test_nrfjprog.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. # Copyright (c) 2018 Foundries.io
  2. # Copyright (c) 2020 Nordic Semiconductor ASA
  3. #
  4. # SPDX-License-Identifier: Apache-2.0
  5. import argparse
  6. import os
  7. from pathlib import Path
  8. import shutil
  9. import typing
  10. from unittest.mock import patch, call
  11. import pytest
  12. from runners.nrfjprog import NrfJprogBinaryRunner
  13. from conftest import RC_KERNEL_HEX
  14. #
  15. # Test values
  16. #
  17. TEST_DEF_SNR = 'test-default-serial-number' # for mocking user input
  18. TEST_OVR_SNR = 'test-override-serial-number'
  19. # nRF53 flashing is special in that we have different results
  20. # depending on the input hex file. For that reason, we test it with
  21. # real hex files.
  22. TEST_DIR = Path(__file__).parent / 'nrfjprog'
  23. NRF5340_APP_ONLY_HEX = os.fspath(TEST_DIR / 'nrf5340_app_only.hex')
  24. NRF5340_NET_ONLY_HEX = os.fspath(TEST_DIR / 'nrf5340_net_only.hex')
  25. NRF5340_APP_AND_NET_HEX = os.fspath(TEST_DIR / 'nrf5340_app_and_net.hex')
  26. #
  27. # A dictionary mapping test cases to expected results.
  28. #
  29. # The keys are TC objects.
  30. #
  31. # The values are usually nrfjprog commands we expect to be executed for
  32. # each test case. Verification is done by mocking the check_call()
  33. # ZephyrBinaryRunner method which is used to run the commands.
  34. #
  35. # Values can also be callables which take a tmpdir and return the
  36. # expected nrfjprog commands. This is needed for nRF53 testing.
  37. #
  38. class TC(typing.NamedTuple): # 'TestCase'
  39. # NRF51, NRF52, etc.
  40. family: str
  41. # 'APP', 'NET', 'APP+NET', or None.
  42. coprocessor: typing.Optional[str]
  43. # Run 'nrfjprog --recover' first if True
  44. recover: bool
  45. # Use --reset instead of --pinreset if True
  46. softreset: bool
  47. # --snr TEST_OVR_SNR if True, --snr TEST_DEF_SNR if False
  48. snr: bool
  49. # --chiperase if True,
  50. # --sectorerase if False (or --sectoranduicrerase on nRF52)
  51. erase: bool
  52. EXPECTED_RESULTS = {
  53. # -------------------------------------------------------------------------
  54. # NRF51
  55. #
  56. # family CP recov soft snr erase
  57. TC('NRF51', None, False, False, False, False):
  58. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectorerase', '-f', 'NRF51',
  59. '--snr', TEST_DEF_SNR],
  60. ['nrfjprog', '--pinreset', '-f', 'NRF51', '--snr', TEST_DEF_SNR]),
  61. TC('NRF51', None, False, False, False, True):
  62. (['nrfjprog', '--program', RC_KERNEL_HEX, '--chiperase', '-f', 'NRF51',
  63. '--snr', TEST_DEF_SNR],
  64. ['nrfjprog', '--pinreset', '-f', 'NRF51', '--snr', TEST_DEF_SNR]),
  65. TC('NRF51', None, False, False, True, False):
  66. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectorerase', '-f', 'NRF51',
  67. '--snr', TEST_OVR_SNR],
  68. ['nrfjprog', '--pinreset', '-f', 'NRF51', '--snr', TEST_OVR_SNR]),
  69. TC('NRF51', None, False, True, False, False):
  70. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectorerase', '-f', 'NRF51',
  71. '--snr', TEST_DEF_SNR],
  72. ['nrfjprog', '--reset', '-f', 'NRF51', '--snr', TEST_DEF_SNR]),
  73. TC('NRF51', None, True, False, False, False):
  74. (['nrfjprog', '--recover', '-f', 'NRF51', '--snr', TEST_DEF_SNR],
  75. ['nrfjprog', '--program', RC_KERNEL_HEX, '--sectorerase', '-f', 'NRF51',
  76. '--snr', TEST_DEF_SNR],
  77. ['nrfjprog', '--pinreset', '-f', 'NRF51', '--snr', TEST_DEF_SNR]),
  78. TC('NRF51', None, True, True, True, True):
  79. (['nrfjprog', '--recover', '-f', 'NRF51', '--snr', TEST_OVR_SNR],
  80. ['nrfjprog', '--program', RC_KERNEL_HEX, '--chiperase', '-f', 'NRF51',
  81. '--snr', TEST_OVR_SNR],
  82. ['nrfjprog', '--reset', '-f', 'NRF51', '--snr', TEST_OVR_SNR]),
  83. # -------------------------------------------------------------------------
  84. # NRF52
  85. #
  86. # family CP recov soft snr erase
  87. TC('NRF52', None, False, False, False, False):
  88. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectoranduicrerase',
  89. '-f', 'NRF52', '--snr', TEST_DEF_SNR],
  90. ['nrfjprog', '--pinresetenable', '-f', 'NRF52', '--snr', TEST_DEF_SNR],
  91. ['nrfjprog', '--pinreset', '-f', 'NRF52', '--snr', TEST_DEF_SNR]),
  92. TC('NRF52', None, False, False, False, True):
  93. (['nrfjprog', '--program', RC_KERNEL_HEX, '--chiperase', '-f', 'NRF52',
  94. '--snr', TEST_DEF_SNR],
  95. ['nrfjprog', '--pinresetenable', '-f', 'NRF52', '--snr', TEST_DEF_SNR],
  96. ['nrfjprog', '--pinreset', '-f', 'NRF52', '--snr', TEST_DEF_SNR]),
  97. TC('NRF52', None, False, False, True, False):
  98. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectoranduicrerase',
  99. '-f', 'NRF52', '--snr', TEST_OVR_SNR],
  100. ['nrfjprog', '--pinresetenable', '-f', 'NRF52', '--snr', TEST_OVR_SNR],
  101. ['nrfjprog', '--pinreset', '-f', 'NRF52', '--snr', TEST_OVR_SNR]),
  102. TC('NRF52', None, False, True, False, False):
  103. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectoranduicrerase',
  104. '-f', 'NRF52', '--snr', TEST_DEF_SNR],
  105. ['nrfjprog', '--reset', '-f', 'NRF52', '--snr', TEST_DEF_SNR]),
  106. TC('NRF52', None, True, False, False, False):
  107. (['nrfjprog', '--recover', '-f', 'NRF52', '--snr', TEST_DEF_SNR],
  108. ['nrfjprog', '--program', RC_KERNEL_HEX, '--sectoranduicrerase',
  109. '-f', 'NRF52', '--snr', TEST_DEF_SNR],
  110. ['nrfjprog', '--pinresetenable', '-f', 'NRF52', '--snr', TEST_DEF_SNR],
  111. ['nrfjprog', '--pinreset', '-f', 'NRF52', '--snr', TEST_DEF_SNR]),
  112. TC('NRF52', None, True, True, True, True):
  113. (['nrfjprog', '--recover', '-f', 'NRF52', '--snr', TEST_OVR_SNR],
  114. ['nrfjprog', '--program', RC_KERNEL_HEX, '--chiperase', '-f', 'NRF52',
  115. '--snr', TEST_OVR_SNR],
  116. ['nrfjprog', '--reset', '-f', 'NRF52', '--snr', TEST_OVR_SNR]),
  117. # -------------------------------------------------------------------------
  118. # NRF53 APP only
  119. #
  120. # family CP recov soft snr erase
  121. TC('NRF53', 'APP', False, False, False, False):
  122. (['nrfjprog', '--program', NRF5340_APP_ONLY_HEX, '--sectorerase',
  123. '-f', 'NRF53', '--snr', TEST_DEF_SNR, '--coprocessor', 'CP_APPLICATION'],
  124. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR]),
  125. TC('NRF53', 'APP', False, False, False, True):
  126. (['nrfjprog', '--program', NRF5340_APP_ONLY_HEX, '--chiperase',
  127. '-f', 'NRF53', '--snr', TEST_DEF_SNR, '--coprocessor', 'CP_APPLICATION'],
  128. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR]),
  129. TC('NRF53', 'APP', False, False, True, False):
  130. (['nrfjprog', '--program', NRF5340_APP_ONLY_HEX, '--sectorerase',
  131. '-f', 'NRF53', '--snr', TEST_OVR_SNR, '--coprocessor', 'CP_APPLICATION'],
  132. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_OVR_SNR]),
  133. TC('NRF53', 'APP', False, True, False, False):
  134. (['nrfjprog', '--program', NRF5340_APP_ONLY_HEX, '--sectorerase',
  135. '-f', 'NRF53', '--snr', TEST_DEF_SNR, '--coprocessor', 'CP_APPLICATION'],
  136. ['nrfjprog', '--reset', '-f', 'NRF53', '--snr', TEST_DEF_SNR]),
  137. TC('NRF53', 'APP', True, False, False, False):
  138. (['nrfjprog', '--recover', '-f', 'NRF53', '--coprocessor', 'CP_NETWORK',
  139. '--snr', TEST_DEF_SNR],
  140. ['nrfjprog', '--recover', '-f', 'NRF53', '--snr', TEST_DEF_SNR],
  141. ['nrfjprog', '--program', NRF5340_APP_ONLY_HEX, '--sectorerase',
  142. '-f', 'NRF53', '--snr', TEST_DEF_SNR, '--coprocessor', 'CP_APPLICATION'],
  143. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR]),
  144. TC('NRF53', 'APP', True, True, True, True):
  145. (['nrfjprog', '--recover', '-f', 'NRF53', '--coprocessor', 'CP_NETWORK',
  146. '--snr', TEST_OVR_SNR],
  147. ['nrfjprog', '--recover', '-f', 'NRF53', '--snr', TEST_OVR_SNR],
  148. ['nrfjprog', '--program', NRF5340_APP_ONLY_HEX, '--chiperase',
  149. '-f', 'NRF53', '--snr', TEST_OVR_SNR, '--coprocessor', 'CP_APPLICATION'],
  150. ['nrfjprog', '--reset', '-f', 'NRF53', '--snr', TEST_OVR_SNR]),
  151. # -------------------------------------------------------------------------
  152. # NRF53 NET only
  153. #
  154. # family CP recov soft snr erase
  155. TC('NRF53', 'NET', False, False, False, False):
  156. (['nrfjprog', '--program', NRF5340_NET_ONLY_HEX, '--sectorerase',
  157. '-f', 'NRF53', '--snr', TEST_DEF_SNR, '--coprocessor', 'CP_NETWORK'],
  158. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR]),
  159. TC('NRF53', 'NET', False, False, False, True):
  160. (['nrfjprog', '--program', NRF5340_NET_ONLY_HEX, '--chiperase',
  161. '-f', 'NRF53', '--snr', TEST_DEF_SNR, '--coprocessor', 'CP_NETWORK'],
  162. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR]),
  163. TC('NRF53', 'NET', False, False, True, False):
  164. (['nrfjprog', '--program', NRF5340_NET_ONLY_HEX, '--sectorerase',
  165. '-f', 'NRF53', '--snr', TEST_OVR_SNR, '--coprocessor', 'CP_NETWORK'],
  166. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_OVR_SNR]),
  167. TC('NRF53', 'NET', False, True, False, False):
  168. (['nrfjprog', '--program', NRF5340_NET_ONLY_HEX, '--sectorerase',
  169. '-f', 'NRF53', '--snr', TEST_DEF_SNR, '--coprocessor', 'CP_NETWORK'],
  170. ['nrfjprog', '--reset', '-f', 'NRF53', '--snr', TEST_DEF_SNR]),
  171. TC('NRF53', 'NET', True, False, False, False):
  172. (['nrfjprog', '--recover', '-f', 'NRF53', '--coprocessor', 'CP_NETWORK',
  173. '--snr', TEST_DEF_SNR],
  174. ['nrfjprog', '--recover', '-f', 'NRF53', '--snr', TEST_DEF_SNR],
  175. ['nrfjprog', '--program', NRF5340_NET_ONLY_HEX, '--sectorerase',
  176. '-f', 'NRF53', '--snr', TEST_DEF_SNR, '--coprocessor', 'CP_NETWORK'],
  177. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR]),
  178. TC('NRF53', 'NET', True, True, True, True):
  179. (['nrfjprog', '--recover', '-f', 'NRF53', '--coprocessor', 'CP_NETWORK',
  180. '--snr', TEST_OVR_SNR],
  181. ['nrfjprog', '--recover', '-f', 'NRF53', '--snr', TEST_OVR_SNR],
  182. ['nrfjprog', '--program', NRF5340_NET_ONLY_HEX, '--chiperase',
  183. '-f', 'NRF53', '--snr', TEST_OVR_SNR, '--coprocessor', 'CP_NETWORK'],
  184. ['nrfjprog', '--reset', '-f', 'NRF53', '--snr', TEST_OVR_SNR]),
  185. # -------------------------------------------------------------------------
  186. # NRF53 APP+NET
  187. #
  188. # family CP recov soft snr erase
  189. TC('NRF53', 'APP+NET', False, False, False, False):
  190. (lambda tmpdir, infile: \
  191. (['nrfjprog',
  192. '--program',
  193. os.fspath(tmpdir / 'GENERATED_CP_NETWORK_' + Path(infile).name),
  194. '--sectorerase', '-f', 'NRF53', '--snr', TEST_DEF_SNR,
  195. '--coprocessor', 'CP_NETWORK'],
  196. ['nrfjprog',
  197. '--program',
  198. os.fspath(tmpdir / 'GENERATED_CP_APPLICATION_' + Path(infile).name),
  199. '--sectorerase', '-f', 'NRF53', '--snr', TEST_DEF_SNR,
  200. '--coprocessor', 'CP_APPLICATION'],
  201. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR])),
  202. TC('NRF53', 'APP+NET', False, False, False, True):
  203. (lambda tmpdir, infile: \
  204. (['nrfjprog',
  205. '--program',
  206. os.fspath(tmpdir / 'GENERATED_CP_NETWORK_' + Path(infile).name),
  207. '--chiperase', '-f', 'NRF53', '--snr', TEST_DEF_SNR,
  208. '--coprocessor', 'CP_NETWORK'],
  209. ['nrfjprog',
  210. '--program',
  211. os.fspath(tmpdir / 'GENERATED_CP_APPLICATION_' + Path(infile).name),
  212. '--chiperase', '-f', 'NRF53', '--snr', TEST_DEF_SNR,
  213. '--coprocessor', 'CP_APPLICATION'],
  214. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR])),
  215. TC('NRF53', 'APP+NET', False, False, True, False):
  216. (lambda tmpdir, infile: \
  217. (['nrfjprog',
  218. '--program',
  219. os.fspath(tmpdir / 'GENERATED_CP_NETWORK_' + Path(infile).name),
  220. '--sectorerase', '-f', 'NRF53', '--snr', TEST_OVR_SNR,
  221. '--coprocessor', 'CP_NETWORK'],
  222. ['nrfjprog',
  223. '--program',
  224. os.fspath(tmpdir / 'GENERATED_CP_APPLICATION_' + Path(infile).name),
  225. '--sectorerase', '-f', 'NRF53', '--snr', TEST_OVR_SNR,
  226. '--coprocessor', 'CP_APPLICATION'],
  227. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_OVR_SNR])),
  228. TC('NRF53', 'APP+NET', False, True, False, False):
  229. (lambda tmpdir, infile: \
  230. (['nrfjprog',
  231. '--program',
  232. os.fspath(tmpdir / 'GENERATED_CP_NETWORK_' + Path(infile).name),
  233. '--sectorerase', '-f', 'NRF53', '--snr', TEST_DEF_SNR,
  234. '--coprocessor', 'CP_NETWORK'],
  235. ['nrfjprog',
  236. '--program',
  237. os.fspath(tmpdir / 'GENERATED_CP_APPLICATION_' + Path(infile).name),
  238. '--sectorerase', '-f', 'NRF53', '--snr', TEST_DEF_SNR,
  239. '--coprocessor', 'CP_APPLICATION'],
  240. ['nrfjprog', '--reset', '-f', 'NRF53', '--snr', TEST_DEF_SNR])),
  241. TC('NRF53', 'APP+NET', True, False, False, False):
  242. (lambda tmpdir, infile: \
  243. (['nrfjprog', '--recover', '-f', 'NRF53', '--coprocessor', 'CP_NETWORK',
  244. '--snr', TEST_DEF_SNR],
  245. ['nrfjprog', '--recover', '-f', 'NRF53', '--snr', TEST_DEF_SNR],
  246. ['nrfjprog',
  247. '--program',
  248. os.fspath(tmpdir / 'GENERATED_CP_NETWORK_' + Path(infile).name),
  249. '--sectorerase', '-f', 'NRF53', '--snr', TEST_DEF_SNR,
  250. '--coprocessor', 'CP_NETWORK'],
  251. ['nrfjprog',
  252. '--program',
  253. os.fspath(tmpdir / 'GENERATED_CP_APPLICATION_' + Path(infile).name),
  254. '--sectorerase', '-f', 'NRF53', '--snr', TEST_DEF_SNR,
  255. '--coprocessor', 'CP_APPLICATION'],
  256. ['nrfjprog', '--pinreset', '-f', 'NRF53', '--snr', TEST_DEF_SNR])),
  257. TC('NRF53', 'APP+NET', True, True, True, True):
  258. (lambda tmpdir, infile: \
  259. (['nrfjprog', '--recover', '-f', 'NRF53', '--coprocessor', 'CP_NETWORK',
  260. '--snr', TEST_OVR_SNR],
  261. ['nrfjprog', '--recover', '-f', 'NRF53', '--snr', TEST_OVR_SNR],
  262. ['nrfjprog',
  263. '--program',
  264. os.fspath(tmpdir / 'GENERATED_CP_NETWORK_' + Path(infile).name),
  265. '--chiperase', '-f', 'NRF53', '--snr', TEST_OVR_SNR,
  266. '--coprocessor', 'CP_NETWORK'],
  267. ['nrfjprog',
  268. '--program',
  269. os.fspath(tmpdir / 'GENERATED_CP_APPLICATION_' + Path(infile).name),
  270. '--chiperase', '-f', 'NRF53', '--snr', TEST_OVR_SNR,
  271. '--coprocessor', 'CP_APPLICATION'],
  272. ['nrfjprog', '--reset', '-f', 'NRF53', '--snr', TEST_OVR_SNR])),
  273. # -------------------------------------------------------------------------
  274. # NRF91
  275. #
  276. # family CP recov soft snr erase
  277. TC('NRF91', None, False, False, False, False):
  278. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectorerase', '-f', 'NRF91',
  279. '--snr', TEST_DEF_SNR],
  280. ['nrfjprog', '--pinreset', '-f', 'NRF91', '--snr', TEST_DEF_SNR]),
  281. TC('NRF91', None, False, False, False, True):
  282. (['nrfjprog', '--program', RC_KERNEL_HEX, '--chiperase', '-f', 'NRF91',
  283. '--snr', TEST_DEF_SNR],
  284. ['nrfjprog', '--pinreset', '-f', 'NRF91', '--snr', TEST_DEF_SNR]),
  285. TC('NRF91', None, False, False, True, False):
  286. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectorerase', '-f', 'NRF91',
  287. '--snr', TEST_OVR_SNR],
  288. ['nrfjprog', '--pinreset', '-f', 'NRF91', '--snr', TEST_OVR_SNR]),
  289. TC('NRF91', None, False, True, False, False):
  290. (['nrfjprog', '--program', RC_KERNEL_HEX, '--sectorerase', '-f', 'NRF91',
  291. '--snr', TEST_DEF_SNR],
  292. ['nrfjprog', '--reset', '-f', 'NRF91', '--snr', TEST_DEF_SNR]),
  293. TC('NRF91', None, True, False, False, False):
  294. (['nrfjprog', '--recover', '-f', 'NRF91', '--snr', TEST_DEF_SNR],
  295. ['nrfjprog', '--program', RC_KERNEL_HEX, '--sectorerase', '-f', 'NRF91',
  296. '--snr', TEST_DEF_SNR],
  297. ['nrfjprog', '--pinreset', '-f', 'NRF91', '--snr', TEST_DEF_SNR]),
  298. TC('NRF91', None, True, True, True, True):
  299. (['nrfjprog', '--recover', '-f', 'NRF91', '--snr', TEST_OVR_SNR],
  300. ['nrfjprog', '--program', RC_KERNEL_HEX, '--chiperase', '-f', 'NRF91',
  301. '--snr', TEST_OVR_SNR],
  302. ['nrfjprog', '--reset', '-f', 'NRF91', '--snr', TEST_OVR_SNR]),
  303. }
  304. #
  305. # Monkey-patches
  306. #
  307. def get_board_snr_patch(glob):
  308. return TEST_DEF_SNR
  309. def require_patch(program):
  310. assert program == 'nrfjprog'
  311. os_path_isfile = os.path.isfile
  312. def os_path_isfile_patch(filename):
  313. if filename == RC_KERNEL_HEX:
  314. return True
  315. return os_path_isfile(filename)
  316. #
  317. # Test functions.
  318. #
  319. # These are white box tests that rely on the above monkey-patches.
  320. #
  321. def id_fn(test_case):
  322. if test_case.coprocessor is None:
  323. cp = ''
  324. else:
  325. cp = f', {test_case.coprocessor}'
  326. s = 'soft reset' if test_case.softreset else 'pin reset'
  327. sn = 'default snr' if test_case.snr else 'override snr'
  328. e = 'chip erase' if test_case.erase else 'sector[anduicr] erase'
  329. r = 'recover' if test_case.recover else 'no recover'
  330. return f'{test_case.family}{cp}, {s}, {sn}, {e}, {r}'
  331. def fix_up_runner_config(test_case, runner_config, tmpdir):
  332. # Helper that adjusts the common runner_config fixture for our
  333. # nRF-specific tests.
  334. to_replace = {}
  335. # Provide a skeletal zephyr/.config file to use as the runner's
  336. # BuildConfiguration.
  337. zephyr = tmpdir / 'zephyr'
  338. zephyr.mkdir()
  339. dotconfig = os.fspath(zephyr / '.config')
  340. with open(dotconfig, 'w') as f:
  341. f.write(f'''
  342. CONFIG_SOC_SERIES_{test_case.family}X=y
  343. ''')
  344. to_replace['build_dir'] = tmpdir
  345. if test_case.family != 'NRF53':
  346. return runner_config._replace(**to_replace)
  347. if test_case.coprocessor == 'APP':
  348. to_replace['hex_file'] = NRF5340_APP_ONLY_HEX
  349. elif test_case.coprocessor == 'NET':
  350. to_replace['hex_file'] = NRF5340_NET_ONLY_HEX
  351. elif test_case.coprocessor == 'APP+NET':
  352. # Since the runner is going to generate files next to its input
  353. # file, we need to stash a copy in a tmpdir it can use.
  354. outfile = tmpdir / Path(NRF5340_APP_AND_NET_HEX).name
  355. shutil.copyfile(NRF5340_APP_AND_NET_HEX, outfile)
  356. to_replace['hex_file'] = os.fspath(outfile)
  357. else:
  358. assert False, f'bad test case {test_case}'
  359. return runner_config._replace(**to_replace)
  360. @pytest.mark.parametrize('test_case', EXPECTED_RESULTS.keys(), ids=id_fn)
  361. @patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
  362. @patch('runners.nrfjprog.NrfJprogBinaryRunner.get_board_snr',
  363. side_effect=get_board_snr_patch)
  364. @patch('runners.nrfjprog.NrfJprogBinaryRunner.check_call')
  365. def test_nrfjprog_init(check_call, get_snr, require, test_case,
  366. runner_config, tmpdir):
  367. runner_config = fix_up_runner_config(test_case, runner_config, tmpdir)
  368. expected = EXPECTED_RESULTS[test_case]
  369. snr = TEST_OVR_SNR if test_case.snr else None
  370. runner = NrfJprogBinaryRunner(runner_config,
  371. test_case.family,
  372. test_case.softreset,
  373. snr,
  374. erase=test_case.erase,
  375. recover=test_case.recover)
  376. with patch('os.path.isfile', side_effect=os_path_isfile_patch):
  377. runner.run('flash')
  378. assert require.called
  379. if callable(expected):
  380. assert (check_call.call_args_list ==
  381. [call(x) for x in expected(tmpdir, runner_config.hex_file)])
  382. else:
  383. assert check_call.call_args_list == [call(x) for x in expected]
  384. if snr is None:
  385. get_snr.assert_called_once_with('*')
  386. else:
  387. get_snr.assert_not_called()
  388. @pytest.mark.parametrize('test_case', EXPECTED_RESULTS.keys(), ids=id_fn)
  389. @patch('runners.core.ZephyrBinaryRunner.require', side_effect=require_patch)
  390. @patch('runners.nrfjprog.NrfJprogBinaryRunner.get_board_snr',
  391. side_effect=get_board_snr_patch)
  392. @patch('runners.nrfjprog.NrfJprogBinaryRunner.check_call')
  393. def test_nrfjprog_create(check_call, get_snr, require, test_case,
  394. runner_config, tmpdir):
  395. runner_config = fix_up_runner_config(test_case, runner_config, tmpdir)
  396. expected = EXPECTED_RESULTS[test_case]
  397. args = []
  398. if test_case.softreset:
  399. args.append('--softreset')
  400. if test_case.snr:
  401. args.extend(['--snr', TEST_OVR_SNR])
  402. if test_case.erase:
  403. args.append('--erase')
  404. if test_case.recover:
  405. args.append('--recover')
  406. parser = argparse.ArgumentParser()
  407. NrfJprogBinaryRunner.add_parser(parser)
  408. arg_namespace = parser.parse_args(args)
  409. runner = NrfJprogBinaryRunner.create(runner_config, arg_namespace)
  410. with patch('os.path.isfile', side_effect=os_path_isfile_patch):
  411. runner.run('flash')
  412. assert require.called
  413. if callable(expected):
  414. assert (check_call.call_args_list ==
  415. [call(x) for x in expected(tmpdir, runner_config.hex_file)])
  416. else:
  417. assert check_call.call_args_list == [call(x) for x in expected]
  418. if not test_case.snr:
  419. get_snr.assert_called_once_with('*')
  420. else:
  421. get_snr.assert_not_called()