test_db.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. import checksymbolslib.db as m
  2. def test_empty_db():
  3. db = m.DB()
  4. assert str(db) == '{}'
  5. def test_one_definition():
  6. db = m.DB()
  7. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 7)
  8. assert str(db) == str({
  9. 'BR2_foo': {'definition': {'foo/Config.in': [7]}},
  10. })
  11. def test_three_definitions():
  12. db = m.DB()
  13. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 7)
  14. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 9)
  15. db.add_symbol_definition('BR2_bar', 'bar/Config.in', 5)
  16. assert str(db) == str({
  17. 'BR2_foo': {'definition': {'foo/Config.in': [7, 9]}},
  18. 'BR2_bar': {'definition': {'bar/Config.in': [5]}},
  19. })
  20. def test_definition_and_usage():
  21. db = m.DB()
  22. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 7)
  23. db.add_symbol_usage('BR2_foo', 'foo/Config.in', 9)
  24. assert str(db) == str({
  25. 'BR2_foo': {'definition': {'foo/Config.in': [7]}, 'normal usage': {'foo/Config.in': [9]}},
  26. })
  27. def test_all_entry_types():
  28. db = m.DB()
  29. db.add_symbol_choice('BR2_foo', 'foo/Config.in', 7)
  30. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 7)
  31. db.add_symbol_definition('BR2_bar', 'bar/Config.in', 700)
  32. db.add_symbol_helper('BR2_bar', 'bar/Config.in', 700)
  33. db.add_symbol_legacy_definition('BR2_baz', 'Config.in.legacy', 7000)
  34. db.add_symbol_legacy_note('BR2_baz', 'Config.in.legacy', 7001)
  35. db.add_symbol_legacy_usage('BR2_bar', 'Config.in.legacy', 7001)
  36. db.add_symbol_select('BR2_bar', 'Config.in.legacy', 7001)
  37. db.add_symbol_usage('BR2_foo', 'foo/Config.in', 9)
  38. db.add_symbol_usage_in_legacy('BR2_bar', 'Config.in.legacy', 9)
  39. db.add_symbol_virtual('BR2_foo', 'foo/Config.in', 7)
  40. assert str(db) == str({
  41. 'BR2_foo': {
  42. 'part of a choice': {'foo/Config.in': [7]},
  43. 'definition': {'foo/Config.in': [7]},
  44. 'normal usage': {'foo/Config.in': [9]},
  45. 'virtual': {'foo/Config.in': [7]}},
  46. 'BR2_bar': {
  47. 'definition': {'bar/Config.in': [700]},
  48. 'possible config helper': {'bar/Config.in': [700]},
  49. 'legacy usage': {'Config.in.legacy': [7001]},
  50. 'selected': {'Config.in.legacy': [7001]},
  51. 'usage inside legacy': {'Config.in.legacy': [9]}},
  52. 'BR2_baz': {
  53. 'legacy definition': {'Config.in.legacy': [7000]},
  54. 'legacy note': {'Config.in.legacy': [7001]}},
  55. })
  56. def test_get_symbols_with_pattern():
  57. db = m.DB()
  58. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 7)
  59. db.add_symbol_usage('BR2_foo', 'foo/Config.in', 9)
  60. db.add_symbol_definition('BR2_bar', 'bar/Config.in', 5)
  61. assert str(db) == str({
  62. 'BR2_foo': {'definition': {'foo/Config.in': [7]}, 'normal usage': {'foo/Config.in': [9]}},
  63. 'BR2_bar': {'definition': {'bar/Config.in': [5]}},
  64. })
  65. symbols = db.get_symbols_with_pattern('foo')
  66. assert str(symbols) == str({
  67. 'BR2_foo': {'definition': {'foo/Config.in': [7]}, 'normal usage': {'foo/Config.in': [9]}},
  68. })
  69. symbols = db.get_symbols_with_pattern('FOO')
  70. assert str(symbols) == str({
  71. })
  72. symbols = db.get_symbols_with_pattern('foo|FOO')
  73. assert str(symbols) == str({
  74. 'BR2_foo': {'definition': {'foo/Config.in': [7]}, 'normal usage': {'foo/Config.in': [9]}},
  75. })
  76. symbols = db.get_symbols_with_pattern('^foo')
  77. assert str(symbols) == str({
  78. })
  79. symbols = db.get_symbols_with_pattern('foo|bar')
  80. assert str(symbols) == str({
  81. 'BR2_foo': {'definition': {'foo/Config.in': [7]}, 'normal usage': {'foo/Config.in': [9]}},
  82. 'BR2_bar': {'definition': {'bar/Config.in': [5]}},
  83. })
  84. def test_get_warnings_for_choices_selected():
  85. db = m.DB()
  86. db.add_symbol_choice('BR2_foo', 'foo/Config.in', 1)
  87. db.add_symbol_choice('BR2_bar', 'bar/Config.in', 1)
  88. db.add_symbol_select('BR2_foo', 'bar/Config.in', 2)
  89. assert str(db) == str({
  90. 'BR2_foo': {'part of a choice': {'foo/Config.in': [1]}, 'selected': {'bar/Config.in': [2]}},
  91. 'BR2_bar': {'part of a choice': {'bar/Config.in': [1]}},
  92. })
  93. warnings = db.get_warnings_for_choices_selected()
  94. assert warnings == [
  95. ('bar/Config.in', 2, 'BR2_foo is part of a "choice" and should not be "select"ed'),
  96. ]
  97. def test_get_warnings_for_legacy_symbols_being_used():
  98. db = m.DB()
  99. db.add_symbol_legacy_definition('BR2_foo', 'Config.in.legacy', 1)
  100. db.add_symbol_usage('BR2_foo', 'bar/Config.in', 2)
  101. db.add_symbol_legacy_definition('BR2_bar', 'Config.in.legacy', 10)
  102. db.add_symbol_usage_in_legacy('BR2_bar', 'Config.in.legacy', 11)
  103. assert str(db) == str({
  104. 'BR2_foo': {'legacy definition': {'Config.in.legacy': [1]}, 'normal usage': {'bar/Config.in': [2]}},
  105. 'BR2_bar': {'legacy definition': {'Config.in.legacy': [10]}, 'usage inside legacy': {'Config.in.legacy': [11]}},
  106. })
  107. warnings = db.get_warnings_for_legacy_symbols_being_used()
  108. assert warnings == [
  109. ('bar/Config.in', 2, 'BR2_foo is a legacy symbol and should not be referenced'),
  110. ]
  111. def test_get_warnings_for_legacy_symbols_being_defined():
  112. db = m.DB()
  113. db.add_symbol_legacy_definition('BR2_foo', 'Config.in.legacy', 1)
  114. db.add_symbol_legacy_definition('BR2_bar', 'Config.in.legacy', 10)
  115. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 7)
  116. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 8)
  117. assert str(db) == str({
  118. 'BR2_foo': {'legacy definition': {'Config.in.legacy': [1]}, 'definition': {'foo/Config.in': [7, 8]}},
  119. 'BR2_bar': {'legacy definition': {'Config.in.legacy': [10]}},
  120. })
  121. warnings = db.get_warnings_for_legacy_symbols_being_defined()
  122. assert warnings == [
  123. ('foo/Config.in', 7, 'BR2_foo is a legacy symbol and should not be redefined'),
  124. ('foo/Config.in', 8, 'BR2_foo is a legacy symbol and should not be redefined'),
  125. ]
  126. def test_get_warnings_for_symbols_without_definition():
  127. db = m.DB()
  128. db.add_symbol_definition('BR2_foo', 'foo/Config.in', 7)
  129. db.add_symbol_legacy_definition('BR2_bar', 'Config.in.legacy', 10)
  130. db.add_symbol_virtual('BR2_baz', 'baz/Config.in', 7)
  131. db.add_symbol_usage('BR2_foo', 'file', 1)
  132. db.add_symbol_usage('BR2_bar', 'file', 1)
  133. db.add_symbol_usage('BR2_baz', 'file', 1)
  134. db.add_symbol_usage('BR2_undef1', 'file', 1)
  135. db.add_symbol_legacy_usage('BR2_undef2', 'file', 2)
  136. db.add_symbol_usage_in_legacy('BR2_undef3', 'file', 3)
  137. db.add_symbol_usage('BR2_undef3', 'another', 1)
  138. db.add_symbol_legacy_usage('BR2_undef3', 'another', 2)
  139. db.add_symbol_usage('BR2_PACKAGE_HOST_undef', 'file', 1)
  140. db.add_symbol_usage('BR2_PACKAGE_HAS_HOST_undef', 'file', 1)
  141. db.add_symbol_usage('BR2_TARGET_ROOTFS_undef_XZ', 'file', 1)
  142. db.add_symbol_usage('BR2_GRAPH_ALT', 'file', 1)
  143. db.add_symbol_usage('BR2_EXTERNAL', 'file', 1)
  144. db.add_symbol_usage('BR2_TARGET_BAREBOX_AUX_BAREBOXENV', 'file', 1)
  145. db.add_symbol_usage('BR2_PACKAGE_HAS_TOOLCHAIN_BUILDROOT', 'file', 1)
  146. assert str(db) == str({
  147. 'BR2_foo': {'definition': {'foo/Config.in': [7]}, 'normal usage': {'file': [1]}},
  148. 'BR2_bar': {'legacy definition': {'Config.in.legacy': [10]}, 'normal usage': {'file': [1]}},
  149. 'BR2_baz': {'virtual': {'baz/Config.in': [7]}, 'normal usage': {'file': [1]}},
  150. 'BR2_undef1': {'normal usage': {'file': [1]}},
  151. 'BR2_undef2': {'legacy usage': {'file': [2]}},
  152. 'BR2_undef3': {'usage inside legacy': {'file': [3]}, 'normal usage': {'another': [1]}, 'legacy usage': {'another': [2]}},
  153. 'BR2_PACKAGE_HOST_undef': {'normal usage': {'file': [1]}},
  154. 'BR2_PACKAGE_HAS_HOST_undef': {'normal usage': {'file': [1]}},
  155. 'BR2_TARGET_ROOTFS_undef_XZ': {'normal usage': {'file': [1]}},
  156. 'BR2_GRAPH_ALT': {'normal usage': {'file': [1]}},
  157. 'BR2_EXTERNAL': {'normal usage': {'file': [1]}},
  158. 'BR2_TARGET_BAREBOX_AUX_BAREBOXENV': {'normal usage': {'file': [1]}},
  159. 'BR2_PACKAGE_HAS_TOOLCHAIN_BUILDROOT': {'normal usage': {'file': [1]}},
  160. })
  161. warnings = db.get_warnings_for_symbols_without_definition()
  162. assert warnings == [
  163. ('file', 1, 'BR2_undef1 referenced but not defined'),
  164. ('file', 2, 'BR2_undef2 referenced but not defined'),
  165. ('another', 1, 'BR2_undef3 referenced but not defined'),
  166. ('another', 2, 'BR2_undef3 referenced but not defined'),
  167. ('file', 3, 'BR2_undef3 referenced but not defined'),
  168. ]
  169. def test_get_warnings_for_symbols_without_usage():
  170. db = m.DB()
  171. db.add_symbol_definition('BR2_a', 'a/Config.in', 1)
  172. db.add_symbol_definition('BR2_a', 'a/Config.in', 2)
  173. db.add_symbol_usage('BR2_a', 'file', 1)
  174. db.add_symbol_usage('BR2_a', 'file', 2)
  175. db.add_symbol_definition('BR2_b', 'b/Config.in', 2)
  176. db.add_symbol_usage_in_legacy('BR2_b', 'file', 1)
  177. db.add_symbol_definition('BR2_c', 'c/Config.in', 2)
  178. db.add_symbol_legacy_usage('BR2_c', 'file', 1)
  179. db.add_symbol_definition('BR2_USE_CCACHE', 'file', 1)
  180. db.add_symbol_definition('BR2_PACKAGE_SKELETON', 'file', 1)
  181. db.add_symbol_definition('BR2_d', 'd/Config.in', 2)
  182. db.add_symbol_helper('BR2_d', 'd/Config.in', 2)
  183. db.add_symbol_definition('BR2_e', 'e/Config.in', 2)
  184. db.add_symbol_choice('BR2_e', 'e/Config.in', 2)
  185. db.add_symbol_definition('BR2_f', 'f/Config.in', 2)
  186. db.add_symbol_definition('BR2_g', 'g/Config.in', 2)
  187. db.add_symbol_definition('BR2_g', 'g/Config.in', 3)
  188. db.add_symbol_legacy_definition('BR2_h', 'Config.in.legacy', 1)
  189. db.add_symbol_usage('BR2_h', 'file', 2)
  190. db.add_symbol_usage('BR2_h', 'file', 3)
  191. db.add_symbol_legacy_definition('BR2_i', 'Config.in.legacy', 2)
  192. db.add_symbol_usage_in_legacy('BR2_i', 'file', 2)
  193. db.add_symbol_legacy_definition('BR2_j', 'Config.in.legacy', 2)
  194. db.add_symbol_legacy_usage('BR2_j', 'file', 2)
  195. db.add_symbol_legacy_definition('BR2_k', 'Config.in.legacy', 2)
  196. db.add_symbol_usage('BR2_k', 'file', 5)
  197. db.add_symbol_usage_in_legacy('BR2_k', 'file', 6)
  198. db.add_symbol_legacy_usage('BR2_k', 'file', 7)
  199. db.add_symbol_legacy_definition('BR2_l', 'Config.in.legacy', 2)
  200. assert str(db) == str({
  201. 'BR2_a': {'definition': {'a/Config.in': [1, 2]}, 'normal usage': {'file': [1, 2]}},
  202. 'BR2_b': {'definition': {'b/Config.in': [2]}, 'usage inside legacy': {'file': [1]}},
  203. 'BR2_c': {'definition': {'c/Config.in': [2]}, 'legacy usage': {'file': [1]}},
  204. 'BR2_USE_CCACHE': {'definition': {'file': [1]}},
  205. 'BR2_PACKAGE_SKELETON': {'definition': {'file': [1]}},
  206. 'BR2_d': {'definition': {'d/Config.in': [2]}, 'possible config helper': {'d/Config.in': [2]}},
  207. 'BR2_e': {'definition': {'e/Config.in': [2]}, 'part of a choice': {'e/Config.in': [2]}},
  208. 'BR2_f': {'definition': {'f/Config.in': [2]}},
  209. 'BR2_g': {'definition': {'g/Config.in': [2, 3]}},
  210. 'BR2_h': {'legacy definition': {'Config.in.legacy': [1]}, 'normal usage': {'file': [2, 3]}},
  211. 'BR2_i': {'legacy definition': {'Config.in.legacy': [2]}, 'usage inside legacy': {'file': [2]}},
  212. 'BR2_j': {'legacy definition': {'Config.in.legacy': [2]}, 'legacy usage': {'file': [2]}},
  213. 'BR2_k': {
  214. 'legacy definition': {'Config.in.legacy': [2]},
  215. 'normal usage': {'file': [5]},
  216. 'usage inside legacy': {'file': [6]},
  217. 'legacy usage': {'file': [7]}},
  218. 'BR2_l': {'legacy definition': {'Config.in.legacy': [2]}},
  219. })
  220. warnings = db.get_warnings_for_symbols_without_usage()
  221. assert warnings == [
  222. ('f/Config.in', 2, 'BR2_f defined but not referenced'),
  223. ('g/Config.in', 2, 'BR2_g defined but not referenced'),
  224. ('g/Config.in', 3, 'BR2_g defined but not referenced'),
  225. ('Config.in.legacy', 2, 'BR2_l defined but not referenced'),
  226. ]
  227. def test_get_warnings_for_symbols_with_legacy_note_and_no_comment_on_usage():
  228. db = m.DB()
  229. db.add_symbol_legacy_note('BR2_foo', 'Config.in.legacy', 1)
  230. db.add_symbol_legacy_usage('BR2_foo', 'package/bar/Config.in', 2)
  231. db.add_symbol_legacy_note('BR2_baz', 'Config.in.legacy', 7001)
  232. db.add_symbol_usage('BR2_baz', 'package/foo/Config.in', 1)
  233. assert str(db) == str({
  234. 'BR2_foo': {'legacy note': {'Config.in.legacy': [1]}, 'legacy usage': {'package/bar/Config.in': [2]}},
  235. 'BR2_baz': {'legacy note': {'Config.in.legacy': [7001]}, 'normal usage': {'package/foo/Config.in': [1]}},
  236. })
  237. warnings = db.get_warnings_for_symbols_with_legacy_note_and_no_comment_on_usage()
  238. assert warnings == [
  239. ('package/foo/Config.in', 1, 'BR2_baz missing "# legacy"'),
  240. ]
  241. def test_get_warnings_for_symbols_with_legacy_note_and_no_usage():
  242. db = m.DB()
  243. db.add_symbol_legacy_note('BR2_foo', 'Config.in.legacy', 1)
  244. db.add_symbol_legacy_usage('BR2_foo', 'package/bar/Config.in', 2)
  245. db.add_symbol_legacy_note('BR2_bar', 'Config.in.legacy', 1)
  246. db.add_symbol_usage_in_legacy('BR2_bar', 'Config.in.legacy', 7001)
  247. db.add_symbol_legacy_note('BR2_baz', 'Config.in.legacy', 7001)
  248. db.add_symbol_legacy_note('BR2_no_comment', 'Config.in.legacy', 1)
  249. db.add_symbol_usage('BR2_no_comment', 'package/bar/Config.in', 2)
  250. assert str(db) == str({
  251. 'BR2_foo': {'legacy note': {'Config.in.legacy': [1]}, 'legacy usage': {'package/bar/Config.in': [2]}},
  252. 'BR2_bar': {'legacy note': {'Config.in.legacy': [1]}, 'usage inside legacy': {'Config.in.legacy': [7001]}},
  253. 'BR2_baz': {'legacy note': {'Config.in.legacy': [7001]}},
  254. 'BR2_no_comment': {'legacy note': {'Config.in.legacy': [1]}, 'normal usage': {'package/bar/Config.in': [2]}},
  255. })
  256. warnings = db.get_warnings_for_symbols_with_legacy_note_and_no_usage()
  257. assert warnings == [
  258. ('Config.in.legacy', 1, 'BR2_bar not referenced but has a comment stating it is'),
  259. ('Config.in.legacy', 7001, 'BR2_baz not referenced but has a comment stating it is'),
  260. ]