| 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 | 6 |
| 7 from common.blame import Region, Blame | 7 from common.blame import Region, Blame |
| 8 from common.change_log import ChangeLog | 8 from common.change_log import ChangeLog |
| 9 from common.dependency import Dependency, DependencyRoll | 9 from common.dependency import Dependency, DependencyRoll |
| 10 from common.git_repository import GitRepository | 10 from common.git_repository import GitRepository |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 'revision': '3', | 88 'revision': '3', |
| 89 'reverted_revision': None | 89 'reverted_revision': None |
| 90 }) | 90 }) |
| 91 | 91 |
| 92 | 92 |
| 93 class FinditForCrashTest(CrashTestSuite): | 93 class FinditForCrashTest(CrashTestSuite): |
| 94 | 94 |
| 95 def testGetDepsInCrashStack(self): | 95 def testGetDepsInCrashStack(self): |
| 96 crash_stack = CallStack(0) | 96 crash_stack = CallStack(0) |
| 97 crash_stack.extend([ | 97 crash_stack.extend([ |
| 98 StackFrame(0, 'src/', '', 'func0', 'f0.cc', [1]), | 98 StackFrame(0, 'src/', 'func0', 'f0.cc', 'src/f0.cc', [1]), |
| 99 StackFrame(1, 'src/', '', 'func1', 'f1.cc', [2, 3]), | 99 StackFrame(1, 'src/', 'func1', 'f1.cc', 'src/f1.cc', [2, 3]), |
| 100 StackFrame(1, '', '', 'func1', 'f1.cc', [3]), | 100 StackFrame(1, '', 'func2', 'f2.cc', 'src/f2.cc', [2, 3]), |
| 101 ]) | 101 ]) |
| 102 crash_deps = {'src/': Dependency('src/', 'https://chromium_repo', '1'), | 102 crash_deps = {'src/': Dependency('src/', 'https://chromium_repo', '1'), |
| 103 'src/v8/': Dependency('src/v8/', 'https://v8_repo', '2')} | 103 'src/v8/': Dependency('src/v8/', 'https://v8_repo', '2')} |
| 104 | 104 |
| 105 expected_stack_deps = {'src/': crash_deps['src/']} | 105 expected_stack_deps = {'src/': crash_deps['src/']} |
| 106 | 106 |
| 107 self.assertEqual( | 107 self.assertEqual( |
| 108 findit_for_crash.GetDepsInCrashStack(crash_stack, crash_deps), | 108 findit_for_crash.GetDepsInCrashStack(crash_stack, crash_deps), |
| 109 expected_stack_deps) | 109 expected_stack_deps) |
| 110 | 110 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 } | 142 } |
| 143 } | 143 } |
| 144 self.assertEqual(dep_file_to_changelogs_json, | 144 self.assertEqual(dep_file_to_changelogs_json, |
| 145 expected_dep_file_to_changelogs_json) | 145 expected_dep_file_to_changelogs_json) |
| 146 self.assertEqual(ignore_cls, set(['1'])) | 146 self.assertEqual(ignore_cls, set(['1'])) |
| 147 | 147 |
| 148 def testGetStackInfosForFilesGroupedByDeps(self): | 148 def testGetStackInfosForFilesGroupedByDeps(self): |
| 149 | 149 |
| 150 main_stack = CallStack(0) | 150 main_stack = CallStack(0) |
| 151 main_stack.extend( | 151 main_stack.extend( |
| 152 [StackFrame(0, 'src/', '', 'c(p* &d)', 'a.cc', [177]), | 152 [StackFrame(0, 'src/', 'c(p* &d)', 'a.cc', 'src/a.cc', [177]), |
| 153 StackFrame(1, 'src/', '', 'd(a* c)', 'a.cc', [227, 228, 229]), | 153 StackFrame(1, 'src/', 'd(a* c)', 'a.cc', 'src/a.cc', [227, 228, 229]), |
| 154 StackFrame(2, 'src/v8/', '', 'e(int)', 'b.cc', [87, 88, 89, 90])]) | 154 StackFrame(2, 'src/v8/', 'e(int)', 'b.cc', 'src/v8/b.cc', [89, 90])]) |
| 155 | 155 |
| 156 low_priority_stack = CallStack(1) | 156 low_priority_stack = CallStack(1) |
| 157 low_priority_stack.append( | 157 low_priority_stack.append( |
| 158 StackFrame(0, 'src/dummy/', '', 'c(p* &d)', 'd.cc', [17])) | 158 StackFrame(0, 'src/dummy/', 'c(p* &d)', 'd.cc', 'src/dummy/d.cc', [17])) |
| 159 | 159 |
| 160 stacktrace = Stacktrace() | 160 stacktrace = Stacktrace() |
| 161 stacktrace.extend([main_stack, low_priority_stack]) | 161 stacktrace.extend([main_stack, low_priority_stack]) |
| 162 | 162 |
| 163 crashed_deps = {'src/': Dependency('src/', 'https//repo', '2'), | 163 crashed_deps = {'src/': Dependency('src/', 'https//repo', '2'), |
| 164 'src/v8/': Dependency('src/v8', 'https//repo', '1')} | 164 'src/v8/': Dependency('src/v8', 'https//repo', '1')} |
| 165 | 165 |
| 166 expected_dep_file_to_stack_infos = { | 166 expected_dep_file_to_stack_infos = { |
| 167 'src/': { | 167 'src/': { |
| 168 'a.cc': [ | 168 'a.cc': [ |
| (...skipping 30 matching lines...) Expand all Loading... |
| 199 'src/': { | 199 'src/': { |
| 200 'a.cc': [ | 200 'a.cc': [ |
| 201 DUMMY_CHANGELOG1, | 201 DUMMY_CHANGELOG1, |
| 202 ] | 202 ] |
| 203 } | 203 } |
| 204 } | 204 } |
| 205 | 205 |
| 206 dep_file_to_stack_infos = { | 206 dep_file_to_stack_infos = { |
| 207 'src/': { | 207 'src/': { |
| 208 'a.cc': [ | 208 'a.cc': [ |
| 209 (StackFrame(0, 'src/', '', 'func', 'a.cc', [1]), 0), | 209 (StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [1]), 0), |
| 210 (StackFrame(1, 'src/', '', 'func', 'a.cc', [7]), 0), | 210 (StackFrame(1, 'src/', 'func', 'a.cc', 'src/a.cc', [7]), 0), |
| 211 ], | 211 ], |
| 212 'b.cc': [ | 212 'b.cc': [ |
| 213 (StackFrame(2, 'src/', '', 'func', 'b.cc', [36]), 0), | 213 (StackFrame(2, 'src/', 'func', 'b.cc', 'src/b.cc', [36]), 0), |
| 214 ] | 214 ] |
| 215 } | 215 } |
| 216 } | 216 } |
| 217 | 217 |
| 218 dummy_blame = Blame('9', 'a.cc') | 218 dummy_blame = Blame('9', 'a.cc') |
| 219 dummy_blame.AddRegion( | 219 dummy_blame.AddRegion( |
| 220 Region(1, 5, '6', 'a', 'a@chromium.org', 'Thu Mar 31 21:24:43 2016')) | 220 Region(1, 5, '6', 'a', 'a@chromium.org', 'Thu Mar 31 21:24:43 2016')) |
| 221 dummy_blame.AddRegion( | 221 dummy_blame.AddRegion( |
| 222 Region(6, 10, '1', 'b', 'b@chromium.org', 'Thu Jun 19 12:11:40 2015')) | 222 Region(6, 10, '1', 'b', 'b@chromium.org', 'Thu Jun 19 12:11:40 2015')) |
| 223 | 223 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 243 | 243 |
| 244 expected_dep_to_changed_file_to_blame = {'src/': {'a.cc': dummy_blame}} | 244 expected_dep_to_changed_file_to_blame = {'src/': {'a.cc': dummy_blame}} |
| 245 | 245 |
| 246 match_results, dep_to_changed_file_to_blame = ( | 246 match_results, dep_to_changed_file_to_blame = ( |
| 247 findit_for_crash.FindMatchResults( | 247 findit_for_crash.FindMatchResults( |
| 248 dep_file_to_changelogs, dep_file_to_stack_infos, stack_deps)) | 248 dep_file_to_changelogs, dep_file_to_stack_infos, stack_deps)) |
| 249 self.assertEqual([result.ToDict() for result in match_results], | 249 self.assertEqual([result.ToDict() for result in match_results], |
| 250 expected_match_results) | 250 expected_match_results) |
| 251 | 251 |
| 252 for file_path, blame in dep_to_changed_file_to_blame.iteritems(): | 252 for file_path, blame in dep_to_changed_file_to_blame.iteritems(): |
| 253 print dep_to_changed_file_to_blame | |
| 254 self.assertTrue(file_path in expected_dep_to_changed_file_to_blame) | 253 self.assertTrue(file_path in expected_dep_to_changed_file_to_blame) |
| 255 self.assertEqual(blame, expected_dep_to_changed_file_to_blame[file_path]) | 254 self.assertEqual(blame, expected_dep_to_changed_file_to_blame[file_path]) |
| 256 | 255 |
| 257 def testFindItForCrashNoRegressionRange(self): | 256 def testFindItForCrashNoRegressionRange(self): |
| 258 self.assertEqual( | 257 self.assertEqual( |
| 259 findit_for_crash.FindItForCrash(Stacktrace(), {}, {}), | 258 findit_for_crash.FindItForCrash(Stacktrace(), {}, {}), |
| 260 []) | 259 []) |
| 261 | 260 |
| 262 def testFindItForCrashNoMatchFound(self): | 261 def testFindItForCrashNoMatchFound(self): |
| 263 | 262 |
| 264 def _MockFindMatchResults(*_): | 263 def _MockFindMatchResults(*_): |
| 265 return [], {} | 264 return [], {} |
| 266 | 265 |
| 267 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults) | 266 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults) |
| 268 | 267 |
| 269 regression_deps_rolls = {'src/': DependencyRoll('src/', 'https://repo', | 268 regression_deps_rolls = {'src/': DependencyRoll('src/', 'https://repo', |
| 270 '1', '2')} | 269 '1', '2')} |
| 271 self.assertEqual(findit_for_crash.FindItForCrash( | 270 self.assertEqual(findit_for_crash.FindItForCrash( |
| 272 Stacktrace(), regression_deps_rolls, {}), []) | 271 Stacktrace(), regression_deps_rolls, {}), []) |
| 273 | 272 |
| 274 def testFindItForCrash(self): | 273 def testFindItForCrash(self): |
| 275 | 274 |
| 276 def _MockFindMatchResults(*_): | 275 def _MockFindMatchResults(*_): |
| 277 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '') | 276 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '') |
| 278 match_result1.file_to_stack_infos = { | 277 match_result1.file_to_stack_infos = { |
| 279 'a.cc': [ | 278 'a.cc': [ |
| 280 (StackFrame(0, 'src/', '', 'func', 'a.cc', [1]), 0), | 279 (StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [1]), 0), |
| 281 (StackFrame(1, 'src/', '', 'func', 'a.cc', [7]), 0), | 280 (StackFrame(1, 'src/', 'func', 'a.cc', 'src/a.cc', [7]), 0), |
| 282 ] | 281 ] |
| 283 } | 282 } |
| 284 match_result1.min_distance = 0 | 283 match_result1.min_distance = 0 |
| 285 | 284 |
| 286 match_result2 = MatchResult(DUMMY_CHANGELOG3, 'src/', '') | 285 match_result2 = MatchResult(DUMMY_CHANGELOG3, 'src/', '') |
| 287 match_result2.file_to_stack_infos = { | 286 match_result2.file_to_stack_infos = { |
| 288 'f.cc': [ | 287 'f.cc': [ |
| 289 (StackFrame(5, 'src/', '', 'func', 'f.cc', [1]), 0), | 288 (StackFrame(5, 'src/', 'func', 'f.cc', 'src/f.cc', [1]), 0), |
| 290 ] | 289 ] |
| 291 } | 290 } |
| 292 match_result2.min_distance = 20 | 291 match_result2.min_distance = 20 |
| 293 | 292 |
| 294 return [match_result1, match_result2], {} | 293 return [match_result1, match_result2], {} |
| 295 | 294 |
| 296 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults) | 295 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults) |
| 297 | 296 |
| 298 expected_match_results = [ | 297 expected_match_results = [ |
| 299 { | 298 { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 313 '1', '2')} | 312 '1', '2')} |
| 314 | 313 |
| 315 self.assertEqual(findit_for_crash.FindItForCrash( | 314 self.assertEqual(findit_for_crash.FindItForCrash( |
| 316 Stacktrace(), regression_deps_rolls, {}), expected_match_results) | 315 Stacktrace(), regression_deps_rolls, {}), expected_match_results) |
| 317 | 316 |
| 318 def testFinditForCrashFilterZeroConfidentResults(self): | 317 def testFinditForCrashFilterZeroConfidentResults(self): |
| 319 def _MockFindMatchResults(*_): | 318 def _MockFindMatchResults(*_): |
| 320 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '') | 319 match_result1 = MatchResult(DUMMY_CHANGELOG1, 'src/', '') |
| 321 match_result1.file_to_stack_infos = { | 320 match_result1.file_to_stack_infos = { |
| 322 'a.cc': [ | 321 'a.cc': [ |
| 323 (StackFrame(0, 'src/', '', 'func', 'a.cc', [1]), 0), | 322 (StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [1]), 0), |
| 324 (StackFrame(1, 'src/', '', 'func', 'a.cc', [7]), 0), | 323 (StackFrame(1, 'src/', 'func', 'a.cc', 'src/a.cc', [7]), 0), |
| 325 ] | 324 ] |
| 326 } | 325 } |
| 327 match_result1.min_distance = 1 | 326 match_result1.min_distance = 1 |
| 328 | 327 |
| 329 match_result2 = MatchResult(DUMMY_CHANGELOG3, 'src/', '') | 328 match_result2 = MatchResult(DUMMY_CHANGELOG3, 'src/', '') |
| 330 match_result2.file_to_stack_infos = { | 329 match_result2.file_to_stack_infos = { |
| 331 'f.cc': [ | 330 'f.cc': [ |
| 332 (StackFrame(15, 'src/', '', 'func', 'f.cc', [1]), 0), | 331 (StackFrame(15, 'src/', 'func', 'f.cc', 'src/f.cc', [1]), 0), |
| 333 ] | 332 ] |
| 334 } | 333 } |
| 335 match_result2.min_distance = 20 | 334 match_result2.min_distance = 20 |
| 336 | 335 |
| 337 match_result3 = MatchResult(DUMMY_CHANGELOG3, 'src/', '') | 336 match_result3 = MatchResult(DUMMY_CHANGELOG3, 'src/', '') |
| 338 match_result3.file_to_stack_infos = { | 337 match_result3.file_to_stack_infos = { |
| 339 'f.cc': [ | 338 'f.cc': [ |
| 340 (StackFrame(3, 'src/', '', 'func', 'ff.cc', [1]), 0), | 339 (StackFrame(3, 'src/', 'func', 'ff.cc', 'src/ff.cc', [1]), 0), |
| 341 ] | 340 ] |
| 342 } | 341 } |
| 343 match_result3.min_distance = 60 | 342 match_result3.min_distance = 60 |
| 344 | 343 |
| 345 return [match_result1, match_result2, match_result3], {} | 344 return [match_result1, match_result2, match_result3], {} |
| 346 | 345 |
| 347 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults) | 346 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults) |
| 348 | 347 |
| 349 expected_match_results = [ | 348 expected_match_results = [ |
| 350 { | 349 { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 | 385 |
| 387 return [match_result1, match_result2], {} | 386 return [match_result1, match_result2], {} |
| 388 | 387 |
| 389 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults) | 388 self.mock(findit_for_crash, 'FindMatchResults', _MockFindMatchResults) |
| 390 | 389 |
| 391 regression_deps_rolls = {'src/': DependencyRoll('src/', 'https://repo', | 390 regression_deps_rolls = {'src/': DependencyRoll('src/', 'https://repo', |
| 392 '1', '2')} | 391 '1', '2')} |
| 393 | 392 |
| 394 self.assertEqual(findit_for_crash.FindItForCrash( | 393 self.assertEqual(findit_for_crash.FindItForCrash( |
| 395 Stacktrace(), regression_deps_rolls, {}), []) | 394 Stacktrace(), regression_deps_rolls, {}), []) |
| OLD | NEW |