Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Side by Side Diff: appengine/findit/crash/test/changelist_classifier_test.py

Issue 2524633002: [Culprit-Finder] Refactor GitilesRepostory to make http_client required argument. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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), [])
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698