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