def testInvalidMerge(self): """Tests that updating a BuildStats instance twice is an error.""" base_map = { 'foo': { data_types.Expectation('foo', ['win'], 'Failure'): { 'builder': { 'step': data_types.BuildStats(), }, }, }, } merge_stats = data_types.BuildStats() merge_stats.AddFailedBuild('1') merge_map = { 'foo': { data_types.Expectation('foo', ['win'], 'Failure'): { 'builder': { 'step': merge_stats, }, }, }, } original_base_map = copy.deepcopy(base_map) expectations.MergeExpectationMaps(base_map, merge_map, original_base_map) with self.assertRaises(AssertionError): expectations.MergeExpectationMaps(base_map, merge_map, original_base_map)
def testMergeBuildStats(self): """Tests that BuildStats for the same step are merged properly.""" base_map = { 'foo': { data_types.Expectation('foo', ['win'], 'Failure'): { 'builder': { 'step': data_types.BuildStats(), }, }, }, } merge_stats = data_types.BuildStats() merge_stats.AddFailedBuild('1') merge_map = { 'foo': { data_types.Expectation('foo', ['win'], 'Failure'): { 'builder': { 'step': merge_stats, }, }, }, } expected_stats = data_types.BuildStats() expected_stats.AddFailedBuild('1') expected_base_map = { 'foo': { data_types.Expectation('foo', ['win'], 'Failure'): { 'builder': { 'step': expected_stats, }, }, }, } expectations.MergeExpectationMaps(base_map, merge_map) self.assertEqual(base_map, expected_base_map)
def _FillExpectationMapForBuilders(self, expectation_map, builders, builder_type): """Fills |expectation_map| with results from |builders|. Args: expectation_map: A data_types.TestExpectationMap. Will be modified in-place. builders: A list of strings containing the names of builders to query. builder_type: A string containing the type of builder to query, either "ci" or "try". Returns: A dict containing any results that were retrieved that did not have a matching expectation in |expectation_map| in the following format: { |builder_type|:|builder_name| (str): [ result1 (data_types.Result), result2 (data_types.Result), ... ], } """ assert isinstance(expectation_map, data_types.TestExpectationMap) # Spin up a separate process for each query/add step. This is wasteful in # the sense that we'll have a bunch of idle processes once faster steps # start finishing, but ensures that we start slow queries early and avoids # the overhead of passing large amounts of data between processes. See # crbug.com/1182459 for more information on performance considerations. process_pool = multiprocessing_utils.GetProcessPool( nodes=len(builders)) args = [(b, builder_type, expectation_map) for b in builders] results = process_pool.map(self._QueryAddCombined, args) tmp_expectation_map = data_types.TestExpectationMap() all_unmatched_results = {} for (unmatched_results, prefixed_builder_name, merge_map) in results: expectations.MergeExpectationMaps(tmp_expectation_map, merge_map, expectation_map) if unmatched_results: all_unmatched_results[ prefixed_builder_name] = unmatched_results expectation_map.clear() expectation_map.update(tmp_expectation_map) return all_unmatched_results
def testEmptyMergeMap(self): """Tests that a merge with an empty merge map is a no-op.""" base_map = { 'foo': { data_types.Expectation('foo', ['win'], 'Failure'): { 'builder': { 'step': data_types.BuildStats(), }, }, }, } merge_map = {} original_base_map = copy.deepcopy(base_map) expectations.MergeExpectationMaps(base_map, merge_map) self.assertEqual(base_map, original_base_map) self.assertEqual(merge_map, {})
def testEmptyBaseMap(self): """Tests that a merge with an empty base map copies the merge map.""" base_map = data_types.TestExpectationMap() merge_map = data_types.TestExpectationMap({ 'foo': data_types.ExpectationBuilderMap({ data_types.Expectation('foo', ['win'], 'Failure'): data_types.BuilderStepMap({ 'builder': data_types.StepBuildStatsMap({ 'step': data_types.BuildStats(), }), }), }), }) original_merge_map = copy.deepcopy(merge_map) expectations.MergeExpectationMaps(base_map, merge_map) self.assertEqual(base_map, merge_map) self.assertEqual(merge_map, original_merge_map)
def testMissingKeys(self): """Tests that missing keys are properly copied to the base map.""" base_map = data_types.TestExpectationMap({ 'foo': data_types.ExpectationBuilderMap({ data_types.Expectation('foo', ['win'], 'Failure'): data_types.BuilderStepMap({ 'builder': data_types.StepBuildStatsMap({ 'step': data_types.BuildStats(), }), }), }), }) merge_map = data_types.TestExpectationMap({ 'foo': data_types.ExpectationBuilderMap({ data_types.Expectation('foo', ['win'], 'Failure'): data_types.BuilderStepMap({ 'builder': data_types.StepBuildStatsMap({ 'step2': data_types.BuildStats(), }), 'builder2': data_types.StepBuildStatsMap({ 'step': data_types.BuildStats(), }), }), data_types.Expectation('foo', ['mac'], 'Failure'): data_types.BuilderStepMap({ 'builder': data_types.StepBuildStatsMap({ 'step': data_types.BuildStats(), }) }) }), 'bar': data_types.ExpectationBuilderMap({ data_types.Expectation('bar', ['win'], 'Failure'): data_types.BuilderStepMap({ 'builder': data_types.StepBuildStatsMap({ 'step': data_types.BuildStats(), }), }), }), }) expected_base_map = { 'foo': { data_types.Expectation('foo', ['win'], 'Failure'): { 'builder': { 'step': data_types.BuildStats(), 'step2': data_types.BuildStats(), }, 'builder2': { 'step': data_types.BuildStats(), }, }, data_types.Expectation('foo', ['mac'], 'Failure'): { 'builder': { 'step': data_types.BuildStats(), } } }, 'bar': { data_types.Expectation('bar', ['win'], 'Failure'): { 'builder': { 'step': data_types.BuildStats(), }, }, }, } expectations.MergeExpectationMaps(base_map, merge_map) self.assertEqual(base_map, expected_base_map)