efuse_tests.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #!/usr/bin/env python
  2. from __future__ import print_function, division
  3. import unittest
  4. import sys
  5. try:
  6. import efuse_table_gen
  7. except ImportError:
  8. sys.path.append("..")
  9. import efuse_table_gen
  10. '''
  11. To run the test on local PC:
  12. cd ~/esp/esp-idf/components/efuse/test_efuse_host/
  13. ./efuse_tests.py
  14. '''
  15. class Py23TestCase(unittest.TestCase):
  16. def __init__(self, *args, **kwargs):
  17. super(Py23TestCase, self).__init__(*args, **kwargs)
  18. try:
  19. self.assertRaisesRegex
  20. except AttributeError:
  21. # assertRaisesRegexp is deprecated in Python3 but assertRaisesRegex doesn't exist in Python2
  22. # This fix is used in order to avoid using the alias from the six library
  23. self.assertRaisesRegex = self.assertRaisesRegexp
  24. class CSVParserTests(Py23TestCase):
  25. def test_general(self):
  26. csv = """
  27. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  28. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  29. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  30. """
  31. t = efuse_table_gen.FuseTable.from_csv(csv)
  32. t.verify()
  33. self.assertEqual(t[0].field_name, 'name1')
  34. self.assertEqual(t[0].efuse_block, 'EFUSE_BLK3')
  35. self.assertEqual(t[0].bit_start, 0)
  36. self.assertEqual(t[0].bit_count, 5)
  37. self.assertEqual(t[0].comment, 'Use for test name 1')
  38. self.assertEqual(t[1].field_name, 'name2')
  39. self.assertEqual(t[1].efuse_block, 'EFUSE_BLK3')
  40. self.assertEqual(t[1].bit_start, 5)
  41. self.assertEqual(t[1].bit_count, 4)
  42. self.assertEqual(t[1].comment, 'Use for test name 2')
  43. def test_seq_bit_start1_fill(self):
  44. csv = """
  45. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  46. name1, EFUSE_BLK3, , 5,
  47. name2, EFUSE_BLK3, , 4,
  48. """
  49. t = efuse_table_gen.FuseTable.from_csv(csv)
  50. t.verify()
  51. self.assertEqual(t[0].field_name, 'name1')
  52. self.assertEqual(t[0].bit_start, 0)
  53. self.assertEqual(t[0].bit_count, 5)
  54. self.assertEqual(t[1].field_name, 'name2')
  55. self.assertEqual(t[1].bit_start, 5)
  56. self.assertEqual(t[1].bit_count, 4)
  57. def test_seq_bit_start2_fill(self):
  58. csv = """
  59. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  60. name1, EFUSE_BLK3, , 5,
  61. name2, EFUSE_BLK2, , 4,
  62. """
  63. t = efuse_table_gen.FuseTable.from_csv(csv)
  64. t.verify()
  65. self.assertEqual(t[0].field_name, 'name1')
  66. self.assertEqual(t[0].bit_start, 0)
  67. self.assertEqual(t[0].bit_count, 5)
  68. self.assertEqual(t[1].field_name, 'name2')
  69. self.assertEqual(t[1].bit_start, 0)
  70. self.assertEqual(t[1].bit_count, 4)
  71. def test_seq_bit_start3_fill(self):
  72. csv = """
  73. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  74. name1, EFUSE_BLK3, , 5,
  75. name2, EFUSE_BLK2, , 4,
  76. name3, EFUSE_BLK2, 5, 4,
  77. """
  78. t = efuse_table_gen.FuseTable.from_csv(csv)
  79. t.verify()
  80. self.assertEqual(t[0].field_name, 'name1')
  81. self.assertEqual(t[0].bit_start, 0)
  82. self.assertEqual(t[0].bit_count, 5)
  83. self.assertEqual(t[1].field_name, 'name2')
  84. self.assertEqual(t[1].bit_start, 0)
  85. self.assertEqual(t[1].bit_count, 4)
  86. self.assertEqual(t[2].field_name, 'name3')
  87. self.assertEqual(t[2].bit_start, 5)
  88. self.assertEqual(t[2].bit_count, 4)
  89. def test_seq_bit_start4_fill(self):
  90. csv = """
  91. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  92. name1, EFUSE_BLK3, , 5,
  93. name2, EFUSE_BLK2, , 4,
  94. , EFUSE_BLK2, , 4,
  95. name1, EFUSE_BLK3, , 5,
  96. """
  97. with self.assertRaisesRegex(efuse_table_gen.InputError, "Field names must be unique"):
  98. efuse_table_gen.FuseTable.from_csv(csv)
  99. def test_seq_bit_start5_fill(self):
  100. csv = """
  101. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  102. name1, EFUSE_BLK3, , 5,
  103. name2, EFUSE_BLK2, , 4,
  104. , EFUSE_BLK2, , 4,
  105. name3, EFUSE_BLK3, 5, 5,
  106. """
  107. t = efuse_table_gen.FuseTable.from_csv(csv)
  108. t.verify()
  109. self.assertEqual(t[0].field_name, 'name1')
  110. self.assertEqual(t[0].bit_start, 0)
  111. self.assertEqual(t[0].bit_count, 5)
  112. self.assertEqual(t[1].field_name, 'name2')
  113. self.assertEqual(t[1].bit_start, 0)
  114. self.assertEqual(t[1].bit_count, 4)
  115. self.assertEqual(t[2].field_name, 'name2')
  116. self.assertEqual(t[2].bit_start, 4)
  117. self.assertEqual(t[2].bit_count, 4)
  118. self.assertEqual(t[3].field_name, 'name3')
  119. self.assertEqual(t[3].bit_start, 5)
  120. self.assertEqual(t[3].bit_count, 5)
  121. def test_overlapping_bit_start_fail(self):
  122. csv = """
  123. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  124. name1, EFUSE_BLK3, 1, 5, Use for test name 1
  125. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  126. """
  127. t = efuse_table_gen.FuseTable.from_csv(csv)
  128. with self.assertRaisesRegex(efuse_table_gen.InputError, "overlap"):
  129. t.verify()
  130. def test_empty_field_name_fail(self):
  131. csv = """
  132. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  133. , EFUSE_BLK3, , 5,
  134. name2, EFUSE_BLK2, , 4,
  135. """
  136. with self.assertRaisesRegex(efuse_table_gen.InputError, "missing field name"):
  137. efuse_table_gen.FuseTable.from_csv(csv)
  138. def test_unique_field_name_fail(self):
  139. csv = """
  140. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  141. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  142. name1, EFUSE_BLK3, 5, 4, Use for test name 2
  143. """
  144. with self.assertRaisesRegex(efuse_table_gen.InputError, "Field names must be unique"):
  145. efuse_table_gen.FuseTable.from_csv(csv)
  146. def test_bit_count_empty_fail(self):
  147. csv = """
  148. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  149. name1, EFUSE_BLK3, 0, , Use for test name 1
  150. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  151. """
  152. with self.assertRaisesRegex(efuse_table_gen.InputError, "empty"):
  153. efuse_table_gen.FuseTable.from_csv(csv)
  154. def test_bit_start_num_fail(self):
  155. csv = """
  156. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  157. name1, EFUSE_BLK3, k, 5, Use for test name 1
  158. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  159. """
  160. with self.assertRaisesRegex(efuse_table_gen.InputError, "Invalid field value"):
  161. efuse_table_gen.FuseTable.from_csv(csv)
  162. def test_join_entry(self):
  163. csv = """
  164. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  165. name1, EFUSE_BLK2, 0, 6, Use for test name 1
  166. name2, EFUSE_BLK2, 6, 5, Use for test name 2
  167. name3, EFUSE_BLK3, 20, 5, Use for test name 3
  168. , EFUSE_BLK3, 30, 5, Use for test name 3
  169. name4, EFUSE_BLK2, 30, 5, Use for test name 4
  170. """
  171. t = efuse_table_gen.FuseTable.from_csv(csv)
  172. t.verify()
  173. self.assertEqual(t[0].field_name, 'name1')
  174. self.assertEqual(t[0].efuse_block, 'EFUSE_BLK2')
  175. self.assertEqual(t[0].bit_start, 0)
  176. self.assertEqual(t[0].bit_count, 6)
  177. self.assertEqual(t[1].field_name, 'name2')
  178. self.assertEqual(t[1].efuse_block, 'EFUSE_BLK2')
  179. self.assertEqual(t[1].bit_start, 6)
  180. self.assertEqual(t[1].bit_count, 5)
  181. self.assertEqual(t[2].field_name, 'name3')
  182. self.assertEqual(t[2].efuse_block, 'EFUSE_BLK3')
  183. self.assertEqual(t[2].bit_start, 20)
  184. self.assertEqual(t[2].bit_count, 5)
  185. self.assertEqual(t[3].field_name, 'name3')
  186. self.assertEqual(t[3].efuse_block, 'EFUSE_BLK3')
  187. self.assertEqual(t[3].bit_start, 30)
  188. self.assertEqual(t[3].bit_count, 5)
  189. self.assertEqual(t[4].field_name, 'name4')
  190. self.assertEqual(t[4].efuse_block, 'EFUSE_BLK2')
  191. self.assertEqual(t[4].bit_start, 30)
  192. self.assertEqual(t[4].bit_count, 5)
  193. def test_block_fail(self):
  194. csv = """
  195. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  196. name1, EFUSE_BLK5, 0, 5, Use for test name 1
  197. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  198. """
  199. with self.assertRaisesRegex(efuse_table_gen.InputError, "'efuse_block' should be one of EFUSE_BLK0..EFUSE_BLK3"):
  200. efuse_table_gen.FuseTable.from_csv(csv)
  201. def test_field_size_is_ok(self):
  202. csv = """
  203. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  204. name1, EFUSE_BLK0, 0, 224, Use for test name 1
  205. name2, EFUSE_BLK1, 0, 256, Use for test name 2
  206. """
  207. efuse_table_gen.max_blk_len = 256
  208. t = efuse_table_gen.FuseTable.from_csv(csv)
  209. t.verify()
  210. def test_field_blk3_size_is_more(self):
  211. csv = """
  212. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  213. name1, EFUSE_BLK3, 190, 1, Use for test name 1
  214. name2, EFUSE_BLK3, 191, 5, Use for test name 2
  215. """
  216. efuse_table_gen.max_blk_len = 192
  217. t = efuse_table_gen.FuseTable.from_csv(csv)
  218. with self.assertRaisesRegex(efuse_table_gen.InputError, "The field is outside the boundaries"):
  219. t.verify()
  220. def test_field_blk1_size_is_more(self):
  221. csv = """
  222. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  223. name1, EFUSE_BLK0, 0, 224, Use for test name 1
  224. name2, EFUSE_BLK1, 1, 256, Use for test name 2
  225. """
  226. t = efuse_table_gen.FuseTable.from_csv(csv)
  227. with self.assertRaisesRegex(efuse_table_gen.InputError, "The field is outside the boundaries"):
  228. t.verify()
  229. class VerificationTests(Py23TestCase):
  230. def test_general(self):
  231. csv = """
  232. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  233. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  234. name2, EFUSE_BLK3, 5, 4, Use for test name 2
  235. name1_1, EFUSE_BLK2, 0, 5, Use for test name 1_1
  236. name2_1, EFUSE_BLK2, 5, 4, Use for test name 2_1
  237. """
  238. t = efuse_table_gen.FuseTable.from_csv(csv)
  239. t.verify()
  240. self.assertEqual(t[0].field_name, 'name1')
  241. self.assertEqual(t[0].efuse_block, 'EFUSE_BLK3')
  242. self.assertEqual(t[0].bit_start, 0)
  243. self.assertEqual(t[0].bit_count, 5)
  244. self.assertEqual(t[1].field_name, 'name2')
  245. self.assertEqual(t[1].efuse_block, 'EFUSE_BLK3')
  246. self.assertEqual(t[1].bit_start, 5)
  247. self.assertEqual(t[1].bit_count, 4)
  248. self.assertEqual(t[2].field_name, 'name1_1')
  249. self.assertEqual(t[2].efuse_block, 'EFUSE_BLK2')
  250. self.assertEqual(t[2].bit_start, 0)
  251. self.assertEqual(t[2].bit_count, 5)
  252. self.assertEqual(t[3].field_name, 'name2_1')
  253. self.assertEqual(t[3].efuse_block, 'EFUSE_BLK2')
  254. self.assertEqual(t[3].bit_start, 5)
  255. self.assertEqual(t[3].bit_count, 4)
  256. def test_custom_use_only_BLK3(self):
  257. csv = """
  258. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  259. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  260. name2, EFUSE_BLK2, 5, 4, Use for test name 2
  261. """
  262. t = efuse_table_gen.FuseTable.from_csv(csv)
  263. with self.assertRaisesRegex(efuse_table_gen.ValidationError, "custom_table should use only EFUSE_BLK3"):
  264. t.verify("custom_table")
  265. def test_common_and_custom_table_use_the_same_bits(self):
  266. csv_common = """
  267. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  268. name1, EFUSE_BLK3, 0, 5, Use for test name 1
  269. name2, EFUSE_BLK2, 5, 4, Use for test name 2
  270. """
  271. common_table = efuse_table_gen.FuseTable.from_csv(csv_common)
  272. common_table.verify("common_table")
  273. two_tables = common_table
  274. csv_custom = """
  275. # field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK3), bit_start(0..255), bit_count, comment
  276. name3, EFUSE_BLK3, 20, 5, Use for test name 1
  277. name4, EFUSE_BLK3, 4, 1, Use for test name 2
  278. """
  279. custom_table = efuse_table_gen.FuseTable.from_csv(csv_custom)
  280. custom_table.verify("custom_table")
  281. two_tables += custom_table
  282. with self.assertRaisesRegex(efuse_table_gen.InputError, "overlaps"):
  283. two_tables.verify()
  284. if __name__ == "__main__":
  285. unittest.main()