efuse_tests.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. #!/usr/bin/env python
  2. # SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
  3. # SPDX-License-Identifier: Apache-2.0
  4. from __future__ import division, print_function
  5. import sys
  6. import unittest
  7. try:
  8. import efuse_table_gen
  9. except ImportError:
  10. sys.path.append('..')
  11. import efuse_table_gen
  12. '''
  13. To run the test on local PC:
  14. cd ~/esp/esp-idf/components/efuse/test_efuse_host/
  15. ./efuse_tests.py
  16. '''
  17. class Py23TestCase(unittest.TestCase):
  18. def __init__(self, *args, **kwargs):
  19. super(Py23TestCase, self).__init__(*args, **kwargs)
  20. try:
  21. self.assertRaisesRegex
  22. except AttributeError:
  23. # assertRaisesRegexp is deprecated in Python3 but assertRaisesRegex doesn't exist in Python2
  24. # This fix is used in order to avoid using the alias from the six library
  25. self.assertRaisesRegex = self.assertRaisesRegexp
  26. class CSVParserTests(Py23TestCase):
  27. def test_general(self):
  28. csv = """
  29. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  30. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  31. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  32. """
  33. t = efuse_table_gen.FuseTable.from_csv(csv)
  34. t.verify()
  35. self.assertEqual(t[0].field_name, 'name1')
  36. self.assertEqual(t[0].efuse_block, 'EFUSE_BLK3')
  37. self.assertEqual(t[0].bit_start, 0)
  38. self.assertEqual(t[0].bit_count, 5)
  39. self.assertEqual(t[0].comment, 'Use for test name 1')
  40. self.assertEqual(t[1].field_name, 'name2')
  41. self.assertEqual(t[1].efuse_block, 'EFUSE_BLK3')
  42. self.assertEqual(t[1].bit_start, 5)
  43. self.assertEqual(t[1].bit_count, 4)
  44. self.assertEqual(t[1].comment, 'Use for test name 2')
  45. def test_seq_bit_start1_fill(self):
  46. csv = """
  47. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  48. name1, EFUSE_BLK3, , 5,
  49. name2, EFUSE_BLK3, , 4,
  50. """
  51. t = efuse_table_gen.FuseTable.from_csv(csv)
  52. t.verify()
  53. self.assertEqual(t[0].field_name, 'name1')
  54. self.assertEqual(t[0].bit_start, 0)
  55. self.assertEqual(t[0].bit_count, 5)
  56. self.assertEqual(t[1].field_name, 'name2')
  57. self.assertEqual(t[1].bit_start, 5)
  58. self.assertEqual(t[1].bit_count, 4)
  59. def test_seq_bit_start2_fill(self):
  60. csv = """
  61. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  62. name1, EFUSE_BLK3, , 5,
  63. name2, EFUSE_BLK2, , 4,
  64. """
  65. t = efuse_table_gen.FuseTable.from_csv(csv)
  66. t.verify()
  67. self.assertEqual(t[0].field_name, 'name1')
  68. self.assertEqual(t[0].bit_start, 0)
  69. self.assertEqual(t[0].bit_count, 5)
  70. self.assertEqual(t[1].field_name, 'name2')
  71. self.assertEqual(t[1].bit_start, 0)
  72. self.assertEqual(t[1].bit_count, 4)
  73. def test_seq_bit_start3_fill(self):
  74. csv = """
  75. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  76. name1, EFUSE_BLK3, , 5,
  77. name2, EFUSE_BLK2, , 4,
  78. name3, EFUSE_BLK2, 5, 4,
  79. """
  80. t = efuse_table_gen.FuseTable.from_csv(csv)
  81. t.verify()
  82. self.assertEqual(t[0].field_name, 'name1')
  83. self.assertEqual(t[0].bit_start, 0)
  84. self.assertEqual(t[0].bit_count, 5)
  85. self.assertEqual(t[1].field_name, 'name2')
  86. self.assertEqual(t[1].bit_start, 0)
  87. self.assertEqual(t[1].bit_count, 4)
  88. self.assertEqual(t[2].field_name, 'name3')
  89. self.assertEqual(t[2].bit_start, 5)
  90. self.assertEqual(t[2].bit_count, 4)
  91. def test_seq_bit_start4_fill(self):
  92. csv = """
  93. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  94. name1, EFUSE_BLK3, , 5,
  95. name2, EFUSE_BLK2, , 4,
  96. , EFUSE_BLK2, , 4,
  97. name1, EFUSE_BLK3, , 5,
  98. """
  99. with self.assertRaisesRegex(efuse_table_gen.InputError, 'Field names must be unique'):
  100. efuse_table_gen.FuseTable.from_csv(csv)
  101. def test_seq_bit_start5_fill(self):
  102. csv = """
  103. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  104. name1, EFUSE_BLK3, , 5,
  105. name2, EFUSE_BLK2, , 4,
  106. , EFUSE_BLK2, , 4,
  107. name3, EFUSE_BLK3, 5, 5,
  108. """
  109. t = efuse_table_gen.FuseTable.from_csv(csv)
  110. t.verify()
  111. self.assertEqual(t[0].field_name, 'name1')
  112. self.assertEqual(t[0].bit_start, 0)
  113. self.assertEqual(t[0].bit_count, 5)
  114. self.assertEqual(t[1].field_name, 'name2')
  115. self.assertEqual(t[1].bit_start, 0)
  116. self.assertEqual(t[1].bit_count, 4)
  117. self.assertEqual(t[2].field_name, 'name2')
  118. self.assertEqual(t[2].bit_start, 4)
  119. self.assertEqual(t[2].bit_count, 4)
  120. self.assertEqual(t[3].field_name, 'name3')
  121. self.assertEqual(t[3].bit_start, 5)
  122. self.assertEqual(t[3].bit_count, 5)
  123. def test_overlapping_bit_start_fail(self):
  124. csv = """
  125. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  126. name1, EFUSE_BLK3, 1, 5, Use for test name 1
  127. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  128. """
  129. t = efuse_table_gen.FuseTable.from_csv(csv)
  130. with self.assertRaisesRegex(efuse_table_gen.InputError, 'intersected with'):
  131. t.verify()
  132. def test_empty_field_name_fail(self):
  133. csv = """
  134. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  135. , EFUSE_BLK3, , 5,
  136. name2, EFUSE_BLK2, , 4,
  137. """
  138. with self.assertRaisesRegex(efuse_table_gen.InputError, 'missing field name'):
  139. efuse_table_gen.FuseTable.from_csv(csv)
  140. def test_unique_field_name_fail(self):
  141. csv = """
  142. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  143. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  144. name1, EFUSE_BLK3, 5, 4, Use for test name 2
  145. """
  146. with self.assertRaisesRegex(efuse_table_gen.InputError, 'Field names must be unique'):
  147. efuse_table_gen.FuseTable.from_csv(csv)
  148. def test_bit_count_empty_fail(self):
  149. csv = """
  150. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  151. name1, EFUSE_BLK3, 0, , Use for test name 1
  152. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  153. """
  154. with self.assertRaisesRegex(efuse_table_gen.InputError, 'empty'):
  155. efuse_table_gen.FuseTable.from_csv(csv)
  156. def test_bit_start_num_fail(self):
  157. csv = """
  158. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  159. name1, EFUSE_BLK3, k, 5, Use for test name 1
  160. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  161. """
  162. with self.assertRaisesRegex(efuse_table_gen.InputError, 'Invalid field value'):
  163. efuse_table_gen.FuseTable.from_csv(csv)
  164. def test_join_entry(self):
  165. csv = """
  166. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  167. name1, EFUSE_BLK2, 0, 6, Use for test name 1
  168. name2, EFUSE_BLK2, 6, 5, Use for test name 2
  169. name3, EFUSE_BLK3, 20, 5, Use for test name 3
  170. , EFUSE_BLK3, 30, 5, Use for test name 3
  171. name4, EFUSE_BLK2, 30, 5, Use for test name 4
  172. """
  173. t = efuse_table_gen.FuseTable.from_csv(csv)
  174. t.verify()
  175. self.assertEqual(t[0].field_name, 'name1')
  176. self.assertEqual(t[0].efuse_block, 'EFUSE_BLK2')
  177. self.assertEqual(t[0].bit_start, 0)
  178. self.assertEqual(t[0].bit_count, 6)
  179. self.assertEqual(t[1].field_name, 'name2')
  180. self.assertEqual(t[1].efuse_block, 'EFUSE_BLK2')
  181. self.assertEqual(t[1].bit_start, 6)
  182. self.assertEqual(t[1].bit_count, 5)
  183. self.assertEqual(t[2].field_name, 'name3')
  184. self.assertEqual(t[2].efuse_block, 'EFUSE_BLK3')
  185. self.assertEqual(t[2].bit_start, 20)
  186. self.assertEqual(t[2].bit_count, 5)
  187. self.assertEqual(t[3].field_name, 'name3')
  188. self.assertEqual(t[3].efuse_block, 'EFUSE_BLK3')
  189. self.assertEqual(t[3].bit_start, 30)
  190. self.assertEqual(t[3].bit_count, 5)
  191. self.assertEqual(t[4].field_name, 'name4')
  192. self.assertEqual(t[4].efuse_block, 'EFUSE_BLK2')
  193. self.assertEqual(t[4].bit_start, 30)
  194. self.assertEqual(t[4].bit_count, 5)
  195. def test_block_fail(self):
  196. csv = """
  197. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  198. name1, EFUSE_BLK5, 0, 5, Use for test name 1
  199. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  200. """
  201. with self.assertRaisesRegex(efuse_table_gen.InputError, "'efuse_block' should be one of EFUSE_BLK0..EFUSE_BLK3"):
  202. efuse_table_gen.FuseTable.from_csv(csv)
  203. def test_field_size_is_ok(self):
  204. csv = """
  205. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  206. name1, EFUSE_BLK0, 0, 224, Use for test name 1
  207. name2, EFUSE_BLK1, 0, 256, Use for test name 2
  208. """
  209. efuse_table_gen.max_blk_len = 256
  210. t = efuse_table_gen.FuseTable.from_csv(csv)
  211. t.verify()
  212. def test_field_blk3_size_is_more(self):
  213. csv = """
  214. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  215. name1, EFUSE_BLK3, 190, 1, Use for test name 1
  216. name2, EFUSE_BLK3, 191, 5, Use for test name 2
  217. """
  218. efuse_table_gen.max_blk_len = 192
  219. t = efuse_table_gen.FuseTable.from_csv(csv)
  220. with self.assertRaisesRegex(efuse_table_gen.InputError, 'The field is outside the boundaries'):
  221. t.verify()
  222. def test_field_blk1_size_is_more(self):
  223. csv = """
  224. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  225. name1, EFUSE_BLK0, 0, 224, Use for test name 1
  226. name2, EFUSE_BLK1, 1, 256, Use for test name 2
  227. """
  228. t = efuse_table_gen.FuseTable.from_csv(csv)
  229. with self.assertRaisesRegex(efuse_table_gen.InputError, 'The field is outside the boundaries'):
  230. t.verify()
  231. class VerificationTests(Py23TestCase):
  232. def test_general(self):
  233. csv = """
  234. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  235. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  236. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  237. name1_1, EFUSE_BLK2, 0, 5, Use for test name 1_1
  238. name2_1, EFUSE_BLK2, 5, 4, Use for test name 2_1
  239. """
  240. t = efuse_table_gen.FuseTable.from_csv(csv)
  241. t.verify()
  242. self.assertEqual(t[0].field_name, 'name1')
  243. self.assertEqual(t[0].efuse_block, 'EFUSE_BLK3')
  244. self.assertEqual(t[0].bit_start, 0)
  245. self.assertEqual(t[0].bit_count, 5)
  246. self.assertEqual(t[1].field_name, 'name2')
  247. self.assertEqual(t[1].efuse_block, 'EFUSE_BLK3')
  248. self.assertEqual(t[1].bit_start, 5)
  249. self.assertEqual(t[1].bit_count, 4)
  250. self.assertEqual(t[2].field_name, 'name1_1')
  251. self.assertEqual(t[2].efuse_block, 'EFUSE_BLK2')
  252. self.assertEqual(t[2].bit_start, 0)
  253. self.assertEqual(t[2].bit_count, 5)
  254. self.assertEqual(t[3].field_name, 'name2_1')
  255. self.assertEqual(t[3].efuse_block, 'EFUSE_BLK2')
  256. self.assertEqual(t[3].bit_start, 5)
  257. self.assertEqual(t[3].bit_count, 4)
  258. def test_common_and_custom_table_use_the_same_bits(self):
  259. csv_common = """
  260. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  261. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  262. name2, EFUSE_BLK2, 5, 4, Use for test name 2
  263. """
  264. common_table = efuse_table_gen.FuseTable.from_csv(csv_common)
  265. common_table.verify('common_table')
  266. two_tables = common_table
  267. csv_custom = """
  268. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  269. name3, EFUSE_BLK3, 20, 5, Use for test name 1
  270. name4, EFUSE_BLK3, 4, 1, Use for test name 2
  271. """
  272. custom_table = efuse_table_gen.FuseTable.from_csv(csv_custom)
  273. custom_table.verify('custom_table')
  274. two_tables += custom_table
  275. with self.assertRaisesRegex(efuse_table_gen.InputError, 'intersected with'):
  276. two_tables.verify()
  277. def test_common_and_custom_table_use_nested_fields(self):
  278. csv_common = """
  279. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  280. namet1, EFUSE_BLK3, 0, 5, comment
  281. namet2, EFUSE_BLK1, 8, 4, comment
  282. """
  283. common_table = efuse_table_gen.FuseTable.from_csv(csv_common)
  284. common_table.verify('common_table')
  285. two_tables = common_table
  286. csv_custom = """
  287. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  288. namet1.D1, EFUSE_BLK3, 0, 2, comment
  289. namet1.D1.D11, EFUSE_BLK3, 0, 1, comment
  290. namet1.D1.D12, EFUSE_BLK3, 1, 1, comment
  291. namet1.D2, EFUSE_BLK3, 2, 3, comment
  292. namet2.F1, EFUSE_BLK1, 9, 1, comment
  293. """
  294. custom_table = efuse_table_gen.FuseTable.from_csv(csv_custom)
  295. custom_table.verify('custom_table')
  296. two_tables += custom_table
  297. two_tables.verify()
  298. def test_common_and_custom_table_use_nested_fields2(self):
  299. csv_common = """
  300. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  301. namet3, EFUSE_BLK3, 0, 5, comment
  302. namet2, EFUSE_BLK1, 8, 4, comment
  303. """
  304. common_table = efuse_table_gen.FuseTable.from_csv(csv_common)
  305. common_table.verify('common_table')
  306. two_tables = common_table
  307. csv_custom = """
  308. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  309. namet1.D1, EFUSE_BLK3, 0, 2, comment
  310. namet1.D1.D11, EFUSE_BLK3, 0, 1, comment
  311. namet1.D1.D12, EFUSE_BLK3, 1, 1, comment
  312. namet1.D2, EFUSE_BLK3, 2, 3, comment
  313. namet2.F1, EFUSE_BLK1, 9, 1, comment
  314. """
  315. custom_table = efuse_table_gen.FuseTable.from_csv(csv_custom)
  316. custom_table.verify('custom_table')
  317. two_tables += custom_table
  318. with self.assertRaisesRegex(efuse_table_gen.InputError, 'namet1 is not found'):
  319. two_tables.verify()
  320. def test_nested_fields1(self):
  321. csv = """
  322. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  323. name1, EFUSE_BLK3, 0, 5, comment
  324. name1.D1, EFUSE_BLK3, 0, 4, comment
  325. name1.D1.D2, EFUSE_BLK3, 0, 3, comment
  326. name1.D1.D2.D3, EFUSE_BLK3, 0, 2, comment
  327. name1.D1.D2.D3.D4, EFUSE_BLK3, 0, 1, comment
  328. """
  329. t = efuse_table_gen.FuseTable.from_csv(csv)
  330. t.verify()
  331. for i in range(0, 5):
  332. self.assertEqual(t[i].bit_start, 0)
  333. self.assertEqual(t[i].bit_count, 5 - i)
  334. def test_nested_fields2(self):
  335. csv = """
  336. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  337. name1, EFUSE_BLK3, 0, 5, comment
  338. name1.D1, EFUSE_BLK3, 1, 4, comment
  339. name1.D1.D2, EFUSE_BLK3, 2, 3, comment
  340. name1.D1.D2.D3, EFUSE_BLK3, 3, 2, comment
  341. name1.D1.D2.D3.D4, EFUSE_BLK3, 4, 1, comment
  342. """
  343. t = efuse_table_gen.FuseTable.from_csv(csv)
  344. t.verify()
  345. for i in range(0, 5):
  346. self.assertEqual(t[i].bit_start, i)
  347. self.assertEqual(t[i].bit_count, 5 - i)
  348. def test_nested_fields_fail1(self):
  349. csv = """
  350. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  351. name1, EFUSE_BLK3, 0, 5, comment
  352. name1.D1, EFUSE_BLK3, 1, 4, comment
  353. name1.D1.D2, EFUSE_BLK3, 0, 1, comment
  354. """
  355. t = efuse_table_gen.FuseTable.from_csv(csv)
  356. with self.assertRaisesRegex(efuse_table_gen.InputError, 'out of range'):
  357. t.verify()
  358. def test_nested_fields_fail2(self):
  359. csv = """
  360. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  361. name1, EFUSE_BLK3, 0, 5, comment
  362. namet2, EFUSE_BLK2, 8, 4, comment
  363. namet2.F1, EFUSE_BLK2, 5, 4, comment
  364. """
  365. t = efuse_table_gen.FuseTable.from_csv(csv)
  366. with self.assertRaisesRegex(efuse_table_gen.InputError, 'intersected with'):
  367. t.verify()
  368. def test_nested_fields_fail3(self):
  369. csv = """
  370. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  371. name1, EFUSE_BLK3, 10, 5, comment
  372. name11, EFUSE_BLK3, 5, 1, comment
  373. namet2.F1, EFUSE_BLK2, 22, 1, comment
  374. """
  375. t = efuse_table_gen.FuseTable.from_csv(csv)
  376. with self.assertRaisesRegex(efuse_table_gen.InputError, 'namet2 is not found'):
  377. t.verify()
  378. def test_nested_fields_fail4(self):
  379. csv = """
  380. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  381. name1, EFUSE_BLK3, 10, 5, comment
  382. name2, EFUSE_BLK3, 5, 1, comment
  383. name2.F1, EFUSE_BLK2, 22, 1, comment
  384. """
  385. t = efuse_table_gen.FuseTable.from_csv(csv)
  386. with self.assertRaisesRegex(efuse_table_gen.InputError, 'name2 is not found'):
  387. t.verify()
  388. if __name__ == '__main__':
  389. unittest.main()