zephyr/scripts/west_commands/tests/test_mdb.py
Eugeniy Paltsev 0699f38f16 ARC: west: mdb runner: record MDB's CLD process pid to file
Record MDB's CLD process pid to file so this process can be
terminated by sanitycheck infrastructure.
Update mdb runners test to be able to handle changes.

Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
2020-11-11 08:18:38 -05:00

217 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)