os/ossrv/lowlevellibsandfws/genericusabilitylib/test/src/t_emanagedLcleanup.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // Overview:
    15 // Test methods of the LManagedX and LCleanedupX classes.
    16 // 
    17 // 
    18 //
    19 
    20 #include "emanaged.h"
    21 #include <e32base.h>
    22 #include <e32test.h>
    23 #include <e32def.h>
    24 #include <e32cmn.h>
    25 
    26 
    27 extern RTest test;
    28 
    29 template<TInt Value>
    30 class CTracker : public CBase
    31 	{
    32 public:
    33 	enum TConstructionMode { ENonleavingConstructor, EConstructorLeaves};
    34 
    35 	static CTracker* NewL()
    36 		{
    37 		CTracker* ptr = new(ELeave) CTracker;
    38 		ptr->ConstructL();
    39 		return ptr;
    40 		}
    41 	CTracker():iData(NULL)
    42 		{
    43 		test.Printf(_L("  CTracker - %x\n"), this);
    44 		}
    45 
    46 	void ConstructL()
    47 		{
    48 		test.Printf(_L("  CTracker::ConstructL - %x\n"), this);
    49 		iData = new(ELeave) TInt(Value);
    50 		}
    51 public:
    52 	virtual ~CTracker()
    53 		{
    54 		test.Printf(_L("  ~CTracker - %x\n"), this);
    55 		if(iData)
    56 			{
    57 			delete iData;	
    58 			}
    59 		}
    60 
    61 	virtual void MemFunc()
    62 		{
    63 		test.Printf(_L("  CTracker::MemFunc - %x\n"), this);
    64 		}
    65 
    66 	static void StaticMemberRef(const CTracker& aTracker)
    67 		{
    68 		test.Printf(_L("  CTracker::StaticMemberRef - %x\n"), &aTracker);
    69 		}
    70 
    71 	static void StaticMemberPtr(CTracker* aTracker)
    72 		{
    73 		test.Printf(_L("  CTracker::StaticMemberPtr - %x\n"), aTracker);
    74 		}
    75 
    76   private:
    77 	TInt* iData;
    78 	};
    79 
    80 namespace Log
    81 {
    82 
    83 class RLoggerNew
    84 	{
    85   public:
    86 	RLoggerNew()
    87 		: iData(NULL)
    88 		{
    89 		test.Printf(_L("  RLoggerNew - %x\n"), this);
    90 		}
    91 
    92 	RLoggerNew(TInt* aData)
    93 		: iData(aData)
    94 		{
    95 		test.Printf(_L("  RLoggerNew - %x ptr %x -> val %d\n"), this, aData, *iData);
    96 		}
    97 
    98 	RLoggerNew(TInt aValue)
    99 		: iData(new(ELeave) TInt(aValue))
   100 		{
   101 		test.Printf(_L("  RLoggerNew - %x value %d\n"), this, *iData);
   102 		}
   103 
   104 	void OpenL(TInt aValue)
   105 		{
   106 		iData = new(ELeave) TInt(aValue);
   107 		test.Printf(_L("  RLoggerNew::OpenL(TInt aValue) - %x value %d\n"), this, *iData);
   108 		}
   109 
   110 	RLoggerNew(const RLoggerNew& aLogger)
   111 		: iData(aLogger.iData)
   112 		{
   113 		test.Printf(_L("  RLoggerNew::RLoggerNew(const RLoggerNew&) - %x (copy)\n"), this);
   114 		}
   115 
   116 
   117 	RLoggerNew& operator=(const RLoggerNew& aLogger)
   118 		{
   119 		iData = aLogger.iData;
   120 
   121 		test.Printf(_L("  RLoggerNew::operator=(const RLoggerNew&) - %x copy from %x val %d\n"), this, &aLogger, *aLogger.iData);
   122 		return *this;
   123 		}
   124 
   125 
   126 	~RLoggerNew()
   127 		{
   128 		test.Printf(_L("  ~RLoggerNew - %x\n"), this);
   129 		}
   130 
   131 
   132 	void Close()
   133 		{
   134 		test.Printf(_L("  RLoggerNew::Close - %x\n"), this);
   135 
   136 		// Open or non-NULL initializing constructor not called or
   137 		// cleanup function already called
   138 
   139 		__ASSERT_ALWAYS(iData != NULL, test.Panic(_L("NULL pointer")));
   140 		delete iData;
   141 		iData = NULL;
   142 		}
   143 
   144 
   145 	void Release()
   146 		{
   147 		test.Printf(_L("  RLoggerNew::Release - %x\n"), this);
   148 
   149 		// Open or non-NULL initializing constructor not called or
   150 		// cleanup function already called
   151 
   152 		__ASSERT_ALWAYS(iData != NULL, test.Panic(_L("NULL pointer")));
   153 		delete iData;
   154 		iData = NULL;
   155 		}
   156 
   157 
   158 	void Destroy()
   159 		{
   160 		test.Printf(_L("  RLoggerNew::Destroy - %x\n"), this);
   161 
   162 		// Open or non-NULL initializing constructor not called or
   163 		// cleanup function already called
   164 
   165 		__ASSERT_ALWAYS(iData != NULL, test.Panic(_L("NULL pointer")));
   166 		delete iData;
   167 		iData = NULL;
   168 		}
   169 
   170 
   171 	void Free()
   172 		{
   173 		test.Printf(_L("  RLoggerNew::Free - %x\n"), this);
   174 
   175 		// Open or non-NULL initializing constructor not called or
   176 		// cleanup function already called
   177 
   178 		__ASSERT_ALWAYS(iData != NULL, test.Panic(_L("NULL pointer")));
   179 		delete iData;
   180 		iData = NULL;
   181 		}
   182 
   183 	void MemFunc()
   184 		{
   185 		test.Printf(_L("  RLoggerNew::MemFunc - %x %x\n"), this, iData);
   186 		}
   187 
   188 	static void StaticMemberRef(const RLoggerNew& aTracker)
   189 		{
   190 		test.Printf(_L("  RLoggerNew::StaticMemberRef - %x\n"), &aTracker);
   191 		}
   192 
   193 	static void StaticMemberPtr(RLoggerNew* aTracker)
   194 		{
   195 		test.Printf(_L("  RLoggerNew::StaticMemberPtr - %x\n"), aTracker);
   196 		}
   197 
   198 	static void Cleanup(TAny* aRLoggerNew)
   199 		{
   200 		static_cast<RLoggerNew*>(aRLoggerNew)->Close();
   201 		}
   202 
   203 	TInt* GetData() const
   204 		{
   205 		return iData;
   206 		}
   207 
   208   protected:
   209 	TInt* iData;
   210 	};
   211 
   212 
   213 DEFINE_CLEANUP_FUNCTION(RLoggerNew, Release);
   214 }//namespace Log
   215 
   216 
   217 
   218 using Log::RLoggerNew;
   219 
   220 //------------------------------------------	
   221 //LCleanedupPtr tests here
   222 //------------------
   223 template<TInt Value>
   224 void TestLCleanedupPtrGenerateL()
   225 	{
   226 	__UHEAP_MARK;
   227 
   228 		{
   229 		LCleanedupPtr<CTracker<Value> > tracker(CTracker<Value>::NewL());
   230 
   231  		tracker->MemFunc();
   232  		
   233 		}
   234 
   235 	__UHEAP_MARKEND;
   236 	test.Printf(_L("__UHEAP_MARKEND - OK\n"));
   237 	}
   238 
   239 template<TInt Value>
   240 void GenerateLCleanedupPtrTestL()
   241 	{
   242 	TestLCleanedupPtrGenerateL<Value>();
   243 	GenerateLCleanedupPtrTestL<Value - 1>();
   244 	}
   245 
   246 template<>
   247 void GenerateLCleanedupPtrTestL<0>()
   248 	{
   249 	TestLCleanedupPtrGenerateL<0>();
   250 	}
   251 
   252 
   253 //-------------------------------------------
   254 //LCleanedupArray tests here
   255 //-----------------
   256 template<TInt Value>
   257 void TestLCleanedupArrayGenerateL()
   258 	{
   259 	__UHEAP_MARK;
   260 
   261 		{
   262 		LCleanedupArray<CTracker<Value> > tracker(new(ELeave) CTracker<Value>[Value]);
   263  		}
   264 
   265 	__UHEAP_MARKEND;
   266 	test.Printf(_L("__UHEAP_MARKEND - OK\n"));
   267 	}
   268 
   269 template<TInt Value>
   270 void GenerateLCleanedupArrayTestL()
   271 	{
   272 	TestLCleanedupArrayGenerateL<Value>();
   273 	GenerateLCleanedupArrayTestL<Value - 1>();
   274 	}
   275 
   276 template<>
   277 void GenerateLCleanedupArrayTestL<0>()
   278 	{
   279 	TestLCleanedupArrayGenerateL<0>();
   280 	}
   281 	
   282 //-----------------------------------
   283 //LCleanedupGuard Tests Here
   284 //---------------------------
   285 template<TInt Value>
   286 void TestLCleanedupGuardTestGenerateL()
   287 	{
   288 	__UHEAP_MARK;
   289 
   290 		{
   291 		RLoggerNew logger(Value);
   292 		LCleanedupGuard cleanGuard(RLoggerNew::Cleanup, &logger);
   293  		}
   294 
   295 	__UHEAP_MARKEND;
   296 	test.Printf(_L("__UHEAP_MARKEND - OK\n"));
   297 	}
   298 	
   299 template<TInt Value>
   300 void GenerateLCleanedupGuardTestL()
   301 	{
   302 	TestLCleanedupGuardTestGenerateL<Value>();
   303 	GenerateLCleanedupGuardTestL<Value - 1>();
   304 	}
   305 
   306 template<>
   307 void GenerateLCleanedupGuardTestL<0>()
   308 	{
   309 	TestLCleanedupGuardTestGenerateL<0>();
   310 	}
   311 
   312 //----------------------------------------
   313 //LCleanedupHandle Tests Here
   314 //-----------------------
   315 
   316 template<TInt Value>
   317 void TestLCleanedupHandleGenerateL()
   318 	{
   319 	__UHEAP_MARK;
   320 
   321 		{
   322 		LCleanedupHandle<RLoggerNew> logger(Value);
   323 		}
   324 
   325 	__UHEAP_MARKEND;
   326 	test.Printf(_L("__UHEAP_MARKEND - OK\n"));
   327 	}
   328 	
   329 template<TInt Value>
   330 void GenerateLCleanedupHandleTestL()
   331 	{
   332 	TestLCleanedupHandleGenerateL<Value>();
   333 	GenerateLCleanedupHandleTestL<Value - 1>();
   334 	}
   335 
   336 template<>
   337 void GenerateLCleanedupHandleTestL<0>()
   338 	{
   339 	TestLCleanedupHandleGenerateL<0>();
   340 	}
   341 //------------------------------------------
   342 //LCleanedupRef Tests Here
   343 //-------------------------
   344 
   345 template<TInt Value>
   346 void TestLCleanedupRefGenerateL()
   347 	{
   348 	__UHEAP_MARK;
   349 
   350 		{
   351 		RLoggerNew logger;
   352 		logger.OpenL(Value);
   353 		LCleanedupRef<RLoggerNew> rlog(logger);
   354 		rlog.ReleaseResource();		
   355 		}
   356 
   357 	__UHEAP_MARKEND;
   358 	test.Printf(_L("__UHEAP_MARKEND - OK\n"));
   359 	}
   360 	
   361 template<TInt Value>
   362 void GenerateLCleanedupRefTestL()
   363 	{
   364 	TestLCleanedupRefGenerateL<Value>();
   365 	GenerateLCleanedupRefTestL<Value - 1>();
   366 	}
   367 
   368 template<>
   369 void GenerateLCleanedupRefTestL<0>()
   370 	{
   371 	TestLCleanedupRefGenerateL<0>();
   372 	}
   373 
   374 /**
   375 @SYMTestCaseID 			BASESRVCS-EUSERHL-UT-4071
   376 @SYMTestCaseDesc 		Tests multiple defined symbols of ManagedPopCleanupStackItem method 
   377 						and also does stress testing of the template classes.
   378 						Tests All the different Templated Class such as
   379 						LCleanedupRef,LCleanedupGuard,LCleanedupHandle,LCleanedupArray and LCleanedupPtr
   380 						for performance as well by explicit instantiation of the templated class using recurrsion.		
   381 @SYMTestPriority 		High
   382 @SYMTestActions 		Creates multiple instances of LCleanedupArray,LCleanedupPtr and LCleanedupRef etc
   383 						Verifies that the objects are automatically cleaned up when they go
   384 						out of scope
   385 @SYMTestExpectedResults All memory allocated for the LXXX objects
   386 						is automatically freed when they go out of scope and there are no 
   387 						errors on multiple definition of ManagedPopCleanupStackItem is produced.
   388 @SYMREQ					DEF137572
   389 */
   390 
   391 TInt TExtendedTestL()
   392 	{
   393 	//------------
   394 	TRAPD(status, GenerateLCleanedupPtrTestL<64>());
   395 	if (status != KErrNone)
   396 		{
   397 		test.Printf(_L("LCleanedupPtr; leave code: %d\n"), status);
   398 		}
   399 	
   400 	TRAPD(status1,GenerateLCleanedupArrayTestL<64>());
   401 	if(status1 !=KErrNone)
   402 		{
   403 		test.Printf(_L("LCleanedupArray completed;leave code:%d\n"),status1);			
   404 		}
   405 	
   406 	TRAPD(status2,GenerateLCleanedupGuardTestL<64>());
   407 	if(status2 !=KErrNone)
   408 		{
   409 		test.Printf(_L("LCleanedupGuard completed;leave code:%d\n"),status2);			
   410 		}
   411 	
   412 	TRAPD(status3,GenerateLCleanedupHandleTestL<64>());
   413 	if(status3 !=KErrNone)
   414 		{
   415 		test.Printf(_L("LCleanedupHandle completed;leave code:%d\n"),status3);			
   416 		}
   417 	
   418 	TRAPD(status4,GenerateLCleanedupRefTestL<64>());
   419 	if(status4 !=KErrNone)
   420 		{
   421 		test.Printf(_L("LCleanedupRef completed;leave code:%d\n"),status4);			
   422 		}
   423 	return status;
   424 	}
   425 
   426 
   427