| OLD | NEW |
| (Empty) |
| 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 | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 from common.dependency import Dependency | |
| 6 from crash.callstack import StackFrame, CallStack | |
| 7 from crash.test.stacktrace_test_suite import StacktraceTestSuite | |
| 8 from crash.type_enums import CallStackFormatType, CallStackLanguageType | |
| 9 | |
| 10 | |
| 11 class CallStackTest(StacktraceTestSuite): | |
| 12 | |
| 13 def testStackFrameToString(self): | |
| 14 self.assertEqual( | |
| 15 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', []).ToString(), | |
| 16 '#0 in func @ f.cc') | |
| 17 self.assertEqual( | |
| 18 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', [1]).ToString(), | |
| 19 '#0 in func @ f.cc:1') | |
| 20 self.assertEqual( | |
| 21 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', [1, 2]).ToString(), | |
| 22 '#0 in func @ f.cc:1:1') | |
| 23 | |
| 24 def testBlameUrlForStackFrame(self): | |
| 25 frame = StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', []) | |
| 26 self.assertEqual(frame.BlameUrl('1'), None) | |
| 27 | |
| 28 frame.repo_url = 'https://repo_url' | |
| 29 self.assertEqual(frame.BlameUrl('1'), 'https://repo_url/+blame/1/f.cc') | |
| 30 | |
| 31 frame.crashed_line_numbers = [9, 10] | |
| 32 self.assertEqual(frame.BlameUrl('1'), 'https://repo_url/+blame/1/f.cc#9') | |
| 33 | |
| 34 def testFrameListInitCallStack(self): | |
| 35 stack = CallStack(0) | |
| 36 stack.extend([StackFrame(0, 'src/', '', 'func', 'f.cc', [2])]) | |
| 37 | |
| 38 copy_stack = CallStack(stack.priority, frame_list=stack) | |
| 39 self._VerifyTwoCallStacksEqual(copy_stack, stack) | |
| 40 | |
| 41 def testParseLineForJavaCallstackFormat(self): | |
| 42 stack = CallStack(0, CallStackFormatType.JAVA) | |
| 43 | |
| 44 stack.ParseLine('dummy line', {}) | |
| 45 self.assertEqual(stack, []) | |
| 46 | |
| 47 deps = {'org/': Dependency('org/', 'https://repo', '1')} | |
| 48 stack.ParseLine(' at org.a.b(a.java:609)', deps) | |
| 49 self._VerifyTwoStackFramesEqual( | |
| 50 stack[0], | |
| 51 StackFrame(0, 'org/', 'org.a.b', 'a.java', 'org/a.java', [609])) | |
| 52 | |
| 53 def testParseLineForSyzyasanCallstackFormat(self): | |
| 54 stack = CallStack(0, CallStackFormatType.SYZYASAN) | |
| 55 | |
| 56 stack.ParseLine('dummy line', {}) | |
| 57 self.assertEqual(stack, []) | |
| 58 | |
| 59 deps = {'src/content/': Dependency('src/content/', 'https://repo', '1')} | |
| 60 stack.ParseLine('c::p::n [src/content/e.cc @ 165]', deps) | |
| 61 self._VerifyTwoStackFramesEqual( | |
| 62 stack[0], | |
| 63 StackFrame( | |
| 64 0, 'src/content/', 'c::p::n', 'e.cc', 'src/content/e.cc', [165])) | |
| 65 | |
| 66 def testParseLineForDefaultCallstackFormat(self): | |
| 67 stack = CallStack(0, CallStackFormatType.DEFAULT) | |
| 68 | |
| 69 stack.ParseLine('dummy line', {}) | |
| 70 self.assertEqual(stack, []) | |
| 71 | |
| 72 stack.ParseLine('#dummy line', {}) | |
| 73 self.assertEqual(stack, []) | |
| 74 | |
| 75 deps = {'tp/webrtc/': Dependency('tp/webrtc/', 'https://repo', '1')} | |
| 76 stack.ParseLine('#0 0x52617a in func0 tp/webrtc/a.c:38:3', deps) | |
| 77 self._VerifyTwoStackFramesEqual( | |
| 78 stack[0], | |
| 79 StackFrame( | |
| 80 0, 'tp/webrtc/', 'func0', 'a.c', 'tp/webrtc/a.c', [38, 39, 40, 41])) | |
| 81 | |
| 82 stack.ParseLine('#1 0x526 in func::func2::func3 tp/webrtc/a.c:3:2', deps) | |
| 83 self._VerifyTwoStackFramesEqual( | |
| 84 stack[1], | |
| 85 StackFrame( | |
| 86 1, 'tp/webrtc/', 'func::func2::func3', 'a.c', 'tp/webrtc/a.c', | |
| 87 [3, 4, 5])) | |
| 88 | |
| 89 def testParseLineForFracasJavaStack(self): | |
| 90 stack = CallStack(0, CallStackFormatType.DEFAULT, | |
| 91 CallStackLanguageType.JAVA) | |
| 92 | |
| 93 stack.ParseLine('#0 0xxx in android.app.func app.java:2450', {}) | |
| 94 self._VerifyTwoStackFramesEqual( | |
| 95 stack[0], | |
| 96 StackFrame( | |
| 97 0, '', 'android.app.func', 'android/app.java', | |
| 98 'android/app.java', [2450])) | |
| OLD | NEW |