218 lines
8.1 KiB
Python
218 lines
8.1 KiB
Python
# Copyright (c) 2020 Synopsys
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import argparse
|
|
from os import path
|
|
from unittest.mock import patch
|
|
from unittest.mock import call
|
|
|
|
import pytest
|
|
|
|
from runners.mdb import MdbNsimBinaryRunner, MdbHwBinaryRunner
|
|
from conftest import RC_KERNEL_ELF, RC_BOARD_DIR
|
|
|
|
|
|
TEST_DRIVER_CMD = 'mdb'
|
|
TEST_NSIM_ARGS='test_nsim.args'
|
|
TEST_TARGET = 'test-target'
|
|
TEST_BOARD_NSIM_ARGS = '@' + path.join(RC_BOARD_DIR, 'support', TEST_NSIM_ARGS)
|
|
|
|
# mdb-nsim
|
|
TEST_NSIM_FLASH_CASES = [
|
|
{
|
|
'i': ['--cores=1', '--nsim=' + TEST_NSIM_ARGS],
|
|
'o': [TEST_DRIVER_CMD, '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'-nsim', TEST_BOARD_NSIM_ARGS,
|
|
'-run', '-cl', RC_KERNEL_ELF]
|
|
}]
|
|
|
|
TEST_NSIM_DEBUG_CASES = [
|
|
{
|
|
'i': ['--cores=1', '--nsim=' + TEST_NSIM_ARGS],
|
|
'o': [TEST_DRIVER_CMD, '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'-nsim', TEST_BOARD_NSIM_ARGS,
|
|
'-OKN', RC_KERNEL_ELF
|
|
]
|
|
}]
|
|
|
|
TEST_NSIM_MULTICORE_CASES = [['--cores=2', '--nsim=' + TEST_NSIM_ARGS]]
|
|
TEST_NSIM_CORE1 = [TEST_DRIVER_CMD, '-pset=1', '-psetname=core0', '',
|
|
'-nooptions', '-nogoifmain', '-toggle=include_local_symbols=1',
|
|
'-nsim', TEST_BOARD_NSIM_ARGS, RC_KERNEL_ELF]
|
|
TEST_NSIM_CORE2 = [TEST_DRIVER_CMD, '-pset=2', '-psetname=core1',
|
|
'-prop=download=2', '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'-nsim', TEST_BOARD_NSIM_ARGS, RC_KERNEL_ELF]
|
|
TEST_NSIM_CORES_LAUNCH = [TEST_DRIVER_CMD, '-multifiles=core0,core1',
|
|
'-run', '-cl']
|
|
|
|
# mdb-hw
|
|
TEST_HW_FLASH_CASES = [
|
|
{
|
|
'i': ['--jtag=digilent', '--cores=1'],
|
|
'o': [TEST_DRIVER_CMD, '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'-digilent', '',
|
|
'-run', '-cmd=-nowaitq run', '-cmd=quit', '-cl', RC_KERNEL_ELF]
|
|
}, {
|
|
'i': ['--jtag=digilent', '--cores=1', '--dig-device=test'],
|
|
'o': [TEST_DRIVER_CMD, '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'-digilent', '-prop=dig_device=test',
|
|
'-run', '-cmd=-nowaitq run', '-cmd=quit', '-cl', RC_KERNEL_ELF]
|
|
}, {
|
|
'i': ['--jtag=test_debug', '--cores=1'],
|
|
'o': [TEST_DRIVER_CMD, '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'',
|
|
'-run', '-cmd=-nowaitq run', '-cmd=quit', '-cl', RC_KERNEL_ELF]
|
|
}]
|
|
|
|
TEST_HW_DEBUG_CASES = [
|
|
{
|
|
'i': ['--jtag=digilent', '--cores=1'],
|
|
'o': [TEST_DRIVER_CMD, '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'-digilent', '',
|
|
'-OKN', RC_KERNEL_ELF]
|
|
}, {
|
|
'i': ['--jtag=digilent', '--cores=1', '--dig-device=test'],
|
|
'o': [TEST_DRIVER_CMD, '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'-digilent', '-prop=dig_device=test',
|
|
'-OKN', RC_KERNEL_ELF]
|
|
}, {
|
|
'i': ['--jtag=test_debug', '--cores=1'],
|
|
'o': [TEST_DRIVER_CMD, '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'',
|
|
'-OKN', RC_KERNEL_ELF]
|
|
}]
|
|
|
|
TEST_HW_MULTICORE_CASES = [['--jtag=digilent', '--cores=2']]
|
|
TEST_HW_CORE1 = [TEST_DRIVER_CMD, '-pset=1', '-psetname=core0', '',
|
|
'-nooptions', '-nogoifmain', '-toggle=include_local_symbols=1',
|
|
'-digilent', '', RC_KERNEL_ELF]
|
|
TEST_HW_CORE2 = [TEST_DRIVER_CMD, '-pset=2', '-psetname=core1',
|
|
'-prop=download=2', '-nooptions', '-nogoifmain',
|
|
'-toggle=include_local_symbols=1',
|
|
'-digilent', '', RC_KERNEL_ELF]
|
|
TEST_HW_CORES_LAUNCH = [TEST_DRIVER_CMD, '-multifiles=core0,core1', '-run',
|
|
'-cmd=-nowaitq run', '-cmd=quit', '-cl']
|
|
|
|
#
|
|
# Fixtures
|
|
#
|
|
|
|
def mdb(runner_config, tmpdir, mdb_runner):
|
|
'''MdbBinaryRunner from constructor kwargs or command line parameters'''
|
|
# This factory takes either a dict of kwargs to pass to the
|
|
# constructor, or a list of command-line arguments to parse and
|
|
# use with the create() method.
|
|
def _factory(args):
|
|
# Ensure kernel binaries exist (as empty files, so commands
|
|
# which use them must be patched out).
|
|
tmpdir.ensure(RC_KERNEL_ELF)
|
|
tmpdir.chdir()
|
|
|
|
if isinstance(args, dict):
|
|
return mdb_runner(runner_config, TEST_TARGET, **args)
|
|
elif isinstance(args, list):
|
|
parser = argparse.ArgumentParser()
|
|
mdb_runner.add_parser(parser)
|
|
arg_namespace = parser.parse_args(args)
|
|
return mdb_runner.create(runner_config, arg_namespace)
|
|
|
|
return _factory
|
|
|
|
@pytest.fixture
|
|
def mdb_nsim(runner_config, tmpdir):
|
|
return mdb(runner_config, tmpdir, MdbNsimBinaryRunner)
|
|
|
|
@pytest.fixture
|
|
def mdb_hw(runner_config, tmpdir):
|
|
return mdb(runner_config, tmpdir, MdbHwBinaryRunner)
|
|
|
|
#
|
|
# Helpers
|
|
#
|
|
|
|
def require_patch(program):
|
|
assert program == TEST_DRIVER_CMD
|
|
|
|
#
|
|
# Test cases for runners created by constructor.
|
|
#
|
|
|
|
# mdb-nsim test cases
|
|
@pytest.mark.parametrize('test_case', TEST_NSIM_FLASH_CASES)
|
|
@patch('runners.mdb.get_cld_pid', return_value=(False, -1))
|
|
@patch('time.sleep', return_value=None)
|
|
@patch('runners.mdb.MdbNsimBinaryRunner.popen_ignore_int')
|
|
@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
|
|
def test_flash_nsim(require, cc, t, gcp, test_case, mdb_nsim):
|
|
mdb_nsim(test_case['i']).run('flash')
|
|
assert require.called
|
|
cc.assert_called_once_with(test_case['o'])
|
|
|
|
@pytest.mark.parametrize('test_case', TEST_NSIM_DEBUG_CASES)
|
|
@patch('runners.mdb.get_cld_pid', return_value=(False, -1))
|
|
@patch('time.sleep', return_value=None)
|
|
@patch('runners.mdb.MdbNsimBinaryRunner.popen_ignore_int')
|
|
@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
|
|
def test_debug_nsim(require, pii, t, gcp, test_case, mdb_nsim):
|
|
mdb_nsim(test_case['i']).run('debug')
|
|
assert require.called
|
|
pii.assert_called_once_with(test_case['o'])
|
|
|
|
@pytest.mark.parametrize('test_case', TEST_NSIM_MULTICORE_CASES)
|
|
@patch('runners.mdb.get_cld_pid', return_value=(False, -1))
|
|
@patch('time.sleep', return_value=None)
|
|
@patch('runners.mdb.MdbNsimBinaryRunner.check_call')
|
|
@patch('runners.mdb.MdbNsimBinaryRunner.popen_ignore_int')
|
|
@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
|
|
def test_multicores_nsim(require, pii, cc, t, gcp, test_case, mdb_nsim):
|
|
mdb_nsim(test_case).run('flash')
|
|
assert require.called
|
|
cc_calls = [call(TEST_NSIM_CORE1), call(TEST_NSIM_CORE2)]
|
|
cc.assert_has_calls(cc_calls)
|
|
pii.assert_called_once_with(TEST_NSIM_CORES_LAUNCH)
|
|
|
|
|
|
# mdb-hw test cases
|
|
@pytest.mark.parametrize('test_case', TEST_HW_FLASH_CASES)
|
|
@patch('runners.mdb.get_cld_pid', return_value=(False, -1))
|
|
@patch('time.sleep', return_value=None)
|
|
@patch('runners.mdb.MdbHwBinaryRunner.popen_ignore_int')
|
|
@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
|
|
def test_flash_hw(require, cc, t, gcp, test_case, mdb_hw):
|
|
mdb_hw(test_case['i']).run('flash')
|
|
assert require.called
|
|
cc.assert_called_once_with(test_case['o'])
|
|
|
|
@pytest.mark.parametrize('test_case', TEST_HW_DEBUG_CASES)
|
|
@patch('runners.mdb.get_cld_pid', return_value=(False, -1))
|
|
@patch('time.sleep', return_value=None)
|
|
@patch('runners.mdb.MdbHwBinaryRunner.popen_ignore_int')
|
|
@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
|
|
def test_debug_hw(require, pii, t, gcp, test_case, mdb_hw):
|
|
mdb_hw(test_case['i']).run('debug')
|
|
assert require.called
|
|
pii.assert_called_once_with(test_case['o'])
|
|
|
|
@pytest.mark.parametrize('test_case', TEST_HW_MULTICORE_CASES)
|
|
@patch('runners.mdb.get_cld_pid', return_value=(False, -1))
|
|
@patch('time.sleep', return_value=None)
|
|
@patch('runners.mdb.MdbHwBinaryRunner.check_call')
|
|
@patch('runners.mdb.MdbHwBinaryRunner.popen_ignore_int')
|
|
@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
|
|
def test_multicores_hw(require, pii, cc, t, gcp, test_case, mdb_hw):
|
|
mdb_hw(test_case).run('flash')
|
|
assert require.called
|
|
cc_calls = [call(TEST_HW_CORE1), call(TEST_HW_CORE2)]
|
|
cc.assert_has_calls(cc_calls)
|
|
pii.assert_called_once_with(TEST_HW_CORES_LAUNCH)
|