test: fail tests when programs are missing

Building only a subset of programs is not a very common situation, it is
more likely that some feature was accidentally disabled. For that
reason, fail tests by default unless a program is explicitly permitted
to be missing.

The '-v' test is now dropped from the Travis tests, the sole reason of
adding it was to see which tests got (accidentally) skipped.

Change-Id: I725f4508541d8ed980e17d69fb7aee1ad2875d73
Reviewed-on: https://code.wireshark.org/review/31660
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
This commit is contained in:
Peter Wu 2019-01-21 15:05:37 +01:00
parent 70d9bfbf33
commit 0971d20452
5 changed files with 35 additions and 11 deletions

View File

@ -127,7 +127,8 @@ script:
# Invoke ninja (Linux/macOS, --config is ignored) or msbuild (Windows)
- cmake --build . --config RelWithDebInfo
- cmake --build . --config RelWithDebInfo --target test-programs
- pytest -v
- if [ "$PCAP" = "OFF" ]; then export PYTEST_ADDOPTS=--skip-missing-programs=dumpcap,rawshark; fi
- pytest
after_script:
- if [ -f run/tshark ]; then run/tshark --version; fi
- if [ -f run/RelWithDebInfo/tshark.exe ]; then run/RelWithDebInfo/tshark.exe --version; fi

View File

@ -64,11 +64,9 @@ Capture tests depend on the permissions of the user running the test
script. We assume that the test user has capture permissions on Windows
and macOS and capture tests are enabled by default on those platforms.
If the program or feature dependencies of a test are not satisfied, then
the test will be skipped. For example, if `dumpcap` has not been built
or if an old version of Libgcrypt is in use, then some capture or
decryption tests will be skipped while other tests can still run to
completion.
If a feature is unavailable, the test will be skipped. For example, if
an old version of Libgcrypt is in use, then some decryption tests will
be skipped while other tests can still run to completion.
[[TestsLayout]]
==== Suites, Cases, and Tests
@ -217,6 +215,19 @@ $ pytest --collect-only
$ pytest --collect-only -k "dfilter and tvb"
----
The test suite will fail tests when programs are missing. When only a
subset of programs are built or when some programs are disabled, then
the test suite can be instructed to skip instead of fail tests:
[source,sh]
----
# Run tests when libpcap support is disabled (-DENABLE_PCAP=OFF)
$ pytest --skip-missing-programs dumpcap,rawshark
# Run tests and ignore all tests with missing program dependencies
$ pytest --skip-missing-programs all
----
To open a Python debugger (PDB) on failing tests, use the `--pdb` option and
disable parallelism with the `-n0` option:

View File

@ -19,6 +19,9 @@ def pytest_addoption(parser):
help='Capture interface index or name.'
)
parser.addoption('--program-path', help='Path to Wireshark executables.')
parser.addoption('--skip-missing-programs',
help='Skip tests that lack programs from this list instead of failing'
' them. Use "all" to ignore all missing programs.')
_all_test_groups = None

View File

@ -72,14 +72,20 @@ def program_path(request):
@fixtures.fixture(scope='session')
def program(program_path):
def program(program_path, request):
skip_if_missing = request.config.getoption('--skip-missing-programs',
default='')
skip_if_missing = skip_if_missing.split(',') if skip_if_missing else []
dotexe = ''
if sys.platform.startswith('win32'):
dotexe = '.exe'
def resolver(name):
dotexe = ''
if sys.platform.startswith('win32'):
dotexe = '.exe'
path = os.path.abspath(os.path.join(program_path, name + dotexe))
if not os.access(path, os.X_OK):
fixtures.skip('Program %s is not available' % (name,))
if skip_if_missing == ['all'] or name in skip_if_missing:
fixtures.skip('Program %s is not available' % (name,))
raise AssertionError('Program %s is not available' % (name,))
return path
return resolver

View File

@ -56,6 +56,9 @@ def main():
cap_group.add_argument('-E', '--disable-capture', action='store_true', help='Disable capture tests')
cap_group.add_argument('-i', '--capture-interface', help='Capture interface index or name')
parser.add_argument('-p', '--program-path', default=os.path.curdir, help='Path to Wireshark executables.')
parser.add_argument('--skip-missing-programs',
help='Skip tests that lack programs from this list instead of failing'
' them. Use "all" to ignore all missing programs.')
list_group = parser.add_mutually_exclusive_group()
list_group.add_argument('-l', '--list', action='store_true', help='List tests. One of "all" or a full or partial test name.')
list_group.add_argument('--list-suites', action='store_true', help='List all suites.')