ec7044437e
Disables allowing the python argparse library from automatically shortening command line arguments, this prevents issues whereby a new command is added and code that wrongly uses the shortened command of an existing argument which is the same as the new command being added will silently change script behaviour. Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
124 lines
4.3 KiB
Python
124 lines
4.3 KiB
Python
# Copyright (c) 2020 Vestas Wind Systems A/S
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import argparse
|
|
import os
|
|
from unittest.mock import patch, call
|
|
|
|
import pytest
|
|
|
|
from runners.canopen_program import CANopenBinaryRunner
|
|
from conftest import RC_KERNEL_BIN
|
|
|
|
#
|
|
# Test values
|
|
#
|
|
|
|
TEST_DEF_CONTEXT = 'default'
|
|
TEST_ALT_CONTEXT = 'alternate'
|
|
|
|
#
|
|
# Test cases
|
|
#
|
|
|
|
TEST_CASES = [(n, x, p, c, o, t, r, s, b)
|
|
for n in range(1, 3)
|
|
for x in (None, TEST_ALT_CONTEXT)
|
|
for p in range(1, 3)
|
|
for c in (False, True)
|
|
for o in (False, True)
|
|
for t in range(1, 3)
|
|
for r in range(1, 3)
|
|
for s in range(1, 3)
|
|
for b in range(False, True)]
|
|
|
|
os_path_isfile = os.path.isfile
|
|
|
|
def os_path_isfile_patch(filename):
|
|
if filename == RC_KERNEL_BIN:
|
|
return True
|
|
return os_path_isfile(filename)
|
|
|
|
@pytest.mark.parametrize('test_case', TEST_CASES)
|
|
@patch('runners.canopen_program.CANopenProgramDownloader')
|
|
def test_canopen_program_create(cpd, test_case, runner_config):
|
|
'''Test CANopen runner created from command line parameters.'''
|
|
node_id, context, program_number, confirm, confirm_only, timeout, sdo_retries, sdo_timeout, block_transfer = test_case
|
|
|
|
args = ['--node-id', str(node_id)]
|
|
if context is not None:
|
|
args.extend(['--can-context', context])
|
|
if program_number:
|
|
args.extend(['--program-number', str(program_number)])
|
|
if not confirm:
|
|
args.append('--no-confirm')
|
|
if confirm_only:
|
|
args.append('--confirm-only')
|
|
if timeout:
|
|
args.extend(['--timeout', str(timeout)])
|
|
if sdo_retries:
|
|
args.extend(['--sdo-retries', str(sdo_retries)])
|
|
if sdo_timeout:
|
|
args.extend(['--sdo-timeout', str(sdo_timeout)])
|
|
if block_transfer:
|
|
args.append('--block_transfer')
|
|
|
|
mock = cpd.return_value
|
|
mock.flash_status.return_value = 0
|
|
mock.wait_for_flash_status_ok.return_value = 0
|
|
mock.swid.return_value = 0
|
|
|
|
parser = argparse.ArgumentParser(allow_abbrev=False)
|
|
CANopenBinaryRunner.add_parser(parser)
|
|
arg_namespace = parser.parse_args(args)
|
|
runner = CANopenBinaryRunner.create(runner_config, arg_namespace)
|
|
with patch('os.path.isfile', side_effect=os_path_isfile_patch):
|
|
runner.run('flash')
|
|
|
|
cpd.assert_called_once()
|
|
if context:
|
|
assert cpd.call_args == call(node_id=node_id,
|
|
can_context=context,
|
|
logger=runner.logger,
|
|
program_number=program_number,
|
|
sdo_retries=sdo_retries,
|
|
sdo_timeout=sdo_timeout,
|
|
block_transfer=block_transfer)
|
|
else:
|
|
assert cpd.call_args == call(node_id=node_id,
|
|
can_context=TEST_DEF_CONTEXT,
|
|
logger=runner.logger,
|
|
program_number=program_number,
|
|
sdo_retries=sdo_retries,
|
|
sdo_timeout=sdo_timeout,
|
|
block_transfer=block_transfer)
|
|
|
|
mock.connect.assert_called_once()
|
|
|
|
if confirm_only:
|
|
mock.wait_for_flash_status_ok.assert_called_with(timeout)
|
|
mock.swid.assert_called_once()
|
|
mock.enter_pre_operational.assert_called_once()
|
|
mock.zephyr_confirm_program.assert_called_once()
|
|
mock.clear_program.assert_not_called()
|
|
mock.stop_program.assert_not_called()
|
|
mock.download.assert_not_called()
|
|
mock.start_program.assert_not_called()
|
|
mock.wait_for_bootup.assert_not_called()
|
|
else:
|
|
mock.enter_pre_operational.assert_called()
|
|
mock.wait_for_flash_status_ok.assert_called_with(timeout)
|
|
mock.swid.assert_called()
|
|
mock.stop_program.assert_called_once()
|
|
mock.clear_program.assert_called_once()
|
|
mock.download.assert_called_once_with(RC_KERNEL_BIN)
|
|
mock.start_program.assert_called_once()
|
|
mock.wait_for_bootup.assert_called_once_with(timeout)
|
|
if confirm:
|
|
mock.zephyr_confirm_program.assert_called_once()
|
|
else:
|
|
mock.zephyr_confirm_program.assert_not_called()
|
|
|
|
mock.disconnect.assert_called_once()
|