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 |
(...skipping 12 matching lines...) Expand all Loading... |
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 |
33 MOCK_REPOSITORY = None | 33 MOCK_GET_REPOSITORY = lambda _: None # pragma: no cover |
34 | 34 |
35 class _FinditForChromeCrash(FinditForChromeCrash): # pylint: disable = W | 35 class _FinditForChromeCrash(FinditForChromeCrash): # pylint: disable = W |
36 # We allow overriding the default MOCK_REPOSITORY because one unittest | 36 # We allow overriding the default ``get_repository`` because one unittest |
37 # needs to. | 37 # needs to. |
38 def __init__(self, repository=MOCK_REPOSITORY): | 38 def __init__(self, get_repository=MOCK_GET_REPOSITORY): |
39 super(_FinditForChromeCrash, self).__init__(repository) | 39 super(_FinditForChromeCrash, self).__init__(get_repository) |
40 | 40 |
41 @classmethod | 41 @classmethod |
42 def _ClientID(cls): # pragma: no cover | 42 def _ClientID(cls): # pragma: no cover |
43 """Avoid throwing a NotImplementedError. | 43 """Avoid throwing a NotImplementedError. |
44 | 44 |
45 Since this method is called from ``FinditForChromeCrash.__init__`` | 45 Since this method is called from ``FinditForChromeCrash.__init__`` |
46 in order to construct the Azalea object, we need to not throw | 46 in order to construct the Azalea object, we need to not throw |
47 exceptions since we want to be able to test the FinditForChromeCrash | 47 exceptions since we want to be able to test the FinditForChromeCrash |
48 class itself. | 48 class itself. |
49 """ | 49 """ |
50 return '' | 50 return '' |
51 | 51 |
52 @property | 52 @property |
53 def config(self): | 53 def config(self): |
54 """Avoid returning None. | 54 """Avoid returning None. |
55 | 55 |
56 The default ``Findit.config`` will return None if the client | 56 The default ``Findit.config`` will return None if the client |
57 id is not found in the CrashConfig. This in turn will cause | 57 id is not found in the CrashConfig. This in turn will cause |
58 ``FinditForChromeCrash.__init__`` to crash, since NoneType doesn't | 58 ``FinditForChromeCrash.__init__`` to crash, since NoneType doesn't |
59 have a ``get`` method. In general it's fine for things to crash, since | 59 have a ``get`` method. In general it's fine for things to crash, since |
60 noone should make instances of Findit subclasses which don't define | 60 noone should make instances of Findit subclasses which don't define |
61 ``_clientID``; but for this test suite, we want to permit instances | 61 ``_clientID``; but for this test suite, we want to permit instances |
62 of FinditForChromeCrash, so that we can test that class directly. | 62 of FinditForChromeCrash, so that we can test that class directly. |
63 """ | 63 """ |
64 return {} | 64 return {} |
65 | 65 |
66 | 66 |
67 def _FinditForFracas(): | 67 def _FinditForFracas(): |
68 """A helper to pass in the standard pipeline class.""" | 68 """A helper to pass in the standard pipeline class.""" |
69 return FinditForFracas(MOCK_REPOSITORY) | 69 return FinditForFracas(MOCK_GET_REPOSITORY) |
| 70 |
| 71 |
| 72 def _GitilesRepositoryFactory(repo_url): # pragma: no cover |
| 73 return gitiles_repository.GitilesRepository( |
| 74 HttpClientAppengine(), repo_url) |
70 | 75 |
71 | 76 |
72 class FinditForChromeCrashTest(PredatorTestCase): | 77 class FinditForChromeCrashTest(PredatorTestCase): |
73 | 78 |
74 chrome_dep_fetcher = chrome_dependency_fetcher.ChromeDependencyFetcher( | |
75 gitiles_repository.GitilesRepository(HttpClientAppengine())) | |
76 | |
77 # TODO(wrengr): what was the purpose of this test? As written it's | 79 # TODO(wrengr): what was the purpose of this test? As written it's |
78 # just testing that mocking works. I'm guessing it was to check that | 80 # just testing that mocking works. I'm guessing it was to check that |
79 # we fail when the analysis is for the wrong client_id; but if so, | 81 # we fail when the analysis is for the wrong client_id; but if so, |
80 # then we shouldn't need to mock FindCulprit... | 82 # then we shouldn't need to mock FindCulprit... |
81 def testFindCulprit(self): | 83 def testFindCulprit(self): |
82 self.mock(FinditForChromeCrash, 'FindCulprit', lambda self, *_: None) | 84 self.mock(FinditForChromeCrash, 'FindCulprit', lambda self, *_: None) |
83 | 85 |
84 # TODO(wrengr): would be less fragile to call | 86 # TODO(wrengr): would be less fragile to call |
85 # FinditForFracas.CreateAnalysis instead; though if I'm right about | 87 # FinditForFracas.CreateAnalysis instead; though if I'm right about |
86 # the original purpose of this test, then this is one of the few | 88 # the original purpose of this test, then this is one of the few |
87 # places where calling FracasCrashAnalysis directly would actually | 89 # places where calling FracasCrashAnalysis directly would actually |
88 # make sense. | 90 # make sense. |
89 analysis = FracasCrashAnalysis.Create({'signature': 'sig'}) | 91 analysis = FracasCrashAnalysis.Create({'signature': 'sig'}) |
90 # TODO(wrengr): shouldn't FracasCrashAnalysis.Create already have set | 92 # TODO(wrengr): shouldn't FracasCrashAnalysis.Create already have set |
91 # the client_id? | 93 # the client_id? |
92 analysis.client_id = CrashClient.FRACAS | 94 analysis.client_id = CrashClient.FRACAS |
93 | 95 |
94 findit_client = _FinditForChromeCrash( | 96 findit_client = _FinditForChromeCrash(_GitilesRepositoryFactory) |
95 gitiles_repository.GitilesRepository(HttpClientAppengine())) | |
96 self.assertIsNone(findit_client.FindCulprit(analysis)) | 97 self.assertIsNone(findit_client.FindCulprit(analysis)) |
97 | 98 |
98 | 99 |
99 class FinditForFracasTest(PredatorTestCase): | 100 class FinditForFracasTest(PredatorTestCase): |
100 | 101 |
101 def testPlatformRename(self): | 102 def testPlatformRename(self): |
102 self.assertEqual(_FinditForFracas().RenamePlatform('linux'), 'unix') | 103 self.assertEqual(_FinditForFracas().RenamePlatform('linux'), 'unix') |
103 | 104 |
104 def testCheckPolicyUnsupportedPlatform(self): | 105 def testCheckPolicyUnsupportedPlatform(self): |
105 self.assertIsNone(_FinditForFracas().CheckPolicy(DummyCrashData( | 106 self.assertIsNone(_FinditForFracas().CheckPolicy(DummyCrashData( |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 def testProcessResultForPublishing(self, mocked_get_default_host, | 271 def testProcessResultForPublishing(self, mocked_get_default_host, |
271 mocked_urlsafe): | 272 mocked_urlsafe): |
272 mocked_host = 'http://host' | 273 mocked_host = 'http://host' |
273 mocked_get_default_host.return_value = mocked_host | 274 mocked_get_default_host.return_value = mocked_host |
274 urlsafe_key = 'abcde' | 275 urlsafe_key = 'abcde' |
275 mocked_urlsafe.return_value = urlsafe_key | 276 mocked_urlsafe.return_value = urlsafe_key |
276 | 277 |
277 crash_identifiers = {'signature': 'sig'} | 278 crash_identifiers = {'signature': 'sig'} |
278 analysis = FracasCrashAnalysis.Create(crash_identifiers) | 279 analysis = FracasCrashAnalysis.Create(crash_identifiers) |
279 analysis.result = {'other': 'data'} | 280 analysis.result = {'other': 'data'} |
280 findit_object = FinditForFracas(None) | 281 findit_object = FinditForFracas(MOCK_GET_REPOSITORY) |
281 expected_processed_suspect = { | 282 expected_processed_suspect = { |
282 'client_id': findit_object.client_id, | 283 'client_id': findit_object.client_id, |
283 'crash_identifiers': {'signature': 'sig'}, | 284 'crash_identifiers': {'signature': 'sig'}, |
284 'result': { | 285 'result': { |
285 'feedback_url': ( | 286 'feedback_url': ( |
286 findit_for_chromecrash._FRACAS_FEEDBACK_URL_TEMPLATE % ( | 287 findit_for_chromecrash._FRACAS_FEEDBACK_URL_TEMPLATE % ( |
287 mocked_host, urlsafe_key)), | 288 mocked_host, urlsafe_key)), |
288 'other': 'data' | 289 'other': 'data' |
289 } | 290 } |
290 } | 291 } |
291 | 292 |
292 self.assertDictEqual(findit_object.GetPublishableResult(crash_identifiers, | 293 self.assertDictEqual(findit_object.GetPublishableResult(crash_identifiers, |
293 analysis), | 294 analysis), |
294 expected_processed_suspect) | 295 expected_processed_suspect) |
OLD | NEW |