| 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 import mock | 5 import mock |
| 6 | 6 |
| 7 from common import chrome_dependency_fetcher | 7 from common import chrome_dependency_fetcher |
| 8 from common.dependency import DependencyRoll | 8 from common.dependency import DependencyRoll |
| 9 from common.http_client_appengine import HttpClientAppengine | 9 from common.http_client_appengine import HttpClientAppengine |
| 10 from crash import chromecrash_parser | 10 from crash import chromecrash_parser |
| 11 from crash import detect_regression_range | 11 from crash import detect_regression_range |
| 12 from crash import findit | 12 from crash import findit |
| 13 from crash import findit_for_chromecrash | 13 from crash import findit_for_chromecrash |
| 14 from crash.changelist_classifier import ChangelistClassifier | 14 from crash.changelist_classifier import ChangelistClassifier |
| 15 from crash.chromecrash_parser import ChromeCrashParser | 15 from crash.chromecrash_parser import ChromeCrashParser |
| 16 from crash.component_classifier import ComponentClassifier | 16 from crash.component_classifier import ComponentClassifier |
| 17 from crash.crash_report import CrashReport | 17 from crash.crash_report import CrashReport |
| 18 from crash.culprit import Culprit | 18 from crash.culprit import Culprit |
| 19 from crash.findit_for_chromecrash import FinditForChromeCrash | 19 from crash.findit_for_chromecrash import FinditForChromeCrash |
| 20 from crash.findit_for_chromecrash import FinditForFracas | 20 from crash.findit_for_chromecrash import FinditForFracas |
| 21 from crash.project_classifier import ProjectClassifier | 21 from crash.project_classifier import ProjectClassifier |
| 22 from crash.results import MatchResult | 22 from crash.suspect import Suspect |
| 23 from crash.stacktrace import CallStack | 23 from crash.stacktrace import CallStack |
| 24 from crash.stacktrace import Stacktrace | 24 from crash.stacktrace import Stacktrace |
| 25 from crash.test.crash_pipeline_test import DummyCrashData | 25 from crash.test.crash_pipeline_test import DummyCrashData |
| 26 from crash.test.predator_testcase import PredatorTestCase | 26 from crash.test.predator_testcase import PredatorTestCase |
| 27 from crash.type_enums import CrashClient | 27 from crash.type_enums import CrashClient |
| 28 from libs.gitiles import gitiles_repository | 28 from libs.gitiles import gitiles_repository |
| 29 from model import analysis_status | 29 from model import analysis_status |
| 30 from model.crash.crash_analysis import CrashAnalysis | 30 from model.crash.crash_analysis import CrashAnalysis |
| 31 from model.crash.fracas_crash_analysis import FracasCrashAnalysis | 31 from model.crash.fracas_crash_analysis import FracasCrashAnalysis |
| 32 | 32 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 self.mock(ChromeCrashParser, 'Parse', lambda *_: Stacktrace([CallStack(0)])) | 194 self.mock(ChromeCrashParser, 'Parse', lambda *_: Stacktrace([CallStack(0)])) |
| 195 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 195 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| 196 'GetDependencyRollsDict', | 196 'GetDependencyRollsDict', |
| 197 lambda *_: { | 197 lambda *_: { |
| 198 'src/': DependencyRoll('src/', 'https://repo', '1', '2'), | 198 'src/': DependencyRoll('src/', 'https://repo', '1', '2'), |
| 199 'src/add': DependencyRoll('src/add', 'https://repo1', None, '2'), | 199 'src/add': DependencyRoll('src/add', 'https://repo1', None, '2'), |
| 200 'src/delete': DependencyRoll('src/delete', 'https://repo2', '2', | 200 'src/delete': DependencyRoll('src/delete', 'https://repo2', '2', |
| 201 None) | 201 None) |
| 202 }) | 202 }) |
| 203 | 203 |
| 204 dummy_match_result = MatchResult(self.GetDummyChangeLog(), 'src/') | 204 dummy_suspect = Suspect(self.GetDummyChangeLog(), 'src/') |
| 205 self.mock(ChangelistClassifier, '__call__', | 205 self.mock(ChangelistClassifier, '__call__', |
| 206 lambda _self, report: | 206 lambda _self, report: |
| 207 [dummy_match_result] if report.regression_range else []) | 207 [dummy_suspect] if report.regression_range else []) |
| 208 | 208 |
| 209 self.mock(ComponentClassifier, 'Classify', lambda *_: []) | 209 self.mock(ComponentClassifier, 'Classify', lambda *_: []) |
| 210 self.mock(ProjectClassifier, 'Classify', lambda *_: '') | 210 self.mock(ProjectClassifier, 'Classify', lambda *_: '') |
| 211 | 211 |
| 212 # TODO(wrengr): for both these tests, we should compare Culprit | 212 # TODO(wrengr): for both these tests, we should compare Culprit |
| 213 # objects directly rather than calling ToDicts and comparing the | 213 # objects directly rather than calling ToDicts and comparing the |
| 214 # dictionaries. | 214 # dictionaries. |
| 215 self._testFindCulpritForChromeCrashSucceeds(dummy_match_result) | 215 self._testFindCulpritForChromeCrashSucceeds(dummy_suspect) |
| 216 self._testFindCulpritForChromeCrashFails() | 216 self._testFindCulpritForChromeCrashFails() |
| 217 | 217 |
| 218 def _testFindCulpritForChromeCrashSucceeds(self, dummy_match_result): | 218 def _testFindCulpritForChromeCrashSucceeds(self, dummy_suspect): |
| 219 analysis = CrashAnalysis() | 219 analysis = CrashAnalysis() |
| 220 analysis.signature = 'signature' | 220 analysis.signature = 'signature' |
| 221 analysis.platform = 'win' | 221 analysis.platform = 'win' |
| 222 analysis.stack_trace = 'frame1\nframe2' | 222 analysis.stack_trace = 'frame1\nframe2' |
| 223 analysis.crashed_version = '50.0.1234.0' | 223 analysis.crashed_version = '50.0.1234.0' |
| 224 dummy_regression_range = ['50.0.1233.0', '50.0.1234.0'] | 224 dummy_regression_range = ['50.0.1233.0', '50.0.1234.0'] |
| 225 analysis.regression_range = dummy_regression_range | 225 analysis.regression_range = dummy_regression_range |
| 226 culprit = _FinditForChromeCrash().FindCulprit(analysis) | 226 culprit = _FinditForChromeCrash().FindCulprit(analysis) |
| 227 self.assertIsNotNone(culprit, 'FindCulprit failed unexpectedly') | 227 self.assertIsNotNone(culprit, 'FindCulprit failed unexpectedly') |
| 228 results, tag = culprit.ToDicts() | 228 suspects, tag = culprit.ToDicts() |
| 229 | 229 |
| 230 expected_results = { | 230 expected_suspects = { |
| 231 'found': True, | 231 'found': True, |
| 232 'suspected_cls': [dummy_match_result.ToDict()], | 232 'suspected_cls': [dummy_suspect.ToDict()], |
| 233 'regression_range': dummy_regression_range | 233 'regression_range': dummy_regression_range |
| 234 } | 234 } |
| 235 expected_tag = { | 235 expected_tag = { |
| 236 'found_suspects': True, | 236 'found_suspects': True, |
| 237 'found_project': False, | 237 'found_project': False, |
| 238 'found_components': False, | 238 'found_components': False, |
| 239 'has_regression_range': True, | 239 'has_regression_range': True, |
| 240 'solution': 'core_algorithm', | 240 'solution': 'core_algorithm', |
| 241 } | 241 } |
| 242 | 242 |
| 243 self.assertDictEqual(expected_results, results) | 243 self.assertDictEqual(expected_suspects, suspects) |
| 244 self.assertDictEqual(expected_tag, tag) | 244 self.assertDictEqual(expected_tag, tag) |
| 245 | 245 |
| 246 def _testFindCulpritForChromeCrashFails(self): | 246 def _testFindCulpritForChromeCrashFails(self): |
| 247 analysis = CrashAnalysis() | 247 analysis = CrashAnalysis() |
| 248 analysis.signature = 'signature' | 248 analysis.signature = 'signature' |
| 249 analysis.platform = 'win' | 249 analysis.platform = 'win' |
| 250 analysis.stack_trace = 'frame1\nframe2' | 250 analysis.stack_trace = 'frame1\nframe2' |
| 251 analysis.crashed_version = '50.0.1234.0' | 251 analysis.crashed_version = '50.0.1234.0' |
| 252 results, tag = _FinditForChromeCrash().FindCulprit(analysis).ToDicts() | 252 suspects, tag = _FinditForChromeCrash().FindCulprit(analysis).ToDicts() |
| 253 | 253 |
| 254 expected_results = {'found': False} | 254 expected_suspects = {'found': False} |
| 255 expected_tag = { | 255 expected_tag = { |
| 256 'found_suspects': False, | 256 'found_suspects': False, |
| 257 'found_project': False, | 257 'found_project': False, |
| 258 'found_components': False, | 258 'found_components': False, |
| 259 'has_regression_range': False, | 259 'has_regression_range': False, |
| 260 'solution': 'core_algorithm', | 260 'solution': 'core_algorithm', |
| 261 } | 261 } |
| 262 | 262 |
| 263 self.assertDictEqual(expected_results, results) | 263 self.assertDictEqual(expected_suspects, suspects) |
| 264 self.assertDictEqual(expected_tag, tag) | 264 self.assertDictEqual(expected_tag, tag) |
| 265 | 265 |
| 266 @mock.patch('google.appengine.ext.ndb.Key.urlsafe') | 266 @mock.patch('google.appengine.ext.ndb.Key.urlsafe') |
| 267 @mock.patch('common.appengine_util.GetDefaultVersionHostname') | 267 @mock.patch('common.appengine_util.GetDefaultVersionHostname') |
| 268 def testProcessResultForPublishing(self, mocked_get_default_host, | 268 def testProcessResultForPublishing(self, mocked_get_default_host, |
| 269 mocked_urlsafe): | 269 mocked_urlsafe): |
| 270 mocked_host = 'http://host' | 270 mocked_host = 'http://host' |
| 271 mocked_get_default_host.return_value = mocked_host | 271 mocked_get_default_host.return_value = mocked_host |
| 272 urlsafe_key = 'abcde' | 272 urlsafe_key = 'abcde' |
| 273 mocked_urlsafe.return_value = urlsafe_key | 273 mocked_urlsafe.return_value = urlsafe_key |
| 274 | 274 |
| 275 crash_identifiers = {'signature': 'sig'} | 275 crash_identifiers = {'signature': 'sig'} |
| 276 analysis = FracasCrashAnalysis.Create(crash_identifiers) | 276 analysis = FracasCrashAnalysis.Create(crash_identifiers) |
| 277 analysis.result = {'other': 'data'} | 277 analysis.result = {'other': 'data'} |
| 278 findit_object = FinditForFracas(None) | 278 findit_object = FinditForFracas(None) |
| 279 expected_processed_result = { | 279 expected_processed_suspect = { |
| 280 'client_id': findit_object.client_id, | 280 'client_id': findit_object.client_id, |
| 281 'crash_identifiers': {'signature': 'sig'}, | 281 'crash_identifiers': {'signature': 'sig'}, |
| 282 'result': { | 282 'result': { |
| 283 'feedback_url': ( | 283 'feedback_url': ( |
| 284 findit_for_chromecrash._FRACAS_FEEDBACK_URL_TEMPLATE % ( | 284 findit_for_chromecrash._FRACAS_FEEDBACK_URL_TEMPLATE % ( |
| 285 mocked_host, urlsafe_key)), | 285 mocked_host, urlsafe_key)), |
| 286 'other': 'data' | 286 'other': 'data' |
| 287 } | 287 } |
| 288 } | 288 } |
| 289 | 289 |
| 290 self.assertDictEqual(findit_object.GetPublishableResult(crash_identifiers, | 290 self.assertDictEqual(findit_object.GetPublishableResult(crash_identifiers, |
| 291 analysis), | 291 analysis), |
| 292 expected_processed_result) | 292 expected_processed_suspect) |
| OLD | NEW |