test_canopen_program.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # Copyright (c) 2020 Vestas Wind Systems A/S
  2. #
  3. # SPDX-License-Identifier: Apache-2.0
  4. import argparse
  5. import os
  6. from unittest.mock import patch, call
  7. import pytest
  8. from runners.canopen_program import CANopenBinaryRunner
  9. from conftest import RC_KERNEL_BIN
  10. #
  11. # Test values
  12. #
  13. TEST_DEF_CONTEXT = 'default'
  14. TEST_ALT_CONTEXT = 'alternate'
  15. #
  16. # Test cases
  17. #
  18. TEST_CASES = [(n, x, p, c, o, t)
  19. for n in range(1, 3)
  20. for x in (None, TEST_ALT_CONTEXT)
  21. for p in range(1, 3)
  22. for c in (False, True)
  23. for o in (False, True)
  24. for t in range(1, 3)]
  25. os_path_isfile = os.path.isfile
  26. def os_path_isfile_patch(filename):
  27. if filename == RC_KERNEL_BIN:
  28. return True
  29. return os_path_isfile(filename)
  30. @pytest.mark.parametrize('test_case', TEST_CASES)
  31. @patch('runners.canopen_program.CANopenProgramDownloader')
  32. def test_canopen_program_create(cpd, test_case, runner_config):
  33. '''Test CANopen runner created from command line parameters.'''
  34. node_id, context, program_number, confirm, confirm_only, timeout = test_case
  35. args = ['--node-id', str(node_id)]
  36. if context is not None:
  37. args.extend(['--can-context', context])
  38. if program_number:
  39. args.extend(['--program-number', str(program_number)])
  40. if not confirm:
  41. args.append('--no-confirm')
  42. if confirm_only:
  43. args.append('--confirm-only')
  44. if timeout:
  45. args.extend(['--timeout', str(timeout)])
  46. mock = cpd.return_value
  47. mock.flash_status.return_value = 0
  48. mock.swid.return_value = 0
  49. parser = argparse.ArgumentParser()
  50. CANopenBinaryRunner.add_parser(parser)
  51. arg_namespace = parser.parse_args(args)
  52. runner = CANopenBinaryRunner.create(runner_config, arg_namespace)
  53. with patch('os.path.isfile', side_effect=os_path_isfile_patch):
  54. runner.run('flash')
  55. cpd.assert_called_once()
  56. if context:
  57. assert cpd.call_args == call(node_id=node_id,
  58. can_context=context,
  59. logger=runner.logger,
  60. program_number=program_number)
  61. else:
  62. assert cpd.call_args == call(node_id=node_id,
  63. can_context=TEST_DEF_CONTEXT,
  64. logger=runner.logger,
  65. program_number=program_number)
  66. mock.connect.assert_called_once()
  67. if confirm_only:
  68. mock.flash_status.assert_called_once()
  69. mock.swid.assert_called_once()
  70. mock.enter_pre_operational.assert_called_once()
  71. mock.zephyr_confirm_program.assert_called_once()
  72. mock.clear_program.assert_not_called()
  73. mock.stop_program.assert_not_called()
  74. mock.download.assert_not_called()
  75. mock.start_program.assert_not_called()
  76. mock.wait_for_bootup.assert_not_called()
  77. else:
  78. mock.enter_pre_operational.assert_called()
  79. mock.flash_status.assert_called()
  80. mock.swid.assert_called()
  81. mock.stop_program.assert_called_once()
  82. mock.clear_program.assert_called_once()
  83. mock.download.assert_called_once_with(RC_KERNEL_BIN)
  84. mock.start_program.assert_called_once()
  85. mock.wait_for_bootup.assert_called_once_with(timeout)
  86. if confirm:
  87. mock.zephyr_confirm_program.assert_called_once()
  88. else:
  89. mock.zephyr_confirm_program.assert_not_called()
  90. mock.disconnect.assert_called_once()