Fix QThreadstorage test.

- 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>
This commit is contained in:
Friedemann Kleint 2012-02-27 11:09:27 +01:00 committed by Qt by Nokia
parent 5a0eb4e768
commit ed8d8451c4
7 changed files with 62 additions and 25 deletions

View File

@ -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

View File

@ -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

View File

@ -1,5 +1,5 @@
TEMPLATE = subdirs
SUBDIRS = \
tst_qthreadstorage.pro \
crashOnExit.pro
CONFIG += parallel_test
crashonexit \
test
CONFIG += ordered parallel_test

View File

@ -0,0 +1,6 @@
CONFIG += testcase
TARGET = ../tst_qthreadstorage
CONFIG -= app_bundle
CONFIG += console
QT = core testlib
SOURCES = ../tst_qthreadstorage.cpp

View 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);
}
static inline bool runCrashOnExit(const QString &binary, QString *errorMessage)
{
const int timeout = 60000;
QProcess process;
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()
{
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);
QString errorMessage;
QVERIFY2(runCrashOnExit(m_crashOnExit, &errorMessage),
qPrintable(errorMessage));
}
// S stands for thread Safe.

View File

@ -1,4 +0,0 @@
CONFIG += testcase
TARGET = tst_qthreadstorage
QT = core testlib
SOURCES = tst_qthreadstorage.cpp