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>
113 lines
3.7 KiB
Python
113 lines
3.7 KiB
Python
# Copyright (c) 2019 Thomas Kupper
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import argparse
|
|
import os
|
|
import platform
|
|
from unittest.mock import patch, call
|
|
|
|
import pytest
|
|
|
|
from runners.stm32flash import Stm32flashBinaryRunner
|
|
from conftest import RC_KERNEL_BIN
|
|
|
|
TEST_CMD = 'stm32flash'
|
|
|
|
TEST_DEVICE = '/dev/ttyUSB0'
|
|
if platform.system() == 'Darwin':
|
|
TEST_DEVICE = '/dev/tty.SLAB_USBtoUART'
|
|
TEST_BAUD = '115200'
|
|
TEST_FORCE_BINARY = False
|
|
TEST_ADDR = '0x08000000'
|
|
TEST_BIN_SIZE = '4095'
|
|
TEST_EXEC_ADDR = '0'
|
|
TEST_SERIAL_MODE = '8e1'
|
|
TEST_RESET = False
|
|
TEST_VERIFY = False
|
|
|
|
# Expected subprocesses to be run for each action. Using the
|
|
# runner_config fixture (and always specifying all necessary
|
|
# parameters) means we don't get 100% coverage, but it's a
|
|
# starting out point.
|
|
EXPECTED_COMMANDS = {
|
|
'info':
|
|
([TEST_CMD,
|
|
'-b', TEST_BAUD,
|
|
'-m', TEST_SERIAL_MODE,
|
|
TEST_DEVICE],),
|
|
'erase':
|
|
([TEST_CMD,
|
|
'-b', TEST_BAUD,
|
|
'-m', TEST_SERIAL_MODE,
|
|
'-S', TEST_ADDR + ":" + str((int(TEST_BIN_SIZE) >> 12) + 1 << 12),
|
|
'-o', TEST_DEVICE],),
|
|
'start':
|
|
([TEST_CMD,
|
|
'-b', TEST_BAUD,
|
|
'-m', TEST_SERIAL_MODE,
|
|
'-g', TEST_EXEC_ADDR, TEST_DEVICE],),
|
|
|
|
'write':
|
|
([TEST_CMD,
|
|
'-b', TEST_BAUD,
|
|
'-m', TEST_SERIAL_MODE,
|
|
'-S', TEST_ADDR + ":" + TEST_BIN_SIZE,
|
|
'-w', RC_KERNEL_BIN,
|
|
TEST_DEVICE],),
|
|
}
|
|
|
|
def require_patch(program):
|
|
assert program == TEST_CMD
|
|
|
|
def os_path_getsize_patch(filename):
|
|
if filename == RC_KERNEL_BIN:
|
|
return TEST_BIN_SIZE
|
|
return os.path.isfile(filename)
|
|
|
|
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('action', EXPECTED_COMMANDS)
|
|
@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
|
|
@patch('runners.core.ZephyrBinaryRunner.check_call')
|
|
def test_stm32flash_init(cc, req, action, runner_config):
|
|
'''Test actions using a runner created by constructor.'''
|
|
test_exec_addr = TEST_EXEC_ADDR
|
|
if action == 'write':
|
|
test_exec_addr = None
|
|
|
|
runner = Stm32flashBinaryRunner(runner_config, device=TEST_DEVICE,
|
|
action=action, baud=TEST_BAUD, force_binary=TEST_FORCE_BINARY,
|
|
start_addr=TEST_ADDR, exec_addr=test_exec_addr,
|
|
serial_mode=TEST_SERIAL_MODE, reset=TEST_RESET, verify=TEST_VERIFY)
|
|
|
|
with patch('os.path.getsize', side_effect=os_path_getsize_patch):
|
|
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[action]]
|
|
|
|
@pytest.mark.parametrize('action', EXPECTED_COMMANDS)
|
|
@patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
|
|
@patch('runners.core.ZephyrBinaryRunner.check_call')
|
|
def test_stm32flash_create(cc, req, action, runner_config):
|
|
'''Test actions using a runner created from action line parameters.'''
|
|
if action == 'start':
|
|
args = ['--action', action, '--baud-rate', TEST_BAUD, '--start-addr', TEST_ADDR,
|
|
'--execution-addr', TEST_EXEC_ADDR]
|
|
else:
|
|
args = ['--action', action, '--baud-rate', TEST_BAUD, '--start-addr', TEST_ADDR]
|
|
|
|
parser = argparse.ArgumentParser(allow_abbrev=False)
|
|
Stm32flashBinaryRunner.add_parser(parser)
|
|
arg_namespace = parser.parse_args(args)
|
|
runner = Stm32flashBinaryRunner.create(runner_config, arg_namespace)
|
|
with patch('os.path.getsize', side_effect=os_path_getsize_patch):
|
|
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[action]]
|