File indexing completed on 2024-04-21 16:12:20
0001 /* 0002 SPDX-FileCopyrightText: 2020 Harald Sitter <sitter@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include <QTest> 0008 0009 #include "../parser/backtraceparsergdb.h" 0010 0011 class GdbBacktraceLineTest : public QObject 0012 { 0013 Q_OBJECT 0014 private Q_SLOTS: 0015 0016 // rating() is often times somewhat misleading because it is an exclusive state 0017 // but in practice a frame may have multiple issues. for purposes of rating all 0018 // issues are considered equal. it's not ideal though, a frame that is missing 0019 // multiple elements is objectively worse than a frame that is just missing one. 0020 0021 void testComplete() 0022 { 0023 BacktraceLineGdb line( 0024 "#7 0x00007f468b177bfa in KMime::DateFormatterPrivate::localized (t=t@entry=1579263464, shortFormat=shortFormat@entry=true, lang=...) at " 0025 "/usr/src/debug/kmime-19.12.1-lp151.150.1.x86_64/src/kmime_dateformatter.cpp:310\n"); 0026 QCOMPARE(line.type(), BacktraceLine::StackFrame); 0027 QCOMPARE(line.frameNumber(), 7); 0028 QCOMPARE(line.functionName(), "KMime::DateFormatterPrivate::localized"); 0029 QCOMPARE(line.fileName(), "/usr/src/debug/kmime-19.12.1-lp151.150.1.x86_64/src/kmime_dateformatter.cpp:310"); 0030 QCOMPARE(line.libraryName(), ""); 0031 QCOMPARE(line.rating(), BacktraceLine::Good); 0032 } 0033 0034 void testPoorFile() 0035 { 0036 BacktraceLineGdb line("#41 0x00007f4684ae4e87 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0\n"); 0037 QCOMPARE(line.type(), BacktraceLine::StackFrame); 0038 QCOMPARE(line.frameNumber(), 41); 0039 QCOMPARE(line.functionName(), "g_main_context_dispatch"); 0040 QCOMPARE(line.fileName(), ""); 0041 QCOMPARE(line.libraryName(), "/usr/lib64/libglib-2.0.so.0"); 0042 QCOMPARE(line.rating(), BacktraceLine::MissingSourceFile); 0043 } 0044 0045 void testNoFunctionPoorFile() 0046 { 0047 // Also uses 'at' keyword while referring to a library, this used to trip up 0048 // the parser and make it think there's a source file, when in reality there 0049 // is not. 0050 // Lacking a function name further tripped up the parsing because originally 0051 // couldn't deal with the function name being missing entirely. 0052 // As a result this line used to rate as 'Good' -.- 0053 // https://bugs.kde.org/show_bug.cgi?id=416923 0054 // https://bugs.kde.org/show_bug.cgi?id=418538 0055 { // glib 0056 BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libglib-2.0.so.0\n"); 0057 QCOMPARE(line.type(), BacktraceLine::StackFrame); 0058 QCOMPARE(line.frameNumber(), 13); 0059 QCOMPARE(line.functionName(), ""); 0060 QCOMPARE(line.fileName(), ""); 0061 QCOMPARE(line.libraryName(), "/usr/lib/libglib-2.0.so.0"); 0062 QCOMPARE(line.rating(), BacktraceLine::MissingFunction); 0063 } 0064 { // library without -2.0 (trips up suffix detection) 0065 BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libpackagekit-qt.so.12\n"); 0066 QCOMPARE(line.type(), BacktraceLine::StackFrame); 0067 QCOMPARE(line.frameNumber(), 13); 0068 QCOMPARE(line.functionName(), ""); 0069 QCOMPARE(line.fileName(), ""); 0070 QCOMPARE(line.libraryName(), "/usr/lib/libpackagekit-qt.so.12"); 0071 QCOMPARE(line.rating(), BacktraceLine::MissingFunction); 0072 } 0073 { // library without any soversion 0074 BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libpackagekit-qt.so\n"); 0075 QCOMPARE(line.type(), BacktraceLine::StackFrame); 0076 QCOMPARE(line.frameNumber(), 13); 0077 QCOMPARE(line.functionName(), ""); 0078 QCOMPARE(line.fileName(), ""); 0079 QCOMPARE(line.libraryName(), "/usr/lib/libpackagekit-qt.so"); 0080 QCOMPARE(line.rating(), BacktraceLine::MissingFunction); 0081 } 0082 { // library without any soversion but name suffix 0083 BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libpackagekit-1.0.so\n"); 0084 QCOMPARE(line.type(), BacktraceLine::StackFrame); 0085 QCOMPARE(line.frameNumber(), 13); 0086 QCOMPARE(line.functionName(), ""); 0087 QCOMPARE(line.fileName(), ""); 0088 QCOMPARE(line.libraryName(), "/usr/lib/libpackagekit-1.0.so"); 0089 QCOMPARE(line.rating(), BacktraceLine::MissingFunction); 0090 } 0091 } 0092 0093 void testOnlyFunctionNofile() 0094 { 0095 BacktraceLineGdb line("#20 0x0000557e978c1b7e in _start ()\n"); 0096 QCOMPARE(line.type(), BacktraceLine::StackFrame); 0097 QCOMPARE(line.frameNumber(), 20); 0098 QCOMPARE(line.functionName(), "_start"); 0099 QCOMPARE(line.fileName(), ""); 0100 QCOMPARE(line.libraryName(), ""); 0101 QCOMPARE(line.rating(), BacktraceLine::MissingLibrary); 0102 } 0103 0104 void testInferiorMarker() 0105 { 0106 BacktraceLineGdb line("[Inferior 1 (process 72692) detached]\n"); 0107 QCOMPARE(line.type(), BacktraceLine::Unknown); 0108 QCOMPARE(line.rating(), BacktraceLine::InvalidRating); 0109 } 0110 0111 void testThreadStart() 0112 { 0113 const QString input = QStringLiteral("Thread 35 (Thread 0x7f77f57fa700 (LWP 8133)):\n"); 0114 BacktraceLineGdb line(input); 0115 QCOMPARE(line.type(), BacktraceLineGdb::ThreadStart); 0116 QCOMPARE(line.rating(), BacktraceLine::InvalidRating); 0117 QCOMPARE(line.toString(), input); 0118 } 0119 0120 void testThreadIndicator() 0121 { 0122 const QString input = QStringLiteral("[Current thread is 1 (Thread 0x7f78847c7c80 (LWP 7806))]\n"); 0123 BacktraceLineGdb line(input); 0124 QCOMPARE(line.type(), BacktraceLineGdb::ThreadIndicator); 0125 QCOMPARE(line.rating(), BacktraceLine::InvalidRating); 0126 QCOMPARE(line.toString(), input); 0127 } 0128 }; 0129 0130 QTEST_GUILESS_MAIN(GdbBacktraceLineTest) 0131 0132 #include "gdbbacktracelinetest.moc"