From 79c99466aa9a893036d6d4290a81cdbe658bc286 Mon Sep 17 00:00:00 2001 From: Jo Asplin Date: Thu, 3 Nov 2011 14:11:36 +0100 Subject: Moved qobjectrace into integrationtests/ The qobjectrace test seems to belong to integrationtests/ since it tests the interaction between QObject and QThread (much in the same way integrationtests/qsharedpointer_and_qwidget/ tests the interaction between QSharedPointer and QWidget). Change-Id: I89f1dab7300c2ef23755d52a86479677ef021ef1 Reviewed-by: Jason McDonald --- tests/auto/corelib.pro | 1 - tests/auto/integrationtests/integrationtests.pro | 1 + tests/auto/integrationtests/qobjectrace/.gitignore | 1 + .../integrationtests/qobjectrace/qobjectrace.pro | 6 + .../qobjectrace/tst_qobjectrace.cpp | 262 +++++++++++++++++++++ tests/auto/qobjectrace/.gitignore | 1 - tests/auto/qobjectrace/qobjectrace.pro | 6 - tests/auto/qobjectrace/tst_qobjectrace.cpp | 262 --------------------- 8 files changed, 270 insertions(+), 270 deletions(-) create mode 100644 tests/auto/integrationtests/qobjectrace/.gitignore create mode 100644 tests/auto/integrationtests/qobjectrace/qobjectrace.pro create mode 100644 tests/auto/integrationtests/qobjectrace/tst_qobjectrace.cpp delete mode 100644 tests/auto/qobjectrace/.gitignore delete mode 100644 tests/auto/qobjectrace/qobjectrace.pro delete mode 100644 tests/auto/qobjectrace/tst_qobjectrace.cpp (limited to 'tests/auto') diff --git a/tests/auto/corelib.pro b/tests/auto/corelib.pro index ebdc1cd8c5..007779a70b 100644 --- a/tests/auto/corelib.pro +++ b/tests/auto/corelib.pro @@ -1,5 +1,4 @@ TEMPLATE=subdirs SUBDIRS=\ corelib \ - qobjectrace \ utf8 diff --git a/tests/auto/integrationtests/integrationtests.pro b/tests/auto/integrationtests/integrationtests.pro index 33d54e22e9..053f007b10 100644 --- a/tests/auto/integrationtests/integrationtests.pro +++ b/tests/auto/integrationtests/integrationtests.pro @@ -17,6 +17,7 @@ SUBDIRS=\ qfocusevent \ qmultiscreen \ qnetworkaccessmanager_and_qprogressdialog \ + qobjectrace \ qsharedpointer_and_qwidget \ windowsmobile \ diff --git a/tests/auto/integrationtests/qobjectrace/.gitignore b/tests/auto/integrationtests/qobjectrace/.gitignore new file mode 100644 index 0000000000..9d3f96e0a0 --- /dev/null +++ b/tests/auto/integrationtests/qobjectrace/.gitignore @@ -0,0 +1 @@ +tst_qobjectrace diff --git a/tests/auto/integrationtests/qobjectrace/qobjectrace.pro b/tests/auto/integrationtests/qobjectrace/qobjectrace.pro new file mode 100644 index 0000000000..9a0d8e58c4 --- /dev/null +++ b/tests/auto/integrationtests/qobjectrace/qobjectrace.pro @@ -0,0 +1,6 @@ +CONFIG += testcase +SOURCES += tst_qobjectrace.cpp +QT = core testlib + +TARGET.EPOCHEAPSIZE = 20000000 40000000 +CONFIG += parallel_test diff --git a/tests/auto/integrationtests/qobjectrace/tst_qobjectrace.cpp b/tests/auto/integrationtests/qobjectrace/tst_qobjectrace.cpp new file mode 100644 index 0000000000..8cb7845e78 --- /dev/null +++ b/tests/auto/integrationtests/qobjectrace/tst_qobjectrace.cpp @@ -0,0 +1,262 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include +#include + + +enum { OneMinute = 60 * 1000, + TwoMinutes = OneMinute * 2 }; + +class tst_QObjectRace: public QObject +{ + Q_OBJECT +private slots: + void moveToThreadRace(); + void destroyRace(); +}; + +class RaceObject : public QObject +{ + Q_OBJECT + QList threads; + int count; + +public: + RaceObject() + : count(0) + { } + + void addThread(QThread *thread) + { threads.append(thread); } + +public slots: + void theSlot() + { + enum { step = 35 }; + if ((++count % step) == 0) { + QThread *nextThread = threads.at((count / step) % threads.size()); + moveToThread(nextThread); + } + } + + void destroSlot() { + emit theSignal(); + } +signals: + void theSignal(); +}; + +class RaceThread : public QThread +{ + Q_OBJECT + RaceObject *object; + QTime stopWatch; + +public: + RaceThread() + : object(0) + { } + + void setObject(RaceObject *o) + { + object = o; + object->addThread(this); + } + + void start() { + stopWatch.start(); + QThread::start(); + } + + void run() { + QTimer zeroTimer; + connect(&zeroTimer, SIGNAL(timeout()), object, SLOT(theSlot())); + connect(&zeroTimer, SIGNAL(timeout()), this, SLOT(checkStopWatch()), Qt::DirectConnection); + zeroTimer.start(0); + (void) exec(); + } + +signals: + void theSignal(); + +private slots: + void checkStopWatch() + { +#if defined(Q_OS_WINCE) || defined(Q_OS_VXWORKS) + if (stopWatch.elapsed() >= OneMinute / 2) +#else + if (stopWatch.elapsed() >= OneMinute) +#endif + quit(); + + QObject o; + connect(&o, SIGNAL(destroyed()) , object, SLOT(destroSlot())); + connect(object, SIGNAL(destroyed()) , &o, SLOT(deleteLater())); + } +}; + +void tst_QObjectRace::moveToThreadRace() +{ + RaceObject *object = new RaceObject; + + enum { ThreadCount = 6 }; + RaceThread *threads[ThreadCount]; + for (int i = 0; i < ThreadCount; ++i) { + threads[i] = new RaceThread; + threads[i]->setObject(object); + } + + object->moveToThread(threads[0]); + + for (int i = 0; i < ThreadCount; ++i) + threads[i]->start(); + + while(!threads[0]->isFinished()) { + QPointer foo (object); + QObject o; + connect(&o, SIGNAL(destroyed()) , object, SLOT(destroSlot())); + connect(object, SIGNAL(destroyed()) , &o, SLOT(deleteLater())); + QTest::qWait(10); + } + // the other threads should finish pretty quickly now + for (int i = 1; i < ThreadCount; ++i) + QVERIFY(threads[i]->wait(300)); + + for (int i = 0; i < ThreadCount; ++i) + delete threads[i]; + delete object; +} + + +class MyObject : public QObject +{ Q_OBJECT + public slots: + void slot1() { emit signal1(); } + void slot2() { emit signal2(); } + void slot3() { emit signal3(); } + void slot4() { emit signal4(); } + void slot5() { emit signal5(); } + void slot6() { emit signal6(); } + void slot7() { emit signal7(); } + signals: + void signal1(); + void signal2(); + void signal3(); + void signal4(); + void signal5(); + void signal6(); + void signal7(); +}; + + + +class DestroyThread : public QThread +{ + Q_OBJECT + QObject **objects; + int number; + +public: + void setObjects(QObject **o, int n) + { + objects = o; + number = n; + for(int i = 0; i < number; i++) + objects[i]->moveToThread(this); + } + + void run() { + for(int i = 0; i < number; i++) + delete objects[i]; + } +}; + +#define EXTRA_THREAD_WAIT 3000 +#define MAIN_THREAD_WAIT TwoMinutes + +void tst_QObjectRace::destroyRace() +{ + enum { ThreadCount = 10, ObjectCountPerThread = 733, + ObjectCount = ThreadCount * ObjectCountPerThread }; + + const char *_slots[] = { SLOT(slot1()) , SLOT(slot2()) , SLOT(slot3()), + SLOT(slot4()) , SLOT(slot5()) , SLOT(slot6()), + SLOT(slot7()) }; + + const char *_signals[] = { SIGNAL(signal1()), SIGNAL(signal2()), SIGNAL(signal3()), + SIGNAL(signal4()), SIGNAL(signal5()), SIGNAL(signal6()), + SIGNAL(signal7()) }; + + QObject *objects[ObjectCount]; + for (int i = 0; i < ObjectCount; ++i) + objects[i] = new MyObject; + + + for (int i = 0; i < ObjectCount * 11; ++i) { + connect(objects[(i*13) % ObjectCount], _signals[(2*i)%7], + objects[((i+2)*17) % ObjectCount], _slots[(3*i+2)%7] ); + connect(objects[((i+6)*23) % ObjectCount], _signals[(5*i+4)%7], + objects[((i+8)*41) % ObjectCount], _slots[(i+6)%7] ); + } + + DestroyThread *threads[ThreadCount]; + for (int i = 0; i < ThreadCount; ++i) { + threads[i] = new DestroyThread; + threads[i]->setObjects(objects + i*ObjectCountPerThread, ObjectCountPerThread); + } + + for (int i = 0; i < ThreadCount; ++i) + threads[i]->start(); + + QVERIFY(threads[0]->wait(MAIN_THREAD_WAIT)); + // the other threads should finish pretty quickly now + for (int i = 1; i < ThreadCount; ++i) + QVERIFY(threads[i]->wait(EXTRA_THREAD_WAIT)); + + for (int i = 0; i < ThreadCount; ++i) + delete threads[i]; +} + + +QTEST_MAIN(tst_QObjectRace) +#include "tst_qobjectrace.moc" diff --git a/tests/auto/qobjectrace/.gitignore b/tests/auto/qobjectrace/.gitignore deleted file mode 100644 index 9d3f96e0a0..0000000000 --- a/tests/auto/qobjectrace/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tst_qobjectrace diff --git a/tests/auto/qobjectrace/qobjectrace.pro b/tests/auto/qobjectrace/qobjectrace.pro deleted file mode 100644 index 9a0d8e58c4..0000000000 --- a/tests/auto/qobjectrace/qobjectrace.pro +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG += testcase -SOURCES += tst_qobjectrace.cpp -QT = core testlib - -TARGET.EPOCHEAPSIZE = 20000000 40000000 -CONFIG += parallel_test diff --git a/tests/auto/qobjectrace/tst_qobjectrace.cpp b/tests/auto/qobjectrace/tst_qobjectrace.cpp deleted file mode 100644 index 8cb7845e78..0000000000 --- a/tests/auto/qobjectrace/tst_qobjectrace.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include -#include - - -enum { OneMinute = 60 * 1000, - TwoMinutes = OneMinute * 2 }; - -class tst_QObjectRace: public QObject -{ - Q_OBJECT -private slots: - void moveToThreadRace(); - void destroyRace(); -}; - -class RaceObject : public QObject -{ - Q_OBJECT - QList threads; - int count; - -public: - RaceObject() - : count(0) - { } - - void addThread(QThread *thread) - { threads.append(thread); } - -public slots: - void theSlot() - { - enum { step = 35 }; - if ((++count % step) == 0) { - QThread *nextThread = threads.at((count / step) % threads.size()); - moveToThread(nextThread); - } - } - - void destroSlot() { - emit theSignal(); - } -signals: - void theSignal(); -}; - -class RaceThread : public QThread -{ - Q_OBJECT - RaceObject *object; - QTime stopWatch; - -public: - RaceThread() - : object(0) - { } - - void setObject(RaceObject *o) - { - object = o; - object->addThread(this); - } - - void start() { - stopWatch.start(); - QThread::start(); - } - - void run() { - QTimer zeroTimer; - connect(&zeroTimer, SIGNAL(timeout()), object, SLOT(theSlot())); - connect(&zeroTimer, SIGNAL(timeout()), this, SLOT(checkStopWatch()), Qt::DirectConnection); - zeroTimer.start(0); - (void) exec(); - } - -signals: - void theSignal(); - -private slots: - void checkStopWatch() - { -#if defined(Q_OS_WINCE) || defined(Q_OS_VXWORKS) - if (stopWatch.elapsed() >= OneMinute / 2) -#else - if (stopWatch.elapsed() >= OneMinute) -#endif - quit(); - - QObject o; - connect(&o, SIGNAL(destroyed()) , object, SLOT(destroSlot())); - connect(object, SIGNAL(destroyed()) , &o, SLOT(deleteLater())); - } -}; - -void tst_QObjectRace::moveToThreadRace() -{ - RaceObject *object = new RaceObject; - - enum { ThreadCount = 6 }; - RaceThread *threads[ThreadCount]; - for (int i = 0; i < ThreadCount; ++i) { - threads[i] = new RaceThread; - threads[i]->setObject(object); - } - - object->moveToThread(threads[0]); - - for (int i = 0; i < ThreadCount; ++i) - threads[i]->start(); - - while(!threads[0]->isFinished()) { - QPointer foo (object); - QObject o; - connect(&o, SIGNAL(destroyed()) , object, SLOT(destroSlot())); - connect(object, SIGNAL(destroyed()) , &o, SLOT(deleteLater())); - QTest::qWait(10); - } - // the other threads should finish pretty quickly now - for (int i = 1; i < ThreadCount; ++i) - QVERIFY(threads[i]->wait(300)); - - for (int i = 0; i < ThreadCount; ++i) - delete threads[i]; - delete object; -} - - -class MyObject : public QObject -{ Q_OBJECT - public slots: - void slot1() { emit signal1(); } - void slot2() { emit signal2(); } - void slot3() { emit signal3(); } - void slot4() { emit signal4(); } - void slot5() { emit signal5(); } - void slot6() { emit signal6(); } - void slot7() { emit signal7(); } - signals: - void signal1(); - void signal2(); - void signal3(); - void signal4(); - void signal5(); - void signal6(); - void signal7(); -}; - - - -class DestroyThread : public QThread -{ - Q_OBJECT - QObject **objects; - int number; - -public: - void setObjects(QObject **o, int n) - { - objects = o; - number = n; - for(int i = 0; i < number; i++) - objects[i]->moveToThread(this); - } - - void run() { - for(int i = 0; i < number; i++) - delete objects[i]; - } -}; - -#define EXTRA_THREAD_WAIT 3000 -#define MAIN_THREAD_WAIT TwoMinutes - -void tst_QObjectRace::destroyRace() -{ - enum { ThreadCount = 10, ObjectCountPerThread = 733, - ObjectCount = ThreadCount * ObjectCountPerThread }; - - const char *_slots[] = { SLOT(slot1()) , SLOT(slot2()) , SLOT(slot3()), - SLOT(slot4()) , SLOT(slot5()) , SLOT(slot6()), - SLOT(slot7()) }; - - const char *_signals[] = { SIGNAL(signal1()), SIGNAL(signal2()), SIGNAL(signal3()), - SIGNAL(signal4()), SIGNAL(signal5()), SIGNAL(signal6()), - SIGNAL(signal7()) }; - - QObject *objects[ObjectCount]; - for (int i = 0; i < ObjectCount; ++i) - objects[i] = new MyObject; - - - for (int i = 0; i < ObjectCount * 11; ++i) { - connect(objects[(i*13) % ObjectCount], _signals[(2*i)%7], - objects[((i+2)*17) % ObjectCount], _slots[(3*i+2)%7] ); - connect(objects[((i+6)*23) % ObjectCount], _signals[(5*i+4)%7], - objects[((i+8)*41) % ObjectCount], _slots[(i+6)%7] ); - } - - DestroyThread *threads[ThreadCount]; - for (int i = 0; i < ThreadCount; ++i) { - threads[i] = new DestroyThread; - threads[i]->setObjects(objects + i*ObjectCountPerThread, ObjectCountPerThread); - } - - for (int i = 0; i < ThreadCount; ++i) - threads[i]->start(); - - QVERIFY(threads[0]->wait(MAIN_THREAD_WAIT)); - // the other threads should finish pretty quickly now - for (int i = 1; i < ThreadCount; ++i) - QVERIFY(threads[i]->wait(EXTRA_THREAD_WAIT)); - - for (int i = 0; i < ThreadCount; ++i) - delete threads[i]; -} - - -QTEST_MAIN(tst_QObjectRace) -#include "tst_qobjectrace.moc" -- cgit v1.2.3