| 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 crash import chromecrash_parser | 9 from crash import chromecrash_parser |
| 10 from crash import detect_regression_range | 10 from crash import detect_regression_range |
| 11 from crash import findit | 11 from crash import findit |
| 12 from crash import findit_for_chromecrash | 12 from crash import findit_for_chromecrash |
| 13 from crash.changelist_classifier import ChangelistClassifier | 13 from crash.changelist_classifier import ChangelistClassifier |
| 14 from crash.chromecrash_parser import ChromeCrashParser | 14 from crash.chromecrash_parser import ChromeCrashParser |
| 15 from crash.component_classifier import ComponentClassifier | 15 from crash.component_classifier import ComponentClassifier |
| 16 from crash.crash_report import CrashReport | 16 from crash.crash_report import CrashReport |
| 17 from crash.culprit import Culprit | 17 from crash.culprit import Culprit |
| 18 from crash.findit_for_chromecrash import FinditForChromeCrash | 18 from crash.findit_for_chromecrash import FinditForChromeCrash |
| 19 from crash.findit_for_chromecrash import FinditForFracas | 19 from crash.findit_for_chromecrash import FinditForFracas |
| 20 from crash.project_classifier import ProjectClassifier | 20 from crash.project_classifier import ProjectClassifier |
| 21 from crash.suspect import Suspect | 21 from crash.suspect import Suspect |
| 22 from crash.stacktrace import CallStack | 22 from crash.stacktrace import CallStack |
| 23 from crash.stacktrace import Stacktrace | 23 from crash.stacktrace import Stacktrace |
| 24 from crash.test.crash_pipeline_test import DummyCrashData | |
| 25 from crash.test.predator_testcase import PredatorTestCase | 24 from crash.test.predator_testcase import PredatorTestCase |
| 26 from crash.type_enums import CrashClient | 25 from crash.type_enums import CrashClient |
| 27 from gae_libs.http.http_client_appengine import HttpClientAppengine | 26 from gae_libs.http.http_client_appengine import HttpClientAppengine |
| 28 from libs.gitiles.gitiles_repository import GitilesRepository | 27 from libs.gitiles.gitiles_repository import GitilesRepository |
| 29 from model import analysis_status | 28 from model import analysis_status |
| 30 from model.crash.crash_analysis import CrashAnalysis | 29 from model.crash.crash_analysis import CrashAnalysis |
| 31 from model.crash.fracas_crash_analysis import FracasCrashAnalysis | 30 from model.crash.fracas_crash_analysis import FracasCrashAnalysis |
| 32 | 31 |
| 33 MOCK_GET_REPOSITORY = lambda _: None # pragma: no cover | 32 MOCK_GET_REPOSITORY = lambda _: None # pragma: no cover |
| 34 | 33 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 _FinditForChromeCrash(GitilesRepository.Factory(HttpClientAppengine()))) | 91 _FinditForChromeCrash(GitilesRepository.Factory(HttpClientAppengine()))) |
| 93 self.assertIsNone(findit_client.FindCulprit(analysis)) | 92 self.assertIsNone(findit_client.FindCulprit(analysis)) |
| 94 | 93 |
| 95 | 94 |
| 96 class FinditForFracasTest(PredatorTestCase): | 95 class FinditForFracasTest(PredatorTestCase): |
| 97 | 96 |
| 98 def testPlatformRename(self): | 97 def testPlatformRename(self): |
| 99 self.assertEqual(_FinditForFracas().RenamePlatform('linux'), 'unix') | 98 self.assertEqual(_FinditForFracas().RenamePlatform('linux'), 'unix') |
| 100 | 99 |
| 101 def testCheckPolicyUnsupportedPlatform(self): | 100 def testCheckPolicyUnsupportedPlatform(self): |
| 102 self.assertIsNone(_FinditForFracas().CheckPolicy(DummyCrashData( | 101 self.assertIsNone(_FinditForFracas().CheckPolicy(self.GetDummyCrashData( |
| 103 platform = 'unsupported_platform'))) | 102 platform = 'unsupported_platform'))) |
| 104 | 103 |
| 105 def testCheckPolicyBlacklistedSignature(self): | 104 def testCheckPolicyBlacklistedSignature(self): |
| 106 self.assertIsNone(_FinditForFracas().CheckPolicy(DummyCrashData( | 105 self.assertIsNone(_FinditForFracas().CheckPolicy(self.GetDummyCrashData( |
| 107 signature = 'Blacklist marker signature'))) | 106 signature = 'Blacklist marker signature'))) |
| 108 | 107 |
| 109 def testCheckPolicyPlatformRename(self): | 108 def testCheckPolicyPlatformRename(self): |
| 110 new_crash_data = _FinditForFracas().CheckPolicy(DummyCrashData( | 109 new_crash_data = _FinditForFracas().CheckPolicy(self.GetDummyCrashData( |
| 111 platform = 'linux')) | 110 platform = 'linux')) |
| 112 self.assertIsNotNone(new_crash_data, | 111 self.assertIsNotNone(new_crash_data, |
| 113 'FinditForFracas.CheckPolicy unexpectedly returned None') | 112 'FinditForFracas.CheckPolicy unexpectedly returned None') |
| 114 self.assertEqual(new_crash_data['platform'], 'unix') | 113 self.assertEqual(new_crash_data['platform'], 'unix') |
| 115 | 114 |
| 116 def testCreateAnalysis(self): | 115 def testCreateAnalysis(self): |
| 117 self.assertIsNotNone(_FinditForFracas().CreateAnalysis( | 116 self.assertIsNotNone(_FinditForFracas().CreateAnalysis( |
| 118 {'signature': 'sig'})) | 117 {'signature': 'sig'})) |
| 119 | 118 |
| 120 def testGetAnalysis(self): | 119 def testGetAnalysis(self): |
| 121 crash_identifiers = {'signature': 'sig'} | 120 crash_identifiers = {'signature': 'sig'} |
| 122 # TODO(wrengr): would be less fragile to call | 121 # TODO(wrengr): would be less fragile to call |
| 123 # FinditForFracas.CreateAnalysis instead. | 122 # FinditForFracas.CreateAnalysis instead. |
| 124 analysis = FracasCrashAnalysis.Create(crash_identifiers) | 123 analysis = FracasCrashAnalysis.Create(crash_identifiers) |
| 125 analysis.put() | 124 analysis.put() |
| 126 self.assertEqual(_FinditForFracas().GetAnalysis(crash_identifiers), | 125 self.assertEqual(_FinditForFracas().GetAnalysis(crash_identifiers), |
| 127 analysis) | 126 analysis) |
| 128 | 127 |
| 129 def testInitializeAnalysisForFracas(self): | 128 def testInitializeAnalysisForFracas(self): |
| 130 crash_data = DummyCrashData(platform = 'linux') | 129 crash_data = self.GetDummyCrashData(platform = 'linux') |
| 131 crash_identifiers = crash_data['crash_identifiers'] | 130 crash_identifiers = crash_data['crash_identifiers'] |
| 132 | 131 |
| 133 findit_client = _FinditForFracas() | 132 findit_client = _FinditForFracas() |
| 134 analysis = findit_client.CreateAnalysis(crash_identifiers) | 133 analysis = findit_client.CreateAnalysis(crash_identifiers) |
| 135 findit_client._InitializeAnalysis(analysis, crash_data) | 134 findit_client._InitializeAnalysis(analysis, crash_data) |
| 136 analysis.put() | 135 analysis.put() |
| 137 analysis = findit_client.GetAnalysis(crash_identifiers) | 136 analysis = findit_client.GetAnalysis(crash_identifiers) |
| 138 self.assertIsNotNone(analysis, | 137 self.assertIsNotNone(analysis, |
| 139 'FinditForFracas.GetAnalysis unexpectedly returned None') | 138 'FinditForFracas.GetAnalysis unexpectedly returned None') |
| 140 | 139 |
| 141 self.assertEqual(analysis.crashed_version, crash_data['crashed_version']) | 140 self.assertEqual(analysis.crashed_version, crash_data['chrome_version']) |
| 142 self.assertEqual(analysis.signature, crash_data['signature']) | 141 self.assertEqual(analysis.signature, crash_data['signature']) |
| 143 self.assertEqual(analysis.platform, crash_data['platform']) | 142 self.assertEqual(analysis.platform, crash_data['platform']) |
| 144 self.assertEqual(analysis.stack_trace, crash_data['stack_trace']) | 143 self.assertEqual(analysis.stack_trace, crash_data['stack_trace']) |
| 145 channel = crash_data['customized_data'].get('channel', None) | 144 channel = crash_data['customized_data'].get('channel', None) |
| 146 self.assertIsNotNone(channel, | 145 self.assertIsNotNone(channel, |
| 147 'channel is unexpectedly not defined in crash_data') | 146 'channel is unexpectedly not defined in crash_data') |
| 148 self.assertEqual(analysis.channel, channel) | 147 self.assertEqual(analysis.channel, channel) |
| 149 | 148 |
| 150 def testNeedsNewAnalysisIsTrueIfNoAnalysisYet(self): | 149 def testNeedsNewAnalysisIsTrueIfNoAnalysisYet(self): |
| 151 self.assertTrue(_FinditForFracas()._NeedsNewAnalysis(DummyCrashData())) | 150 self.assertTrue(_FinditForFracas()._NeedsNewAnalysis( |
| 151 self.GetDummyCrashData())) |
| 152 | 152 |
| 153 def testNeedsNewAnalysisIsTrueIfLastOneFailed(self): | 153 def testNeedsNewAnalysisIsTrueIfLastOneFailed(self): |
| 154 findit_client = _FinditForFracas() | 154 findit_client = _FinditForFracas() |
| 155 crash_data = DummyCrashData() | 155 crash_data = self.GetDummyCrashData() |
| 156 analysis = findit_client.CreateAnalysis(crash_data['crash_identifiers']) | 156 analysis = findit_client.CreateAnalysis(crash_data['crash_identifiers']) |
| 157 analysis.status = analysis_status.ERROR | 157 analysis.status = analysis_status.ERROR |
| 158 analysis.put() | 158 analysis.put() |
| 159 self.assertTrue(findit_client._NeedsNewAnalysis(crash_data)) | 159 self.assertTrue(findit_client._NeedsNewAnalysis(crash_data)) |
| 160 | 160 |
| 161 def testNeedsNewAnalysisIsFalseIfLastOneIsNotFailed(self): | 161 def testNeedsNewAnalysisIsFalseIfLastOneIsNotFailed(self): |
| 162 findit_client = _FinditForFracas() | 162 findit_client = _FinditForFracas() |
| 163 crash_data = DummyCrashData() | 163 crash_data = self.GetDummyCrashData() |
| 164 crash_identifiers = crash_data['crash_identifiers'] | 164 crash_identifiers = crash_data['crash_identifiers'] |
| 165 for status in (analysis_status.PENDING, analysis_status.RUNNING, | 165 for status in (analysis_status.PENDING, analysis_status.RUNNING, |
| 166 analysis_status.COMPLETED, analysis_status.SKIPPED): | 166 analysis_status.COMPLETED, analysis_status.SKIPPED): |
| 167 analysis = findit_client.CreateAnalysis(crash_identifiers) | 167 analysis = findit_client.CreateAnalysis(crash_identifiers) |
| 168 analysis.status = status | 168 analysis.status = status |
| 169 analysis.put() | 169 analysis.put() |
| 170 self.assertFalse(findit_client._NeedsNewAnalysis(crash_data)) | 170 self.assertFalse(findit_client._NeedsNewAnalysis(crash_data)) |
| 171 | 171 |
| 172 def testFindCulpritForChromeCrashEmptyStacktrace(self): | 172 def testFindCulpritForChromeCrashEmptyStacktrace(self): |
| 173 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, | 173 self.mock(chrome_dependency_fetcher.ChromeDependencyFetcher, |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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_suspect) | 292 expected_processed_suspect) |
| OLD | NEW |