| OLD | NEW |
| 1 # Copyright 2017 The Chromium Authors. All rights reserved. | 1 # Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 # pylint: disable=invalid-name | 5 # pylint: disable=invalid-name |
| 6 # pylint complains about the assertXXX methods and the usage of short variables | 6 # pylint complains about the assertXXX methods and the usage of short variables |
| 7 # m/a/b/d in the tests. | 7 # m/a/b/d in the tests. |
| 8 | 8 |
| 9 import types | 9 import types |
| 10 import unittest | 10 import unittest |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 ([1, 2], ([1], [2])), | 37 ([1, 2], ([1], [2])), |
| 38 ([2, 1], ([2], [1])), | 38 ([2, 1], ([2], [1])), |
| 39 ([1, 2, 3], ([], [1, 2, 3])), | 39 ([1, 2, 3], ([], [1, 2, 3])), |
| 40 ([1, 2, 3], ([1], [2, 3])), | 40 ([1, 2, 3], ([1], [2, 3])), |
| 41 ([1, 2, 3], ([1, 2], [3])), | 41 ([1, 2, 3], ([1, 2], [3])), |
| 42 ([1, 2, 3], ([1, 2, 3], [])), | 42 ([1, 2, 3], ([1, 2, 3], [])), |
| 43 ] | 43 ] |
| 44 | 44 |
| 45 for expected, (inputa, inputb) in tests: | 45 for expected, (inputa, inputb) in tests: |
| 46 self.assertListEqual( | 46 self.assertListEqual( |
| 47 expected, m.merge_listlike(inputa, inputb)) | 47 expected, m.merge_listlike([inputa, inputb])) |
| 48 self.assertListEqual( | 48 self.assertListEqual( |
| 49 expected, m.merge(inputa, inputb)) | 49 expected, m.merge([inputa, inputb])) |
| 50 self.assertSequenceEqual( | 50 self.assertSequenceEqual( |
| 51 expected, | 51 expected, |
| 52 m.merge_listlike(tuple(inputa), tuple(inputb)), | 52 m.merge_listlike([tuple(inputa), tuple(inputb)]), |
| 53 types.TupleType) | 53 types.TupleType) |
| 54 self.assertSequenceEqual( | 54 self.assertSequenceEqual( |
| 55 expected, | 55 expected, |
| 56 m.merge(tuple(inputa), tuple(inputb)), | 56 m.merge([tuple(inputa), tuple(inputb)]), |
| 57 types.TupleType) | 57 types.TupleType) |
| 58 | 58 |
| 59 def test_merge_simple_dict(self): | 59 def test_merge_simple_dict(self): |
| 60 m = merge_results.JSONMerger() | 60 m = merge_results.JSONMerger() |
| 61 m.fallback_matcher = m.merge_equal | 61 m.fallback_matcher = m.merge_equal |
| 62 | 62 |
| 63 tests = [ | 63 tests = [ |
| 64 # expected, (inputa, inputb) | 64 # expected, (inputa, inputb) |
| 65 ({'a': 1}, ({'a': 1}, {'a': 1})), | 65 ({'a': 1}, ({'a': 1}, {'a': 1})), |
| 66 | 66 |
| 67 ({'a': 1, 'b': 2}, ({'a': 1, 'b': 2}, {})), | 67 ({'a': 1, 'b': 2}, ({'a': 1, 'b': 2}, {})), |
| 68 ({'a': 1, 'b': 2}, ({}, {'a': 1, 'b': 2})), | 68 ({'a': 1, 'b': 2}, ({}, {'a': 1, 'b': 2})), |
| 69 ({'a': 1, 'b': 2}, ({'a': 1}, {'b': 2})), | 69 ({'a': 1, 'b': 2}, ({'a': 1}, {'b': 2})), |
| 70 | 70 |
| 71 ({'a': 1, 'b': 2, 'c': 3}, ({'a': 1, 'b': 2, 'c': 3}, {})), | 71 ({'a': 1, 'b': 2, 'c': 3}, ({'a': 1, 'b': 2, 'c': 3}, {})), |
| 72 ({'a': 1, 'b': 2, 'c': 3}, ({'a': 1, 'b': 2}, {'c': 3})), | 72 ({'a': 1, 'b': 2, 'c': 3}, ({'a': 1, 'b': 2}, {'c': 3})), |
| 73 ({'a': 1, 'b': 2, 'c': 3}, ({'a': 1}, {'b': 2, 'c': 3})), | 73 ({'a': 1, 'b': 2, 'c': 3}, ({'a': 1}, {'b': 2, 'c': 3})), |
| 74 ({'a': 1, 'b': 2, 'c': 3}, ({}, {'a': 1, 'b': 2, 'c': 3})), | 74 ({'a': 1, 'b': 2, 'c': 3}, ({}, {'a': 1, 'b': 2, 'c': 3})), |
| 75 ] | 75 ] |
| 76 | 76 |
| 77 for expected, (inputa, inputb) in tests: | 77 for expected, (inputa, inputb) in tests: |
| 78 self.assertDictEqual(expected, m.merge_dictlike(inputa, inputb)) | 78 self.assertDictEqual(expected, m.merge_dictlike([inputa, inputb])) |
| 79 | 79 |
| 80 self.assertRaises( | 80 self.assertRaises( |
| 81 merge_results.MergeFailure, m.merge_dictlike, {'a': 1}, {'a': 2}) | 81 merge_results.MergeFailure, m.merge_dictlike, [{'a': 1}, {'a': 2}]) |
| 82 | 82 |
| 83 def test_merge_compound_dict(self): | 83 def test_merge_compound_dict(self): |
| 84 m = merge_results.JSONMerger() | 84 m = merge_results.JSONMerger() |
| 85 | 85 |
| 86 tests = [ | 86 tests = [ |
| 87 # expected, (inputa, inputb) | 87 # expected, (inputa, inputb) |
| 88 ({'a': [1, 2]}, ({'a': [1]}, {'a': [2]})), | 88 ({'a': [1, 2]}, ({'a': [1]}, {'a': [2]})), |
| 89 ({'a': [1, 'c', 3]}, ({'a': [1]}, {'a': ['c', 3]})), | 89 ({'a': [1, 'c', 3]}, ({'a': [1]}, {'a': ['c', 3]})), |
| 90 ({'a': [1], 'b': [2]}, ({'a': [1]}, {'b': [2]})), | 90 ({'a': [1], 'b': [2]}, ({'a': [1]}, {'b': [2]})), |
| 91 ({'a': {'b': 1, 'c': 2}}, ({'a': {'b': 1}}, {'a': {'c': 2}})), | 91 ({'a': {'b': 1, 'c': 2}}, ({'a': {'b': 1}}, {'a': {'c': 2}})), |
| 92 ] | 92 ] |
| 93 for expected, (inputa, inputb) in tests: | 93 for expected, (inputa, inputb) in tests: |
| 94 self.assertDictEqual(expected, m.merge_dictlike(inputa, inputb)) | 94 self.assertDictEqual(expected, m.merge_dictlike([inputa, inputb])) |
| 95 | 95 |
| 96 def test_merge(self): | 96 def test_merge(self): |
| 97 m = merge_results.JSONMerger() | 97 m = merge_results.JSONMerger() |
| 98 m.fallback_matcher = m.merge_equal | 98 m.fallback_matcher = m.merge_equal |
| 99 | 99 |
| 100 tests = [ | 100 tests = [ |
| 101 # expected, (inputa, inputb) | 101 # expected, (inputa, inputb) |
| 102 (None, (None, None)), | 102 (None, (None, None)), |
| 103 ({'a': 1}, ({'a': 1}, None)), | 103 ({'a': 1}, ({'a': 1}, None)), |
| 104 ({'b': 2}, (None, {'b': 2})), | 104 ({'b': 2}, (None, {'b': 2})), |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 ({'a': 1, 'b': 2, 'c': 3}, ({}, {'a': 1, 'b': 2, 'c': 3})), | 136 ({'a': 1, 'b': 2, 'c': 3}, ({}, {'a': 1, 'b': 2, 'c': 3})), |
| 137 | 137 |
| 138 # Complex values | 138 # Complex values |
| 139 ({'a': [1, 2]}, ({'a': [1]}, {'a': [2]})), | 139 ({'a': [1, 2]}, ({'a': [1]}, {'a': [2]})), |
| 140 ({'a': [1, 'c', 3]}, ({'a': [1]}, {'a': ['c', 3]})), | 140 ({'a': [1, 'c', 3]}, ({'a': [1]}, {'a': ['c', 3]})), |
| 141 ({'a': [1], 'b': [2]}, ({'a': [1]}, {'b': [2]})), | 141 ({'a': [1], 'b': [2]}, ({'a': [1]}, {'b': [2]})), |
| 142 ({'a': {'b': 1, 'c': 2}}, ({'a': {'b': 1}}, {'a': {'c': 2}})), | 142 ({'a': {'b': 1, 'c': 2}}, ({'a': {'b': 1}}, {'a': {'c': 2}})), |
| 143 ] | 143 ] |
| 144 | 144 |
| 145 for expected, (inputa, inputb) in tests: | 145 for expected, (inputa, inputb) in tests: |
| 146 self.assertEqual(expected, m.merge(inputa, inputb)) | 146 self.assertEqual(expected, m.merge([inputa, inputb])) |
| 147 | 147 |
| 148 self.assertRaises( | 148 self.assertRaises( |
| 149 merge_results.MergeFailure, m.merge, {'a': 1}, {'a': 2}) | 149 merge_results.MergeFailure, m.merge, [{'a': 1}, {'a': 2}]) |
| 150 | 150 |
| 151 # Ordered values | 151 # Ordered values |
| 152 a = OrderedDict({'a': 1}) | 152 a = OrderedDict({'a': 1}) |
| 153 b = OrderedDict({'b': 2}) | 153 b = OrderedDict({'b': 2}) |
| 154 | 154 |
| 155 a_before_b = OrderedDict() | 155 a_before_b = OrderedDict() |
| 156 a_before_b['a'] = 1 | 156 a_before_b['a'] = 1 |
| 157 a_before_b['b'] = 2 | 157 a_before_b['b'] = 2 |
| 158 | 158 |
| 159 b_before_a = OrderedDict() | 159 b_before_a = OrderedDict() |
| 160 b_before_a['b'] = 2 | 160 b_before_a['b'] = 2 |
| 161 b_before_a['a'] = 1 | 161 b_before_a['a'] = 1 |
| 162 | 162 |
| 163 r1 = m.merge(a, b) | 163 r1 = m.merge([a, b]) |
| 164 self.assertSequenceEqual(a_before_b.items(), r1.items()) | 164 self.assertSequenceEqual(a_before_b.items(), r1.items()) |
| 165 self.assertIsInstance(r1, OrderedDict) | 165 self.assertIsInstance(r1, OrderedDict) |
| 166 | 166 |
| 167 r2 = m.merge(b, a) | 167 r2 = m.merge([b, a]) |
| 168 self.assertSequenceEqual(b_before_a.items(), r2.items()) | 168 self.assertSequenceEqual(b_before_a.items(), r2.items()) |
| 169 self.assertIsInstance(r2, OrderedDict) | 169 self.assertIsInstance(r2, OrderedDict) |
| 170 | 170 |
| 171 def test_custom_match_on_name(self): | 171 def test_custom_match_on_name(self): |
| 172 m = merge_results.JSONMerger() | 172 m = merge_results.JSONMerger() |
| 173 m.add_helper( | 173 m.add_helper( |
| 174 merge_results.NameMatch('a'), | 174 merge_results.NameRegexMatch('a'), |
| 175 lambda a, b, name=None: a + b) | 175 lambda o, name=None: sum(o)) |
| 176 | 176 |
| 177 self.assertDictEqual({'a': 3}, m.merge({'a': 1}, {'a': 2})) | 177 self.assertDictEqual({'a': 3}, m.merge([{'a': 1}, {'a': 2}])) |
| 178 self.assertRaises( | 178 self.assertRaises( |
| 179 merge_results.MergeFailure, m.merge, {'b': 1}, {'b': 2}) | 179 merge_results.MergeFailure, m.merge, [{'b': 1}, {'b': 2}]) |
| 180 | 180 |
| 181 # Test that helpers that are added later have precedence. | 181 # Test that helpers that are added later have precedence. |
| 182 m.add_helper( | 182 m.add_helper( |
| 183 merge_results.NameMatch('b'), | 183 merge_results.NameRegexMatch('b'), |
| 184 lambda a, b, name=None: a + b) | 184 lambda o, name=None: sum(o)) |
| 185 m.add_helper( | 185 m.add_helper( |
| 186 merge_results.NameMatch('b'), | 186 merge_results.NameRegexMatch('b'), |
| 187 lambda a, b, name=None: a - b) | 187 lambda o, name=None: o[0] - o[1]) |
| 188 self.assertDictEqual({'b': -1}, m.merge({'b': 1}, {'b': 2})) | 188 self.assertDictEqual({'b': -1}, m.merge([{'b': 1}, {'b': 2}])) |
| 189 | 189 |
| 190 def test_custom_match_on_obj_type(self): | 190 def test_custom_match_on_obj_type(self): |
| 191 m = merge_results.JSONMerger() | 191 m = merge_results.JSONMerger() |
| 192 m.add_helper( | 192 m.add_helper( |
| 193 merge_results.TypeMatch(int), | 193 merge_results.TypeMatch(int), |
| 194 lambda a, b, name=None: a + b) | 194 lambda o, name=None: sum(o)) |
| 195 self.assertDictEqual({'a': 3}, m.merge({'a': 1}, {'a': 2})) | 195 self.assertDictEqual({'a': 3}, m.merge([{'a': 1}, {'a': 2}])) |
| 196 self.assertDictEqual({'b': 3}, m.merge({'b': 1}, {'b': 2})) | 196 self.assertDictEqual({'b': 3}, m.merge([{'b': 1}, {'b': 2}])) |
| 197 | 197 |
| 198 def test_custom_match_on_obj_value(self): | 198 def test_custom_match_on_obj_value(self): |
| 199 m = merge_results.JSONMerger() | 199 m = merge_results.JSONMerger() |
| 200 m.add_helper( | 200 m.add_helper( |
| 201 merge_results.ValueMatch(3), | 201 merge_results.ValueMatch(3), |
| 202 lambda a, b, name=None: a + b) | 202 lambda o, name=None: sum(o)) |
| 203 self.assertDictEqual({'a': 6}, m.merge({'a': 3}, {'a': 3})) | 203 self.assertDictEqual({'a': 6}, m.merge([{'a': 3}, {'a': 3}])) |
| 204 self.assertDictEqual({'a': 5}, m.merge({'a': 2}, {'a': 3})) | 204 self.assertDictEqual({'a': 5}, m.merge([{'a': 2}, {'a': 3}])) |
| 205 self.assertDictEqual({'a': 7}, m.merge({'a': 3}, {'a': 4})) | 205 self.assertDictEqual({'a': 7}, m.merge([{'a': 3}, {'a': 4}])) |
| 206 self.assertRaises( | 206 self.assertRaises( |
| 207 merge_results.MergeFailure, m.merge, {'a': 1}, {'a': 2}) | 207 merge_results.MergeFailure, m.merge, {'a': 1}, {'a': 2}) |
| 208 | 208 |
| 209 | 209 |
| 210 class MergeFilesOneTests(FileSystemTestCase): | 210 class MergeFilesOneTests(FileSystemTestCase): |
| 211 def test(self): | 211 def test(self): |
| 212 mock_filesystem = MockFileSystem({'/s/file1': '1', '/s/file2': '2'}, dir
s=['/output']) | 212 mock_filesystem = MockFileSystem({'/s/file1': '1', '/s/file2': '2'}, dir
s=['/output']) |
| 213 | 213 |
| 214 merger = merge_results.MergeFilesOne(mock_filesystem) | 214 merger = merge_results.MergeFilesOne(mock_filesystem) |
| 215 | 215 |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 }, | 487 }, |
| 488 ('/output/outff4', ['/s/filea', '/s/filef1a'])) | 488 ('/output/outff4', ['/s/filea', '/s/filef1a'])) |
| 489 | 489 |
| 490 | 490 |
| 491 class JSONTestResultsMerger(unittest.TestCase): | 491 class JSONTestResultsMerger(unittest.TestCase): |
| 492 | 492 |
| 493 def test_allow_unknown_if_matching(self): | 493 def test_allow_unknown_if_matching(self): |
| 494 merger = merge_results.JSONTestResultsMerger(allow_unknown_if_matching=F
alse) | 494 merger = merge_results.JSONTestResultsMerger(allow_unknown_if_matching=F
alse) |
| 495 self.assertEqual( | 495 self.assertEqual( |
| 496 {'version': 3.0}, | 496 {'version': 3.0}, |
| 497 merger.merge({'version': 3.0}, {'version': 3.0})) | 497 merger.merge([{'version': 3.0}, {'version': 3.0}])) |
| 498 | 498 |
| 499 with self.assertRaises(merge_results.MergeFailure): | 499 with self.assertRaises(merge_results.MergeFailure): |
| 500 merger.merge({'random': 'hello'}, {'random': 'hello'}) | 500 merger.merge([{'random': 'hello'}, {'random': 'hello'}]) |
| 501 | 501 |
| 502 merger = merge_results.JSONTestResultsMerger(allow_unknown_if_matching=T
rue) | 502 merger = merge_results.JSONTestResultsMerger(allow_unknown_if_matching=T
rue) |
| 503 self.assertEqual( | 503 self.assertEqual( |
| 504 {'random': 'hello'}, | 504 {'random': 'hello'}, |
| 505 merger.merge({'random': 'hello'}, {'random': 'hello'})) | 505 merger.merge([{'random': 'hello'}, {'random': 'hello'}])) |
| 506 | 506 |
| 507 def test_summable(self): | 507 def test_summable(self): |
| 508 merger = merge_results.JSONTestResultsMerger() | 508 merger = merge_results.JSONTestResultsMerger() |
| 509 self.assertEqual( | 509 self.assertEqual( |
| 510 {'fixable': 5}, | 510 {'fixable': 5}, |
| 511 merger.merge({'fixable': 2}, {'fixable': 3})) | 511 merger.merge([{'fixable': 2}, {'fixable': 3}])) |
| 512 self.assertEqual( | 512 self.assertEqual( |
| 513 {'num_failures_by_type': {'A': 4, 'B': 3, 'C': 2}}, | 513 {'num_failures_by_type': {'A': 4, 'B': 3, 'C': 2}}, |
| 514 merger.merge( | 514 merger.merge([ |
| 515 {'num_failures_by_type': {'A': 3, 'B': 1}}, | 515 {'num_failures_by_type': {'A': 3, 'B': 1}}, |
| 516 {'num_failures_by_type': {'A': 1, 'B': 2, 'C': 2}})) | 516 {'num_failures_by_type': {'A': 1, 'B': 2, 'C': 2}}, |
| 517 ])) |
| 517 | 518 |
| 518 def test_interrupted(self): | 519 def test_interrupted(self): |
| 519 merger = merge_results.JSONTestResultsMerger() | 520 merger = merge_results.JSONTestResultsMerger() |
| 520 self.assertEqual( | 521 self.assertEqual( |
| 521 {'interrupted': False}, | 522 {'interrupted': False}, |
| 522 merger.merge({'interrupted': False}, {'interrupted': False})) | 523 merger.merge([{'interrupted': False}, {'interrupted': False}])) |
| 523 self.assertEqual( | 524 self.assertEqual( |
| 524 {'interrupted': True}, | 525 {'interrupted': True}, |
| 525 merger.merge({'interrupted': True}, {'interrupted': False})) | 526 merger.merge([{'interrupted': True}, {'interrupted': False}])) |
| 526 self.assertEqual( | 527 self.assertEqual( |
| 527 {'interrupted': True}, | 528 {'interrupted': True}, |
| 528 merger.merge({'interrupted': False}, {'interrupted': True})) | 529 merger.merge([{'interrupted': False}, {'interrupted': True}])) |
| 529 | 530 |
| 530 def test_seconds_since_epoch(self): | 531 def test_seconds_since_epoch(self): |
| 531 merger = merge_results.JSONTestResultsMerger() | 532 merger = merge_results.JSONTestResultsMerger() |
| 532 self.assertEqual( | 533 self.assertEqual( |
| 533 {'seconds_since_epoch': 2}, | 534 {'seconds_since_epoch': 2}, |
| 534 merger.merge({'seconds_since_epoch': 3}, {'seconds_since_epoch': 2})
) | 535 merger.merge([{'seconds_since_epoch': 3}, {'seconds_since_epoch': 2}
])) |
| 535 self.assertEqual( | 536 self.assertEqual( |
| 536 {'seconds_since_epoch': 2}, | 537 {'seconds_since_epoch': 2}, |
| 537 merger.merge({'seconds_since_epoch': 2}, {'seconds_since_epoch': 3})
) | 538 merger.merge([{'seconds_since_epoch': 2}, {'seconds_since_epoch': 3}
])) |
| 538 self.assertEqual( | 539 self.assertEqual( |
| 539 {'seconds_since_epoch': 12}, | 540 {'seconds_since_epoch': 12}, |
| 540 merger.merge({'seconds_since_epoch': 12}, {})) | 541 merger.merge([{'seconds_since_epoch': 12}, {}])) |
| 541 | 542 |
| 542 | 543 |
| 543 class LayoutTestDirMergerTests(unittest.TestCase): | 544 class LayoutTestDirMergerTests(unittest.TestCase): |
| 544 | 545 |
| 545 maxDiff = None | 546 maxDiff = None |
| 546 | 547 |
| 547 # Common HTML files every shard has. | 548 # Common HTML files every shard has. |
| 548 dashboard_html = '<html><body>Dashboard would be here.</body></html>' | 549 dashboard_html = '<html><body>Dashboard would be here.</body></html>' |
| 549 dashboard_css = '.css { value = would be here }' | 550 dashboard_css = '.css { value = would be here }' |
| 550 | 551 |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1055 | 1056 |
| 1056 def test(self): | 1057 def test(self): |
| 1057 fs = MockFileSystem(self.layout_test_filesystem) | 1058 fs = MockFileSystem(self.layout_test_filesystem) |
| 1058 | 1059 |
| 1059 merger = merge_results.LayoutTestDirMerger(fs, results_json_value_overri
des={'layout_tests_dir': 'src'}) | 1060 merger = merge_results.LayoutTestDirMerger(fs, results_json_value_overri
des={'layout_tests_dir': 'src'}) |
| 1060 merger.merge('/out', ['/shards/0', '/shards/1']) | 1061 merger.merge('/out', ['/shards/0', '/shards/1']) |
| 1061 | 1062 |
| 1062 for fname, contents in self.layout_test_output_filesystem.items(): | 1063 for fname, contents in self.layout_test_output_filesystem.items(): |
| 1063 self.assertIn(fname, fs.files) | 1064 self.assertIn(fname, fs.files) |
| 1064 self.assertMultiLineEqual(contents, fs.files[fname]) | 1065 self.assertMultiLineEqual(contents, fs.files[fname]) |
| OLD | NEW |