| 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 from common.dependency import Dependency | 5 from common.dependency import Dependency |
| 6 from crash.stacktrace import CallStack |
| 6 from crash.stacktrace import StackFrame | 7 from crash.stacktrace import StackFrame |
| 7 from crash.stacktrace import CallStack | |
| 8 from crash.stacktrace import Stacktrace | 8 from crash.stacktrace import Stacktrace |
| 9 from crash.test.stacktrace_test_suite import StacktraceTestSuite | 9 from crash.test.stacktrace_test_suite import StacktraceTestSuite |
| 10 from crash.type_enums import CallStackFormatType | 10 from crash.type_enums import CallStackFormatType |
| 11 from crash.type_enums import CallStackLanguageType | 11 from crash.type_enums import CallStackLanguageType |
| 12 | 12 |
| 13 class CallStackTest(StacktraceTestSuite): | 13 class CallStackTest(StacktraceTestSuite): |
| 14 | 14 |
| 15 def testCallStackBool(self): |
| 16 self.assertFalse(CallStack(0)) |
| 17 frame = StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', []) |
| 18 self.assertTrue(CallStack(0, frame_list=[frame])) |
| 19 |
| 20 def testCallStackSliceFrames(self): |
| 21 frames = [ |
| 22 StackFrame(0, 'src/', 'func0', 'file0.cc', 'src/file0.cc', [32]), |
| 23 StackFrame(1, 'src/', 'func1', 'file1.cc', 'src/file1.cc', [53]), |
| 24 StackFrame(2, 'src/', 'func2', 'file2.cc', 'src/file2.cc', [3])] |
| 25 |
| 26 self._VerifyTwoCallStacksEqual( |
| 27 CallStack(0, frame_list=frames[2:2]), |
| 28 CallStack(0, frame_list=frames).SliceFrames(2, 2)) |
| 29 self._VerifyTwoCallStacksEqual( |
| 30 CallStack(0, frame_list=frames[:2]), |
| 31 CallStack(0, frame_list=frames).SliceFrames(None, 2)) |
| 32 self._VerifyTwoCallStacksEqual( |
| 33 CallStack(0, frame_list=frames[2:]), |
| 34 CallStack(0, frame_list=frames).SliceFrames(2, None)) |
| 35 self._VerifyTwoCallStacksEqual( |
| 36 CallStack(0, frame_list=frames[:]), |
| 37 CallStack(0, frame_list=frames).SliceFrames(None, None)) |
| 38 |
| 15 def testStackFrameToString(self): | 39 def testStackFrameToString(self): |
| 16 self.assertEqual( | 40 self.assertEqual( |
| 17 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', []).ToString(), | 41 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', []).ToString(), |
| 18 '#0 in func @ f.cc') | 42 '#0 in func @ f.cc') |
| 19 self.assertEqual( | 43 self.assertEqual( |
| 20 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', [1]).ToString(), | 44 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', [1]).ToString(), |
| 21 '#0 in func @ f.cc:1') | 45 '#0 in func @ f.cc:1') |
| 22 self.assertEqual( | 46 self.assertEqual( |
| 23 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', [1, 2]).ToString(), | 47 StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', [1, 2]).ToString(), |
| 24 '#0 in func @ f.cc:1:1') | 48 '#0 in func @ f.cc:1:1') |
| 25 | 49 |
| 26 def testBlameUrlForStackFrame(self): | 50 def testBlameUrlForStackFrame(self): |
| 27 frame = StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', []) | 51 frame = StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', []) |
| 28 self.assertEqual(frame.BlameUrl('1'), None) | 52 self.assertEqual(frame.BlameUrl('1'), None) |
| 29 | 53 |
| 30 frame = frame._replace(repo_url = 'https://repo_url') | 54 frame = frame._replace(repo_url = 'https://repo_url') |
| 31 self.assertEqual(frame.BlameUrl('1'), 'https://repo_url/+blame/1/f.cc') | 55 self.assertEqual(frame.BlameUrl('1'), 'https://repo_url/+blame/1/f.cc') |
| 32 | 56 |
| 33 frame = frame._replace(crashed_line_numbers = [9, 10]) | 57 frame = frame._replace(crashed_line_numbers = [9, 10]) |
| 34 self.assertEqual(frame.BlameUrl('1'), 'https://repo_url/+blame/1/f.cc#9') | 58 self.assertEqual(frame.BlameUrl('1'), 'https://repo_url/+blame/1/f.cc#9') |
| 35 | 59 |
| 36 def testFrameListInitCallStack(self): | 60 def testCallStackConstructorIsLanguageJavaIfFormatJava(self): |
| 37 stack = CallStack(0) | 61 self.assertEqual( |
| 38 stack.extend([StackFrame(0, 'src/', '', 'func', 'f.cc', [2])]) | 62 CallStack(0, format_type = CallStackFormatType.JAVA).language_type, |
| 63 CallStackLanguageType.JAVA) |
| 39 | 64 |
| 40 copy_stack = CallStack(stack.priority, frame_list=stack) | 65 def testParseStackFrameForJavaCallstackFormat(self): |
| 41 self._VerifyTwoCallStacksEqual(copy_stack, stack) | 66 language_type = None |
| 42 | 67 format_type = CallStackFormatType.JAVA |
| 43 def testParseLineForJavaCallstackFormat(self): | 68 self.assertIsNone( |
| 44 stack = CallStack(0, CallStackFormatType.JAVA) | 69 StackFrame.Parse(language_type, format_type, 'dummy line', {})) |
| 45 | |
| 46 stack.ParseLine('dummy line', {}) | |
| 47 self.assertEqual(stack, []) | |
| 48 | 70 |
| 49 deps = {'org/': Dependency('org/', 'https://repo', '1')} | 71 deps = {'org/': Dependency('org/', 'https://repo', '1')} |
| 50 stack.ParseLine(' at org.a.b(a.java:609)', deps) | 72 frame = StackFrame.Parse(language_type, format_type, |
| 73 ' at org.a.b(a.java:609)', deps) |
| 51 self._VerifyTwoStackFramesEqual( | 74 self._VerifyTwoStackFramesEqual( |
| 52 stack[0], | 75 frame, |
| 53 StackFrame(0, 'org/', 'org.a.b', 'a.java', 'org/a.java', [609])) | 76 StackFrame(0, 'org/', 'org.a.b', 'a.java', 'org/a.java', [609])) |
| 54 | 77 |
| 55 def testParseLineForSyzyasanCallstackFormat(self): | 78 def testParseStackFrameForSyzyasanCallstackFormat(self): |
| 56 stack = CallStack(0, CallStackFormatType.SYZYASAN) | 79 language_type = None |
| 57 | 80 format_type = CallStackFormatType.SYZYASAN |
| 58 stack.ParseLine('dummy line', {}) | 81 self.assertIsNone( |
| 59 self.assertEqual(stack, []) | 82 StackFrame.Parse(language_type, format_type, 'dummy line', {})) |
| 60 | 83 |
| 61 deps = {'src/content/': Dependency('src/content/', 'https://repo', '1')} | 84 deps = {'src/content/': Dependency('src/content/', 'https://repo', '1')} |
| 62 stack.ParseLine('c::p::n [src/content/e.cc @ 165]', deps) | 85 frame = StackFrame.Parse(language_type, format_type, |
| 86 'c::p::n [src/content/e.cc @ 165]', deps) |
| 63 self._VerifyTwoStackFramesEqual( | 87 self._VerifyTwoStackFramesEqual( |
| 64 stack[0], | 88 frame, |
| 65 StackFrame( | 89 StackFrame( |
| 66 0, 'src/content/', 'c::p::n', 'e.cc', 'src/content/e.cc', [165])) | 90 0, 'src/content/', 'c::p::n', 'e.cc', 'src/content/e.cc', [165])) |
| 67 | 91 |
| 68 def testParseLineForDefaultCallstackFormat(self): | 92 def testParseStackFrameForDefaultCallstackFormat(self): |
| 69 stack = CallStack(0, CallStackFormatType.DEFAULT) | 93 language_type = None |
| 70 | 94 format_type = CallStackFormatType.DEFAULT |
| 71 stack.ParseLine('dummy line', {}) | 95 self.assertIsNone( |
| 72 self.assertEqual(stack, []) | 96 StackFrame.Parse(language_type, format_type, 'dummy line', {})) |
| 73 | |
| 74 stack.ParseLine('#dummy line', {}) | |
| 75 self.assertEqual(stack, []) | |
| 76 | 97 |
| 77 deps = {'tp/webrtc/': Dependency('tp/webrtc/', 'https://repo', '1')} | 98 deps = {'tp/webrtc/': Dependency('tp/webrtc/', 'https://repo', '1')} |
| 78 stack.ParseLine('#0 0x52617a in func0 tp/webrtc/a.c:38:3', deps) | 99 frame = StackFrame.Parse(language_type, format_type, |
| 100 '#0 0x52617a in func0 tp/webrtc/a.c:38:3', deps) |
| 79 self._VerifyTwoStackFramesEqual( | 101 self._VerifyTwoStackFramesEqual( |
| 80 stack[0], | 102 frame, |
| 81 StackFrame( | 103 StackFrame( |
| 82 0, 'tp/webrtc/', 'func0', 'a.c', 'tp/webrtc/a.c', [38, 39, 40, 41])) | 104 0, 'tp/webrtc/', 'func0', 'a.c', 'tp/webrtc/a.c', [38, 39, 40, 41])) |
| 83 | 105 |
| 84 stack.ParseLine('#1 0x526 in func::func2::func3 tp/webrtc/a.c:3:2', deps) | 106 frame = StackFrame.Parse(language_type, format_type, |
| 107 '#1 0x526 in func::func2::func3 tp/webrtc/a.c:3:2', deps) |
| 85 self._VerifyTwoStackFramesEqual( | 108 self._VerifyTwoStackFramesEqual( |
| 86 stack[1], | 109 frame, |
| 87 StackFrame( | 110 StackFrame( |
| 88 1, 'tp/webrtc/', 'func::func2::func3', 'a.c', 'tp/webrtc/a.c', | 111 1, 'tp/webrtc/', 'func::func2::func3', 'a.c', 'tp/webrtc/a.c', |
| 89 [3, 4, 5])) | 112 [3, 4, 5])) |
| 90 | 113 |
| 91 def testParseLineForFracasJavaStack(self): | 114 def testParseStackFrameForFracasJavaStack(self): |
| 92 stack = CallStack(0, CallStackFormatType.DEFAULT, | 115 format_type = CallStackFormatType.DEFAULT |
| 93 CallStackLanguageType.JAVA) | 116 language_type = CallStackLanguageType.JAVA |
| 94 | 117 |
| 95 stack.ParseLine('#0 0xxx in android.app.func app.java:2450', {}) | 118 frame = StackFrame.Parse(language_type, format_type, |
| 119 '#0 0xxx in android.app.func app.java:2450', {}) |
| 96 self._VerifyTwoStackFramesEqual( | 120 self._VerifyTwoStackFramesEqual( |
| 97 stack[0], | 121 frame, |
| 98 StackFrame( | 122 StackFrame( |
| 99 0, '', 'android.app.func', 'android/app.java', | 123 0, '', 'android.app.func', 'android/app.java', |
| 100 'android/app.java', [2450])) | 124 'android/app.java', [2450])) |
| 101 | 125 |
| 102 | 126 |
| 103 class StacktraceTest(StacktraceTestSuite): | 127 class StacktraceTest(StacktraceTestSuite): |
| 104 | 128 |
| 105 def testCrashStackForStacktraceWithoutSignature(self): | 129 def testCrashStackForStacktraceWithoutSignature(self): |
| 106 frame_list1 = [ | 130 frame_list1 = [ |
| 107 StackFrame(0, 'src/', 'func', 'file0.cc', 'src/file0.cc', [32])] | 131 StackFrame(0, 'src/', 'func', 'file0.cc', 'src/file0.cc', [32])] |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 expected_crash_stack = CallStack(0, frame_list=expected_frame_list) | 177 expected_crash_stack = CallStack(0, frame_list=expected_frame_list) |
| 154 | 178 |
| 155 self._VerifyTwoCallStacksEqual(stacktrace.crash_stack, | 179 self._VerifyTwoCallStacksEqual(stacktrace.crash_stack, |
| 156 expected_crash_stack) | 180 expected_crash_stack) |
| 157 | 181 |
| 158 def testCrashStackFallBackToFirstLeastPriorityCallStack(self): | 182 def testCrashStackFallBackToFirstLeastPriorityCallStack(self): |
| 159 stacktrace = Stacktrace() | 183 stacktrace = Stacktrace() |
| 160 self.assertEqual(stacktrace.crash_stack, None) | 184 self.assertEqual(stacktrace.crash_stack, None) |
| 161 | 185 |
| 162 callstack_list = [CallStack(0), CallStack(1)] | 186 callstack_list = [CallStack(0), CallStack(1)] |
| 163 stacktrace.extend(callstack_list) | 187 stacktrace = Stacktrace(stack_list=callstack_list) |
| 164 | 188 |
| 165 self._VerifyTwoCallStacksEqual(stacktrace.crash_stack, | 189 self._VerifyTwoCallStacksEqual(stacktrace.crash_stack, |
| 166 callstack_list[0]) | 190 callstack_list[0]) |
| 167 | 191 |
| 168 def testInitStacktaceByCopyAnother(self): | 192 def testInitStacktaceByCopyAnother(self): |
| 169 stack_trace = Stacktrace() | 193 stack_trace = Stacktrace(stack_list=[CallStack(0), CallStack(1)]) |
| 170 stack_trace.extend([CallStack(0), CallStack(1)]) | |
| 171 | 194 |
| 172 self._VerifyTwoStacktracesEqual(Stacktrace(stack_trace), stack_trace) | 195 self._VerifyTwoStacktracesEqual(Stacktrace(stack_trace), stack_trace) |
| OLD | NEW |