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

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

Issue 2562623004: Making CallStack immutable, so it can be hashable (Closed)
Patch Set: Addressing nits 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
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
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)
OLDNEW
« no previous file with comments | « appengine/findit/crash/test/project_classifier_test.py ('k') | appengine/findit/crash/test/stacktrace_test_suite.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698