Skip tests that segfault, run the rest

This commit is contained in:
Roman Yurchak 2018-10-01 13:43:11 +02:00
parent b86101a58d
commit 641f3e7b1a
2 changed files with 34 additions and 23 deletions

View File

@ -1,7 +1,12 @@
# Test modules with a failure reason after their name are either skipped
# or marked as a known failure in pytest.
#
# Following reason codes are skipped:
# Following reason codes are skipped, whithout running them, as they lead to
# segfaults:
# - segfault-<syscall>: segfault in the corresponding system call.
#
# While the below reason codes are marked as a known failure, and are still
# executed:
# - platform-specific: This is testing something about a particular platform
# that isn't relevant here
# - async: relies on async
@ -24,8 +29,6 @@
# - fs: Fails due to virtual filesystem issues.
# - nonsense: This functionality doesn't make sense in this context. Includes
# things like `pip`, `distutils`
#
# While the below reason codes are marked as a known failure:
# - crash: The Python interpreter just stopped without a traceback. Will require
# further investigation. This usually seems to be caused by calling into a
# system function that doesn't behave as one would expect.
@ -53,7 +56,7 @@ test_asyncio.test_locks async
test_asyncio.test_pep492 async
test_asyncio.test_proactor_events async
test_asyncio.test_queues async
test_asyncio.test_selector_events async
test_asyncio.test_selector_events async segfault-socketcall
test_asyncio.test_sslproto async
test_asyncio.test_streams async
test_asyncio.test_subprocess async
@ -201,7 +204,7 @@ test_fractions
test_frame
test_frozen
test_fstring
test_ftplib syscall 21537
test_ftplib socket
test_funcattrs
test_functools threading
test_future
@ -232,7 +235,7 @@ test_html
test_htmlparser
test_http_cookiejar
test_http_cookies
test_httplib socket
test_httplib socket segfault-socketcall
test_httpservers threading
test_idle
test_imaplib socket
@ -360,8 +363,8 @@ test_platform subprocess
test_plistlib
test_poll subprocess
test_popen subprocess
test_poplib bad ioctl syscall 21537
test_posix crash
test_poplib bad ioctl socket
test_posix segfault-fstatfs64
test_posixpath crash
test_pow
test_pprint
@ -396,8 +399,8 @@ test_sched threading
test_scope
test_script_helper
test_secrets
test_select networking
test_selectors networking
test_select networking segfault-newselect
test_selectors networking segfault-newselect
test_set
test_setcomps
test_shelve
@ -490,7 +493,7 @@ test_unittest os.kill
test_univnewlines
test_unpack
test_unpack_ex
test_urllib crash
test_urllib segfault-socketcall
test_urllib2 subprocess
test_urllib2_localnet socket
test_urllib2net

View File

@ -336,14 +336,25 @@ def test_open_url_cgi(selenium):
""") == 'HELLO\n'
def test_run_core_python_test(python_test, selenium, request):
def test_cpython_core(python_test, selenium, request):
name, error_flags = python_test
if ('crash' in error_flags or
'crash-' + selenium.browser in error_flags):
pytest.xfail(reason='known failure with code "{}"'
.format(','.join(error_flags)))
# keep only flags related to the current browser
flags_to_remove = ['firefox', 'chrome']
flags_to_remove.remove(selenium.browser)
for flag in flags_to_remove:
if 'crash-' + flag in error_flags:
error_flags.remove('crash-' + flag)
if any(flag.startswith('segfault') for flag in error_flags):
pytest.skip('known segfault with code: "{}"'
.format(','.join(error_flags)))
if error_flags:
request.applymarker(pytest.mark.xfail(
run=False, reason='known failure with code "{}"'
.format(','.join(error_flags))))
selenium.load_package('test')
try:
@ -373,13 +384,10 @@ def pytest_generate_tests(metafunc):
continue
error_flags = line.split()
name = error_flags.pop(0)
if (not error_flags
or set(error_flags).intersection(
{'crash', 'crash-chrome', 'crash-firefox'})):
test_modules.append((name, error_flags))
# explicitly define test ids to keep
# a human readable test name in pytest
test_modules_ids.append(name)
test_modules.append((name, error_flags))
# explicitly define test ids to keep
# a human readable test name in pytest
test_modules_ids.append(name)
metafunc.parametrize("python_test", test_modules,
ids=test_modules_ids)