mb_validation_unittest.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. #!/usr/bin/env python
  2. # Copyright 2020 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. """Tests for mb_validate.py."""
  6. from __future__ import print_function
  7. from __future__ import absolute_import
  8. import sys
  9. import ast
  10. import os
  11. import unittest
  12. sys.path.insert(0, os.path.join(
  13. os.path.dirname(os.path.abspath(__file__)), '..'))
  14. from mb import mb
  15. from mb import mb_unittest
  16. from mb.lib import validation
  17. TEST_UNREFERENCED_MIXIN_CONFIG = """\
  18. {
  19. 'public_artifact_builders': {},
  20. 'configs': {
  21. 'rel_bot_1': ['rel'],
  22. 'rel_bot_2': ['rel'],
  23. },
  24. 'builder_groups': {
  25. 'fake_builder_group_a': {
  26. 'fake_builder_a': 'rel_bot_1',
  27. 'fake_builder_b': 'rel_bot_2',
  28. },
  29. },
  30. 'mixins': {
  31. 'unreferenced_mixin': {
  32. 'gn_args': 'proprietary_codecs=true',
  33. },
  34. 'rel': {
  35. 'gn_args': 'is_debug=false',
  36. },
  37. },
  38. }
  39. """
  40. TEST_UNKNOWNMIXIN_CONFIG = """\
  41. {
  42. 'public_artifact_builders': {},
  43. 'configs': {
  44. 'rel_bot_1': ['rel'],
  45. 'rel_bot_2': ['rel', 'unknown_mixin'],
  46. },
  47. 'builder_groups': {
  48. 'fake_builder_group_a': {
  49. 'fake_builder_a': 'rel_bot_1',
  50. 'fake_builder_b': 'rel_bot_2',
  51. },
  52. },
  53. 'mixins': {
  54. 'rel': {
  55. 'gn_args': 'is_debug=false',
  56. },
  57. },
  58. }
  59. """
  60. TEST_UNKNOWN_NESTED_MIXIN_CONFIG = """\
  61. {
  62. 'public_artifact_builders': {},
  63. 'configs': {
  64. 'rel_bot_1': ['rel', 'nested_mixin'],
  65. 'rel_bot_2': ['rel'],
  66. },
  67. 'builder_groups': {
  68. 'fake_builder_group_a': {
  69. 'fake_builder_a': 'rel_bot_1',
  70. 'fake_builder_b': 'rel_bot_2',
  71. },
  72. },
  73. 'mixins': {
  74. 'nested_mixin': {
  75. 'mixins': {
  76. 'unknown_mixin': {
  77. 'gn_args': 'proprietary_codecs=true',
  78. },
  79. },
  80. },
  81. 'rel': {
  82. 'gn_args': 'is_debug=false',
  83. },
  84. },
  85. }
  86. """
  87. TEST_CONFIG_UNSORTED_GROUPS = """\
  88. {
  89. 'builder_groups': {
  90. 'groupB': {},
  91. 'groupA': {},
  92. 'groupC': {},
  93. },
  94. 'configs': {
  95. },
  96. 'mixins': {
  97. },
  98. }
  99. """
  100. TEST_CONFIG_UNSORTED_BUILDERNAMES = """\
  101. {
  102. 'builder_groups': {
  103. 'group': {
  104. 'builderB': '',
  105. 'builderA': ''
  106. },
  107. },
  108. 'configs': {
  109. },
  110. 'mixins': {
  111. },
  112. }
  113. """
  114. TEST_CONFIG_UNSORTED_CONFIGS = """\
  115. {
  116. 'builder_groups': {
  117. },
  118. 'configs': {
  119. 'configB': {},
  120. 'configA': {},
  121. },
  122. 'mixins': {
  123. },
  124. }
  125. """
  126. TEST_CONFIG_UNSORTED_MIXINS = """\
  127. {
  128. 'builder_groups': {
  129. },
  130. 'configs': {
  131. },
  132. 'mixins': {
  133. 'mixinB': {},
  134. 'mixinA': {},
  135. },
  136. }
  137. """
  138. class UnitTest(unittest.TestCase):
  139. def test_GetAllConfigs(self):
  140. configs = ast.literal_eval(mb_unittest.TEST_CONFIG)
  141. all_configs = validation.GetAllConfigs(configs['builder_groups'])
  142. self.assertEqual(all_configs['rel_bot'], 'fake_builder_group')
  143. self.assertEqual(all_configs['debug_goma'], 'fake_builder_group')
  144. def test_CheckAllConfigsAndMixinsReferenced_ok(self):
  145. configs = ast.literal_eval(mb_unittest.TEST_CONFIG)
  146. errs = []
  147. all_configs = validation.GetAllConfigs(configs['builder_groups'])
  148. config_configs = configs['configs']
  149. mixins = configs['mixins']
  150. validation.CheckAllConfigsAndMixinsReferenced(errs, all_configs,
  151. config_configs, mixins)
  152. self.assertEqual(errs, [])
  153. def test_CheckAllConfigsAndMixinsReferenced_unreferenced(self):
  154. configs = ast.literal_eval(TEST_UNREFERENCED_MIXIN_CONFIG)
  155. errs = []
  156. all_configs = validation.GetAllConfigs(configs['builder_groups'])
  157. config_configs = configs['configs']
  158. mixins = configs['mixins']
  159. validation.CheckAllConfigsAndMixinsReferenced(errs, all_configs,
  160. config_configs, mixins)
  161. self.assertIn('Unreferenced mixin "unreferenced_mixin".', errs)
  162. def test_CheckAllConfigsAndMixinsReferenced_unknown(self):
  163. configs = ast.literal_eval(TEST_UNKNOWNMIXIN_CONFIG)
  164. errs = []
  165. all_configs = validation.GetAllConfigs(configs['builder_groups'])
  166. config_configs = configs['configs']
  167. mixins = configs['mixins']
  168. validation.CheckAllConfigsAndMixinsReferenced(errs, all_configs,
  169. config_configs, mixins)
  170. self.assertIn(
  171. 'Unknown mixin "unknown_mixin" '
  172. 'referenced by config "rel_bot_2".', errs)
  173. def test_CheckAllConfigsAndMixinsReferenced_unknown_nested(self):
  174. configs = ast.literal_eval(TEST_UNKNOWN_NESTED_MIXIN_CONFIG)
  175. errs = []
  176. all_configs = validation.GetAllConfigs(configs['builder_groups'])
  177. config_configs = configs['configs']
  178. mixins = configs['mixins']
  179. validation.CheckAllConfigsAndMixinsReferenced(errs, all_configs,
  180. config_configs, mixins)
  181. self.assertIn(
  182. 'Unknown mixin "unknown_mixin" '
  183. 'referenced by mixin "nested_mixin".', errs)
  184. def test_CheckAllConfigsAndMixinsReferenced_unused(self):
  185. configs = ast.literal_eval(TEST_UNKNOWN_NESTED_MIXIN_CONFIG)
  186. errs = []
  187. all_configs = validation.GetAllConfigs(configs['builder_groups'])
  188. config_configs = configs['configs']
  189. mixins = configs['mixins']
  190. validation.CheckAllConfigsAndMixinsReferenced(errs, all_configs,
  191. config_configs, mixins)
  192. self.assertIn(
  193. 'Unknown mixin "unknown_mixin" '
  194. 'referenced by mixin "nested_mixin".', errs)
  195. def test_EnsureNoProprietaryMixins(self):
  196. bad_configs = ast.literal_eval(mb_unittest.TEST_BAD_CONFIG)
  197. errs = []
  198. builder_groups = bad_configs['builder_groups']
  199. mixins = bad_configs['mixins']
  200. config_configs = bad_configs['configs']
  201. validation.EnsureNoProprietaryMixins(errs, builder_groups, config_configs,
  202. mixins)
  203. self.assertIn(
  204. 'Public artifact builder "a" '
  205. 'can not contain the "chrome_with_codecs" mixin.', errs)
  206. self.assertIn(
  207. 'Public artifact builder "b" '
  208. 'can not contain the "chrome_with_codecs" mixin.', errs)
  209. self.assertEqual(len(errs), 2)
  210. def test_CheckDuplicateConfigs_ok(self):
  211. configs = ast.literal_eval(mb_unittest.TEST_CONFIG)
  212. config_configs = configs['configs']
  213. mixins = configs['mixins']
  214. grouping = configs['builder_groups']
  215. errs = []
  216. validation.CheckDuplicateConfigs(errs, config_configs, mixins, grouping,
  217. mb.FlattenConfig)
  218. self.assertEqual(errs, [])
  219. @unittest.skip('bla')
  220. def test_CheckDuplicateConfigs_dups(self):
  221. configs = ast.literal_eval(mb_unittest.TEST_DUP_CONFIG)
  222. config_configs = configs['configs']
  223. mixins = configs['mixins']
  224. grouping = configs['builder_groups']
  225. errs = []
  226. validation.CheckDuplicateConfigs(errs, config_configs, mixins, grouping,
  227. mb.FlattenConfig)
  228. self.assertIn(
  229. 'Duplicate configs detected. When evaluated fully, the '
  230. 'following configs are all equivalent: \'some_config\', '
  231. '\'some_other_config\'. Please consolidate these configs '
  232. 'into only one unique name per configuration value.', errs)
  233. def test_CheckKeyOrderingOK(self):
  234. mb_config = ast.literal_eval(mb_unittest.TEST_CONFIG)
  235. errs = []
  236. validation.CheckKeyOrdering(errs, mb_config['builder_groups'],
  237. mb_config['configs'], mb_config['mixins'])
  238. self.assertEqual(errs, [])
  239. def test_CheckKeyOrderingBad(self):
  240. mb_config = ast.literal_eval(TEST_CONFIG_UNSORTED_GROUPS)
  241. errs = []
  242. validation.CheckKeyOrdering(errs, mb_config['builder_groups'],
  243. mb_config['configs'], mb_config['mixins'])
  244. self.assertIn('\nThe keys in "builder_groups" are not sorted:', errs)
  245. mb_config = ast.literal_eval(TEST_CONFIG_UNSORTED_BUILDERNAMES)
  246. errs = []
  247. validation.CheckKeyOrdering(errs, mb_config['builder_groups'],
  248. mb_config['configs'], mb_config['mixins'])
  249. self.assertIn('\nThe builders in group "group" are not sorted:', errs)
  250. mb_config = ast.literal_eval(TEST_CONFIG_UNSORTED_CONFIGS)
  251. errs = []
  252. validation.CheckKeyOrdering(errs, mb_config['builder_groups'],
  253. mb_config['configs'], mb_config['mixins'])
  254. self.assertIn('\nThe config names are not sorted:', errs)
  255. mb_config = ast.literal_eval(TEST_CONFIG_UNSORTED_MIXINS)
  256. errs = []
  257. validation.CheckKeyOrdering(errs, mb_config['builder_groups'],
  258. mb_config['configs'], mb_config['mixins'])
  259. self.assertIn('\nThe mixin names are not sorted:', errs)
  260. if __name__ == '__main__':
  261. unittest.main()