Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 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 from collections import defaultdict | 5 from collections import defaultdict |
| 6 import copy | 6 import copy |
| 7 | 7 |
| 8 from common.dependency import Dependency | 8 from common.dependency import Dependency |
| 9 from common.dependency import DependencyRoll | 9 from common.dependency import DependencyRoll |
| 10 from common import chrome_dependency_fetcher | 10 from common import chrome_dependency_fetcher |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 passed_in_regression_deps_rolls.append(regression_deps_rolls) | 126 passed_in_regression_deps_rolls.append(regression_deps_rolls) |
| 127 return {}, None | 127 return {}, None |
| 128 | 128 |
| 129 self.mock(changelist_classifier, 'GetChangeLogsForFilesGroupedByDeps', | 129 self.mock(changelist_classifier, 'GetChangeLogsForFilesGroupedByDeps', |
| 130 _MockGetChangeLogsForFilesGroupedByDeps) | 130 _MockGetChangeLogsForFilesGroupedByDeps) |
| 131 self.mock(changelist_classifier, 'GetStackInfosForFilesGroupedByDeps', | 131 self.mock(changelist_classifier, 'GetStackInfosForFilesGroupedByDeps', |
| 132 lambda *_: {}) | 132 lambda *_: {}) |
| 133 self.mock(changelist_classifier, 'FindMatchResults', lambda *_: None) | 133 self.mock(changelist_classifier, 'FindMatchResults', lambda *_: None) |
| 134 | 134 |
| 135 cl_classifier = changelist_classifier.ChangelistClassifier( | 135 cl_classifier = changelist_classifier.ChangelistClassifier( |
| 136 GitilesRepository(), 7) | 136 GitilesRepository(self.GetMockHttpClient()), 7) |
| 137 cl_classifier(CrashReport(crashed_version = '5', | 137 cl_classifier(CrashReport(crashed_version = '5', |
| 138 signature = 'sig', | 138 signature = 'sig', |
| 139 platform = 'canary', | 139 platform = 'canary', |
| 140 stacktrace = Stacktrace([CallStack(0)]), | 140 stacktrace = Stacktrace([CallStack(0)]), |
| 141 regression_range = ['4', '5'])) | 141 regression_range = ['4', '5'])) |
| 142 expected_regression_deps_rolls = copy.deepcopy(dep_rolls) | 142 expected_regression_deps_rolls = copy.deepcopy(dep_rolls) |
| 143 | 143 |
| 144 # Regression of a dep added/deleted (old_revision/new_revision is None) can | 144 # Regression of a dep added/deleted (old_revision/new_revision is None) can |
| 145 # not be known for sure and this case rarely happens, so just filter them | 145 # not be known for sure and this case rarely happens, so just filter them |
| 146 # out. | 146 # out. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 180 def _MockGetChangeLogs(_, start_rev, end_rev): | 180 def _MockGetChangeLogs(_, start_rev, end_rev): |
| 181 if start_rev == '4' and end_rev == '5': | 181 if start_rev == '4' and end_rev == '5': |
| 182 return [DUMMY_CHANGELOG1, DUMMY_CHANGELOG2, DUMMY_CHANGELOG3] | 182 return [DUMMY_CHANGELOG1, DUMMY_CHANGELOG2, DUMMY_CHANGELOG3] |
| 183 | 183 |
| 184 return [] | 184 return [] |
| 185 | 185 |
| 186 self.mock(GitilesRepository, 'GetChangeLogs', _MockGetChangeLogs) | 186 self.mock(GitilesRepository, 'GetChangeLogs', _MockGetChangeLogs) |
| 187 | 187 |
| 188 dep_file_to_changelogs, ignore_cls = ( | 188 dep_file_to_changelogs, ignore_cls = ( |
| 189 changelist_classifier.GetChangeLogsForFilesGroupedByDeps( | 189 changelist_classifier.GetChangeLogsForFilesGroupedByDeps( |
| 190 regression_deps_rolls, stack_deps, GitilesRepository())) | 190 regression_deps_rolls, stack_deps, |
| 191 GitilesRepository(self.GetMockHttpClient()))) | |
| 191 dep_file_to_changelogs_json = defaultdict(lambda: defaultdict(list)) | 192 dep_file_to_changelogs_json = defaultdict(lambda: defaultdict(list)) |
| 192 for dep, file_to_changelogs in dep_file_to_changelogs.iteritems(): | 193 for dep, file_to_changelogs in dep_file_to_changelogs.iteritems(): |
| 193 for file_path, changelogs in file_to_changelogs.iteritems(): | 194 for file_path, changelogs in file_to_changelogs.iteritems(): |
| 194 for changelog in changelogs: | 195 for changelog in changelogs: |
| 195 dep_file_to_changelogs_json[dep][file_path].append(changelog.ToDict()) | 196 dep_file_to_changelogs_json[dep][file_path].append(changelog.ToDict()) |
| 196 | 197 |
| 197 expected_dep_file_to_changelogs_json = { | 198 expected_dep_file_to_changelogs_json = { |
| 198 'src/': { | 199 'src/': { |
| 199 'a.cc': [DUMMY_CHANGELOG1.ToDict()], | 200 'a.cc': [DUMMY_CHANGELOG1.ToDict()], |
| 200 'f.cc': [DUMMY_CHANGELOG3.ToDict()] | 201 'f.cc': [DUMMY_CHANGELOG3.ToDict()] |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 292 'project_path': 'src/', | 293 'project_path': 'src/', |
| 293 'author': 'r@chromium.org', | 294 'author': 'r@chromium.org', |
| 294 'time': 'Thu Mar 31 21:24:43 2016', | 295 'time': 'Thu Mar 31 21:24:43 2016', |
| 295 'reasons': None, | 296 'reasons': None, |
| 296 'confidence': None, | 297 'confidence': None, |
| 297 'changed_files': None | 298 'changed_files': None |
| 298 }] | 299 }] |
| 299 | 300 |
| 300 match_results = changelist_classifier.FindMatchResults( | 301 match_results = changelist_classifier.FindMatchResults( |
| 301 dep_file_to_changelogs, dep_file_to_stack_infos, stack_deps, | 302 dep_file_to_changelogs, dep_file_to_stack_infos, stack_deps, |
| 302 GitilesRepository()) | 303 GitilesRepository(self.GetMockHttpClient())) |
| 303 self.assertListEqual([result.ToDict() for result in match_results], | 304 self.assertListEqual([result.ToDict() for result in match_results], |
| 304 expected_match_results) | 305 expected_match_results) |
| 305 | 306 |
| 306 # TODO(http://crbug.com/659346): why do these mocks give coverage | 307 # TODO(http://crbug.com/659346): why do these mocks give coverage |
| 307 # failures? That's almost surely hiding a bug in the tests themselves. | 308 # failures? That's almost surely hiding a bug in the tests themselves. |
| 308 def testFindItForCrashNoRegressionRange(self): # pragma: no cover | 309 def testFindItForCrashNoRegressionRange(self): # pragma: no cover |
| 309 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 310 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 310 'GetDependencyRollsDict', lambda *_: {}) | 311 'GetDependencyRollsDict', lambda *_: {}) |
| 311 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 312 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 312 'GetDependency', lambda *_: {}) | 313 'GetDependency', lambda *_: {}) |
| 313 cl_classifier = changelist_classifier.ChangelistClassifier(7, | 314 cl_classifier = changelist_classifier.ChangelistClassifier( |
| 314 GitilesRepository()) | 315 7, GitilesRepository(self.GetMockHttpClient())) |
|
wrengr
2016/11/22 19:11:53
Since we do this line a lot in a bunch of tests, m
Sharu Jiang
2016/11/22 20:15:38
Done.
| |
| 315 # N.B., for this one test we really do want regression_range=None. | 316 # N.B., for this one test we really do want regression_range=None. |
| 316 report = DUMMY_REPORT._replace(regression_range=None) | 317 report = DUMMY_REPORT._replace(regression_range=None) |
| 317 self.assertListEqual(cl_classifier(report), []) | 318 self.assertListEqual(cl_classifier(report), []) |
| 318 | 319 |
| 319 def testFindItForCrashNoMatchFound(self): | 320 def testFindItForCrashNoMatchFound(self): |
| 320 self.mock(changelist_classifier, 'FindMatchResults', lambda *_: []) | 321 self.mock(changelist_classifier, 'FindMatchResults', lambda *_: []) |
| 321 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 322 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 322 'GetDependencyRollsDict', | 323 'GetDependencyRollsDict', |
| 323 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) | 324 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) |
| 324 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 325 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 325 'GetDependency', lambda *_: {}) | 326 'GetDependency', lambda *_: {}) |
| 326 cl_classifier = changelist_classifier.ChangelistClassifier(7, | 327 cl_classifier = changelist_classifier.ChangelistClassifier( |
| 327 GitilesRepository()) | 328 7, GitilesRepository(self.GetMockHttpClient())) |
| 328 self.assertListEqual(cl_classifier(DUMMY_REPORT), []) | 329 self.assertListEqual(cl_classifier(DUMMY_REPORT), []) |
| 329 | 330 |
| 330 def testFindItForCrash(self): | 331 def testFindItForCrash(self): |
| 331 | 332 |
| 332 def _MockFindMatchResults(*_): | 333 def _MockFindMatchResults(*_): |
| 333 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '') | 334 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '') |
| 334 frame1 = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [1]) | 335 frame1 = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [1]) |
| 335 frame2 = StackFrame(1, 'src/', 'func', 'a.cc', 'src/a.cc', [7]) | 336 frame2 = StackFrame(1, 'src/', 'func', 'a.cc', 'src/a.cc', [7]) |
| 336 match_result1.file_to_stack_infos = { | 337 match_result1.file_to_stack_infos = { |
| 337 'a.cc': [(frame1, 0), (frame2, 0)] | 338 'a.cc': [(frame1, 0), (frame2, 0)] |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 350 } | 351 } |
| 351 | 352 |
| 352 return [match_result1, match_result2] | 353 return [match_result1, match_result2] |
| 353 | 354 |
| 354 self.mock(changelist_classifier, 'FindMatchResults', _MockFindMatchResults) | 355 self.mock(changelist_classifier, 'FindMatchResults', _MockFindMatchResults) |
| 355 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 356 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 356 'GetDependencyRollsDict', | 357 'GetDependencyRollsDict', |
| 357 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) | 358 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) |
| 358 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 359 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 359 'GetDependency', lambda *_: {}) | 360 'GetDependency', lambda *_: {}) |
| 360 cl_classifier = changelist_classifier.ChangelistClassifier(7, | 361 cl_classifier = changelist_classifier.ChangelistClassifier( |
| 361 GitilesRepository()) | 362 7, GitilesRepository(self.GetMockHttpClient())) |
| 362 results = cl_classifier(DUMMY_REPORT) | 363 results = cl_classifier(DUMMY_REPORT) |
| 363 expected_match_results = [ | 364 expected_match_results = [ |
| 364 { | 365 { |
| 365 'reasons': [('TopFrameIndex', 1.0, 'Top frame is #0'), | 366 'reasons': [('TopFrameIndex', 1.0, 'Top frame is #0'), |
| 366 ('MinDistance', 1, 'Minimum distance is 0')], | 367 ('MinDistance', 1, 'Minimum distance is 0')], |
| 367 'changed_files': [{'info': 'Minimum distance (LOC) 0, frame #0', | 368 'changed_files': [{'info': 'Minimum distance (LOC) 0, frame #0', |
| 368 'blame_url': None, 'file': 'a.cc'}], | 369 'blame_url': None, 'file': 'a.cc'}], |
| 369 'time': 'Thu Mar 31 21:24:43 2016', | 370 'time': 'Thu Mar 31 21:24:43 2016', |
| 370 'author': 'r@chromium.org', | 371 'author': 'r@chromium.org', |
| 371 'url': 'https://repo.test/+/1', | 372 'url': 'https://repo.test/+/1', |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 409 | 410 |
| 410 return [match_result1, match_result2, match_result3] | 411 return [match_result1, match_result2, match_result3] |
| 411 | 412 |
| 412 self.mock(changelist_classifier, 'FindMatchResults', _MockFindMatchResults) | 413 self.mock(changelist_classifier, 'FindMatchResults', _MockFindMatchResults) |
| 413 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 414 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 414 'GetDependencyRollsDict', | 415 'GetDependencyRollsDict', |
| 415 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) | 416 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) |
| 416 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 417 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 417 'GetDependency', lambda *_: {}) | 418 'GetDependency', lambda *_: {}) |
| 418 | 419 |
| 419 cl_classifier = changelist_classifier.ChangelistClassifier(7, | 420 cl_classifier = changelist_classifier.ChangelistClassifier( |
| 420 GitilesRepository()) | 421 7, GitilesRepository(self.GetMockHttpClient())) |
| 421 results = cl_classifier(DUMMY_REPORT) | 422 results = cl_classifier(DUMMY_REPORT) |
| 422 expected_match_results = [ | 423 expected_match_results = [ |
| 423 { | 424 { |
| 424 'author': 'r@chromium.org', | 425 'author': 'r@chromium.org', |
| 425 'changed_files': [ | 426 'changed_files': [ |
| 426 { | 427 { |
| 427 'blame_url': None, | 428 'blame_url': None, |
| 428 'file': 'a.cc', | 429 'file': 'a.cc', |
| 429 'info': 'Minimum distance (LOC) 1, frame #0' | 430 'info': 'Minimum distance (LOC) 1, frame #0' |
| 430 } | 431 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 468 | 469 |
| 469 return [match_result1, match_result2] | 470 return [match_result1, match_result2] |
| 470 | 471 |
| 471 self.mock(changelist_classifier, 'FindMatchResults', _MockFindMatchResults) | 472 self.mock(changelist_classifier, 'FindMatchResults', _MockFindMatchResults) |
| 472 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 473 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 473 'GetDependencyRollsDict', | 474 'GetDependencyRollsDict', |
| 474 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) | 475 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) |
| 475 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 476 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 476 'GetDependency', lambda *_: {}) | 477 'GetDependency', lambda *_: {}) |
| 477 | 478 |
| 478 cl_classifier = changelist_classifier.ChangelistClassifier(7, | 479 cl_classifier = changelist_classifier.ChangelistClassifier( |
| 479 GitilesRepository()) | 480 7, GitilesRepository(self.GetMockHttpClient())) |
| 480 self.assertListEqual(cl_classifier(DUMMY_REPORT), []) | 481 self.assertListEqual(cl_classifier(DUMMY_REPORT), []) |
| OLD | NEW |