sys.path.insert(0, os.path.abspath('%s/../..' % os.path.dirname(__file__)))
from chromite.cbuildbot import metadata_lib
-from chromite.cbuildbot import results_lib
-from chromite.cbuildbot import constants
from chromite.lib import cros_test_lib
from chromite.lib import parallel
-class LocalBuilderStatusTest(cros_test_lib.TestCase):
- """Test the correctness of the various LocalBuilderStatus methods."""
-
- Results = results_lib.Results
- SUCCESS = results_lib.Results.SUCCESS
-
- def setUp(self):
- self.Results.Clear()
-
- def tearDown(self):
- self.Results.Clear()
-
- def testEmptyFail(self):
- """Sometimes there is no board-specific information."""
- self.Results.Record('Sync', self.SUCCESS)
- builder_status = metadata_lib.LocalBuilderStatus.Get()
- self.assertEqual({}, builder_status.board_status_map)
- self.assertEqual(constants.FINAL_STATUS_FAILED,
- builder_status.GetBuilderStatus('lumpy-paladin'))
- self.assertEqual(constants.FINAL_STATUS_PASSED,
- builder_status.GetBuilderStatus('master-paladin'))
-
- def testAllFail(self):
- """Failures in a shared stage cause specific stages to fail."""
- self.Results.Record('Sync', self.SUCCESS)
- self.Results.Record('BuildPackages', self.SUCCESS, board='lumpy')
- self.Results.Record('Completion', 'FAIL')
- builder_status = metadata_lib.LocalBuilderStatus.Get()
- self.assertEqual({'lumpy': constants.FINAL_STATUS_PASSED},
- builder_status.board_status_map)
- self.assertEqual(constants.FINAL_STATUS_FAILED,
- builder_status.GetBuilderStatus('lumpy-paladin'))
- self.assertEqual(constants.FINAL_STATUS_FAILED,
- builder_status.GetBuilderStatus('master-paladin'))
-
- def testMixedFail(self):
- """Specific stages can pass/fail separately."""
- self.Results.Record('Sync', self.SUCCESS)
- self.Results.Record('BuildPackages [lumpy]', 'FAIL', board='lumpy')
- self.Results.Record('BuildPackages [stumpy]', self.SUCCESS, board='stumpy')
- builder_status = metadata_lib.LocalBuilderStatus.Get()
- self.assertEqual({'lumpy': constants.FINAL_STATUS_FAILED,
- 'stumpy': constants.FINAL_STATUS_PASSED},
- builder_status.board_status_map)
- self.assertEqual(constants.FINAL_STATUS_FAILED,
- builder_status.GetBuilderStatus('lumpy-paladin'))
- self.assertEqual(constants.FINAL_STATUS_PASSED,
- builder_status.GetBuilderStatus('stumpy-paladin'))
- self.assertEqual(constants.FINAL_STATUS_FAILED,
- builder_status.GetBuilderStatus('winky-paladin'))
- self.assertEqual(constants.FINAL_STATUS_PASSED,
- builder_status.GetBuilderStatus('master-paladin'))
-
-
@cros_test_lib.NetworkTest()
class MetadataFetchTest(cros_test_lib.TestCase):
"""Test functions for fetching metadata from GS."""
def testGetDict(self):
starting_dict = {'key1': 1,
'key2': '2',
- 'cl_actions': [('a', 1), ('b', 2)]}
+ 'cl_actions': [('a', 1), ('b', 2)],
+ 'board-metadata': {
+ 'board-1': {'info': 432}
+ }
+ }
metadata = metadata_lib.CBuildbotMetadata(starting_dict)
ending_dict = metadata.GetDict()
self.assertEqual(starting_dict, ending_dict)
+ def testUpdateKeyDictWithDict(self):
+ expected_dict = {str(x): x for x in range(20)}
+ m = multiprocessing.Manager()
+ metadata = metadata_lib.CBuildbotMetadata(multiprocess_manager=m)
+
+ metadata.UpdateKeyDictWithDict('my_dict', expected_dict)
+
+ self.assertEqual(expected_dict, metadata.GetDict()['my_dict'])
+
+
+ def testUpdateKeyDictWithDictMultiprocess(self):
+ expected_dict = {str(x): x for x in range(20)}
+ m = multiprocessing.Manager()
+ metadata = metadata_lib.CBuildbotMetadata(multiprocess_manager=m)
+
+ with parallel.BackgroundTaskRunner(metadata.UpdateKeyDictWithDict) as q:
+ for k, v in expected_dict.iteritems():
+ q.put(['my_dict', {k: v}])
+
+ self.assertEqual(expected_dict, metadata.GetDict()['my_dict'])
+
+ def testUpdateBoardMetadataWithMultiprocessDict(self):
+ starting_dict = {'key1': 1,
+ 'key2': '2',
+ 'cl_actions': [('a', 1), ('b', 2)],
+ 'board-metadata': {
+ 'board-1': {'info': 432}
+ }
+ }
+
+ m = multiprocessing.Manager()
+ metadata = metadata_lib.CBuildbotMetadata(metadata_dict=starting_dict,
+ multiprocess_manager=m)
+
+ # pylint: disable-msg=E1101
+ update_dict = m.dict()
+ update_dict['my_key'] = 'some value'
+ metadata.UpdateBoardDictWithDict('board-1', update_dict)
+
+ self.assertEqual(metadata.GetDict()['board-metadata']['board-1']['my_key'],
+ 'some value')
+
def testMultiprocessSafety(self):
m = multiprocessing.Manager()
metadata = metadata_lib.CBuildbotMetadata(multiprocess_manager=m)
starting_dict = {'key1': 1,
'key2': '2',
'key3': key_dict,
- 'cl_actions': [('a', 1), ('b', 2)]}
+ 'cl_actions': [('a', 1), ('b', 2)],
+ 'board-metadata': {
+ 'board-1': {'info': 432}
+ }
+ }
# Test that UpdateWithDict is process-safe
parallel.RunParallelSteps([lambda: metadata.UpdateWithDict(starting_dict)])
self.assertEqual(len(starting_dict['cl_actions']) + 1,
len(ending_dict['cl_actions']))
+ def testPerBoardDict(self):
+ starting_per_board_dict = {
+ 'board-1': {'kubrick': 2001,
+ 'bergman': 'persona',
+ 'hitchcock': 'vertigo'},
+ 'board-2': {'kubrick': ['barry lyndon', 'dr. strangelove'],
+ 'bergman': 'the seventh seal'}
+ }
+
+ starting_dict = {'board-metadata': starting_per_board_dict}
+
+ m = multiprocessing.Manager()
+ metadata = metadata_lib.CBuildbotMetadata(metadata_dict=starting_dict,
+ multiprocess_manager=m)
+
+ extra_per_board_dict = {
+ 'board-1': {'kurosawa': 'rashomon',
+ 'coen brothers': 'fargo'},
+ 'board-3': {'hitchcock': 'north by northwest',
+ 'coen brothers': 'the big lebowski'}
+ }
+
+ expected_dict = starting_per_board_dict
+
+ # Write each per board key-value pair to metadata in a separate process.
+ with parallel.BackgroundTaskRunner(metadata.UpdateBoardDictWithDict) as q:
+ for board, board_dict in extra_per_board_dict.iteritems():
+ expected_dict.setdefault(board, {}).update(board_dict)
+ for k, v in board_dict.iteritems():
+ q.put([board, {k: v}])
+
+ self.assertEqual(expected_dict, metadata.GetDict()['board-metadata'])
+
if __name__ == '__main__':
cros_test_lib.main(level=logging.DEBUG)