zephyr/scripts/tests/twister_blackbox/conftest.py

86 lines
2.9 KiB
Python

#!/usr/bin/env python3
# Copyright (c) 2023 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
'''Common fixtures for use in testing the twister tool.'''
import logging
import shutil
import mock
import os
import pytest
import sys
ZEPHYR_BASE = os.getenv('ZEPHYR_BASE')
TEST_DATA = os.path.join(ZEPHYR_BASE, 'scripts', 'tests',
'twister_blackbox', 'test_data')
sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts/pylib/twister"))
sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts"))
testsuite_filename_mock = mock.PropertyMock(return_value='test_data.yaml')
def pytest_configure(config):
config.addinivalue_line("markers", "noclearlog: disable the clear_log autouse fixture")
config.addinivalue_line("markers", "noclearout: disable the provide_out autouse fixture")
@pytest.fixture(name='zephyr_base')
def zephyr_base_directory():
return ZEPHYR_BASE
@pytest.fixture(name='zephyr_test_data')
def zephyr_test_directory():
return TEST_DATA
@pytest.fixture(autouse=True)
def clear_log(request):
# As this fixture is autouse, one can use the pytest.mark.noclearlog decorator
# in order to be sure that this fixture's code will not fire.
if 'noclearlog' in request.keywords:
return
# clear_log is used by pytest fixture
# However, clear_log_in_test is prepared to be used directly in the code, wherever required
clear_log_in_test()
def clear_log_in_test():
# Required to fix the pytest logging error
# See: https://github.com/pytest-dev/pytest/issues/5502
loggers = [logging.getLogger()] \
+ list(logging.Logger.manager.loggerDict.values()) \
+ [logging.getLogger(name) for \
name in logging.root.manager.loggerDict]
for logger in loggers:
handlers = getattr(logger, 'handlers', [])
for handler in handlers:
logger.removeHandler(handler)
# This fixture provides blackbox tests with an `out_path` parameter
# It should be used as the `-O` (`--out_dir`) parameter in blackbox tests
# APPRECIATED: method of using this out_path wholly outside of test code
@pytest.fixture(name='out_path', autouse=True)
def provide_out(tmp_path, request):
# As this fixture is autouse, one can use the pytest.mark.noclearout decorator
# in order to be sure that this fixture's code will not fire.
# Most of the time, just omitting the `out_path` parameter is sufficient.
if 'noclearout' in request.keywords:
yield
return
# Before
out_container_path = tmp_path / 'blackbox-out-container'
out_container_path.mkdir()
out_path = os.path.join(out_container_path, "blackbox-out")
# Test
yield out_path
# After
# We're operating in temp, so it is not strictly necessary
# but the files can get large quickly as we do not need them after the test.
shutil.rmtree(out_container_path)