Extend QTRY_COMPARE and QTRY_VERIFY macros

We need to fix CI, one of the most common complains is that CI machines
are overloaded and some tests simply timeouts. This patch extends QTRY*
macros to gather statistics. Each time a QTRY* macro is used it is
waiting for the expression to be true by certain time (by default 5 sec)
Next, if it failed, it waits twice as much to prove that the expression
is not affected by CI machine slowness, then fails anyway.

Before the next major release, we should decide if this functionality
should be included, as it changes behavior slightly.
The following task should be kept open until the decision has been
made:

Task-number: QTBUG-36036

Change-Id: I7ab5070cb7eb7d96a7289dd7b2bebf91d93090e5
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
This commit is contained in:
Jędrzej Nowacki 2013-10-16 10:49:42 +00:00 committed by The Qt Project
parent 019588f307
commit 43f9bb9a80

View File

@ -129,34 +129,44 @@ do {\
#endif // !QT_NO_EXCEPTIONS
// Will try to wait for the expression to become true while allowing event processing
#define QTRY_VERIFY_WITH_TIMEOUT(__expr, __timeout) \
do { \
const int __step = 50; \
const int __timeoutValue = __timeout; \
#define QTRY_LOOP_IMPL(__expr, __timeoutValue, __step) \
if (!(__expr)) { \
QTest::qWait(0); \
} \
for (int __i = 0; __i < __timeoutValue && !(__expr); __i+=__step) { \
int __i = 0; \
for (; __i < __timeoutValue && !(__expr); __i += __step) { \
QTest::qWait(__step); \
} \
}
#define QTRY_TIMEOUT_DEBUG_IMPL(__expr, __timeoutValue, __step)\
if (!(__expr)) { \
QTRY_LOOP_IMPL(__expr, (2 * __timeoutValue), __step);\
if (__expr) { \
QString msg = QString::fromUtf8("QTestLib: This test case check (\"%1\") failed because the requested timeout (%2 ms) was too short, %3 ms would have been sufficient this time."); \
msg = msg.arg(QString::fromUtf8(#__expr)).arg(__timeoutValue).arg(__timeoutValue + __i); \
QFAIL(qPrintable(msg)); \
} \
}
#define QTRY_IMPL(__expr, __timeout)\
const int __step = 50; \
const int __timeoutValue = __timeout; \
QTRY_LOOP_IMPL(__expr, __timeoutValue, __step); \
QTRY_TIMEOUT_DEBUG_IMPL(__expr, __timeoutValue, __step)\
// Will try to wait for the expression to become true while allowing event processing
#define QTRY_VERIFY_WITH_TIMEOUT(__expr, __timeout) \
do { \
QTRY_IMPL(__expr, __timeout);\
QVERIFY(__expr); \
} while (0)
#define QTRY_VERIFY(__expr) QTRY_VERIFY_WITH_TIMEOUT(__expr, 5000)
// Will try to wait for the comparison to become successful while allowing event processing
#define QTRY_COMPARE_WITH_TIMEOUT(__expr, __expected, __timeout) \
do { \
const int __step = 50; \
const int __timeoutValue = __timeout; \
if ((__expr) != (__expected)) { \
QTest::qWait(0); \
} \
for (int __i = 0; __i < __timeoutValue && ((__expr) != (__expected)); __i+=__step) { \
QTest::qWait(__step); \
} \
QTRY_IMPL(((__expr) == (__expected)), __timeout);\
QCOMPARE(__expr, __expected); \
} while (0)