Source code for schrodinger.test.pytest.faulthandler_setup
"""
Set up faulthandler inside of pytest
"""
from typing import Optional
import _pytest.config
FAULTHANDLER_TIMEOUT_KEY = 'faulthandler_timeout'
[docs]def set_timeout(config: _pytest.config.Config) -> Optional[int]:
"""
Modifies config to set a reasonable faulthandler_timeout.
:param config: pytest configuration object
:return: timeout of faulthandler in seconds, or None if not set
"""
# this is true when use specifies -p no:faulthandler
if not config.pluginmanager.getplugin("faulthandler"):
return
existing_timeout = get_existing_faulthandler_timeout(config)
if existing_timeout:
return existing_timeout
# 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 config._override_ini:
config._override_ini = []
option = f"{FAULTHANDLER_TIMEOUT_KEY}={faulthandler_timeout}"
config._override_ini.append(option)
return faulthandler_timeout
[docs]def get_faulthandler_timeout(config: _pytest.config.Config) -> int:
"""
Return an appropriate timeout to trigger faulthandler.
:param config: pytest configuration object
"""
faulthandler_timeout = 1140
if config.option.memtest:
faulthandler_timeout = faulthandler_timeout * 10
return faulthandler_timeout
[docs]def get_existing_faulthandler_timeout(
config: _pytest.config.Config) -> Optional[int]:
"""
Return whether a user has overriden the specification
of faulthandler_timeout in ini or commandline.
:return: number of seconds for faulthandler timeout
"""
timeout = config.getini(FAULTHANDLER_TIMEOUT_KEY)
if timeout:
return int(timeout)
for opt in config._override_ini:
if opt.startswith(FAULTHANDLER_TIMEOUT_KEY):
return int(opt)