| #!/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) |