Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / chromite / cbuildbot / metadata_lib_unittest.py
index 6db71a3..9f97f5a 100755 (executable)
@@ -12,66 +12,10 @@ import sys
 
 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."""
@@ -91,11 +35,57 @@ class MetadataTest(cros_test_lib.TestCase):
   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)
@@ -103,7 +93,11 @@ class MetadataTest(cros_test_lib.TestCase):
     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)])
@@ -126,6 +120,39 @@ class MetadataTest(cros_test_lib.TestCase):
     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)