# Copyright (c) 2021 Gerson Fernando Budke <nandojve@gmail.com>
# SPDX-License-Identifier: Apache-2.0

import argparse
import os
import platform
from unittest.mock import patch, call

import pytest

from runners.gd32isp import Gd32ispBinaryRunner
from conftest import RC_KERNEL_BIN

if platform.system() != 'Linux':
    pytest.skip("skipping Linux-only gd32isp tests", allow_module_level=True)

TEST_GD32ISP_CLI   = 'GD32_ISP_Console'
TEST_GD32ISP_CLI_T = 'GD32_ISP_CLI'
TEST_GD32ISP_DEV   = 'test-gd32test'
TEST_GD32ISP_PORT  = 'test-gd32isp-serial'
TEST_GD32ISP_SPEED = '2000000'
TEST_GD32ISP_ADDR  = '0x08765430'

EXPECTED_COMMANDS_DEFAULT = [
    [TEST_GD32ISP_CLI, '-c', '--pn', '/dev/ttyUSB0', '--br', '57600',
     '--sb', '1', '-i', TEST_GD32ISP_DEV, '-e', '--all', '-d',
     '--a', '0x08000000', '--fn', RC_KERNEL_BIN],
]

EXPECTED_COMMANDS = [
    [TEST_GD32ISP_CLI_T, '-c', '--pn', TEST_GD32ISP_PORT,
     '--br', TEST_GD32ISP_SPEED,
     '--sb', '1', '-i', TEST_GD32ISP_DEV, '-e', '--all', '-d',
     '--a', TEST_GD32ISP_ADDR, '--fn', RC_KERNEL_BIN],
]

def require_patch(program):
    assert program in [TEST_GD32ISP_CLI, TEST_GD32ISP_CLI_T]

os_path_isfile = os.path.isfile

def os_path_isfile_patch(filename):
    if filename == RC_KERNEL_BIN:
        return True
    return os_path_isfile(filename)


@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
@patch('runners.core.ZephyrBinaryRunner.check_call')
def test_gd32isp_init(cc, req, runner_config):
    runner = Gd32ispBinaryRunner(runner_config, TEST_GD32ISP_DEV)
    with patch('os.path.isfile', side_effect=os_path_isfile_patch):
        runner.run('flash')
    assert cc.call_args_list == [call(x) for x in EXPECTED_COMMANDS_DEFAULT]


@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
@patch('runners.core.ZephyrBinaryRunner.check_call')
def test_gd32isp_create(cc, req, runner_config):
    args = ['--device', TEST_GD32ISP_DEV,
            '--port', TEST_GD32ISP_PORT,
            '--speed', TEST_GD32ISP_SPEED,
            '--addr', TEST_GD32ISP_ADDR,
            '--isp', TEST_GD32ISP_CLI_T]
    parser = argparse.ArgumentParser()
    Gd32ispBinaryRunner.add_parser(parser)
    arg_namespace = parser.parse_args(args)
    runner = Gd32ispBinaryRunner.create(runner_config, arg_namespace)
    with patch('os.path.isfile', side_effect=os_path_isfile_patch):
        runner.run('flash')
    assert cc.call_args_list == [call(x) for x in EXPECTED_COMMANDS]
