# Copyright (c) 2023 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0

import os
from pathlib import Path
from typing import Generator
from unittest.mock import patch

import pytest

from twister_harness.device.qemu_adapter import QemuAdapter
from twister_harness.exceptions import TwisterHarnessException
from twister_harness.twister_harness_config import DeviceConfig


@pytest.fixture(name='device')
def fixture_device_adapter(tmp_path) -> Generator[QemuAdapter, None, None]:
    build_dir = tmp_path / 'build_dir'
    os.mkdir(build_dir)
    device = QemuAdapter(DeviceConfig(build_dir=build_dir, type='qemu', base_timeout=5.0))
    try:
        yield device
    finally:
        device.close()  # to make sure all running processes are closed


@patch('shutil.which', return_value='west')
def test_if_generate_command_creates_proper_command(patched_which, device: QemuAdapter):
    device.device_config.build_dir = Path('build_dir')
    device.generate_command()
    assert device.command == ['west', 'build', '-d', 'build_dir', '-t', 'run']


def test_if_qemu_adapter_runs_without_errors(resources, device: QemuAdapter) -> None:
    fifo_file_path = str(device.device_config.build_dir / 'qemu-fifo')
    script_path = resources.joinpath('fifo_mock.py')
    device.command = ['python', str(script_path), fifo_file_path]
    device.launch()
    lines = device.readlines_until(regex='Namespaces are one honking great idea')
    device.close()
    assert 'Readability counts.' in lines
    assert os.path.isfile(device.handler_log_path)
    with open(device.handler_log_path, 'r') as file:
        file_lines = [line.strip() for line in file.readlines()]
    assert file_lines[-2:] == lines[-2:]


def test_if_qemu_adapter_raise_exception_due_to_no_fifo_connection(device: QemuAdapter) -> None:
    device.base_timeout = 0.3
    device.command = ['sleep', '1']
    with pytest.raises(TwisterHarnessException, match='Cannot establish communication with QEMU device.'):
        device._flash_and_run()
    device._close_device()
    assert not os.path.exists(device._fifo_connection._fifo_out_path)
    assert not os.path.exists(device._fifo_connection._fifo_in_path)
