| # Copyright 2016 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import copy |
| |
| from libs.base_testcase import BaseTestCase |
| from libs.gitiles.change_log import ChangeLog |
| from analysis.type_enums import CrashClient |
| |
| |
| DUMMY_CHANGELOG = ChangeLog.FromDict({ |
| 'author': { |
| 'name': 'r@chromium.org', |
| 'email': 'r@chromium.org', |
| 'time': 'Thu Mar 31 21:24:43 2016', |
| }, |
| 'committer': { |
| 'name': 'example@chromium.org', |
| 'email': 'r@chromium.org', |
| 'time': 'Thu Mar 31 21:28:39 2016', |
| }, |
| 'message': 'dummy', |
| 'commit_position': 175900, |
| 'touched_files': [ |
| { |
| 'change_type': 'add', |
| 'new_path': 'a.cc', |
| 'old_path': None, |
| }, |
| { |
| 'change_type': 'rename', |
| 'old_path': 'old_name.cc', |
| 'new_path': 'new_name.cc', |
| }, |
| ], |
| 'commit_url': |
| 'https://repo.test/+/1', |
| 'code_review_url': 'https://codereview.chromium.org/3281', |
| 'revision': '1', |
| 'reverted_revision': None |
| }) |
| |
| |
| class MockLog(object): # pragma: no cover |
| |
| def __init__(self): |
| self.logs = [] |
| |
| def Log(self, name, message, level): |
| self.logs.append({'name': name, 'message': message, 'level': level}) |
| |
| |
| class AnalysisTestCase(BaseTestCase): # pragma: no cover. |
| |
| def _VerifyTwoStackFramesEqual(self, frame1, frame2): |
| self.assertIsNotNone(frame1, "the first frame is unexpectedly missing") |
| self.assertIsNotNone(frame2, "the second frame is unexpectedly missing") |
| self.assertEqual(str(frame1), str(frame2)) |
| self.assertEqual(frame1.dep_path, frame2.dep_path) |
| |
| def _VerifyTwoCallStacksEqual(self, stack1, stack2): |
| self.assertIsNotNone(stack1, "the first stack is unexpectedly missing") |
| self.assertIsNotNone(stack2, "the second stack is unexpectedly missing") |
| self.assertEqual(len(stack1.frames), len(stack2.frames)) |
| self.assertEqual(stack1.priority, stack2.priority) |
| self.assertEqual(stack1.format_type, stack2.format_type) |
| self.assertEqual(stack1.language_type, stack2.language_type) |
| map(self._VerifyTwoStackFramesEqual, stack1.frames, stack2.frames) |
| |
| def _VerifyTwoStacktracesEqual(self, trace1, trace2): |
| self.assertIsNotNone(trace1, "the first trace is unexpectedly missing") |
| self.assertIsNotNone(trace2, "the second trace is unexpectedly missing") |
| self.assertEqual(len(trace1.stacks), len(trace2.stacks)) |
| map(self._VerifyTwoCallStacksEqual, trace1.stacks, trace2.stacks) |
| |
| def GetDummyChangeLog(self): |
| return copy.deepcopy(DUMMY_CHANGELOG) |
| |
| def GetDummyClusterfuzzData( |
| self, client_id=CrashClient.CLUSTERFUZZ, version='1', |
| signature='signature', platform='win', stack_trace=None, |
| regression_range=None, testcase_id='213412343', |
| crash_type='check', crash_address='0x0023', |
| job_type='android_asan', sanitizer='ASAN', dependencies=None, |
| dependency_rolls=None, redo=False, security_flag=False): |
| crash_identifiers = {'testcase_id': testcase_id} |
| regression_range = regression_range or { |
| 'dep_path': 'src', |
| 'repo_url': 'https://chromium.git', |
| 'old_revision': '3', |
| 'new_revision': '9', |
| } |
| customized_data = { |
| 'crash_type': crash_type, |
| 'crash_address': crash_address, |
| 'job_type': job_type, |
| 'sanitizer': sanitizer, |
| 'regression_range': regression_range, |
| 'dependencies': dependencies or [{'dep_path': 'src/', |
| 'repo_url': 'https://repo', |
| 'revision': 'rev'}], |
| 'dependency_rolls': dependency_rolls or [{'dep_path': 'src/', |
| 'repo_url': 'https://repo', |
| 'old_revision': 'rev1', |
| 'new_revision': 'rev5'}], |
| 'testcase_id': testcase_id, |
| 'security_flag': security_flag, |
| } |
| |
| crash_data = { |
| 'crash_revision': version, |
| 'signature': signature, |
| 'platform': platform, |
| 'stack_trace': stack_trace, |
| 'regression_range': regression_range, |
| 'crash_identifiers': crash_identifiers, |
| 'customized_data': customized_data |
| } |
| if redo: |
| crash_data['redo'] = True |
| # This insertion of client_id is used for debugging ScheduleNewAnalysis. |
| if client_id is not None: # pragma: no cover |
| crash_data['client_id'] = client_id |
| return crash_data |
| |
| def GetDummyChromeCrashData( |
| self, client_id=CrashClient.CRACAS, version='1', signature='signature', |
| platform='win', stack_trace=None, regression_range=None, channel='canary', |
| historical_metadata=None, process_type='browser'): |
| crash_identifiers = { |
| 'chrome_version': version, |
| 'signature': signature, |
| 'channel': channel, |
| 'platform': platform, |
| 'process_type': process_type, |
| } |
| customized_data = { |
| 'historical_metadata': historical_metadata, |
| 'channel': channel, |
| } |
| |
| crash_data = { |
| 'chrome_version': version, |
| 'signature': signature, |
| 'platform': platform, |
| 'stack_trace': stack_trace, |
| 'regression_range': regression_range, |
| 'crash_identifiers': crash_identifiers, |
| 'customized_data': customized_data |
| } |
| # This insertion of client_id is used for debugging ScheduleNewAnalysis. |
| if client_id is not None: # pragma: no cover |
| crash_data['client_id'] = client_id |
| return crash_data |
| |
| def GetMockLog(self): |
| return MockLog() |