| 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 crash import callstack_detectors |
| 6 from crash.flag_manager import ParsingFlag |
| 7 from crash.flag_manager import FlagManager |
| 8 from crash.test.stacktrace_test_suite import StacktraceTestSuite |
| 9 from crash.type_enums import CallStackFormatType |
| 10 from crash.type_enums import LanguageType |
| 11 |
| 12 |
| 13 class CallStackDetectorTest(StacktraceTestSuite): |
| 14 |
| 15 def testAndroidJobDetector(self): |
| 16 """Tests that ``AndroidJobDetector`` detects android job callstack.""" |
| 17 stack_detector = callstack_detectors.AndroidJobDetector() |
| 18 flag_manager = FlagManager() |
| 19 flag_manager.Register('group', |
| 20 ParsingFlag('java_main_stack_flag', value=True)) |
| 21 |
| 22 self.assertTupleEqual( |
| 23 stack_detector.IsStartOfNewCallStack( |
| 24 'java.lang.IllegalStateException: blabla', flag_manager), |
| 25 (True, 0, CallStackFormatType.JAVA, LanguageType.JAVA, {})) |
| 26 self.assertTupleEqual( |
| 27 stack_detector.IsStartOfNewCallStack( |
| 28 'org.chromium.src.BlaBla', flag_manager), |
| 29 (True, 1, CallStackFormatType.JAVA, LanguageType.JAVA, {})) |
| 30 self.assertTupleEqual( |
| 31 stack_detector.IsStartOfNewCallStack('Caused by:', flag_manager), |
| 32 (True, 1, CallStackFormatType.JAVA, LanguageType.JAVA, {})) |
| 33 self.assertTupleEqual( |
| 34 stack_detector.IsStartOfNewCallStack( |
| 35 'com.google.android.BlaBla', flag_manager), |
| 36 (True, 1, CallStackFormatType.JAVA, LanguageType.JAVA, {})) |
| 37 self.assertTupleEqual( |
| 38 stack_detector.IsStartOfNewCallStack('dummy', flag_manager), |
| 39 (False, None, None, None, None)) |
| 40 |
| 41 def testSyzyasanDetector(self): |
| 42 """Tests that ``SyzyasanDetector`` detects sysyasn callstack.""" |
| 43 stack_detector = callstack_detectors.SyzyasanDetector() |
| 44 self.assertTupleEqual( |
| 45 stack_detector.IsStartOfNewCallStack('Crash stack:'), |
| 46 (True, 0, CallStackFormatType.SYZYASAN, LanguageType.CPP, {})) |
| 47 self.assertTupleEqual( |
| 48 stack_detector.IsStartOfNewCallStack('A stack:'), |
| 49 (True, 1, CallStackFormatType.SYZYASAN, LanguageType.CPP, {})) |
| 50 self.assertTupleEqual( |
| 51 stack_detector.IsStartOfNewCallStack('dummy'), |
| 52 (False, None, None, None, None)) |
| 53 |
| 54 def testTsanDetector(self): |
| 55 """Tests that ``TsanDetector`` detects thread sanitizer callstack.""" |
| 56 stack_detector = callstack_detectors.TsanDetector() |
| 57 self.assertTupleEqual( |
| 58 stack_detector.IsStartOfNewCallStack('Read of size 1023:'), |
| 59 (True, 0, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 60 self.assertTupleEqual( |
| 61 stack_detector.IsStartOfNewCallStack('WARNING: ThreadSanitizer'), |
| 62 (True, 0, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 63 self.assertTupleEqual( |
| 64 stack_detector.IsStartOfNewCallStack('Previous read of size 102'), |
| 65 (True, 1, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 66 self.assertTupleEqual( |
| 67 stack_detector.IsStartOfNewCallStack( |
| 68 'Location is heap block of size 3543'), |
| 69 (True, 1, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 70 self.assertTupleEqual( |
| 71 stack_detector.IsStartOfNewCallStack('dummy'), |
| 72 (False, None, None, None, None)) |
| 73 |
| 74 def testUbsanDetector(self): |
| 75 """Tests that ``UbsanDetector`` detects ubsan callstack.""" |
| 76 stack_detector = callstack_detectors.UbsanDetector() |
| 77 flag_manager = FlagManager() |
| 78 flag_manager.Register('group', |
| 79 ParsingFlag('is_first_stack_flag', value=True)) |
| 80 self.assertTupleEqual( |
| 81 stack_detector.IsStartOfNewCallStack('blabla: runtime error: blabla', |
| 82 flag_manager), |
| 83 (True, 0, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 84 # After the ``is_first_stack_flag`` is set to False, the priority will be |
| 85 # 1. |
| 86 self.assertTupleEqual( |
| 87 stack_detector.IsStartOfNewCallStack('blabla: runtime error: blabla', |
| 88 flag_manager), |
| 89 (True, 1, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 90 self.assertTupleEqual( |
| 91 stack_detector.IsStartOfNewCallStack('dummy', flag_manager), |
| 92 (False, None, None, None, None)) |
| 93 |
| 94 def testMsanDetector(self): |
| 95 """Tests that ``MsanDetector`` detects memory sanitizer callstack.""" |
| 96 stack_detector = callstack_detectors.MsanDetector() |
| 97 self.assertTupleEqual( |
| 98 stack_detector.IsStartOfNewCallStack( |
| 99 'Uninitialized value was created by'), |
| 100 (True, 0, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 101 # After the ``is_first_stack_flag`` is set to False, the priority will be |
| 102 # 1. |
| 103 self.assertTupleEqual( |
| 104 stack_detector.IsStartOfNewCallStack( |
| 105 'Uninitialized value was stored to'), |
| 106 (True, 1, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 107 self.assertTupleEqual( |
| 108 stack_detector.IsStartOfNewCallStack( |
| 109 '==123== ERROR:MemorySanitizer'), |
| 110 (True, 2, CallStackFormatType.DEFAULT, LanguageType.CPP, {'pid': 123})) |
| 111 self.assertTupleEqual( |
| 112 stack_detector.IsStartOfNewCallStack('dummy'), |
| 113 (False, None, None, None, None)) |
| 114 |
| 115 def testAsanDetector(self): |
| 116 """Tests that ``AsanDetector`` detects address sanitizer callstack.""" |
| 117 stack_detector = callstack_detectors.AsanDetector() |
| 118 self.assertTupleEqual( |
| 119 stack_detector.IsStartOfNewCallStack('==123== ERROR:AddressSanitizer'), |
| 120 (True, 0, CallStackFormatType.DEFAULT, LanguageType.CPP, {'pid': 123})) |
| 121 # After the ``is_first_stack_flag`` is set to False, the priority will be |
| 122 # 1. |
| 123 self.assertTupleEqual( |
| 124 stack_detector.IsStartOfNewCallStack('READ of size 32 at backtrace:'), |
| 125 (True, 0, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 126 self.assertTupleEqual( |
| 127 stack_detector.IsStartOfNewCallStack('freed by thread T99 here:'), |
| 128 (True, 1, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 129 self.assertTupleEqual( |
| 130 stack_detector.IsStartOfNewCallStack( |
| 131 'previously allocated by thread T1 here:'), |
| 132 (True, 1, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 133 self.assertTupleEqual( |
| 134 stack_detector.IsStartOfNewCallStack('Thread T9 created by'), |
| 135 (True, 1, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 136 self.assertTupleEqual( |
| 137 stack_detector.IsStartOfNewCallStack('dummy'), |
| 138 (False, None, None, None, None)) |
| 139 |
| 140 def testChromeCrashDetector(self): |
| 141 """Tests that ``ChromeCrashDetector`` detects Fracas/Cracas callstack.""" |
| 142 stack_detector = callstack_detectors.ChromeCrashStackDetector() |
| 143 |
| 144 self.assertTupleEqual( |
| 145 stack_detector.IsStartOfNewCallStack('CRASHED [EXC @ 0x508]'), |
| 146 (True, 0, CallStackFormatType.DEFAULT, LanguageType.CPP, {})) |
| 147 self.assertTupleEqual( |
| 148 stack_detector.IsStartOfNewCallStack('(JAVA) CRASHED [EXC @ 0x508]'), |
| 149 (True, 0, CallStackFormatType.DEFAULT, LanguageType.JAVA, {})) |
| 150 self.assertTupleEqual(stack_detector.IsStartOfNewCallStack('dummy line'), |
| 151 (False, None, None, None, None)) |
| OLD | NEW |