Partially revert "Inline QTest::qSleep()"

This change partially reverts change
a0e0b51001.

Replacing the QTest specific sleep function with QThread::msleep()
was not a good idea. The reason is that QThread::msleep() will force
the thread to sleep to x mseconds, even if a signal woke the thread
in the meantime.

This would cause qWaitFor() to not call processEvents(), in some cases,
leading to flakyness and test failures in tests that rely on timing,
such as the animation tests in Qt Qml.

Change-Id: I0ad132cdf32be5813b2e73552d772251fe1d7f89
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Lars Knoll 2020-09-12 13:58:03 +02:00
parent a7b85e5993
commit 1abea5f5f1
4 changed files with 32 additions and 20 deletions

View File

@ -45,6 +45,35 @@
QT_BEGIN_NAMESPACE
/*!
Sleeps for \a ms milliseconds, blocking execution of the
test. qSleep() will not do any event processing and leave your test
unresponsive. Network communication might time out while
sleeping. Use \l {QTest::qWait()} to do non-blocking sleeping.
\a ms must be greater than 0.
\b {Note:} The qSleep() function calls either \c nanosleep() on
unix or \c Sleep() on windows, so the accuracy of time spent in
qSleep() depends on the operating system.
Example:
\snippet code/src_qtestlib_qtestcase.cpp 23
\sa {QTest::qWait()}
*/
Q_CORE_EXPORT void QTest::qSleep(int ms)
{
Q_ASSERT(ms > 0);
#if defined(Q_OS_WIN)
Sleep(uint(ms));
#else
struct timespec ts = { time_t(ms / 1000), (ms % 1000) * 1000 * 1000 };
nanosleep(&ts, nullptr);
#endif
}
/*! \fn template <typename Functor> bool QTest::qWaitFor(Functor predicate, int timeout)
Waits for \a timeout milliseconds or until the \a predicate returns true.

View File

@ -48,6 +48,8 @@ QT_BEGIN_NAMESPACE
namespace QTest {
Q_CORE_EXPORT void qSleep(int ms);
template <typename Functor>
Q_REQUIRED_RESULT static bool qWaitFor(Functor predicate, int timeout = 5000)
{
@ -75,7 +77,7 @@ Q_REQUIRED_RESULT static bool qWaitFor(Functor predicate, int timeout = 5000)
remaining = int(deadline.remainingTime());
if (remaining > 0)
QThread::msleep(qMin(10, remaining));
qSleep(qMin(10, remaining));
if (predicate())
return true;

View File

@ -2474,24 +2474,6 @@ bool QTest::currentTestFailed()
return QTestResult::currentTestFailed();
}
/*!
Sleeps for \a ms milliseconds, blocking execution of the
test. qSleep() will not do any event processing and leave your test
unresponsive. Network communication might time out while
sleeping. Use \l {QTest::qWait()} to do non-blocking sleeping.
\a ms must be greater than 0.
\b {Note:} The qSleep() function calls either \c nanosleep() on
unix or \c Sleep() on windows, so the accuracy of time spent in
qSleep() depends on the operating system.
Example:
\snippet code/src_qtestlib_qtestcase.cpp 23
\sa {QTest::qWait()}
*/
/*! \internal
*/
QObject *QTest::testObject()

View File

@ -336,7 +336,6 @@ namespace QTest
char *val1, char *val2,
const char *actual, const char *expected,
const char *file, int line);
inline void qSleep(int ms) { QThread::msleep(ms); }
Q_TESTLIB_EXPORT void addColumnInternal(int id, const char *name);
template <typename T>