test_stm32flash.py 3.7 KB

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