diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index d3ed8d28ae37f7d283b92702ae16253cf760eab6..cd176649d0b49ac5ed1919876afc9517b619600c 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -342,6 +342,20 @@ public: mutable QMap<QByteArray, Check> checks; // IName -> Action }; +struct TempStuff +{ + TempStuff() : buildTemp(QLatin1String("qt_tst_dumpers_")) + { + buildPath = buildTemp.path(); + buildTemp.setAutoRemove(false); + QVERIFY(!buildPath.isEmpty()); + } + + QByteArray input; + QTemporaryDir buildTemp; + QString buildPath; +}; + Q_DECLARE_METATYPE(Data) class tst_Dumpers : public QObject @@ -349,15 +363,17 @@ class tst_Dumpers : public QObject Q_OBJECT public: - tst_Dumpers() {} + tst_Dumpers() : t(0), m_keepTemp(false) {} private slots: void initTestCase(); void dumper(); void dumper_data(); - void cleanupTestCase(); + void init(); + void cleanup(); private: + TempStuff *t; QByteArray m_debuggerBinary; QByteArray m_qmakeBinary; bool m_usePython; @@ -403,40 +419,20 @@ void tst_Dumpers::initTestCase() qDebug() << "Gdb version " << m_gdbVersion; } -void tst_Dumpers::cleanupTestCase() +void tst_Dumpers::init() { -// if (m_keepTemp) -// logInput(); + t = new TempStuff(); } -struct TempStuff +void tst_Dumpers::cleanup() { - TempStuff() : buildTemp(QLatin1String("qt_tst_dumpers_")) - { - buildPath = buildTemp.path(); - QVERIFY(!buildPath.isEmpty()); - } - - void verify(bool ok, int line) - { - if (ok) - return; - buildTemp.setAutoRemove(false); - logInput(); - QTest::qVerify(false, "error", "", __FILE__, line); - } - - void logInput() - { - QFile logger(buildPath + QLatin1String("/input.txt")); + if (!t->buildTemp.autoRemove()) { + QFile logger(t->buildPath + QLatin1String("/input.txt")); logger.open(QIODevice::ReadWrite); - logger.write(input); + logger.write(t->input); } - - QByteArray input; - QTemporaryDir buildTemp; - QString buildPath; -}; + delete t; +} void tst_Dumpers::dumper() { @@ -447,19 +443,14 @@ void tst_Dumpers::dumper() if (data.neededGdbVersion.max < m_gdbVersion) MSKIP_SINGLE("Need maximum GDB version " + QByteArray::number(data.neededGdbVersion.max)); - bool ok; QString cmd; QByteArray output; QByteArray error; - TempStuff t; - t.buildTemp.setAutoRemove(m_keepTemp); - const char *mainFile = data.forceC ? "main.c" : "main.cpp"; - QFile proFile(t.buildPath + QLatin1String("/doit.pro")); - ok = proFile.open(QIODevice::ReadWrite); - t.verify(ok, __LINE__); + QFile proFile(t->buildPath + QLatin1String("/doit.pro")); + QVERIFY(proFile.open(QIODevice::ReadWrite)); proFile.write("SOURCES = "); proFile.write(mainFile); proFile.write("\nTARGET = doit\n"); @@ -472,8 +463,8 @@ void tst_Dumpers::dumper() proFile.write(data.profileExtra); proFile.close(); - QFile source(t.buildPath + QLatin1Char('/') + QLatin1String(mainFile)); - ok = source.open(QIODevice::ReadWrite); + QFile source(t->buildPath + QLatin1Char('/') + QLatin1String(mainFile)); + QVERIFY(source.open(QIODevice::ReadWrite)); QByteArray fullCode = "\n\nvoid unused(const void *first,...) { (void) first; }" "\n\nvoid breakHere() {}" @@ -486,29 +477,26 @@ void tst_Dumpers::dumper() "\n breakHere();" "\n return 0;" "\n}\n"; - t.verify(ok, __LINE__); source.write(fullCode); source.close(); QProcess qmake; - qmake.setWorkingDirectory(t.buildPath); + qmake.setWorkingDirectory(t->buildPath); cmd = QString::fromLatin1(m_qmakeBinary); //qDebug() << "Starting qmake: " << cmd; qmake.start(cmd); - ok = qmake.waitForFinished(); - t.verify(ok, __LINE__); + QVERIFY(qmake.waitForFinished()); output = qmake.readAllStandardOutput(); error = qmake.readAllStandardError(); //qDebug() << "stdout: " << output; - if (!error.isEmpty()) { qDebug() << error; t.verify(false, __LINE__); } + if (!error.isEmpty()) { qDebug() << error; QVERIFY(false); } QProcess make; - make.setWorkingDirectory(t.buildPath); + make.setWorkingDirectory(t->buildPath); cmd = QString::fromLatin1("make"); //qDebug() << "Starting make: " << cmd; make.start(cmd); - ok = make.waitForFinished(); - t.verify(ok, __LINE__); + QVERIFY(make.waitForFinished()); output = make.readAllStandardOutput(); error = make.readAllStandardError(); //qDebug() << "stdout: " << output; @@ -572,27 +560,26 @@ void tst_Dumpers::dumper() cmds += "quit\n"; - t.input = cmds; + t->input = cmds; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert(QLatin1String("QT_HASH_SEED"), QLatin1String("0")); QProcess debugger; debugger.setProcessEnvironment(env); - debugger.setWorkingDirectory(t.buildPath); + debugger.setWorkingDirectory(t->buildPath); debugger.start(QString::fromLatin1(m_debuggerBinary) + QLatin1String(" -i mi -quiet -nx")); - ok = debugger.waitForStarted(); + QVERIFY(debugger.waitForStarted()); debugger.write(cmds); - ok = debugger.waitForFinished(); - t.verify(ok, __LINE__); + QVERIFY(debugger.waitForFinished()); output = debugger.readAllStandardOutput(); //qDebug() << "stdout: " << output; error = debugger.readAllStandardError(); if (!error.isEmpty()) { qDebug() << error; } if (m_keepTemp) { - QFile logger(t.buildPath + QLatin1String("/output.txt")); - ok = logger.open(QIODevice::ReadWrite); + QFile logger(t->buildPath + QLatin1String("/output.txt")); + logger.open(QIODevice::ReadWrite); logger.write("=== STDOUT ===\n"); logger.write(output); logger.write("\n=== STDERR ===\n"); @@ -600,26 +587,25 @@ void tst_Dumpers::dumper() } Context context; - int pos1 = output.indexOf("data="); - t.verify(pos1 != -1, __LINE__); - int pos2 = output.indexOf(",typeinfo", pos1); - t.verify(pos2 != -1, __LINE__); - QByteArray contents = output.mid(pos1, pos2 - pos1); + int posDataStart = output.indexOf("data="); + QVERIFY(posDataStart != -1); + int posDataEnd = output.indexOf(",typeinfo", posDataStart); + QVERIFY(posDataEnd != -1); + QByteArray contents = output.mid(posDataStart, posDataEnd - posDataStart); contents.replace("\\\"", "\""); - int pos3 = output.indexOf("@NS@"); - t.verify(pos3 != -1, __LINE__); - pos3 += sizeof("@NS@") - 1; - int pos4 = output.indexOf("@", pos3); - t.verify(pos4 != -1, __LINE__); - context.nameSpace = output.mid(pos3, pos4 - pos3); + int posNameSpaceStart = output.indexOf("@NS@"); + QVERIFY(posNameSpaceStart != -1); + posNameSpaceStart += sizeof("@NS@") - 1; + int posNameSpaceEnd = output.indexOf("@", posNameSpaceStart); + QVERIFY(posNameSpaceEnd != -1); + context.nameSpace = output.mid(posNameSpaceStart, posNameSpaceEnd - posNameSpaceStart); //qDebug() << "FOUND NS: " << context.nameSpace; if (context.nameSpace == "::") context.nameSpace.clear(); GdbMi actual; actual.fromString(contents); - ok = false; WatchData local; local.iname = "local"; @@ -636,6 +622,7 @@ void tst_Dumpers::dumper() //qDebug() << "QT VERSION " << QByteArray::number(context.qtVersion, 16); QSet<QByteArray> seenINames; + bool ok = true; foreach (const WatchData &item, list) { seenINames.insert(item.iname); if (data.checks.contains(item.iname)) { @@ -645,21 +632,21 @@ void tst_Dumpers::dumper() qDebug() << "NAME ACTUAL : " << item.name.toLatin1(); qDebug() << "NAME EXPECTED: " << check.expectedName.name; qDebug() << "CONTENTS : " << contents; - t.verify(false, __LINE__); + ok = false; } if (!check.expectedValue.matches(item.value, context)) { qDebug() << "INAME : " << item.iname; qDebug() << "VALUE ACTUAL : " << item.value << toHex(item.value); qDebug() << "VALUE EXPECTED: " << check.expectedValue.value << toHex(check.expectedValue.value); qDebug() << "CONTENTS : " << contents; - t.verify(false, __LINE__); + ok = false; } if (!check.expectedType.matches(item.type, context)) { qDebug() << "INAME : " << item.iname; qDebug() << "TYPE ACTUAL : " << item.type; qDebug() << "TYPE EXPECTED: " << check.expectedType.type; qDebug() << "CONTENTS : " << contents; - t.verify(false, __LINE__); + ok = false; } } } @@ -675,8 +662,10 @@ void tst_Dumpers::dumper() qDebug() << "SEEN INAMES " << seenINames; qDebug() << "CONTENTS : " << contents; qDebug() << "EXPANDED : " << expanded; - t.verify(false, __LINE__); + ok = false; } + QVERIFY(ok); + t->buildTemp.setAutoRemove(m_keepTemp); } void tst_Dumpers::dumper_data()