sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Overview: sl@0: // Test methods of the LManagedX and LCleanedupX classes. sl@0: // sl@0: // sl@0: // sl@0: sl@0: #include "emanaged.h" sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: sl@0: extern RTest test; sl@0: sl@0: template sl@0: class CTracker : public CBase sl@0: { sl@0: public: sl@0: enum TConstructionMode { ENonleavingConstructor, EConstructorLeaves}; sl@0: sl@0: static CTracker* NewL() sl@0: { sl@0: CTracker* ptr = new(ELeave) CTracker; sl@0: ptr->ConstructL(); sl@0: return ptr; sl@0: } sl@0: CTracker():iData(NULL) sl@0: { sl@0: test.Printf(_L(" CTracker - %x\n"), this); sl@0: } sl@0: sl@0: void ConstructL() sl@0: { sl@0: test.Printf(_L(" CTracker::ConstructL - %x\n"), this); sl@0: iData = new(ELeave) TInt(Value); sl@0: } sl@0: public: sl@0: virtual ~CTracker() sl@0: { sl@0: test.Printf(_L(" ~CTracker - %x\n"), this); sl@0: if(iData) sl@0: { sl@0: delete iData; sl@0: } sl@0: } sl@0: sl@0: virtual void MemFunc() sl@0: { sl@0: test.Printf(_L(" CTracker::MemFunc - %x\n"), this); sl@0: } sl@0: sl@0: static void StaticMemberRef(const CTracker& aTracker) sl@0: { sl@0: test.Printf(_L(" CTracker::StaticMemberRef - %x\n"), &aTracker); sl@0: } sl@0: sl@0: static void StaticMemberPtr(CTracker* aTracker) sl@0: { sl@0: test.Printf(_L(" CTracker::StaticMemberPtr - %x\n"), aTracker); sl@0: } sl@0: sl@0: private: sl@0: TInt* iData; sl@0: }; sl@0: sl@0: namespace Log sl@0: { sl@0: sl@0: class RLoggerNew sl@0: { sl@0: public: sl@0: RLoggerNew() sl@0: : iData(NULL) sl@0: { sl@0: test.Printf(_L(" RLoggerNew - %x\n"), this); sl@0: } sl@0: sl@0: RLoggerNew(TInt* aData) sl@0: : iData(aData) sl@0: { sl@0: test.Printf(_L(" RLoggerNew - %x ptr %x -> val %d\n"), this, aData, *iData); sl@0: } sl@0: sl@0: RLoggerNew(TInt aValue) sl@0: : iData(new(ELeave) TInt(aValue)) sl@0: { sl@0: test.Printf(_L(" RLoggerNew - %x value %d\n"), this, *iData); sl@0: } sl@0: sl@0: void OpenL(TInt aValue) sl@0: { sl@0: iData = new(ELeave) TInt(aValue); sl@0: test.Printf(_L(" RLoggerNew::OpenL(TInt aValue) - %x value %d\n"), this, *iData); sl@0: } sl@0: sl@0: RLoggerNew(const RLoggerNew& aLogger) sl@0: : iData(aLogger.iData) sl@0: { sl@0: test.Printf(_L(" RLoggerNew::RLoggerNew(const RLoggerNew&) - %x (copy)\n"), this); sl@0: } sl@0: sl@0: sl@0: RLoggerNew& operator=(const RLoggerNew& aLogger) sl@0: { sl@0: iData = aLogger.iData; sl@0: sl@0: test.Printf(_L(" RLoggerNew::operator=(const RLoggerNew&) - %x copy from %x val %d\n"), this, &aLogger, *aLogger.iData); sl@0: return *this; sl@0: } sl@0: sl@0: sl@0: ~RLoggerNew() sl@0: { sl@0: test.Printf(_L(" ~RLoggerNew - %x\n"), this); sl@0: } sl@0: sl@0: sl@0: void Close() sl@0: { sl@0: test.Printf(_L(" RLoggerNew::Close - %x\n"), this); sl@0: sl@0: // Open or non-NULL initializing constructor not called or sl@0: // cleanup function already called sl@0: sl@0: __ASSERT_ALWAYS(iData != NULL, test.Panic(_L("NULL pointer"))); sl@0: delete iData; sl@0: iData = NULL; sl@0: } sl@0: sl@0: sl@0: void Release() sl@0: { sl@0: test.Printf(_L(" RLoggerNew::Release - %x\n"), this); sl@0: sl@0: // Open or non-NULL initializing constructor not called or sl@0: // cleanup function already called sl@0: sl@0: __ASSERT_ALWAYS(iData != NULL, test.Panic(_L("NULL pointer"))); sl@0: delete iData; sl@0: iData = NULL; sl@0: } sl@0: sl@0: sl@0: void Destroy() sl@0: { sl@0: test.Printf(_L(" RLoggerNew::Destroy - %x\n"), this); sl@0: sl@0: // Open or non-NULL initializing constructor not called or sl@0: // cleanup function already called sl@0: sl@0: __ASSERT_ALWAYS(iData != NULL, test.Panic(_L("NULL pointer"))); sl@0: delete iData; sl@0: iData = NULL; sl@0: } sl@0: sl@0: sl@0: void Free() sl@0: { sl@0: test.Printf(_L(" RLoggerNew::Free - %x\n"), this); sl@0: sl@0: // Open or non-NULL initializing constructor not called or sl@0: // cleanup function already called sl@0: sl@0: __ASSERT_ALWAYS(iData != NULL, test.Panic(_L("NULL pointer"))); sl@0: delete iData; sl@0: iData = NULL; sl@0: } sl@0: sl@0: void MemFunc() sl@0: { sl@0: test.Printf(_L(" RLoggerNew::MemFunc - %x %x\n"), this, iData); sl@0: } sl@0: sl@0: static void StaticMemberRef(const RLoggerNew& aTracker) sl@0: { sl@0: test.Printf(_L(" RLoggerNew::StaticMemberRef - %x\n"), &aTracker); sl@0: } sl@0: sl@0: static void StaticMemberPtr(RLoggerNew* aTracker) sl@0: { sl@0: test.Printf(_L(" RLoggerNew::StaticMemberPtr - %x\n"), aTracker); sl@0: } sl@0: sl@0: static void Cleanup(TAny* aRLoggerNew) sl@0: { sl@0: static_cast(aRLoggerNew)->Close(); sl@0: } sl@0: sl@0: TInt* GetData() const sl@0: { sl@0: return iData; sl@0: } sl@0: sl@0: protected: sl@0: TInt* iData; sl@0: }; sl@0: sl@0: sl@0: DEFINE_CLEANUP_FUNCTION(RLoggerNew, Release); sl@0: }//namespace Log sl@0: sl@0: sl@0: sl@0: using Log::RLoggerNew; sl@0: sl@0: //------------------------------------------ sl@0: //LCleanedupPtr tests here sl@0: //------------------ sl@0: template sl@0: void TestLCleanedupPtrGenerateL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: { sl@0: LCleanedupPtr > tracker(CTracker::NewL()); sl@0: sl@0: tracker->MemFunc(); sl@0: sl@0: } sl@0: sl@0: __UHEAP_MARKEND; sl@0: test.Printf(_L("__UHEAP_MARKEND - OK\n")); sl@0: } sl@0: sl@0: template sl@0: void GenerateLCleanedupPtrTestL() sl@0: { sl@0: TestLCleanedupPtrGenerateL(); sl@0: GenerateLCleanedupPtrTestL(); sl@0: } sl@0: sl@0: template<> sl@0: void GenerateLCleanedupPtrTestL<0>() sl@0: { sl@0: TestLCleanedupPtrGenerateL<0>(); sl@0: } sl@0: sl@0: sl@0: //------------------------------------------- sl@0: //LCleanedupArray tests here sl@0: //----------------- sl@0: template sl@0: void TestLCleanedupArrayGenerateL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: { sl@0: LCleanedupArray > tracker(new(ELeave) CTracker[Value]); sl@0: } sl@0: sl@0: __UHEAP_MARKEND; sl@0: test.Printf(_L("__UHEAP_MARKEND - OK\n")); sl@0: } sl@0: sl@0: template sl@0: void GenerateLCleanedupArrayTestL() sl@0: { sl@0: TestLCleanedupArrayGenerateL(); sl@0: GenerateLCleanedupArrayTestL(); sl@0: } sl@0: sl@0: template<> sl@0: void GenerateLCleanedupArrayTestL<0>() sl@0: { sl@0: TestLCleanedupArrayGenerateL<0>(); sl@0: } sl@0: sl@0: //----------------------------------- sl@0: //LCleanedupGuard Tests Here sl@0: //--------------------------- sl@0: template sl@0: void TestLCleanedupGuardTestGenerateL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: { sl@0: RLoggerNew logger(Value); sl@0: LCleanedupGuard cleanGuard(RLoggerNew::Cleanup, &logger); sl@0: } sl@0: sl@0: __UHEAP_MARKEND; sl@0: test.Printf(_L("__UHEAP_MARKEND - OK\n")); sl@0: } sl@0: sl@0: template sl@0: void GenerateLCleanedupGuardTestL() sl@0: { sl@0: TestLCleanedupGuardTestGenerateL(); sl@0: GenerateLCleanedupGuardTestL(); sl@0: } sl@0: sl@0: template<> sl@0: void GenerateLCleanedupGuardTestL<0>() sl@0: { sl@0: TestLCleanedupGuardTestGenerateL<0>(); sl@0: } sl@0: sl@0: //---------------------------------------- sl@0: //LCleanedupHandle Tests Here sl@0: //----------------------- sl@0: sl@0: template sl@0: void TestLCleanedupHandleGenerateL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: { sl@0: LCleanedupHandle logger(Value); sl@0: } sl@0: sl@0: __UHEAP_MARKEND; sl@0: test.Printf(_L("__UHEAP_MARKEND - OK\n")); sl@0: } sl@0: sl@0: template sl@0: void GenerateLCleanedupHandleTestL() sl@0: { sl@0: TestLCleanedupHandleGenerateL(); sl@0: GenerateLCleanedupHandleTestL(); sl@0: } sl@0: sl@0: template<> sl@0: void GenerateLCleanedupHandleTestL<0>() sl@0: { sl@0: TestLCleanedupHandleGenerateL<0>(); sl@0: } sl@0: //------------------------------------------ sl@0: //LCleanedupRef Tests Here sl@0: //------------------------- sl@0: sl@0: template sl@0: void TestLCleanedupRefGenerateL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: { sl@0: RLoggerNew logger; sl@0: logger.OpenL(Value); sl@0: LCleanedupRef rlog(logger); sl@0: rlog.ReleaseResource(); sl@0: } sl@0: sl@0: __UHEAP_MARKEND; sl@0: test.Printf(_L("__UHEAP_MARKEND - OK\n")); sl@0: } sl@0: sl@0: template sl@0: void GenerateLCleanedupRefTestL() sl@0: { sl@0: TestLCleanedupRefGenerateL(); sl@0: GenerateLCleanedupRefTestL(); sl@0: } sl@0: sl@0: template<> sl@0: void GenerateLCleanedupRefTestL<0>() sl@0: { sl@0: TestLCleanedupRefGenerateL<0>(); sl@0: } sl@0: sl@0: /** sl@0: @SYMTestCaseID BASESRVCS-EUSERHL-UT-4071 sl@0: @SYMTestCaseDesc Tests multiple defined symbols of ManagedPopCleanupStackItem method sl@0: and also does stress testing of the template classes. sl@0: Tests All the different Templated Class such as sl@0: LCleanedupRef,LCleanedupGuard,LCleanedupHandle,LCleanedupArray and LCleanedupPtr sl@0: for performance as well by explicit instantiation of the templated class using recurrsion. sl@0: @SYMTestPriority High sl@0: @SYMTestActions Creates multiple instances of LCleanedupArray,LCleanedupPtr and LCleanedupRef etc sl@0: Verifies that the objects are automatically cleaned up when they go sl@0: out of scope sl@0: @SYMTestExpectedResults All memory allocated for the LXXX objects sl@0: is automatically freed when they go out of scope and there are no sl@0: errors on multiple definition of ManagedPopCleanupStackItem is produced. sl@0: @SYMREQ DEF137572 sl@0: */ sl@0: sl@0: TInt TExtendedTestL() sl@0: { sl@0: //------------ sl@0: TRAPD(status, GenerateLCleanedupPtrTestL<64>()); sl@0: if (status != KErrNone) sl@0: { sl@0: test.Printf(_L("LCleanedupPtr; leave code: %d\n"), status); sl@0: } sl@0: sl@0: TRAPD(status1,GenerateLCleanedupArrayTestL<64>()); sl@0: if(status1 !=KErrNone) sl@0: { sl@0: test.Printf(_L("LCleanedupArray completed;leave code:%d\n"),status1); sl@0: } sl@0: sl@0: TRAPD(status2,GenerateLCleanedupGuardTestL<64>()); sl@0: if(status2 !=KErrNone) sl@0: { sl@0: test.Printf(_L("LCleanedupGuard completed;leave code:%d\n"),status2); sl@0: } sl@0: sl@0: TRAPD(status3,GenerateLCleanedupHandleTestL<64>()); sl@0: if(status3 !=KErrNone) sl@0: { sl@0: test.Printf(_L("LCleanedupHandle completed;leave code:%d\n"),status3); sl@0: } sl@0: sl@0: TRAPD(status4,GenerateLCleanedupRefTestL<64>()); sl@0: if(status4 !=KErrNone) sl@0: { sl@0: test.Printf(_L("LCleanedupRef completed;leave code:%d\n"),status4); sl@0: } sl@0: return status; sl@0: } sl@0: sl@0: sl@0: