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