File indexing completed on 2024-05-12 04:39:58

0001 /*
0002     SPDX-FileCopyrightText: 2010 Niko Sams <niko.sams@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #include "test_gdbprinters.h"
0008 
0009 #include "tests/debuggers-tests-config.h"
0010 
0011 #include <QCoreApplication>
0012 #include <QTest>
0013 #include <QProcess>
0014 #include <QDebug>
0015 #include <QFileInfo>
0016 #include <QDir>
0017 #include <QStandardPaths>
0018 
0019 const QString BINARY_PATH(DEBUGGEE_BIN_DIR);
0020 
0021 class GdbProcess : private QProcess
0022 {
0023     Q_OBJECT
0024 
0025 public:
0026     explicit GdbProcess(const QString &program) : QProcess()
0027     {
0028         setProcessChannelMode(MergedChannels);
0029         // don't attempt to load .gdbinit in home (may cause unexpected results)
0030         QProcess::start(QStringLiteral("gdb"), (QStringList() << QStringLiteral("-nx") << (BINARY_PATH + '/' + program)));
0031         const bool started = waitForStarted();
0032         if (!started) {
0033             qDebug() << "Failed to start 'gdb' executable:" << errorString();
0034             Q_ASSERT(false);
0035             return;
0036         }
0037 
0038         QByteArray prompt = waitForPrompt();
0039         QVERIFY(!prompt.contains("No such file or directory"));
0040         execute("set confirm off");
0041         execute("set print pretty on");
0042         execute("set disable-randomization off"); // see https://phabricator.kde.org/D2188
0043         QList<QByteArray> p;
0044         QDir printersDir = QFileInfo(__FILE__).dir();
0045         printersDir.cdUp(); // go up to get to the main printers directory
0046         QVERIFY(printersDir.cd("printers"));
0047         p << "python"
0048           << "import sys"
0049           << "sys.path.insert(0, '"+printersDir.path().toLatin1()+"')"
0050           << "from qt import register_qt_printers"
0051           << "register_qt_printers (None)"
0052           << "from kde import register_kde_printers"
0053           << "register_kde_printers (None)"
0054           << "end";
0055         for (const QByteArray& i : qAsConst(p)) {
0056             write(i + "\n");
0057         }
0058         waitForPrompt();
0059     }
0060     ~GdbProcess() override
0061     {
0062         write("q\n");
0063         waitForFinished();
0064     }
0065     QByteArray waitForPrompt()
0066     {
0067         QByteArray output;
0068         while (!output.endsWith("(gdb) ")) {
0069             Q_ASSERT(state() == QProcess::Running);
0070             waitForReadyRead();
0071             QByteArray l = readAll();
0072             //qDebug() << l;
0073             output.append(l);
0074         }
0075         output.chop(7); //remove (gdb) prompt
0076         if (output.contains("Traceback") || output.contains("Exception")) {
0077             qDebug() << output;
0078             QTest::qFail("Unexpected Python Exception", __FILE__, __LINE__);
0079         }
0080         return output;
0081     }
0082 
0083     QByteArray execute(const QByteArray &cmd)
0084     {
0085         write(cmd + "\n");
0086         auto out = waitForPrompt();
0087         qDebug() << cmd << " = " << out;
0088         return out;
0089     }
0090 };
0091 
0092 void QtPrintersTest::initTestCase()
0093 {
0094     QStandardPaths::setTestModeEnabled(true);
0095 
0096     // Prevent SIGPIPE, then "ICE default IO error handler doing an exit(), pid = <PID>, errno = 32"
0097     // crash when the test runs for at least 60 seconds. This is a workaround for QTBUG-58709.
0098     QCoreApplication::processEvents();
0099 }
0100 
0101 void QtPrintersTest::testQString()
0102 {
0103     GdbProcess gdb(QStringLiteral("debuggee_qstring"));
0104     gdb.execute("break qstring.cpp:5");
0105     gdb.execute("run");
0106     QVERIFY(gdb.execute("print s").contains("\"test最后一个不是特殊字符'\\\"\\\\u6211\""));
0107     gdb.execute("next");
0108     QVERIFY(gdb.execute("print s").contains("\"test最后一个不是特殊字符'\\\"\\\\u6211x\""));
0109 
0110     const auto isEmptyGdbString = [](const QString& str) { return str.contains("= \"\""); };
0111     gdb.execute("next");
0112     QVERIFY(isEmptyGdbString(gdb.execute("print nullString")));
0113     gdb.execute("next");
0114     QVERIFY(isEmptyGdbString(gdb.execute("print emptyString")));
0115 }
0116 
0117 void QtPrintersTest::testQByteArray()
0118 {
0119     GdbProcess gdb(QStringLiteral("debuggee_qbytearray"));
0120     gdb.execute("break qbytearray.cpp:5");
0121     gdb.execute("run");
0122     QByteArray out = gdb.execute("print ba");
0123     qDebug() << out;
0124     QVERIFY(out.contains("\"\xE6\x98\xAF'\\\"\\\\u6211\""));
0125     QVERIFY(out.contains("[0] = -26 '\\346'"));
0126     QVERIFY(out.contains("[3] = 39 '\\''"));
0127     QVERIFY(out.contains("[4] = 34 '\"'"));
0128     gdb.execute("next");
0129     out = gdb.execute("print ba");
0130     QVERIFY(out.contains("\"\xE6\x98\xAF'\\\"\\\\u6211x\""));
0131 }
0132 
0133 void QtPrintersTest::testQListContainer_data()
0134 {
0135     QTest::addColumn<QString>("container");
0136 
0137     QTest::newRow("QList") << "QList";
0138     QTest::newRow("QQueue") << "QQueue";
0139     QTest::newRow("QVector") << "QVector";
0140     QTest::newRow("QStack") << "QStack";
0141     QTest::newRow("QLinkedList") << "QLinkedList";
0142     QTest::newRow("QSet") << "QSet";
0143 }
0144 
0145 void QtPrintersTest::testQListContainer()
0146 {
0147     QFETCH(QString, container);
0148     GdbProcess gdb(QStringLiteral("debuggee_qlistcontainer"));
0149     gdb.execute("break main");
0150     gdb.execute("run");
0151     gdb.execute(QStringLiteral("break 'doStuff<%1>()'").arg(container).toLocal8Bit());
0152     gdb.execute("cont");
0153 
0154     auto runToLine = [&](int line) {
0155         gdb.execute("tbreak qlistcontainer.cpp:" + QByteArray::number(line));
0156         gdb.execute("cont");
0157     };
0158 
0159     { // <int>
0160         runToLine(34);
0161         QByteArray out = gdb.execute("print intList");
0162         qWarning() << "FOO" << out;
0163         QVERIFY(out.contains(QString("%1<int> (size = 0)").arg(container).toLocal8Bit()));
0164         gdb.execute("next");
0165         out = gdb.execute("print intList");
0166         QVERIFY(out.contains(QString("%1<int> (size = 2)").arg(container).toLocal8Bit()));
0167         if (container != QLatin1String("QSet")) {
0168             QVERIFY(out.contains("[0] = 10"));
0169             QVERIFY(out.contains("[1] = 20"));
0170             QVERIFY(!out.contains("[2] = 30"));
0171         } else { // QSet order is undefined
0172             QVERIFY(out.contains("] = 10"));
0173             QVERIFY(out.contains("] = 20"));
0174             QVERIFY(!out.contains("] = 30"));
0175         }
0176     gdb.execute("next");
0177     out = gdb.execute("print intList");
0178     QVERIFY(out.contains(QString("%1<int> (size = 3)").arg(container).toLocal8Bit()));
0179     if (container != QLatin1String("QSet")) {
0180         QVERIFY(out.contains("[0] = 10"));
0181         QVERIFY(out.contains("[1] = 20"));
0182         QVERIFY(out.contains("[2] = 30"));
0183     } else { // QSet order is undefined
0184         QVERIFY(out.contains("] = 10"));
0185         QVERIFY(out.contains("] = 20"));
0186         QVERIFY(out.contains("] = 30"));
0187     }
0188     }
0189     { // <QString>
0190         runToLine(38);
0191         QByteArray out = gdb.execute("print stringList");
0192         QVERIFY(out.contains(QString("%1<QString> (size = 0)").arg(container).toLocal8Bit()));
0193         gdb.execute("next");
0194         out = gdb.execute("print stringList");
0195         QVERIFY(out.contains(QString("%1<QString> (size = 2)").arg(container).toLocal8Bit()));
0196         if (container != QLatin1String("QSet")) {
0197             QVERIFY(out.contains("[0] = \"a\""));
0198             QVERIFY(out.contains("[1] = \"bc\""));
0199             QVERIFY(!out.contains("[2] = \"d\""));
0200         } else { // QSet order is undefined
0201             QVERIFY(out.contains("] = \"a\""));
0202             QVERIFY(out.contains("] = \"bc\""));
0203             QVERIFY(!out.contains("] = \"d\""));
0204         }
0205     gdb.execute("next");
0206     out = gdb.execute("print stringList");
0207     QVERIFY(out.contains(QString("%1<QString> (size = 3)").arg(container).toLocal8Bit()));
0208     if (container != QLatin1String("QSet")) {
0209         QVERIFY(out.contains("[0] = \"a\""));
0210         QVERIFY(out.contains("[1] = \"bc\""));
0211         QVERIFY(out.contains("[2] = \"d\""));
0212     } else { // QSet order is undefined
0213         QVERIFY(out.contains("] = \"a\""));
0214         QVERIFY(out.contains("] = \"bc\""));
0215         QVERIFY(out.contains("] = \"d\""));
0216     }
0217     }
0218     { // <struct A>
0219         runToLine(42);
0220         QByteArray out = gdb.execute("print structList");
0221         QVERIFY(out.contains(QString("%1<A> (size = 0)").arg(container).toLocal8Bit()));
0222         gdb.execute("next");
0223         out = gdb.execute("print structList");
0224         QVERIFY(out.contains(QString("%1<A> (size = 1)").arg(container).toLocal8Bit()));
0225         QVERIFY(out.contains("[0] = {"));
0226         QVERIFY(out.contains("a = \"a\""));
0227         QVERIFY(out.contains("b = \"b\""));
0228         QVERIFY(out.contains("c = 100"));
0229         QVERIFY(out.contains("d = -200"));
0230         gdb.execute("next");
0231         out = gdb.execute("print structList");
0232         QVERIFY(out.contains(QString("%1<A> (size = 2)").arg(container).toLocal8Bit()));
0233         QVERIFY(out.contains("[1] = {"));
0234     }
0235     { // <int*>
0236         runToLine(46);
0237         QByteArray out = gdb.execute("print pointerList");
0238         QVERIFY(out.contains(QString("%1<int *> (size = 0)").arg(container).toLocal8Bit()));
0239         gdb.execute("next");
0240         out = gdb.execute("print pointerList");
0241         QVERIFY(out.contains(QString("%1<int *> (size = 2)").arg(container).toLocal8Bit()));
0242         QVERIFY(out.contains("[0] = 0x"));
0243         QVERIFY(out.contains("[1] = 0x"));
0244         QVERIFY(!out.contains("[2] = 0x"));
0245         gdb.execute("next");
0246         out = gdb.execute("print pointerList");
0247         QVERIFY(out.contains(QString("%1<int *> (size = 3)").arg(container).toLocal8Bit()));
0248         QVERIFY(out.contains("[0] = 0x"));
0249         QVERIFY(out.contains("[1] = 0x"));
0250         QVERIFY(out.contains("[2] = 0x"));
0251     }
0252     { // <QPair<int, int> >
0253         runToLine(51);
0254         QByteArray out = gdb.execute("print pairList");
0255         QVERIFY(out.contains(QString("%1<QPair<int, int>> (size = 0)").arg(container).toLocal8Bit()));
0256         gdb.execute("next");
0257         out = gdb.execute("print pairList");
0258         QVERIFY(out.contains(QString("%1<QPair<int, int>> (size = 2)").arg(container).toLocal8Bit()));
0259         if (container != QLatin1String("QSet")) {
0260             QVERIFY(out.contains("[0] = {\n    first = 1,\n    second = 2\n  }"));
0261             QVERIFY(out.contains("[1] = {\n    first = 2,\n    second = 3\n  }"));
0262         } else { // order is undefined in QSet
0263             QVERIFY(out.contains("] = {\n    first = 1,\n    second = 2\n  }"));
0264             QVERIFY(out.contains("] = {\n    first = 2,\n    second = 3\n  }"));
0265         }
0266     QVERIFY(!out.contains("[2] = "));
0267     gdb.execute("next");
0268     out = gdb.execute("print pairList");
0269     QVERIFY(out.contains(QString("%1<QPair<int, int>> (size = 3)").arg(container).toLocal8Bit()));
0270     if (container != QLatin1String("QSet")) {
0271         QVERIFY(out.contains("[0] = {\n    first = 1,\n    second = 2\n  }"));
0272         QVERIFY(out.contains("[1] = {\n    first = 2,\n    second = 3\n  }"));
0273         QVERIFY(out.contains("[2] = {\n    first = 4,\n    second = 5\n  }"));
0274     } else { // order is undefined in QSet
0275         QVERIFY(out.contains("] = {\n    first = 1,\n    second = 2\n  }"));
0276         QVERIFY(out.contains("] = {\n    first = 2,\n    second = 3\n  }"));
0277         QVERIFY(out.contains("] = {\n    first = 4,\n    second = 5\n  }"));
0278     }
0279     }
0280 }
0281 
0282 void QtPrintersTest::testQMapInt()
0283 {
0284     GdbProcess gdb(QStringLiteral("debuggee_qmapint"));
0285     gdb.execute("break qmapint.cpp:7");
0286     gdb.execute("run");
0287     QByteArray out = gdb.execute("print m");
0288     QVERIFY(out.contains("QMap<int, int> (size = 2)"));
0289     QVERIFY(out.contains("[10] = 100"));
0290     QVERIFY(out.contains("[20] = 200"));
0291     gdb.execute("next");
0292     out = gdb.execute("print m");
0293     QVERIFY(out.contains("QMap<int, int> (size = 3)"));
0294     QVERIFY(out.contains("[30] = 300"));
0295 }
0296 
0297 void QtPrintersTest::testQMapString()
0298 {
0299     GdbProcess gdb(QStringLiteral("debuggee_qmapstring"));
0300     gdb.execute("break qmapstring.cpp:8");
0301     gdb.execute("run");
0302     QByteArray out = gdb.execute("print m");
0303     QVERIFY(out.contains("QMap<QString, QString> (size = 2)"));
0304     QVERIFY(out.contains("[\"10\"] = \"100\""));
0305     QVERIFY(out.contains("[\"20\"] = \"200\""));
0306     gdb.execute("next");
0307     out = gdb.execute("print m");
0308     QVERIFY(out.contains("QMap<QString, QString> (size = 3)"));
0309     QVERIFY(out.contains("[\"30\"] = \"300\""));
0310 }
0311 
0312 void QtPrintersTest::testQMapStringBool()
0313 {
0314     GdbProcess gdb(QStringLiteral("debuggee_qmapstringbool"));
0315     gdb.execute("break qmapstringbool.cpp:8");
0316     gdb.execute("run");
0317     QByteArray out = gdb.execute("print m");
0318     QVERIFY(out.contains("QMap<QString, bool> (size = 2)"));
0319     QVERIFY(out.contains("[\"10\"] = true"));
0320     QVERIFY(out.contains("[\"20\"] = false"));
0321     gdb.execute("next");
0322     out = gdb.execute("print m");
0323     QVERIFY(out.contains("QMap<QString, bool> (size = 3)"));
0324     QVERIFY(out.contains("[\"30\"] = true"));
0325 }
0326 
0327 
0328 void QtPrintersTest::testQDate()
0329 {
0330     GdbProcess gdb(QStringLiteral("debuggee_qdate"));
0331     gdb.execute("break qdate.cpp:6");
0332     gdb.execute("run");
0333     QByteArray out = gdb.execute("print d");
0334     QVERIFY(out.contains("2010-01-20"));
0335 }
0336 
0337 void QtPrintersTest::testQTime()
0338 {
0339     GdbProcess gdb(QStringLiteral("debuggee_qtime"));
0340     gdb.execute("break qtime.cpp:6");
0341     gdb.execute("run");
0342     QByteArray out = gdb.execute("print t");
0343     QVERIFY(out.contains("15:30:10.123"));
0344 }
0345 
0346 void QtPrintersTest::testQDateTime()
0347 {
0348     GdbProcess gdb(QStringLiteral("debuggee_qdatetime"));
0349     gdb.execute("break qdatetime.cpp:5");
0350     gdb.execute("run");
0351     QByteArray out = gdb.execute("print dt");
0352     QVERIFY(out.contains("Wed Jan 20 15:31:13 2010"));
0353 }
0354 
0355 void QtPrintersTest::testQUrl()
0356 {
0357     GdbProcess gdb(QStringLiteral("debuggee_qurl"));
0358     gdb.execute("break qurl.cpp:7");
0359     gdb.execute("run");
0360 
0361     QByteArray out = gdb.execute("print u");
0362     QVERIFY(out.contains("http://user@www.kdevelop.org:12345/foo?xyz=bar#asdf"));
0363 
0364     const auto localFile = gdb.execute("print localFile");
0365     QVERIFY(localFile.contains("file:///usr/bin/kdevelop"));
0366 
0367     const auto defaultConstructed = gdb.execute("print defaultConstructed");
0368     QVERIFY(defaultConstructed.contains("<invalid>"));
0369 }
0370 
0371 void QtPrintersTest::testQHashInt()
0372 {
0373     GdbProcess gdb(QStringLiteral("debuggee_qhashint"));
0374     gdb.execute("break qhashint.cpp:7");
0375     gdb.execute("run");
0376     QByteArray out = gdb.execute("print h");
0377     QVERIFY(out.contains("QHash<int, int> (size = 2)"));
0378     QVERIFY(out.contains("[10] = 100"));
0379     QVERIFY(out.contains("[20] = 200"));
0380     gdb.execute("next");
0381     out = gdb.execute("print h");
0382     QVERIFY(out.contains("QHash<int, int> (size = 3)"));
0383     QVERIFY(out.contains("[30] = 300"));
0384 }
0385 
0386 void QtPrintersTest::testQHashString()
0387 {
0388     GdbProcess gdb(QStringLiteral("debuggee_qhashstring"));
0389     gdb.execute("break qhashstring.cpp:8");
0390     gdb.execute("run");
0391     QByteArray out = gdb.execute("print h");
0392     QVERIFY(out.contains("QHash<QString, QString> (size = 2)"));
0393     QVERIFY(out.contains("[\"10\"] = \"100\""));
0394     QVERIFY(out.contains("[\"20\"] = \"200\""));
0395     gdb.execute("next");
0396     out = gdb.execute("print h");
0397     QVERIFY(out.contains("QHash<QString, QString> (size = 3)"));
0398     QVERIFY(out.contains("[\"30\"] = \"300\""));
0399 }
0400 
0401 void QtPrintersTest::testQSetInt()
0402 {
0403     GdbProcess gdb(QStringLiteral("debuggee_qsetint"));
0404     gdb.execute("break qsetint.cpp:7");
0405     gdb.execute("run");
0406     QByteArray out = gdb.execute("print s");
0407     QVERIFY(out.contains("QSet<int> (size = 2)"));
0408     QVERIFY(out.contains("] = 10"));
0409     QVERIFY(out.contains("] = 20"));
0410     gdb.execute("next");
0411     out = gdb.execute("print s");
0412     QVERIFY(out.contains("QSet<int> (size = 3)"));
0413     QVERIFY(out.contains("] = 30"));
0414 }
0415 
0416 void QtPrintersTest::testQSetString()
0417 {
0418     GdbProcess gdb(QStringLiteral("debuggee_qsetstring"));
0419     gdb.execute("break qsetstring.cpp:8");
0420     gdb.execute("run");
0421     QByteArray out = gdb.execute("print s");
0422     QVERIFY(out.contains("QSet<QString> (size = 2)"));
0423     QVERIFY(out.contains("] = \"10\""));
0424     QVERIFY(out.contains("] = \"20\""));
0425     gdb.execute("next");
0426     out = gdb.execute("print s");
0427     QVERIFY(out.contains("QSet<QString> (size = 3)"));
0428     QVERIFY(out.contains("] = \"30\""));
0429 }
0430 
0431 void QtPrintersTest::testQChar()
0432 {
0433     GdbProcess gdb(QStringLiteral("debuggee_qchar"));
0434     gdb.execute("break qchar.cpp:5");
0435     gdb.execute("run");
0436     QVERIFY(gdb.execute("print c").contains("\"k\""));
0437 }
0438 
0439 void QtPrintersTest::testQListPOD()
0440 {
0441     GdbProcess gdb(QStringLiteral("debuggee_qlistpod"));
0442     gdb.execute("break qlistpod.cpp:31");
0443     gdb.execute("run");
0444     QVERIFY(gdb.execute("print b").contains("false"));
0445     QVERIFY(gdb.execute("print c").contains("50"));
0446     QVERIFY(gdb.execute("print uc").contains("50"));
0447     QVERIFY(gdb.execute("print s").contains("50"));
0448     QVERIFY(gdb.execute("print us").contains("50"));
0449     QVERIFY(gdb.execute("print i").contains("50"));
0450     QVERIFY(gdb.execute("print ui").contains("50"));
0451     QVERIFY(gdb.execute("print l").contains("50"));
0452     QVERIFY(gdb.execute("print ul").contains("50"));
0453     QVERIFY(gdb.execute("print i64").contains("50"));
0454     QVERIFY(gdb.execute("print ui64").contains("50"));
0455     QVERIFY(gdb.execute("print f").contains("50"));
0456     QVERIFY(gdb.execute("print d").contains("50"));
0457 }
0458 
0459 void QtPrintersTest::testQUuid()
0460 {
0461     GdbProcess gdb(QStringLiteral("debuggee_quuid"));
0462     gdb.execute("break quuid.cpp:4");
0463     gdb.execute("run");
0464     QByteArray data = gdb.execute("print id");
0465     QVERIFY(data.contains("{9ec3b70b-d105-42bf-b3b4-656e44d2e223}"));
0466 }
0467 
0468 void QtPrintersTest::testQVariant()
0469 {
0470     GdbProcess gdb(QStringLiteral("debuggee_qvariant"));
0471 
0472     auto printNext = [&]() {
0473         gdb.execute("next");
0474         return gdb.execute("print v");
0475     };
0476 
0477     gdb.execute("break qvariant.cpp:13");
0478     gdb.execute("run");
0479 
0480     QVERIFY(printNext().contains("QVariant(NULL)"));
0481     QVERIFY(printNext().contains("QVariant(QString, \"KDevelop (QString)\")"));
0482     QVERIFY(printNext().contains("QVariant(QByteArray, \"KDevelop (QByteArray)\" = {"));
0483     QVERIFY(printNext().contains("QVariant(signed char, -8"));
0484     QVERIFY(printNext().contains("QVariant(uchar, 8"));
0485     QVERIFY(printNext().contains("QVariant(short, -16)"));
0486     QVERIFY(printNext().contains("QVariant(ushort, 16)"));
0487     QVERIFY(printNext().contains("QVariant(int, -32)"));
0488     QVERIFY(printNext().contains("QVariant(uint, 32)"));
0489     QVERIFY(printNext().contains("QVariant(qlonglong, -64)"));
0490     QVERIFY(printNext().contains("QVariant(qulonglong, 64)"));
0491     QVERIFY(printNext().contains("QVariant(bool, true)"));
0492     QVERIFY(printNext().contains("QVariant(float, 4.5)"));
0493     QVERIFY(printNext().contains("QVariant(double, 42.5)"));
0494     QVERIFY(printNext().contains("QVariant(QObject*, 0x"));
0495     QVERIFY(printNext().contains("QVariant(SomeCustomType, {\n  foo = 42\n})"));
0496 }
0497 
0498 void QtPrintersTest::testKTextEditorTypes()
0499 {
0500     GdbProcess gdb(QStringLiteral("debuggee_ktexteditortypes"));
0501     gdb.execute("break ktexteditortypes.cpp:9");
0502     gdb.execute("run");
0503 
0504     QByteArray data = gdb.execute("print cursor");
0505     QCOMPARE(data, QByteArray("$1 = [1, 1]"));
0506     data = gdb.execute("print range");
0507     QCOMPARE(data, QByteArray("$2 = [(1, 1) -> (2, 2)]"));
0508 }
0509 
0510 void QtPrintersTest::testKDevelopTypes()
0511 {
0512     GdbProcess gdb(QStringLiteral("debuggee_kdeveloptypes"));
0513     gdb.execute("break kdeveloptypes.cpp:12");
0514     const auto runMessage = gdb.execute("run");
0515     if (runMessage.contains("ASan runtime does not come first"))
0516         QSKIP("cannot run this test in an ASan build configuration");
0517 
0518     QVERIFY(gdb.execute("print path1").contains("(\"tmp\", \"foo\")"));
0519     QVERIFY(gdb.execute("print path2").contains("(\"http://www.test.com\", \"tmp\", \"asdf.txt\")"));
0520 }
0521 
0522 QTEST_MAIN(QtPrintersTest)
0523 
0524 #include "test_gdbprinters.moc"
0525 #include "moc_test_gdbprinters.cpp"