From 15499b1e4f2d31c2707d75800046f7fa12bb5dac Mon Sep 17 00:00:00 2001 From: Michael Meeks Date: Fri, 5 Jun 2015 12:49:05 +0100 Subject: VclPtr - more extensive lifecycle tests. Change-Id: Ifb5355b3a8f33601bcec0c11ce1afe1c735695b6 Reviewed-on: https://gerrit.libreoffice.org/16100 Tested-by: Jenkins Reviewed-by: Michael Meeks Tested-by: Michael Meeks --- vcl/Module_vcl.mk | 2 +- vcl/qa/cppunit/lifecycle.cxx | 102 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) (limited to 'vcl') diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index 8cb05ba73bd8..aa26183c774e 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -99,11 +99,11 @@ $(eval $(call gb_Module_add_targets,vcl,\ endif $(eval $(call gb_Module_add_check_targets,vcl,\ + CppunitTest_vcl_lifecycle \ CppunitTest_vcl_bitmap_test \ CppunitTest_vcl_fontcharmap \ CppunitTest_vcl_complextext \ CppunitTest_vcl_filters_test \ - CppunitTest_vcl_lifecycle \ CppunitTest_vcl_outdev \ CppunitTest_vcl_app_test \ CppunitTest_vcl_wmf_test \ diff --git a/vcl/qa/cppunit/lifecycle.cxx b/vcl/qa/cppunit/lifecycle.cxx index d3b15d0fb088..afc77b3de78f 100644 --- a/vcl/qa/cppunit/lifecycle.cxx +++ b/vcl/qa/cppunit/lifecycle.cxx @@ -17,6 +17,8 @@ #include #include #include +#include +#include class LifecycleTest : public test::BootstrapFixture { @@ -33,6 +35,7 @@ public: void testChildDispose(); void testPostDispose(); void testFocus(); + void testLeakage(); CPPUNIT_TEST_SUITE(LifecycleTest); CPPUNIT_TEST(testCast); @@ -43,6 +46,7 @@ public: CPPUNIT_TEST(testChildDispose); CPPUNIT_TEST(testPostDispose); CPPUNIT_TEST(testFocus); + CPPUNIT_TEST(testLeakage); CPPUNIT_TEST_SUITE_END(); }; @@ -183,6 +187,104 @@ void LifecycleTest::testFocus() // CPPUNIT_ASSERT(xChild->HasFocus()); } +template +class LeakTestClass : public vcl_type +{ + bool &mrDeleted; +public: + template + LeakTestClass(bool &bDeleted, Arg &&... arg) : + vcl_type(std::forward(arg)...), + mrDeleted(bDeleted) + { + mrDeleted = false; + } + ~LeakTestClass() + { + mrDeleted = true; + } +}; + +class LeakTestObject +{ + bool mbDeleted; + VclPtr mxRef; + void *mpRef; + LeakTestObject() {} +public: + template static LeakTestObject * + Create(Arg &&... arg) + { + LeakTestObject *pNew = new LeakTestObject(); + pNew->mxRef = VclPtr< LeakTestClass< vcl_type > >::Create( pNew->mbDeleted, + std::forward(arg)...); + pNew->mpRef = reinterpret_cast(static_cast(pNew->mxRef)); + return pNew; + } + VclPtr getRef() { return mxRef; } + void disposeAndClear() + { + mxRef.disposeAndClear(); + } + void assertDeleted() + { + if (!mbDeleted) + { + OUStringBuffer aMsg = "Type '"; + vcl::Window *pWin = reinterpret_cast(mpRef); + aMsg.appendAscii(typeid(*pWin).name()); + aMsg.append("' not freed after dispose"); + CPPUNIT_FAIL(OUStringToOString(aMsg.makeStringAndClear(), + RTL_TEXTENCODING_UTF8).getStr()); + } + } +}; + +void LifecycleTest::testLeakage() +{ + std::vector aObjects; + + // Create objects + aObjects.push_back(LeakTestObject::Create(nullptr, WB_APP|WB_STDWORK)); + VclPtr xParent = aObjects.back()->getRef(); + aObjects.push_back(LeakTestObject::Create(xParent)); + aObjects.push_back(LeakTestObject::Create(xParent)); + aObjects.push_back(LeakTestObject::Create(xParent)); + aObjects.push_back(LeakTestObject::Create(xParent)); + aObjects.push_back(LeakTestObject::Create(xParent)); + aObjects.push_back(LeakTestObject::Create(xParent)); + aObjects.push_back(LeakTestObject::Create(xParent)); + aObjects.push_back(LeakTestObject::Create(xParent)); + +#if 0 + { // something that looks like a dialog + aObjects.push_back(LeakTestObject::Create(xParent,WB_CLIPCHILDREN|WB_MOVEABLE|WB_3DLOOK|WB_CLOSEABLE|WB_SIZEABLE)); + VclPtr xDlgParent = aObjects.back()->getRef(); + + aObjects.push_back(LeakTestObject::Create(xDlgParent)); + VclPtr xVBox = aObjects.back()->getRef(); + + aObjects.push_back(LeakTestObject::Create(xVBox)); + } + + aObjects.push_back(LeakTestObject::Create(xParent, "PrintProgressDialog", "vcl/ui/printprogressdialog.ui")); + aObjects.push_back(LeakTestObject::Create(xParent)); +#endif + xParent.clear(); + + for (auto i = aObjects.rbegin(); i != aObjects.rend(); ++i) + (*i)->getRef()->Show(); + + for (auto i = aObjects.rbegin(); i != aObjects.rend(); ++i) + (*i)->disposeAndClear(); + + for (auto i = aObjects.begin(); i != aObjects.end(); ++i) + (*i)->assertDeleted(); + + for (auto i = aObjects.begin(); i != aObjects.end(); ++i) + delete *i; +} + CPPUNIT_TEST_SUITE_REGISTRATION(LifecycleTest); CPPUNIT_PLUGIN_IMPLEMENT(); -- cgit v1.2.3