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)