Thomas Kupper | ef0e3ed | 2019-09-03 00:03:04 +0200 | [diff] [blame] | 1 | # Copyright (c) 2019 Thomas Kupper |
| 2 | # |
| 3 | # SPDX-License-Identifier: Apache-2.0 |
| 4 | |
| 5 | import argparse |
| 6 | import os |
| 7 | import platform |
| 8 | from unittest.mock import patch, call |
| 9 | |
| 10 | import pytest |
| 11 | |
| 12 | from runners.stm32flash import Stm32flashBinaryRunner |
| 13 | from conftest import RC_KERNEL_BIN |
| 14 | |
| 15 | TEST_CMD = 'stm32flash' |
| 16 | |
| 17 | TEST_DEVICE = '/dev/ttyUSB0' |
| 18 | if platform.system() == 'Darwin': |
| 19 | TEST_DEVICE = '/dev/tty.SLAB_USBtoUART' |
| 20 | TEST_BAUD = '115200' |
| 21 | TEST_FORCE_BINARY = False |
| 22 | TEST_ADDR = '0x08000000' |
| 23 | TEST_BIN_SIZE = '4095' |
| 24 | TEST_EXEC_ADDR = '0' |
| 25 | TEST_SERIAL_MODE = '8e1' |
| 26 | TEST_RESET = False |
| 27 | TEST_VERIFY = False |
| 28 | |
| 29 | # Expected subprocesses to be run for each action. Using the |
| 30 | # runner_config fixture (and always specifying all necessary |
| 31 | # parameters) means we don't get 100% coverage, but it's a |
| 32 | # starting out point. |
| 33 | EXPECTED_COMMANDS = { |
| 34 | 'info': |
| 35 | ([TEST_CMD, |
| 36 | '-b', TEST_BAUD, |
| 37 | '-m', TEST_SERIAL_MODE, |
| 38 | TEST_DEVICE],), |
| 39 | 'erase': |
| 40 | ([TEST_CMD, |
| 41 | '-b', TEST_BAUD, |
| 42 | '-m', TEST_SERIAL_MODE, |
| 43 | '-S', TEST_ADDR + ":" + str((int(TEST_BIN_SIZE) >> 12) + 1 << 12), |
| 44 | '-o', TEST_DEVICE],), |
| 45 | 'start': |
| 46 | ([TEST_CMD, |
| 47 | '-b', TEST_BAUD, |
| 48 | '-m', TEST_SERIAL_MODE, |
| 49 | '-g', TEST_EXEC_ADDR, TEST_DEVICE],), |
| 50 | |
| 51 | 'write': |
| 52 | ([TEST_CMD, |
| 53 | '-b', TEST_BAUD, |
| 54 | '-m', TEST_SERIAL_MODE, |
| 55 | '-S', TEST_ADDR + ":" + TEST_BIN_SIZE, |
| 56 | '-w', RC_KERNEL_BIN, |
| 57 | TEST_DEVICE],), |
| 58 | } |
| 59 | |
| 60 | def require_patch(program): |
| 61 | assert program == TEST_CMD |
| 62 | |
| 63 | def os_path_getsize_patch(filename): |
| 64 | if filename == RC_KERNEL_BIN: |
| 65 | return TEST_BIN_SIZE |
| 66 | return os.path.isfile(filename) |
| 67 | |
Martí Bolívar | 09f5576 | 2021-04-28 10:19:53 -0700 | [diff] [blame] | 68 | os_path_isfile = os.path.isfile |
| 69 | |
Martí Bolívar | 3204554 | 2021-02-02 08:55:16 -0800 | [diff] [blame] | 70 | def os_path_isfile_patch(filename): |
| 71 | if filename == RC_KERNEL_BIN: |
| 72 | return True |
Martí Bolívar | 09f5576 | 2021-04-28 10:19:53 -0700 | [diff] [blame] | 73 | return os_path_isfile(filename) |
Martí Bolívar | 3204554 | 2021-02-02 08:55:16 -0800 | [diff] [blame] | 74 | |
Thomas Kupper | ef0e3ed | 2019-09-03 00:03:04 +0200 | [diff] [blame] | 75 | @pytest.mark.parametrize('action', EXPECTED_COMMANDS) |
| 76 | @patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch) |
| 77 | @patch('runners.core.ZephyrBinaryRunner.check_call') |
| 78 | def test_stm32flash_init(cc, req, action, runner_config): |
| 79 | '''Test actions using a runner created by constructor.''' |
| 80 | test_exec_addr = TEST_EXEC_ADDR |
| 81 | if action == 'write': |
| 82 | test_exec_addr = None |
| 83 | |
| 84 | runner = Stm32flashBinaryRunner(runner_config, device=TEST_DEVICE, |
| 85 | action=action, baud=TEST_BAUD, force_binary=TEST_FORCE_BINARY, |
| 86 | start_addr=TEST_ADDR, exec_addr=test_exec_addr, |
| 87 | serial_mode=TEST_SERIAL_MODE, reset=TEST_RESET, verify=TEST_VERIFY) |
| 88 | |
| 89 | with patch('os.path.getsize', side_effect=os_path_getsize_patch): |
Martí Bolívar | 3204554 | 2021-02-02 08:55:16 -0800 | [diff] [blame] | 90 | with patch('os.path.isfile', side_effect=os_path_isfile_patch): |
| 91 | runner.run('flash') |
Thomas Kupper | ef0e3ed | 2019-09-03 00:03:04 +0200 | [diff] [blame] | 92 | assert cc.call_args_list == [call(x) for x in EXPECTED_COMMANDS[action]] |
| 93 | |
| 94 | @pytest.mark.parametrize('action', EXPECTED_COMMANDS) |
| 95 | @patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch) |
| 96 | @patch('runners.core.ZephyrBinaryRunner.check_call') |
| 97 | def test_stm32flash_create(cc, req, action, runner_config): |
| 98 | '''Test actions using a runner created from action line parameters.''' |
| 99 | if action == 'start': |
| 100 | args = ['--action', action, '--baud-rate', TEST_BAUD, '--start-addr', TEST_ADDR, |
| 101 | '--execution-addr', TEST_EXEC_ADDR] |
| 102 | else: |
| 103 | args = ['--action', action, '--baud-rate', TEST_BAUD, '--start-addr', TEST_ADDR] |
| 104 | |
Jamie McCrae | ec70444 | 2023-01-04 16:08:36 +0000 | [diff] [blame] | 105 | parser = argparse.ArgumentParser(allow_abbrev=False) |
Thomas Kupper | ef0e3ed | 2019-09-03 00:03:04 +0200 | [diff] [blame] | 106 | Stm32flashBinaryRunner.add_parser(parser) |
| 107 | arg_namespace = parser.parse_args(args) |
| 108 | runner = Stm32flashBinaryRunner.create(runner_config, arg_namespace) |
| 109 | with patch('os.path.getsize', side_effect=os_path_getsize_patch): |
Martí Bolívar | 3204554 | 2021-02-02 08:55:16 -0800 | [diff] [blame] | 110 | with patch('os.path.isfile', side_effect=os_path_isfile_patch): |
| 111 | runner.run('flash') |
Thomas Kupper | ef0e3ed | 2019-09-03 00:03:04 +0200 | [diff] [blame] | 112 | assert cc.call_args_list == [call(x) for x in EXPECTED_COMMANDS[action]] |