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"