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

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

Issue 2414523002: [Findit] Reorganizing findit_for_*.py (Closed)
Patch Set: Finally fixed the mock tests! 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
(Empty)
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
3 # found in the LICENSE file.
4
5 from collections import defaultdict
6
7 from common import git_repository
8 from common.blame import Region
9 from common.blame import Blame
10 from common.change_log import ChangeLog
11 from common.dependency import Dependency
12 from common.dependency import DependencyRoll
13 from common.http_client_appengine import HttpClientAppengine
14 from crash import findit_for_crash
15 from crash.stacktrace import StackFrame
16 from crash.stacktrace import CallStack
17 from crash.stacktrace import Stacktrace
18 from crash.results import MatchResult
19 from crash.test.crash_test_suite import CrashTestSuite
20
21
22 DUMMY_CHANGELOG1 = ChangeLog.FromDict({
23 'author_name': 'r@chromium.org',
24 'message': 'dummy',
25 'committer_email': 'r@chromium.org',
26 'commit_position': 175900,
27 'author_email': 'r@chromium.org',
28 'touched_files': [
29 {
30 'change_type': 'add',
31 'new_path': 'a.cc',
32 'old_path': None,
33 },
34 ],
35 'author_time': 'Thu Mar 31 21:24:43 2016',
36 'committer_time': 'Thu Mar 31 21:28:39 2016',
37 'commit_url':
38 'https://repo.test/+/1',
39 'code_review_url': 'https://codereview.chromium.org/3281',
40 'committer_name': 'example@chromium.org',
41 'revision': '1',
42 'reverted_revision': None
43 })
44
45 DUMMY_CHANGELOG2 = ChangeLog.FromDict({
46 'author_name': 'example@chromium.org',
47 'message': 'dummy',
48 'committer_email': 'example@chromium.org',
49 'commit_position': 175976,
50 'author_email': 'example@chromium.org',
51 'touched_files': [
52 {
53 'change_type': 'add',
54 'new_path': 'f0.cc',
55 'old_path': 'b/f0.cc'
56 },
57 ],
58 'author_time': 'Thu Mar 31 21:24:43 2016',
59 'committer_time': 'Thu Mar 31 21:28:39 2016',
60 'commit_url':
61 'https://repo.test/+/2',
62 'code_review_url': 'https://codereview.chromium.org/3281',
63 'committer_name': 'example@chromium.org',
64 'revision': '2',
65 'reverted_revision': '1'
66 })
67
68 DUMMY_CHANGELOG3 = ChangeLog.FromDict({
69 'author_name': 'e@chromium.org',
70 'message': 'dummy',
71 'committer_email': 'e@chromium.org',
72 'commit_position': 176000,
73 'author_email': 'e@chromium.org',
74 'touched_files': [
75 {
76 'change_type': 'modify',
77 'new_path': 'f.cc',
78 'old_path': 'f.cc'
79 },
80 {
81 'change_type': 'delete',
82 'new_path': None,
83 'old_path': 'f1.cc'
84 },
85 ],
86 'author_time': 'Thu Apr 1 21:24:43 2016',
87 'committer_time': 'Thu Apr 1 21:28:39 2016',
88 'commit_url':
89 'https://repo.test/+/3',
90 'code_review_url': 'https://codereview.chromium.org/3281',
91 'committer_name': 'example@chromium.org',
92 'revision': '3',
93 'reverted_revision': None
94 })
95
96
97 class FinditForCrashTest(CrashTestSuite):
98
99 def testGetDepsInCrashStack(self):
100 crash_stack = CallStack(0)
101 crash_stack.extend([
102 StackFrame(0, 'src/', 'func0', 'f0.cc', 'src/f0.cc', [1]),
103 StackFrame(1, 'src/', 'func1', 'f1.cc', 'src/f1.cc', [2, 3]),
104 StackFrame(1, '', 'func2', 'f2.cc', 'src/f2.cc', [2, 3]),
105 ])
106 crash_deps = {'src/': Dependency('src/', 'https://chromium_repo', '1'),
107 'src/v8/': Dependency('src/v8/', 'https://v8_repo', '2')}
108
109 expected_stack_deps = {'src/': crash_deps['src/']}
110
111 self.assertEqual(
112 findit_for_crash.GetDepsInCrashStack(crash_stack, crash_deps),
113 expected_stack_deps)
114
115 def testGetChangeLogsForFilesGroupedByDeps(self):
116 regression_deps_rolls = {
117 'src/dep1': DependencyRoll('src/dep1', 'https://url_dep1', '7', '9'),
118 'src/dep2': DependencyRoll('src/dep2', 'repo_url', '3', None),
119 'src/': DependencyRoll('src/', ('https://chromium.googlesource.com/'
120 'chromium/src.git'), '4', '5')
121 }
122
123 stack_deps = {
124 'src/': Dependency('src/', 'https://url_src', 'rev1', 'DEPS'),
125 'src/new': Dependency('src/new', 'https://new', 'rev2', 'DEPS'),
126 }
127
128 def _MockGetChangeLogs(*_):
129 return [DUMMY_CHANGELOG1, DUMMY_CHANGELOG2, DUMMY_CHANGELOG3]
130
131 self.mock(git_repository.GitRepository, 'GetChangeLogs', _MockGetChangeLogs)
132
133 dep_file_to_changelogs, ignore_cls = (
134 findit_for_crash.GetChangeLogsForFilesGroupedByDeps(
135 regression_deps_rolls, stack_deps, git_repository.GitRepository()))
136 dep_file_to_changelogs_json = defaultdict(lambda: defaultdict(list))
137 for dep, file_to_changelogs in dep_file_to_changelogs.iteritems():
138 for file_path, changelogs in file_to_changelogs.iteritems():
139 for changelog in changelogs:
140 dep_file_to_changelogs_json[dep][file_path].append(changelog.ToDict())
141
142 expected_dep_file_to_changelogs_json = {
143 'src/': {
144 'a.cc': [DUMMY_CHANGELOG1.ToDict()],
145 'f.cc': [DUMMY_CHANGELOG3.ToDict()]
146 }
147 }
148 self.assertEqual(dep_file_to_changelogs_json,
149 expected_dep_file_to_changelogs_json)
150 self.assertEqual(ignore_cls, set(['1']))
151
152 def testGetStackInfosForFilesGroupedByDeps(self):
153
154 main_stack = CallStack(0)
155 main_stack.extend(
156 [StackFrame(0, 'src/', 'c(p* &d)', 'a.cc', 'src/a.cc', [177]),
157 StackFrame(1, 'src/', 'd(a* c)', 'a.cc', 'src/a.cc', [227, 228, 229]),
158 StackFrame(2, 'src/v8/', 'e(int)', 'b.cc', 'src/v8/b.cc', [89, 90])])
159
160 low_priority_stack = CallStack(1)
161 low_priority_stack.append(
162 StackFrame(0, 'src/dummy/', 'c(p* &d)', 'd.cc', 'src/dummy/d.cc', [17]))
163
164 stacktrace = Stacktrace()
165 stacktrace.extend([main_stack, low_priority_stack])
166
167 crashed_deps = {'src/': Dependency('src/', 'https//repo', '2'),
168 'src/v8/': Dependency('src/v8', 'https//repo', '1')}
169
170 expected_dep_file_to_stack_infos = {
171 'src/': {
172 'a.cc': [
173 (main_stack[0], 0),
174 (main_stack[1], 0),
175 ],
176 },
177 'src/v8/': {
178 'b.cc': [
179 (main_stack[2], 0),
180 ]
181 }
182 }
183
184 dep_file_to_stack_infos = (
185 findit_for_crash.GetStackInfosForFilesGroupedByDeps(
186 stacktrace, crashed_deps))
187
188 self.assertEqual(len(dep_file_to_stack_infos),
189 len(expected_dep_file_to_stack_infos))
190
191 for dep, file_to_stack_infos in dep_file_to_stack_infos.iteritems():
192 self.assertTrue(dep in expected_dep_file_to_stack_infos)
193 expected_file_to_stack_infos = expected_dep_file_to_stack_infos[dep]
194
195 for file_path, stack_infos in file_to_stack_infos.iteritems():
196 self.assertTrue(file_path in expected_file_to_stack_infos)
197 expected_stack_infos = expected_file_to_stack_infos[file_path]
198
199 self._VerifyTwoStackInfosEqual(stack_infos, expected_stack_infos)
200
201 def testFindMatchResults(self):
202 dep_file_to_changelogs = {
203 'src/': {
204 'a.cc': [
205 DUMMY_CHANGELOG1,
206 ]
207 }
208 }
209
210 dep_file_to_stack_infos = {
211 'src/': {
212 'a.cc': [
213 (StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [1]), 0),
214 (StackFrame(1, 'src/', 'func', 'a.cc', 'src/a.cc', [7]), 0),
215 ],
216 'b.cc': [
217 (StackFrame(2, 'src/', 'func', 'b.cc', 'src/b.cc', [36]), 0),
218 ]
219 }
220 }
221
222 dummy_blame = Blame('9', 'a.cc')
223 dummy_blame.AddRegion(
224 Region(1, 5, '6', 'a', 'a@chromium.org', 'Thu Mar 31 21:24:43 2016'))
225 dummy_blame.AddRegion(
226 Region(6, 10, '1', 'b', 'b@chromium.org', 'Thu Jun 19 12:11:40 2015'))
227
228 def _MockGetBlame(*_):
229 return dummy_blame
230
231 self.mock(git_repository.GitRepository, 'GetBlame', _MockGetBlame)
232
233 stack_deps = {
234 'src/': Dependency('src/', 'https://url_src', 'rev1', 'DEPS'),
235 }
236
237 expected_match_results = [{
238 'url': 'https://repo.test/+/1',
239 'review_url': 'https://codereview.chromium.org/3281',
240 'revision': '1',
241 'project_path': 'src/',
242 'author': 'r@chromium.org',
243 'time': 'Thu Mar 31 21:24:43 2016',
244 'reasons': None,
245 'confidence': None,
246 'changed_files': None
247 }]
248
249 match_results = findit_for_crash.FindMatchResults(
250 dep_file_to_changelogs, dep_file_to_stack_infos, stack_deps,
251 git_repository.GitRepository())
252 self.assertEqual([result.ToDict() for result in match_results],
253 expected_match_results)
254
255 def testFindItForCrashNoRegressionRange(self):
256 self.assertEqual(
257 findit_for_crash.FindItForCrash(Stacktrace(), {}, {}, 7,
258 git_repository.GitRepository()),
259 [])
260
261 def testFindItForCrashNoMatchFound(self):
262
263 def _MockFindMatchResults(*_):
264 return []
265
266 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults)
267
268 regression_deps_rolls = {'src/': DependencyRoll('src/', 'https://repo',
269 '1', '2')}
270 self.assertEqual(findit_for_crash.FindItForCrash(
271 Stacktrace(), regression_deps_rolls, {}, 7,
272 git_repository.GitRepository()), [])
273
274 def testFindItForCrash(self):
275
276 def _MockFindMatchResults(*_):
277 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '')
278 frame1 = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [1])
279 frame2 = StackFrame(1, 'src/', 'func', 'a.cc', 'src/a.cc', [7])
280 match_result1.file_to_stack_infos = {
281 'a.cc': [(frame1, 0), (frame2, 0)]
282 }
283 match_result1.file_to_analysis_info = {
284 'a.cc': {'min_distance': 0, 'min_distance_frame': frame1}
285 }
286
287 match_result2 = MatchResult(DUMMY_CHANGELOG3, 'src/', '')
288 frame3 = StackFrame(5, 'src/', 'func', 'f.cc', 'src/f.cc', [1])
289 match_result2.file_to_stack_infos = {
290 'f.cc': [(frame3, 0)]
291 }
292 match_result2.file_to_analysis_info = {
293 'a.cc': {'min_distance': 20, 'min_distance_frame': frame3}
294 }
295
296 return [match_result1, match_result2]
297
298 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults)
299
300 expected_match_results = [
301 {
302 'reasons': [('TopFrameIndex', 1.0, 'Top frame is #0'),
303 ('MinDistance', 1, 'Minimum distance is 0')],
304 'changed_files': [{'info': 'Minimum distance (LOC) 0, frame #0',
305 'blame_url': None, 'file': 'a.cc'}],
306 'time': 'Thu Mar 31 21:24:43 2016',
307 'author': 'r@chromium.org',
308 'url': 'https://repo.test/+/1',
309 'project_path': 'src/',
310 'review_url': 'https://codereview.chromium.org/3281',
311 'confidence': 1.0, 'revision': '1'
312 },
313 ]
314
315 regression_deps_rolls = {'src/': DependencyRoll('src/', 'https://repo',
316 '1', '2')}
317
318 results = findit_for_crash.FindItForCrash(Stacktrace(),
319 regression_deps_rolls, {}, 7,
320 git_repository.GitRepository())
321 self.assertEqual([result.ToDict() for result in results],
322 expected_match_results)
323
324 def testFinditForCrashFilterZeroConfidentResults(self):
325 def _MockFindMatchResults(*_):
326 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '')
327 frame1 = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [1])
328 frame2 = StackFrame(1, 'src/', 'func', 'a.cc', 'src/a.cc', [7])
329 match_result1.file_to_stack_infos = {
330 'a.cc': [(frame1, 0), (frame2, 0)]
331 }
332 match_result1.file_to_analysis_info = {
333 'a.cc': {'min_distance': 1, 'min_distance_frame': frame1}
334 }
335
336 match_result2 = MatchResult(DUMMY_CHANGELOG3, 'src/', '')
337 frame3 = StackFrame(15, 'src/', 'func', 'f.cc', 'src/f.cc', [1])
338 match_result2.file_to_stack_infos = {
339 'f.cc': [(frame3, 0)]
340 }
341 match_result2.file_to_analysis_info = {
342 'f.cc': {'min_distance': 20, 'min_distance_frame': frame3}
343 }
344
345 match_result3 = MatchResult(DUMMY_CHANGELOG3, 'src/', '')
346 frame4 = StackFrame(3, 'src/', 'func', 'ff.cc', 'src/ff.cc', [1])
347 match_result3.file_to_stack_infos = {
348 'f.cc': [(frame4, 0)]
349 }
350 match_result3.file_to_analysis_info = {
351 'f.cc': {'min_distance': 60, 'min_distance_frame': frame4}
352 }
353
354 return [match_result1, match_result2, match_result3]
355
356 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults)
357
358 expected_match_results = [
359 {
360 'author': 'r@chromium.org',
361 'changed_files': [
362 {
363 'blame_url': None,
364 'file': 'a.cc',
365 'info': 'Minimum distance (LOC) 1, frame #0'
366 }
367 ],
368 'confidence': 0.8,
369 'project_path': 'src/',
370 'reasons': [
371 ('TopFrameIndex', 1.0, 'Top frame is #0'),
372 ('MinDistance', 0.8, 'Minimum distance is 1')
373 ],
374 'review_url': 'https://codereview.chromium.org/3281',
375 'revision': '1',
376 'time': 'Thu Mar 31 21:24:43 2016',
377 'url': 'https://repo.test/+/1'
378 }
379 ]
380
381 regression_deps_rolls = {'src/': DependencyRoll('src/', 'https://repo',
382 '1', '2')}
383
384 results = findit_for_crash.FindItForCrash(Stacktrace(),
385 regression_deps_rolls, {}, 7,
386 git_repository.GitRepository())
387
388 self.assertEqual([result.ToDict() for result in results],
389 expected_match_results)
390
391 def testFinditForCrashAllMatchResultsWithZeroConfidences(self):
392 def _MockFindMatchResults(*_):
393 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '')
394 frame1 = StackFrame(20, 'src/', '', 'func', 'a.cc', [1])
395 frame2 = StackFrame(21, 'src/', '', 'func', 'a.cc', [7])
396 match_result1.file_to_stack_infos = {
397 'a.cc': [(frame1, 0), (frame2, 0)]
398 }
399 match_result1.file_to_analysis_info = {
400 'a.cc': {'min_distance': 1, 'min_distance_frame': frame1}
401 }
402
403 match_result2 = MatchResult(DUMMY_CHANGELOG3, 'src/', '')
404 frame3 = StackFrame(15, 'src/', '', 'func', 'f.cc', [1])
405 match_result2.file_to_stack_infos = {
406 'f.cc': [(frame3, 0)]
407 }
408 match_result2.min_distance = 20
409 match_result2.file_to_analysis_info = {
410 'f.cc': {'min_distance': 20, 'min_distance_frame': frame3}
411 }
412
413 return [match_result1, match_result2]
414
415 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults)
416
417 regression_deps_rolls = {'src/': DependencyRoll('src/', 'https://repo',
418 '1', '2')}
419
420 self.assertEqual(findit_for_crash.FindItForCrash(
421 Stacktrace(), regression_deps_rolls, {}, 7,
422 git_repository.GitRepository()), [])
OLDNEW
« no previous file with comments | « appengine/findit/crash/test/findit_for_client_test.py ('k') | appengine/findit/crash/test/findit_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698