diff options
Diffstat (limited to 'tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp')
-rw-r--r-- | tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp | 119 |
1 files changed, 104 insertions, 15 deletions
diff --git a/tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp b/tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp index ac7be7acdd..81bc64c8d9 100644 --- a/tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp +++ b/tests/auto/concurrent/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp @@ -65,9 +65,16 @@ public: void tst_QtConcurrentThreadEngine::runDirectly() { - PrintUser *engine = new PrintUser(); - QFuture<void> f = engine->startAsynchronously(); - f.waitForFinished(); + { + PrintUser engine; + engine.startSingleThreaded(); + engine.startBlocking(); + } + { + PrintUser *engine = new PrintUser(); + QFuture<void> f = engine->startAsynchronously(); + f.waitForFinished(); + } } class StringResultUser : public ThreadEngine<QString> @@ -99,10 +106,8 @@ public: void tst_QtConcurrentThreadEngine::result() { - // ThreadEngine will delete 'engine' when it finishes - auto engine = new StringResultUser(); - auto future = engine->startAsynchronously(); - QCOMPARE(future.result(), QString("Foo")); + StringResultUser engine; + QCOMPARE(*engine.startBlocking(), QString("Foo")); } class VoidResultUser : public ThreadEngine<void> @@ -128,9 +133,17 @@ public: void tst_QtConcurrentThreadEngine::runThroughStarter() { - ThreadEngineStarter<QString> starter = startThreadEngine(new StringResultUser()); - QFuture<QString> f = starter.startAsynchronously(); - QCOMPARE(f.result(), QString("Foo")); + { + ThreadEngineStarter<QString> starter = startThreadEngine(new StringResultUser()); + QFuture<QString> f = starter.startAsynchronously(); + QCOMPARE(f.result(), QString("Foo")); + } + + { + ThreadEngineStarter<QString> starter = startThreadEngine(new StringResultUser()); + QString str = starter.startBlocking(); + QCOMPARE(str, QString("Foo")); + } } class CancelUser : public ThreadEngine<void> @@ -213,6 +226,12 @@ void tst_QtConcurrentThreadEngine::throttle() f.waitForFinished(); QCOMPARE(count.loadRelaxed(), 0); } + + for (int i = 0; i < repeats; ++i) { + ThrottleAlwaysUser t; + t.startBlocking(); + QCOMPARE(count.loadRelaxed(), 0); + } } QSet<QThread *> threads; @@ -249,17 +268,35 @@ void tst_QtConcurrentThreadEngine::threadCount() { const int repeats = 10; for (int i = 0; i < repeats; ++i) { + ThreadCountUser t; + t.startBlocking(); + int count = threads.count(); + int count_expected = QThreadPool::globalInstance()->maxThreadCount() + 1; // +1 for the main thread. + if (count != count_expected) + QEXPECT_FAIL("", "QTBUG-23333", Abort); + QCOMPARE(count, count_expected); + (new ThreadCountUser())->startAsynchronously().waitForFinished(); - const auto count = threads.count(); - const auto maxThreadCount = QThreadPool::globalInstance()->maxThreadCount(); - QVERIFY(count <= maxThreadCount); - QVERIFY(!threads.contains(QThread::currentThread())); + count = threads.count(); + count_expected = QThreadPool::globalInstance()->maxThreadCount(); + if (count != count_expected) + QEXPECT_FAIL("", "QTBUG-23333", Abort); + QCOMPARE(count, count_expected); } // Set the finish flag immediately, this should give us one thread only. for (int i = 0; i < repeats; ++i) { + ThreadCountUser t(true /*finishImmediately*/); + t.startBlocking(); + int count = threads.count(); + if (count != 1) + QEXPECT_FAIL("", "QTBUG-23333", Abort); + QCOMPARE(count, 1); + (new ThreadCountUser(true /*finishImmediately*/))->startAsynchronously().waitForFinished(); - const auto count = threads.count(); + count = threads.count(); + if (count != 1) + QEXPECT_FAIL("", "QTBUG-23333", Abort); QCOMPARE(count, 1); QVERIFY(!threads.contains(QThread::currentThread())); } @@ -400,6 +437,7 @@ public: void tst_QtConcurrentThreadEngine::exceptions() { + // Asynchronous mode: { bool caught = false; try { @@ -412,6 +450,32 @@ void tst_QtConcurrentThreadEngine::exceptions() QVERIFY2(caught, "did not get exception"); } + // Blocking mode: + // test throwing the exception from a worker thread. + { + bool caught = false; + try { + QtConcurrentExceptionThrower e(QThread::currentThread()); + e.startBlocking(); + } catch (const QException &) { + caught = true; + } + QVERIFY2(caught, "did not get exception"); + } + + // test throwing the exception from the main thread (different code path) + { + bool caught = false; + try { + QtConcurrentExceptionThrower e(0); + e.startBlocking(); + } catch (const QException &) { + caught = true; + } + QVERIFY2(caught, "did not get exception"); + } + + // Asynchronous mode: { bool caught = false; try { @@ -423,6 +487,31 @@ void tst_QtConcurrentThreadEngine::exceptions() } QVERIFY2(caught, "did not get exception"); } + + // Blocking mode: + // test throwing the exception from a worker thread. + { + bool caught = false; + try { + UnrelatedExceptionThrower e(QThread::currentThread()); + e.startBlocking(); + } catch (const QUnhandledException &) { + caught = true; + } + QVERIFY2(caught, "did not get exception"); + } + + // test throwing the exception from the main thread (different code path) + { + bool caught = false; + try { + UnrelatedExceptionThrower e(0); + e.startBlocking(); + } catch (const QUnhandledException &) { + caught = true; + } + QVERIFY2(caught, "did not get exception"); + } } #endif |