Source code for schrodinger.test.pytest.faulthandler_setup
"""
Set up faulthandler inside of pytest
"""
FAULTHANDLER_TIMEOUT_KEY = 'faulthandler_timeout'
[docs]def set_timeout(config):
"""
Modifies config to set a reasonable faulthandler_timeout.
:param config: pytest configuration object
:type config: pytest.config.Config
"""
# this is true when use specifies -p no:faulthandler
if not config.pluginmanager.getplugin("faulthandler"):
return
if has_existing_faulthandler_timeout(config):
return
# remove cached value, since ini values are already
# accessed at this point
config._inicache.pop(FAULTHANDLER_TIMEOUT_KEY, None)
faulthandler_timeout = get_faulthandler_timeout(config)
if not faulthandler_timeout:
return
if not config._override_ini:
config._override_ini = []
option = f"{FAULTHANDLER_TIMEOUT_KEY}={faulthandler_timeout}"
config._override_ini.append(option)
[docs]def get_faulthandler_timeout(config):
"""
Return an appropriate timeout to trigger faulthandler.
:param config: pytest configuration object
:type config: pytest.config.Config
:rtype: float or None
"""
cpp_timeout = config.getoption('timeout')
if cpp_timeout:
return cpp_timeout - 10
faulthandler_timeout = 1140
if config.option.memtest:
faulthandler_timeout = faulthandler_timeout * 10
return faulthandler_timeout
[docs]def has_existing_faulthandler_timeout(config):
"""
Return whether a user has overriden the specification
of faulthandler_timeout in ini or commandline.
:param config: pytest configuration object
:type config: pytest.config.Config
"""
if config.getini(FAULTHANDLER_TIMEOUT_KEY):
return True
for opt in config._override_ini:
if opt.startswith(FAULTHANDLER_TIMEOUT_KEY):
return True
return False