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)