Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: appengine/findit/crash/test/stacktrace_test.py

Issue 2562623004: Making CallStack immutable, so it can be hashable (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698