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

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

Issue 2605943002: Removing the mutation in the factories for getting dep repositories (Closed)
Patch Set: Created 3 years, 11 months 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 CallStackFormatType.DEFAULT, LanguageType.CPP), 114 CallStackFormatType.DEFAULT, LanguageType.CPP),
115 CallStack(1, [], 115 CallStack(1, [],
116 CallStackFormatType.DEFAULT, LanguageType.CPP)] 116 CallStackFormatType.DEFAULT, LanguageType.CPP)]
117 DUMMY_REPORT = CrashReport(None, None, None, Stacktrace(DUMMY_CALLSTACKS, 117 DUMMY_REPORT = CrashReport(None, None, None, Stacktrace(DUMMY_CALLSTACKS,
118 DUMMY_CALLSTACKS[0]), 118 DUMMY_CALLSTACKS[0]),
119 (None, None)) 119 (None, None))
120 120
121 121
122 class ChangelistClassifierTest(CrashTestSuite): 122 class ChangelistClassifierTest(CrashTestSuite):
123 123
124 @property
125 def _mock_http_gitiles_repo_factory(self):
126 # N.B., we must return a lambda rather than taking ``repo_url``
127 # as an additional argument to the method/property, to ensure that
128 # things have the right arity when this is eventually called. That
129 # is, we want a function of ``repo_url`` which closes over ``self``,
130 # rather than a function taking two arguments at once.
131 return lambda repo_url: GitilesRepository(
132 self.GetMockHttpClient(), repo_url)
133
124 def setUp(self): 134 def setUp(self):
125 super(ChangelistClassifierTest, self).setUp() 135 super(ChangelistClassifierTest, self).setUp()
126 136
127 repository = GitilesRepository(self.GetMockHttpClient())
128
129 # TODO(crbug.com/677224): should replace this with an actual factory.
130 def MutateTheRepo(dep_url): # pragma: no cover
131 """A factory function for returning ``Repository`` objects.
132
133 The current definition captures the functionality of before
134 we factored out this factory method. That is, it's not really a
135 "factory" but rather mutates the main repo object in place. In
136 the future this should be changed to do the right thing instead.
137 """
138 repository.repo_url = dep_url
139 return repository
140
141 self.changelist_classifier = changelist_classifier.ChangelistClassifier( 137 self.changelist_classifier = changelist_classifier.ChangelistClassifier(
142 repository, MutateTheRepo, 7) 138 self._mock_http_gitiles_repo_factory, 7)
143 139
144 def testSkipAddedAndDeletedRegressionRolls(self): 140 def testSkipAddedAndDeletedRegressionRolls(self):
145 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, 141 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher,
146 'GetDependency', lambda *_: {}) 142 'GetDependency', lambda *_: {})
147 dep_rolls = { 143 dep_rolls = {
148 'src/dep': DependencyRoll('src/dep1', 'https://url_dep1', None, '9'), 144 'src/dep': DependencyRoll('src/dep1', 'https://url_dep1', None, '9'),
149 'src/': DependencyRoll('src/', ('https://chromium.googlesource.com/' 145 'src/': DependencyRoll('src/', ('https://chromium.googlesource.com/'
150 'chromium/src.git'), '4', '5') 146 'chromium/src.git'), '4', '5')
151 } 147 }
152 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, 148 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher,
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 def _MockGetChangeLogs(_, start_rev, end_rev): 204 def _MockGetChangeLogs(_, start_rev, end_rev):
209 if start_rev == '4' and end_rev == '5': 205 if start_rev == '4' and end_rev == '5':
210 return [DUMMY_CHANGELOG1, DUMMY_CHANGELOG2, DUMMY_CHANGELOG3] 206 return [DUMMY_CHANGELOG1, DUMMY_CHANGELOG2, DUMMY_CHANGELOG3]
211 207
212 return [] 208 return []
213 209
214 self.mock(GitilesRepository, 'GetChangeLogs', _MockGetChangeLogs) 210 self.mock(GitilesRepository, 'GetChangeLogs', _MockGetChangeLogs)
215 211
216 dep_file_to_changelogs, ignore_cls = ( 212 dep_file_to_changelogs, ignore_cls = (
217 changelist_classifier.GetChangeLogsForFilesGroupedByDeps( 213 changelist_classifier.GetChangeLogsForFilesGroupedByDeps(
218 regression_deps_rolls, stack_deps, 214 regression_deps_rolls,
219 GitilesRepository(self.GetMockHttpClient()))) 215 stack_deps,
216 self._mock_http_gitiles_repo_factory))
220 dep_file_to_changelogs_json = defaultdict(lambda: defaultdict(list)) 217 dep_file_to_changelogs_json = defaultdict(lambda: defaultdict(list))
221 for dep, file_to_changelogs in dep_file_to_changelogs.iteritems(): 218 for dep, file_to_changelogs in dep_file_to_changelogs.iteritems():
222 for file_path, changelogs in file_to_changelogs.iteritems(): 219 for file_path, changelogs in file_to_changelogs.iteritems():
223 for changelog in changelogs: 220 for changelog in changelogs:
224 dep_file_to_changelogs_json[dep][file_path].append(changelog.ToDict()) 221 dep_file_to_changelogs_json[dep][file_path].append(changelog.ToDict())
225 222
226 expected_dep_file_to_changelogs_json = { 223 expected_dep_file_to_changelogs_json = {
227 'src/': { 224 'src/': {
228 'a.cc': [DUMMY_CHANGELOG1.ToDict()], 225 'a.cc': [DUMMY_CHANGELOG1.ToDict()],
229 'f.cc': [DUMMY_CHANGELOG3.ToDict()] 226 'f.cc': [DUMMY_CHANGELOG3.ToDict()]
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 'project_path': 'src/', 318 'project_path': 'src/',
322 'author': 'r@chromium.org', 319 'author': 'r@chromium.org',
323 'time': 'Thu Mar 31 21:24:43 2016', 320 'time': 'Thu Mar 31 21:24:43 2016',
324 'reasons': None, 321 'reasons': None,
325 'confidence': None, 322 'confidence': None,
326 'changed_files': None 323 'changed_files': None
327 }] 324 }]
328 325
329 suspects = changelist_classifier.FindSuspects( 326 suspects = changelist_classifier.FindSuspects(
330 dep_file_to_changelogs, dep_file_to_stack_infos, stack_deps, 327 dep_file_to_changelogs, dep_file_to_stack_infos, stack_deps,
331 lambda repo_url: GitilesRepository(self.GetMockHttpClient(), repo_url)) 328 self._mock_http_gitiles_repo_factory)
332 self.assertListEqual([suspect.ToDict() for suspect in suspects], 329 self.assertListEqual([suspect.ToDict() for suspect in suspects],
333 expected_suspects) 330 expected_suspects)
334 331
335 # TODO(http://crbug.com/659346): why do these mocks give coverage 332 # TODO(http://crbug.com/659346): why do these mocks give coverage
336 # failures? That's almost surely hiding a bug in the tests themselves. 333 # failures? That's almost surely hiding a bug in the tests themselves.
337 def testFindItForCrashNoRegressionRange(self): # pragma: no cover 334 def testFindItForCrashNoRegressionRange(self): # pragma: no cover
338 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, 335 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher,
339 'GetDependencyRollsDict', lambda *_: {}) 336 'GetDependencyRollsDict', lambda *_: {})
340 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, 337 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher,
341 'GetDependency', lambda *_: {}) 338 'GetDependency', lambda *_: {})
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 return [suspect1, suspect2] 495 return [suspect1, suspect2]
499 496
500 self.mock(changelist_classifier, 'FindSuspects', _MockFindSuspects) 497 self.mock(changelist_classifier, 'FindSuspects', _MockFindSuspects)
501 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, 498 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher,
502 'GetDependencyRollsDict', 499 'GetDependencyRollsDict',
503 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')}) 500 lambda *_: {'src/': DependencyRoll('src/', 'https://repo', '1', '2')})
504 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, 501 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher,
505 'GetDependency', lambda *_: {}) 502 'GetDependency', lambda *_: {})
506 503
507 self.assertListEqual(self.changelist_classifier(DUMMY_REPORT), []) 504 self.assertListEqual(self.changelist_classifier(DUMMY_REPORT), [])
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698