Fix QThreadstorage test.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Mon, 27 Feb 2012 10:09:27 +0000 (11:09 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 27 Feb 2012 17:33:50 +0000 (18:33 +0100)
- Create subdirectories containing profiles to avoid
  problems with -fast.
- Use QFINDTESTDATA to locate binary.
- Make it a console application, no Mac-bundle.
- Add error messages to the test, give it a longer time-out
  and ensure sub-process is killed if it hangs.

Change-Id: Ibc177b786c4bc8fdbc068a8c45f4801a41c9f660
Reviewed-by: Sergio Ahumada <sergio.ahumada@nokia.com>
tests/auto/corelib/thread/qthreadstorage/crashOnExit.pro [deleted file]
tests/auto/corelib/thread/qthreadstorage/crashonexit/crashOnExit.cpp [moved from tests/auto/corelib/thread/qthreadstorage/crashOnExit.cpp with 100% similarity]
tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro [new file with mode: 0644]
tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro
tests/auto/corelib/thread/qthreadstorage/test/test.pro [new file with mode: 0644]
tests/auto/corelib/thread/qthreadstorage/tst_qthreadstorage.cpp
tests/auto/corelib/thread/qthreadstorage/tst_qthreadstorage.pro [deleted file]

diff --git a/tests/auto/corelib/thread/qthreadstorage/crashOnExit.pro b/tests/auto/corelib/thread/qthreadstorage/crashOnExit.pro
deleted file mode 100644 (file)
index 68d0f12..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-SOURCES += crashOnExit.cpp
-QT = core
-CONFIG-=app_bundle
-CONFIG+=console
-
-# This app is testdata for tst_qthreadstorage
-target.path = $$[QT_INSTALL_TESTS]/tst_qthreadstorage
-INSTALLS += target
diff --git a/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro b/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro
new file mode 100644 (file)
index 0000000..94a0a01
--- /dev/null
@@ -0,0 +1,9 @@
+SOURCES += crashOnExit.cpp
+DESTDIR = ./
+QT = core
+CONFIG -= app_bundle
+CONFIG += console
+
+# This app is testdata for tst_qthreadstorage
+target.path = $$[QT_INSTALL_TESTS]/tst_qthreadstorage/$$TARGET
+INSTALLS += target
index 0dc8d08..2fa973d 100644 (file)
@@ -1,5 +1,5 @@
 TEMPLATE = subdirs
 SUBDIRS = \
-    tst_qthreadstorage.pro \
-    crashOnExit.pro
-CONFIG += parallel_test
+    crashonexit \
+    test
+CONFIG += ordered parallel_test
diff --git a/tests/auto/corelib/thread/qthreadstorage/test/test.pro b/tests/auto/corelib/thread/qthreadstorage/test/test.pro
new file mode 100644 (file)
index 0000000..a7d8eb0
--- /dev/null
@@ -0,0 +1,6 @@
+CONFIG += testcase
+TARGET = ../tst_qthreadstorage
+CONFIG -= app_bundle
+CONFIG += console
+QT = core testlib
+SOURCES = ../tst_qthreadstorage.cpp
index fff361e..0529e67 100644 (file)
@@ -46,6 +46,8 @@
 #include <qthread.h>
 #include <qwaitcondition.h>
 #include <qthreadstorage.h>
+#include <qdir.h>
+#include <qfileinfo.h>
 
 #ifdef Q_OS_UNIX
 #include <pthread.h>
@@ -61,6 +63,7 @@ class tst_QThreadStorage : public QObject
 {
     Q_OBJECT
 private slots:
+    void initTestCase();
     void hasLocalData();
     void localData();
     void localData_const();
@@ -72,6 +75,9 @@ private slots:
     void leakInDestructor();
     void resetInDestructor();
     void valueBased();
+
+private:
+    QString m_crashOnExit;
 };
 
 class Pointer
@@ -83,6 +89,20 @@ public:
 };
 int Pointer::count = 0;
 
+void tst_QThreadStorage::initTestCase()
+{
+    const QString crashOnExitDir = QFINDTESTDATA("crashonexit");
+    QVERIFY2(!crashOnExitDir.isEmpty(),
+             qPrintable(QString::fromLatin1("Could not find 'crashonexit' starting from '%1'")
+                        .arg(QDir::toNativeSeparators(QDir::currentPath()))));
+    m_crashOnExit = crashOnExitDir + QStringLiteral("/crashonexit");
+#ifdef Q_OS_WIN
+    m_crashOnExit += QStringLiteral(".exe");
+#endif
+    QVERIFY2(QFileInfo(m_crashOnExit).isExecutable(),
+             qPrintable(QDir::toNativeSeparators(m_crashOnExit) + QStringLiteral(" does not exist or is not executable.")));
+}
+
 void tst_QThreadStorage::hasLocalData()
 {
     QThreadStorage<Pointer *> pointers;
@@ -285,18 +305,32 @@ void tst_QThreadStorage::ensureCleanupOrder()
     QVERIFY(First::order < Second::order);
 }
 
-void tst_QThreadStorage::crashOnExit()
+static inline bool runCrashOnExit(const QString &binary, QString *errorMessage)
 {
+    const int timeout = 60000;
     QProcess process;
-    // crashOnExit is always expected to be in the same directory
-    // as this test binary
-#ifdef Q_OS_MAC
-    process.start(QCoreApplication::applicationDirPath() + "/../../../crashOnExit");
-#else
-    process.start(QCoreApplication::applicationDirPath() + "/crashOnExit");
-#endif
-    QVERIFY(process.waitForFinished());
-    QVERIFY(process.exitStatus() != QProcess::CrashExit);
+    process.start(binary);
+    if (!process.waitForStarted()) {
+        *errorMessage = QString::fromLatin1("Could not start '%1': %2").arg(binary, process.errorString());
+        return false;
+    }
+    if (!process.waitForFinished(timeout)) {
+        process.kill();
+        *errorMessage = QString::fromLatin1("Timeout (%1ms) waiting for %2.").arg(timeout).arg(binary);
+        return false;
+    }
+    if (process.exitStatus() != QProcess::NormalExit) {
+        *errorMessage = binary + QStringLiteral(" crashed.");
+        return false;
+    }
+    return true;
+}
+
+void tst_QThreadStorage::crashOnExit()
+{
+    QString errorMessage;
+    QVERIFY2(runCrashOnExit(m_crashOnExit, &errorMessage),
+             qPrintable(errorMessage));
 }
 
 // S stands for thread Safe.
diff --git a/tests/auto/corelib/thread/qthreadstorage/tst_qthreadstorage.pro b/tests/auto/corelib/thread/qthreadstorage/tst_qthreadstorage.pro
deleted file mode 100644 (file)
index 15ced10..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-CONFIG += testcase
-TARGET = tst_qthreadstorage
-QT = core testlib
-SOURCES = tst_qthreadstorage.cpp