88 lines
3.0 KiB
Python
88 lines
3.0 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"))
|
|
|
|
|
|
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)
|