#!/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")) sample_filename_mock = mock.PropertyMock(return_value='test_sample.yaml') testsuite_filename_mock = mock.PropertyMock(return_value='test_data.yaml') sample_filename_mock = mock.PropertyMock(return_value='test_sample.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)