| 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 crash.stacktrace import StackFrame | 5 from crash.stacktrace import StackFrame |
| 6 from crash.suspect import AnalysisInfo | 6 from crash.suspect import AnalysisInfo |
| 7 from crash.suspect import StackInfo | 7 from crash.suspect import StackInfo |
| 8 from crash.suspect import Suspect | 8 from crash.suspect import Suspect |
| 9 from crash.suspect import SuspectMap | 9 from crash.suspect import SuspectMap |
| 10 from crash.suspect import _UpdateSuspect | |
| 11 from crash.test.crash_test_suite import CrashTestSuite | 10 from crash.test.crash_test_suite import CrashTestSuite |
| 12 from libs.gitiles.blame import Blame | 11 from libs.gitiles.blame import Blame |
| 13 from libs.gitiles.blame import Region | 12 from libs.gitiles.blame import Region |
| 14 from libs.gitiles.change_log import ChangeLog | 13 from libs.gitiles.change_log import ChangeLog |
| 15 | 14 |
| 16 DUMMY_CHANGELOG1 = ChangeLog.FromDict({ | 15 DUMMY_CHANGELOG1 = ChangeLog.FromDict({ |
| 17 'author_name': 'r@chromium.org', | 16 'author_name': 'r@chromium.org', |
| 18 'message': 'dummy', | 17 'message': 'dummy', |
| 19 'committer_email': 'r@chromium.org', | 18 'committer_email': 'r@chromium.org', |
| 20 'commit_position': 175900, | 19 'commit_position': 175900, |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 | 115 |
| 117 self.assertEqual(str(suspect), expected_str) | 116 self.assertEqual(str(suspect), expected_str) |
| 118 | 117 |
| 119 def testSuspectUpdate(self): | 118 def testSuspectUpdate(self): |
| 120 # Touched lines have intersection with crashed lines. | 119 # Touched lines have intersection with crashed lines. |
| 121 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) | 120 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) |
| 122 stack_infos = [StackInfo( | 121 stack_infos = [StackInfo( |
| 123 frame = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [7]), | 122 frame = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [7]), |
| 124 priority = 0)] | 123 priority = 0)] |
| 125 | 124 |
| 126 _UpdateSuspect(suspect, 'a.cc', stack_infos, DUMMY_BLAME) | 125 suspect._UpdateSuspect('a.cc', stack_infos, DUMMY_BLAME) |
| 127 self.assertEqual(suspect.file_to_analysis_info['a.cc'].min_distance, 0) | 126 self.assertEqual(suspect.file_to_analysis_info['a.cc'].min_distance, 0) |
| 128 | 127 |
| 129 # Touched lines are before crashed lines. | 128 # Touched lines are before crashed lines. |
| 130 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) | 129 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) |
| 131 | 130 |
| 132 stack_infos = [StackInfo( | 131 stack_infos = [StackInfo( |
| 133 frame = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [3]), | 132 frame = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [3]), |
| 134 priority = 0)] | 133 priority = 0)] |
| 135 | 134 |
| 136 _UpdateSuspect(suspect, 'a.cc', stack_infos, DUMMY_BLAME) | 135 suspect._UpdateSuspect('a.cc', stack_infos, DUMMY_BLAME) |
| 137 self.assertEqual(suspect.file_to_analysis_info['a.cc'].min_distance, 3) | 136 self.assertEqual(suspect.file_to_analysis_info['a.cc'].min_distance, 3) |
| 138 | 137 |
| 139 # Touched lines are after crashed lines. | 138 # Touched lines are after crashed lines. |
| 140 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) | 139 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) |
| 141 | 140 |
| 142 stack_infos = [StackInfo( | 141 stack_infos = [StackInfo( |
| 143 frame = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [10]), | 142 frame = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [10]), |
| 144 priority = 0)] | 143 priority = 0)] |
| 145 | 144 |
| 146 _UpdateSuspect(suspect, 'a.cc', stack_infos, DUMMY_BLAME) | 145 suspect._UpdateSuspect('a.cc', stack_infos, DUMMY_BLAME) |
| 147 self.assertEqual(suspect.file_to_analysis_info['a.cc'].min_distance, 2) | 146 self.assertEqual(suspect.file_to_analysis_info['a.cc'].min_distance, 2) |
| 148 | 147 |
| 149 def testSuspectUpdateWithEmptyBlame(self): | 148 def testSuspectUpdateWithEmptyBlame(self): |
| 150 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) | 149 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) |
| 151 stack_infos = [StackInfo( | 150 stack_infos = [StackInfo( |
| 152 frame = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [7]), | 151 frame = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [7]), |
| 153 priority = 0)] | 152 priority = 0)] |
| 154 | 153 |
| 155 _UpdateSuspect(suspect, 'a.cc', stack_infos, None) | 154 suspect._UpdateSuspect('a.cc', stack_infos, None) |
| 156 self.assertEqual(suspect.file_to_stack_infos['a.cc'], stack_infos) | 155 self.assertEqual(suspect.file_to_stack_infos['a.cc'], stack_infos) |
| 157 self.assertEqual(suspect.file_to_analysis_info, {}) | 156 self.assertEqual(suspect.file_to_analysis_info, {}) |
| 158 | 157 |
| 159 def testSuspectUpdateMinimumDistance(self): | 158 def testSuspectUpdateMinimumDistance(self): |
| 160 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) | 159 suspect = Suspect(DUMMY_CHANGELOG1, 'src/', confidence=1) |
| 161 frame1 = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [7]) | 160 frame1 = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [7]) |
| 162 frame2 = StackFrame(2, 'src/', 'func', 'a.cc', 'src/a.cc', [20]) | 161 frame2 = StackFrame(2, 'src/', 'func', 'a.cc', 'src/a.cc', [20]) |
| 163 stack_infos = [StackInfo(frame1, 0), StackInfo(frame2, 0)] | 162 stack_infos = [StackInfo(frame1, 0), StackInfo(frame2, 0)] |
| 164 | 163 |
| 165 _UpdateSuspect(suspect, 'a.cc', stack_infos, DUMMY_BLAME) | 164 suspect._UpdateSuspect('a.cc', stack_infos, DUMMY_BLAME) |
| 166 self.assertEqual(suspect.file_to_stack_infos['a.cc'], stack_infos) | 165 self.assertEqual(suspect.file_to_stack_infos['a.cc'], stack_infos) |
| 167 self.assertEqual(suspect.file_to_analysis_info, | 166 self.assertEqual(suspect.file_to_analysis_info, |
| 168 {'a.cc': AnalysisInfo(min_distance = 0, min_distance_frame = frame1)}) | 167 {'a.cc': AnalysisInfo(min_distance = 0, min_distance_frame = frame1)}) |
| 169 | 168 |
| 170 def testSuspectsGenerateSuspects(self): | 169 def testSuspectsGenerateSuspects(self): |
| 171 suspects = SuspectMap(ignore_cls=set(['2'])) | 170 suspects = SuspectMap(ignore_cls=set(['2'])) |
| 172 frame1 = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [7]) | 171 frame1 = StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [7]) |
| 173 frame2 = StackFrame(1, 'src/', 'func', 'b.cc', 'src/b.cc', [11]) | 172 frame2 = StackFrame(1, 'src/', 'func', 'b.cc', 'src/b.cc', [11]) |
| 174 stack_infos1 = [StackInfo(frame1, 0)] | 173 stack_infos1 = [StackInfo(frame1, 0)] |
| 175 stack_infos2 = [StackInfo(frame2, 0)] | 174 stack_infos2 = [StackInfo(frame2, 0)] |
| (...skipping 12 matching lines...) Expand all Loading... |
| 188 } | 187 } |
| 189 expected_suspect.file_to_analysis_info = { | 188 expected_suspect.file_to_analysis_info = { |
| 190 'a.cc': AnalysisInfo(min_distance = 0, min_distance_frame = frame1), | 189 'a.cc': AnalysisInfo(min_distance = 0, min_distance_frame = frame1), |
| 191 'b.cc': AnalysisInfo(min_distance = 3, min_distance_frame = frame2), | 190 'b.cc': AnalysisInfo(min_distance = 3, min_distance_frame = frame2), |
| 192 } | 191 } |
| 193 | 192 |
| 194 expected_suspects = SuspectMap(ignore_cls=set(['2'])) | 193 expected_suspects = SuspectMap(ignore_cls=set(['2'])) |
| 195 expected_suspects['1'] = expected_suspect | 194 expected_suspects['1'] = expected_suspect |
| 196 | 195 |
| 197 self._VerifyTwoSuspectMapEqual(suspects, expected_suspects) | 196 self._VerifyTwoSuspectMapEqual(suspects, expected_suspects) |
| OLD | NEW |