From 66e56762e1183fc02323f9e95db20a2e13d2f19e Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Wed, 27 Dec 2017 10:51:39 +0100 Subject: Test for leaks in QMetaObject::invoke with functors Task-number: QTBUG-65462 Change-Id: Ifa9735f5610a6df3ceabd286a0321e87bbd05ca3 Reviewed-by: Thiago Macieira --- .../corelib/kernel/qmetaobject/tst_qmetaobject.cpp | 80 +++++++++++++++------- 1 file changed, 55 insertions(+), 25 deletions(-) (limited to 'tests/auto/corelib/kernel') diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index 35e14b7dbf..431a9ebdea 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -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); } -- cgit v1.2.3