Test for leaks in QMetaObject::invoke with functors

Task-number: QTBUG-65462
Change-Id: Ifa9735f5610a6df3ceabd286a0321e87bbd05ca3
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Olivier Goffart 2017-12-27 10:51:39 +01:00 committed by Olivier Goffart (Woboq GmbH)
parent 57318ce8c2
commit 66e56762e1

View File

@ -779,13 +779,22 @@ void tst_QMetaObject::invokePointer()
QCOMPARE(QtTestObject::staticResult, QString("staticFunction1"));
// Test lambdas
QVERIFY(QMetaObject::invokeMethod(&obj, [&](){obj.sl1(t1);}));
QCOMPARE(obj.slotResult, QString("sl1:1"));
QString exp;
QVERIFY(QMetaObject::invokeMethod(&obj, [&]()->QString{return obj.sl1("bubu");}, &exp));
QCOMPARE(exp, QString("yessir"));
QCOMPARE(obj.slotResult, QString("sl1:bubu"));
QCOMPARE(countedStructObjectsCount, 0);
{
CountedStruct str;
QVERIFY(QMetaObject::invokeMethod(&obj, [str, &t1, &obj]() { obj.sl1(t1); }));
QCOMPARE(obj.slotResult, QString("sl1:1"));
}
QCOMPARE(countedStructObjectsCount, 0);
{
CountedStruct str;
QString exp;
QVERIFY(QMetaObject::invokeMethod(
&obj, [str, &obj]() -> QString { return obj.sl1("bubu"); }, &exp));
QCOMPARE(exp, QString("yessir"));
QCOMPARE(obj.slotResult, QString("sl1:bubu"));
}
QCOMPARE(countedStructObjectsCount, 0);
}
void tst_QMetaObject::invokeQueuedMetaMember()
@ -873,16 +882,28 @@ void tst_QMetaObject::invokeQueuedPointer()
QCOMPARE(QtTestObject::staticResult, QString("staticFunction0"));
// Test lambda
obj.slotResult.clear();
QVERIFY(QMetaObject::invokeMethod(&obj, [&](){obj.sl0();}, Qt::QueuedConnection));
QVERIFY(obj.slotResult.isEmpty());
qApp->processEvents(QEventLoop::AllEvents);
QCOMPARE(obj.slotResult, QString("sl0"));
qint32 var = 0;
QTest::ignoreMessage(QtWarningMsg, "QMetaObject::invokeMethod: Unable to invoke methods with return values in queued connections");
QVERIFY(!QMetaObject::invokeMethod(&obj, []()->qint32{return 1;}, Qt::QueuedConnection, &var));
QCOMPARE(var, 0);
QCOMPARE(countedStructObjectsCount, 0);
{
CountedStruct str;
obj.slotResult.clear();
QVERIFY(
QMetaObject::invokeMethod(&obj, [str, &obj]() { obj.sl0(); }, Qt::QueuedConnection));
QVERIFY(obj.slotResult.isEmpty());
qApp->processEvents(QEventLoop::AllEvents);
QCOMPARE(obj.slotResult, QString("sl0"));
}
QCOMPARE(countedStructObjectsCount, 0);
{
CountedStruct str;
qint32 var = 0;
QTest::ignoreMessage(QtWarningMsg,
"QMetaObject::invokeMethod: Unable to invoke methods with return "
"values in queued connections");
QVERIFY(!QMetaObject::invokeMethod(&obj, [str]() -> qint32 { return 1; },
Qt::QueuedConnection, &var));
QCOMPARE(var, 0);
}
QCOMPARE(countedStructObjectsCount, 0);
}
@ -1063,17 +1084,26 @@ void tst_QMetaObject::invokeBlockingQueuedPointer()
QCOMPARE(QtTestObject::staticResult, QString("staticFunction1"));
// Test lambdas
QVERIFY(QMetaObject::invokeMethod(&obj, [&](){obj.sl1(t1);}, Qt::BlockingQueuedConnection));
QCOMPARE(obj.slotResult, QString("sl1:1"));
QString exp;
QVERIFY(QMetaObject::invokeMethod(&obj, [&]()->QString{return obj.sl1("bubu");}, Qt::BlockingQueuedConnection, &exp));
QCOMPARE(exp, QString("yessir"));
QCOMPARE(obj.slotResult, QString("sl1:bubu"));
QCOMPARE(countedStructObjectsCount, 0);
{
CountedStruct str;
QVERIFY(QMetaObject::invokeMethod(&obj, [str, &obj, &t1]() { obj.sl1(t1); },
Qt::BlockingQueuedConnection));
QCOMPARE(obj.slotResult, QString("sl1:1"));
}
{
CountedStruct str;
QString exp;
QVERIFY(QMetaObject::invokeMethod(&obj,
[&obj, str]() -> QString { return obj.sl1("bubu"); },
Qt::BlockingQueuedConnection, &exp));
QCOMPARE(exp, QString("yessir"));
QCOMPARE(obj.slotResult, QString("sl1:bubu"));
}
QVERIFY(QMetaObject::invokeMethod(&obj, [&](){obj.moveToThread(QThread::currentThread());}, Qt::BlockingQueuedConnection));
t.quit();
QVERIFY(t.wait());
QCOMPARE(countedStructObjectsCount, 0);
}