From 702068a6ab4a8e5cbd66d6e40b742d1f11c2361c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Aug 2014 09:49:30 +0200 Subject: Autotests: Make "copy and touch" operation atomic. On Windows, QFile::copy does not update the timestamp on the target file. This fixes the "projectInvalidation" API test on that OS. Change-Id: I01c232de0f4e5e9bc5d2d28c24d5fb5516a58ca3 Reviewed-by: Joerg Bornemann --- tests/auto/api/tst_api.cpp | 6 ++---- tests/auto/blackbox/tst_blackbox.cpp | 30 +++++------------------------- tests/auto/blackbox/tst_blackbox.h | 1 - tests/auto/shared.h | 19 +++++++++++++++++++ 4 files changed, 26 insertions(+), 30 deletions(-) (limited to 'tests/auto') diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index fd2968441..ceea0f4c4 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -777,15 +777,13 @@ void TestApi::projectInvalidation() qbs::Project project = setupJob->project(); QVERIFY(project.isValid()); waitForNewTimestamp(); - QVERIFY(QFile::remove("project.qbs")); - QVERIFY(QFile::copy("project.early-error.qbs", "project.qbs")); + copyFileAndUpdateTimestamp("project.early-error.qbs", "project.qbs"); setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY(setupJob->error().hasError()); QVERIFY(project.isValid()); // Error in Loader, old project still valid. waitForNewTimestamp(); - QVERIFY(QFile::remove("project.qbs")); - QVERIFY(QFile::copy("project.late-error.qbs", "project.qbs")); + copyFileAndUpdateTimestamp("project.late-error.qbs", "project.qbs"); setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY(setupJob->error().hasError()); diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index 4dd049c8e..b9cc46c45 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -151,16 +151,6 @@ void TestBlackbox::rmDirR(const QString &dir) removeDirectoryWithContents(dir, &errorMessage); } -void TestBlackbox::touch(const QString &fn) -{ - QFile f(fn); - int s = f.size(); - if (!f.open(QFile::ReadWrite)) - qFatal("cannot open file %s", qPrintable(fn)); - f.resize(s+1); - f.resize(s); -} - QByteArray TestBlackbox::unifiedLineEndings(const QByteArray &ba) { if (HostOsInfo::isWindowsHost()) { @@ -815,9 +805,7 @@ void TestBlackbox::track_qrc() void TestBlackbox::track_qobject_change() { QDir::setCurrent(testDataDir + "/trackQObjChange"); - QFile("bla.h").remove(); - QVERIFY(QFile("bla_qobject.h").copy("bla.h")); - touch("bla.h"); + copyFileAndUpdateTimestamp("bla_qobject.h", "bla.h"); QCOMPARE(runQbs(), 0); const QString productFilePath = executableFilePath("i"); QVERIFY2(regularFileExists(productFilePath), qPrintable(productFilePath)); @@ -826,9 +814,7 @@ void TestBlackbox::track_qobject_change() QVERIFY2(regularFileExists(moc_bla_objectFileName), qPrintable(moc_bla_objectFileName)); QTest::qSleep(1000); - QFile("bla.h").remove(); - QVERIFY(QFile("bla_noqobject.h").copy("bla.h")); - touch("bla.h"); + copyFileAndUpdateTimestamp("bla_noqobject.h", "bla.h"); QCOMPARE(runQbs(), 0); QVERIFY(regularFileExists(productFilePath)); QVERIFY(!QFile(moc_bla_objectFileName).exists()); @@ -1135,9 +1121,7 @@ void TestBlackbox::trackRemoveProduct() waitForNewTimestamp(); QFile::remove("zoo.cpp"); QFile::remove("product3.qbs"); - QFile::remove("trackProducts.qbs"); - QFile::copy("../before/trackProducts.qbs", "trackProducts.qbs"); - touch("trackProducts.qbs"); + copyFileAndUpdateTimestamp("../before/trackProducts.qbs", "trackProducts.qbs"); QCOMPARE(runQbs(params), 0); QVERIFY(!m_qbsStdout.contains("compiling foo.cpp")); QVERIFY(!m_qbsStdout.contains("compiling bar.cpp")); @@ -1580,9 +1564,7 @@ void TestBlackbox::dynamicRuleOutputs() QDateTime appFileTimeStamp1 = QFileInfo(appFile).lastModified(); waitForNewTimestamp(); - QFile::remove("numbers.l"); - QFile::copy("../after/numbers.l", "numbers.l"); - touch("numbers.l"); + copyFileAndUpdateTimestamp("../after/numbers.l", "numbers.l"); QCOMPARE(runQbs(), 0); // Check build #2: no file names are specified in numbers.l @@ -1594,9 +1576,7 @@ void TestBlackbox::dynamicRuleOutputs() QVERIFY(regularFileExists(sourceFile2)); waitForNewTimestamp(); - QFile::remove("numbers.l"); - QFile::copy("../before/numbers.l", "numbers.l"); - touch("numbers.l"); + copyFileAndUpdateTimestamp("../before/numbers.l", "numbers.l"); QCOMPARE(runQbs(), 0); // Check build #3: source and header file name are specified in numbers.l diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index 5e265027c..3b155e1d9 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -88,7 +88,6 @@ public: protected: int runQbs(const QbsRunParameters ¶ms = QbsRunParameters()); void rmDirR(const QString &dir); - void touch(const QString &fn); static QByteArray unifiedLineEndings(const QByteArray &ba); static void sanitizeOutput(QByteArray *ba); diff --git a/tests/auto/shared.h b/tests/auto/shared.h index 2b9974110..e0920363f 100644 --- a/tests/auto/shared.h +++ b/tests/auto/shared.h @@ -31,6 +31,7 @@ #include +#include #include #if QT_VERSION >= 0x050000 @@ -48,4 +49,22 @@ inline void waitForNewTimestamp() QTest::qWait(1000); } +inline void touch(const QString &fn) +{ + QFile f(fn); + int s = f.size(); + if (!f.open(QFile::ReadWrite)) + qFatal("cannot open file %s", qPrintable(fn)); + f.resize(s+1); + f.resize(s); +} + +inline void copyFileAndUpdateTimestamp(const QString &source, const QString &target) +{ + QFile::remove(target); + if (!QFile::copy(source, target)) + qFatal("Failed to copy '%s' to '%s'", qPrintable(source), qPrintable(target)); + touch(target); +} + #endif // Include guard. -- cgit v1.2.3