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