2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 22:15:20 +00:00

Capture log output during pytest runner setup

Instantiate a new logger that is used during pytest initialization /
configuration. This logging isn't handled by pytest itself, since it
happens outside of any tests or fixtures.

Root logger can't be reused for this purpose, because that would
duplicate the logs. Instead, create a conftest-specific logger for this
purpose.

Unfortunately, this introduces another log file,
pytest.conftest.log.txt, which contains only the logging from pytest
initialization. However, unless one is debugging the runner /
environment, there should be no need to investigate this file.
This commit is contained in:
Tom Krizek
2023-04-12 14:22:27 +02:00
parent 99e2e50c0e
commit 12c724ee07

View File

@@ -104,9 +104,24 @@ else:
"upforwd/",
]
PRIORITY_TESTS_RE = re.compile("|".join(PRIORITY_TESTS))
CONFTEST_LOGGER = logging.getLogger("conftest")
# ---------------------- Module initialization ---------------------------
def init_pytest_conftest_logger(conftest_logger):
"""
This initializes the conftest logger which is used for pytest setup
and configuration before tests are executed -- aka any logging in this
file that is _not_ module-specific.
"""
conftest_logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler("pytest.conftest.log.txt")
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(logging.Formatter(LOG_FORMAT))
conftest_logger.addHandler(file_handler)
init_pytest_conftest_logger(CONFTEST_LOGGER)
def avoid_duplicated_logs():
"""
Remove direct root logger output to file descriptors.
@@ -141,7 +156,7 @@ else:
stdout=subprocess.PIPE,
)
except subprocess.CalledProcessError as exc:
logging.error("failed to get shell env: %s", exc)
CONFTEST_LOGGER.error("failed to get shell env: %s", exc)
raise exc
env_bytes = proc.stdout
return parse_env(env_bytes)
@@ -150,7 +165,9 @@ else:
# FUTURE: Remove conf.sh entirely and define all variables in pytest only.
CONF_ENV = get_env_bytes(". ./conf.sh && env")
os.environb.update(CONF_ENV)
logging.debug("conf.sh env: %s", CONF_ENV)
CONFTEST_LOGGER.debug(
"variables in env: %s", ", ".join([str(key) for key in CONF_ENV])
)
# --------------------------- pytest hooks -------------------------------
@@ -166,7 +183,7 @@ else:
# Ensure this hook only runs on the main pytest instance if xdist is
# used to spawn other workers.
if not XDIST_WORKER:
logging.debug("compiling required files")
CONFTEST_LOGGER.debug("compiling required files")
env = os.environ.copy()
env["TESTS"] = "" # disable automake test framework - compile-only
try:
@@ -183,10 +200,10 @@ else:
env=env,
)
except subprocess.CalledProcessError as exc:
logging.debug(exc.stdout)
logging.error("failed to compile test files: %s", exc)
CONFTEST_LOGGER.debug(exc.stdout)
CONFTEST_LOGGER.error("failed to compile test files: %s", exc)
raise exc
logging.debug(proc.stdout)
CONFTEST_LOGGER.debug(proc.stdout)
if config.pluginmanager.has_plugin("xdist") and config.option.numprocesses:
# system tests depend on module scope for setup & teardown
@@ -194,7 +211,7 @@ else:
try:
import xdist.scheduler.loadscope # pylint: disable=unused-import
except ImportError:
logging.debug(
CONFTEST_LOGGER.debug(
"xdist is too old and does not have "
"scheduler.loadscope, disabling parallelism"
)