os/kernelhwsrv/kerneltest/e32test/buffer/t_array.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 1994-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 the License "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 // e32test\buffer\t_array.cpp
    15 // Overview:
    16 // Simple array tests.
    17 // API Information:
    18 // RArray, RPointerArray.
    19 // Details:
    20 // - Create fixed length array of 32 and 64 bit integer objects, an array 
    21 // of pointers to objects and verify that they are created successfully. 
    22 // - Simulate heap allocation failure test for the current thread's heap, 
    23 // append some 32 & 64 bit integers to the created arrays and verify the 
    24 // returned errors are as expected.
    25 // - Append some 32, 64 bit integers to fixed length arrays of 32 and 64 
    26 // bit integer objects respectively, check that KErrNoMemory is returned 
    27 // as expected.
    28 // - Verify heap allocation granularity.
    29 // - Simulate heap allocation failure, attempt to insert an object into 
    30 // the arrays, verify failure as expected and verify that the array 
    31 // contents were not modified.
    32 // - Remove elements from the arrays and verify that the number of 
    33 // elements held in the arrays are as expected.
    34 // - Append and remove an element to each array (uncompressed) and check
    35 // that the number of elements held in the arrays are as expected.
    36 // - Simulate heap allocation failure, compress the arrays and verify 
    37 // that KErrNoMemory is returned on appending elements to the arrays.
    38 // - Reset the arrays and check the number of elements held in the arrays are 0.
    39 // - Append some 64 bit integer objects to the array of pointers to objects and 
    40 // verify that the number of elements held in the array is as expected.
    41 // - Empty the array of pointers, and verify that the heap has not been corrupted by 
    42 // any of the tests.
    43 // - Using a variety of random sized arrays, test RArray::FindInOrder and 
    44 // RPointerArray::FindInOrder, verify that the results are as expected.
    45 // - Using a variety of random sized arrays, test RArray::FindInSignedKeyOrder 
    46 // and RArray::FindInUnsignedKeyOrder, verify that the results are as expected.
    47 // - Using a variety of random sized arrays of a struct, test RArray::FindInUnsignedKeyOrder
    48 // an dRArray::FindInUnsignedKeyOrder, verify that the results are as expected.
    49 // - Using a variety of random sized arrays, test RPointerArray::FindInAddressOrder, 
    50 // verify that the results are as expected.
    51 // - Verify that the heap has not been corrupted by any of the tests.
    52 // - Tests for RArray and standard array objects:
    53 // - Append random numbers to the arrays and verify that the arrays are as expected. 
    54 // - Append and remove integers to an RArray, check the values are added and removed 
    55 // as expected.
    56 // - Append some random numbers, check that the numbers are found in the array using 
    57 // sequential and binary search techniques.
    58 // - Append some random numbers, insert them into the arrays allowing duplicates 
    59 // entries and without duplicate entries and check the numbers are found as expected.
    60 // - Insert some random numbers into the arrays allowing duplicates, and check the 
    61 // numbers are added as  expected.
    62 // - Insert a sequence of integers into an array, use the SpecificFindInOrder method 
    63 // and verify that results are as expected.
    64 // - Tests for 4 byte RArrays:
    65 // - Append random numbers to the arrays and verify that the arrays are as expected. 
    66 // - Append and remove integers to an RArray, check the values are added and removed 
    67 // as expected.
    68 // - Append some random numbers, check that the numbers are found in the array using 
    69 // sequential and binary search techniques.
    70 // - Append some random numbers, insert them into the arrays allowing duplicates 
    71 // entries and without duplicate entries and check the numbers are found as expected.
    72 // - Insert some random numbers into the arrays allowing duplicates, and check the 
    73 // numbers are added as  expected.
    74 // - Insert a sequence of integers into an array, use the SpecificFindInOrder method 
    75 // and verify that results are as expected.
    76 // - Verify that the heap has not been corrupted by any of the tests.
    77 // - Repeat the above test for arrays of unsigned integers, pointers, 64 bit integer 
    78 // array objects and array of pointers objects.
    79 // - Test and trap a variety of error conditions that cause the array functions to leave. 
    80 // Test on arrays of integers, pointers, unsigned integers and TInts.
    81 // - Verify that the heap has not been corrupted by any of the tests.
    82 // - Perform simple array tests by appending, finding, find in order, insert in order, 
    83 // sorting, growing and compressing arrays. Verify results are as expected.
    84 // - Perform a variety of speed tests on array objects.
    85 // - Test whether the heap has been corrupted by all the tests.
    86 // Platforms/Drives/Compatibility:
    87 // All 
    88 // Assumptions/Requirement/Pre-requisites:
    89 // Failures and causes:
    90 // Base Port information:
    91 // 
    92 //
    93 
    94 #include <e32test.h>
    95 #include <e32math.h>
    96 
    97 GLREF_C void DoSpeedTests();
    98 GLREF_C void DoIntArrayTests();
    99 GLREF_C void DoUintArrayTests();
   100 GLREF_C void DoPointerArrayTests();
   101 GLREF_C void DoPointerArrayLeavingInterfaceTest();
   102 GLREF_C void DoPointerArrayAnyTests();
   103 GLREF_C void DoPointerArrayAnyLeavingInterfaceTest();
   104 GLREF_C void DoArrayLeavingInterfaceTest();
   105 GLDEF_C void DoTIntArrayLeavingInterfaceTest();
   106 GLDEF_C void DoTUintArrayLeavingInterfaceTest();
   107 GLREF_C void DoSimpleArrayTests();
   108 GLREF_C void DoRArrayTests();
   109 
   110 GLDEF_C RTest test(_L("T_ARRAY"));
   111 
   112 static TInt64 seed = MAKE_TINT64(0xb504f333,0xf9de6484);
   113 GLDEF_C TInt Random()
   114 	{
   115 	// Using this formula ensures repeated numbers wont come up in the tests.
   116 	seed = ((TUint) (69069*seed + 41));
   117 	return (TInt) seed;
   118 	}
   119 
   120 #ifdef _DEBUG
   121 RArray<TInt> *TheIntArray;
   122 RPointerArray<TInt64> *ThePtrArray;
   123 RArray<TInt64> *TheSimpleArray;
   124 
   125 void DoAllocTests()
   126 	{
   127 	test.Next(_L("Testing alloc failure"));
   128 	TheIntArray = new RArray<TInt>(16);
   129 	test(TheIntArray!=NULL);
   130 	ThePtrArray = new RPointerArray<TInt64>;
   131 	test(ThePtrArray!=NULL);
   132 	TheSimpleArray = new RArray<TInt64>;
   133 	test(TheSimpleArray!=NULL);
   134 	__UHEAP_MARK;
   135 	__UHEAP_SETFAIL(RHeap::EDeterministic,1);
   136 	TInt64 x = MAKE_TINT64(0xb504f333,0xf9de6484);
   137 	TInt64 y = MAKE_TINT64(0xc90fdaa2,0xc2352168);
   138 	TInt i;
   139 	TInt r=TheIntArray->Append(0);
   140 	test(r==KErrNoMemory);
   141 	r=ThePtrArray->Append(&x);
   142 	test(r==KErrNoMemory);
   143 	r=TheSimpleArray->Append(x);
   144 	test(r==KErrNoMemory);
   145 	__UHEAP_RESET;
   146 	r=TheIntArray->Append(0);
   147 	test(r==KErrNone);
   148 	r=ThePtrArray->Append(&x);
   149 	test(r==KErrNone);
   150 	r=TheSimpleArray->Append(x);
   151 	test(r==KErrNone);
   152 	TUint8* p1=new TUint8[1024];	// alloc a big cell to block simple expansion
   153 	__UHEAP_SETFAIL(RHeap::EDeterministic,1);
   154 	test.Next(_L("Testing granularity"));
   155 	TInt n=0;
   156 	while(r==KErrNone)
   157 		{
   158 		n++;
   159 		r=TheIntArray->Append(0);
   160 		}
   161 	test(r==KErrNoMemory);
   162 	test(n==16);
   163 	test(TheIntArray->Count()==16);
   164 	r=KErrNone;
   165 	n=0;
   166 	while(r==KErrNone)
   167 		{
   168 		n++;
   169 		r=ThePtrArray->Append(&x);
   170 		}
   171 	test(r==KErrNoMemory);
   172 	test(n==8);
   173 	test(ThePtrArray->Count()==8);		// default
   174 	r=KErrNone;
   175 	n=0;
   176 	while(r==KErrNone)
   177 		{
   178 		n++;
   179 		r=TheSimpleArray->Append(x);
   180 		}
   181 	test(r==KErrNoMemory);
   182 	test(n==8);
   183 	test(TheSimpleArray->Count()==8);	// default
   184 
   185 	r=TheIntArray->Insert(1,1);
   186 	test(r==KErrNoMemory);
   187 	test(TheIntArray->Count()==16);
   188 	for (i=0; i<TheIntArray->Count(); i++)
   189 		{
   190 		test((*TheIntArray)[i]==0);
   191 		}
   192 	r=ThePtrArray->Insert(&y,1);
   193 	test(r==KErrNoMemory);
   194 	test(ThePtrArray->Count()==8);
   195 	for (i=0; i<ThePtrArray->Count(); i++)
   196 		{
   197 		test((*ThePtrArray)[i]==&x);
   198 		}
   199 	r=TheSimpleArray->Insert(y,1);
   200 	test(r==KErrNoMemory);
   201 	test(TheSimpleArray->Count()==8);
   202 	for (i=0; i<TheSimpleArray->Count(); i++)
   203 		{
   204 		test((*TheSimpleArray)[i]==x);
   205 		}
   206 
   207 	for (i=1; i<16; i++)
   208 		{
   209 		TheIntArray->Remove(1);
   210 		}
   211 	for (i=1; i<8; i++)
   212 		{
   213 		ThePtrArray->Remove(1);
   214 		}
   215 	for (i=1; i<8; i++)
   216 		{
   217 		TheSimpleArray->Remove(1);
   218 		}
   219 	test(TheIntArray->Count()==1);
   220 	test(ThePtrArray->Count()==1);
   221 	test(TheSimpleArray->Count()==1);
   222 
   223 	__UHEAP_RESET;
   224 	TAny* p2=User::Alloc(48);
   225 	TAny* p3=User::Alloc(24);
   226 	TAny* p4=User::Alloc(24);
   227 	__UHEAP_SETFAIL(RHeap::EDeterministic,1);
   228 	r=TheIntArray->Append(0);
   229 	test(r==KErrNone);
   230 	r=ThePtrArray->Append(&x);
   231 	test(r==KErrNone);
   232 	r=TheSimpleArray->Append(x);
   233 	test(r==KErrNone);
   234 	test(TheIntArray->Count()==2);
   235 	test(ThePtrArray->Count()==2);
   236 	test(TheSimpleArray->Count()==2);
   237 	TheIntArray->Remove(1);
   238 	ThePtrArray->Remove(1);
   239 	TheSimpleArray->Remove(1);
   240 	test(TheIntArray->Count()==1);
   241 	test(ThePtrArray->Count()==1);
   242 	test(TheSimpleArray->Count()==1);
   243 	TheIntArray->Compress();
   244 	ThePtrArray->Compress();
   245 	TheSimpleArray->Compress();
   246 	User::Free(p2);
   247 	User::Free(p3);
   248 	User::Free(p4);
   249 	__UHEAP_RESET;
   250 	p2=User::Alloc(48);
   251 	p3=User::Alloc(24);
   252 	p4=User::Alloc(24);
   253 	__UHEAP_SETFAIL(RHeap::EDeterministic,1);
   254 	r=TheIntArray->Append(0);
   255 	test(r==KErrNoMemory);
   256 	r=ThePtrArray->Append(&x);
   257 	test(r==KErrNoMemory);
   258 	r=TheSimpleArray->Append(x);
   259 	test(r==KErrNoMemory);
   260 	TheIntArray->Reset();
   261 	ThePtrArray->Reset();
   262 	TheSimpleArray->Reset();
   263 	test(TheIntArray->Count()==0);
   264 	test(ThePtrArray->Count()==0);
   265 	test(TheSimpleArray->Count()==0);
   266 	delete p1;
   267 	User::Free(p2);
   268 	User::Free(p3);
   269 	User::Free(p4);
   270 	__UHEAP_RESET;
   271 	test.Next(_L("ResetAndDestroy"));
   272 	TInt64 *i1=new TInt64;
   273 	TInt64 *i2=new TInt64;
   274 	TInt64 *i3=new TInt64;
   275 	TInt64 *i4=new TInt64;
   276 	ThePtrArray->Append(i1);
   277 	ThePtrArray->Append(i2);
   278 	ThePtrArray->Append(i3);
   279 	ThePtrArray->Append(i4);
   280 	test(ThePtrArray->Count()==4);
   281 	ThePtrArray->ResetAndDestroy();
   282 	__UHEAP_MARKEND;
   283 	TheIntArray->Close();
   284 	delete TheIntArray;
   285 	ThePtrArray->Close();
   286 	delete ThePtrArray;
   287 	TheSimpleArray->Close();
   288 	delete TheSimpleArray;
   289 	}
   290 #endif
   291 
   292 class RHeapMonitor : public RAllocator
   293 	{
   294 public:
   295 	static RHeapMonitor& Install();
   296 	void Uninstall();
   297 	RHeapMonitor();
   298 public:
   299 	virtual TAny* Alloc(TInt);
   300 	virtual void Free(TAny*);
   301 	virtual TAny* ReAlloc(TAny*, TInt, TInt);
   302 	virtual TInt AllocLen(const TAny*) const;
   303 	virtual TInt Compress();
   304 	virtual void Reset();
   305 	virtual TInt AllocSize(TInt&) const;
   306 	virtual TInt Available(TInt&) const;
   307 	virtual TInt DebugFunction(TInt, TAny*, TAny*);
   308 	virtual TInt Extension_(TUint, TAny*&, TAny*);
   309 public:
   310 	RAllocator* iOrig;
   311 	TInt iAllocs;
   312 	TInt iFailedAllocs;
   313 	TInt iFrees;
   314 	TInt iReallocs;
   315 	TInt iFailedReallocs;
   316 	};
   317 
   318 RHeapMonitor::RHeapMonitor()
   319 	{
   320 	iOrig = &User::Allocator();
   321 	iAllocs = 0;
   322 	iFailedAllocs = 0;
   323 	iFrees = 0;
   324 	iReallocs = 0;
   325 	iFailedReallocs = 0;
   326 	}
   327 
   328 RHeapMonitor& RHeapMonitor::Install()
   329 	{
   330 	RHeapMonitor* m = new RHeapMonitor;
   331 	test(m!=0);
   332 	RAllocator* orig = User::SwitchAllocator(m);
   333 	test(orig == m->iOrig);
   334 	return *m;
   335 	}
   336 
   337 void RHeapMonitor::Uninstall()
   338 	{
   339 	RAllocator* m = User::SwitchAllocator(iOrig);
   340 	test(m == this);
   341 	delete this;
   342 	}
   343 
   344 TAny* RHeapMonitor::Alloc(TInt a)
   345 	{
   346 	++iAllocs;
   347 	TAny* p = iOrig->Alloc(a);
   348 	if (!p) ++iFailedAllocs;
   349 	return p;
   350 	}
   351 
   352 void RHeapMonitor::Free(TAny* a)
   353 	{
   354 	if (a) ++iFrees;
   355 	iOrig->Free(a);
   356 	}
   357 
   358 TAny* RHeapMonitor::ReAlloc(TAny* aCell, TInt aSize, TInt aMode)
   359 	{
   360 	if (aCell && aSize>0)
   361 		++iReallocs;
   362 	else if (aCell)
   363 		++iFrees;
   364 	else
   365 		++iAllocs;
   366 	TAny* p = iOrig->ReAlloc(aCell, aSize, aMode);
   367 	if (!p && aSize>0)
   368 		{
   369 		if (aCell)
   370 			++iFailedReallocs;
   371 		else
   372 			++iFailedAllocs;
   373 		}
   374 	return p;
   375 	}
   376 
   377 TInt RHeapMonitor::AllocLen(const TAny* a) const
   378 	{
   379 	return iOrig->AllocLen(a);
   380 	}
   381 
   382 TInt RHeapMonitor::Compress()
   383 	{
   384 	return iOrig->Compress();
   385 	}
   386 
   387 void RHeapMonitor::Reset()
   388 	{
   389 	iOrig->Reset();
   390 	}
   391 
   392 TInt RHeapMonitor::AllocSize(TInt& a) const
   393 	{
   394 	return iOrig->AllocSize(a);
   395 	}
   396 
   397 TInt RHeapMonitor::Available(TInt& a) const
   398 	{
   399 	return iOrig->Available(a);
   400 	}
   401 
   402 TInt RHeapMonitor::DebugFunction(TInt aFunc, TAny* a1, TAny* a2)
   403 	{
   404 	return iOrig->DebugFunction(aFunc, a1, a2);
   405 	}
   406 
   407 TInt RHeapMonitor::Extension_(TUint, TAny*&, TAny*)
   408 	{
   409 	return KErrExtensionNotSupported;
   410 	}
   411 
   412 template<class T>
   413 void TestReserveT()
   414 	{
   415 	RHeapMonitor& m = RHeapMonitor::Install();
   416 	TInt r;
   417 	RArray<T> a(1);
   418 	test(a.Count()==0);
   419 	test(m.iAllocs==0);
   420 	test(a.Append(1)==KErrNone);
   421 	test(m.iAllocs==1);
   422 	test(m.iReallocs==0);
   423 	test(a.Append(2)==KErrNone);
   424 	test(m.iReallocs==1);	// should have realloc'd
   425 	a.Close();
   426 	test(m.iFrees==1);
   427 	test(m.iAllocs==1);
   428 	test(m.iReallocs==1);
   429 	test(a.Count()==0);
   430 	test(a.Reserve(2)==KErrNone);
   431 	test(m.iAllocs==2);
   432 	TRAP(r,a.ReserveL(2));
   433 	test(r==KErrNone);
   434 	test(m.iFrees==1);
   435 	test(m.iAllocs==2);
   436 	test(m.iReallocs==1);
   437 	test(a.Append(1)==KErrNone);
   438 	test(m.iFrees==1);
   439 	test(m.iAllocs==2);
   440 	test(m.iReallocs==1);
   441 	test(a.Append(2)==KErrNone);
   442 	test(m.iFrees==1);
   443 	test(m.iAllocs==2);
   444 	test(m.iReallocs==1);	// shouldn't have realloc'd
   445 	test(a.Append(3)==KErrNone);
   446 	test(m.iFrees==1);
   447 	test(m.iAllocs==2);
   448 	test(m.iReallocs==2);	// should have realloc'd
   449 	a.Close();
   450 	test(m.iFrees==2);
   451 	test(m.iAllocs==2);
   452 	test(m.iReallocs==2);
   453 	test(a.Count()==0);
   454 	test(a.Reserve(2)==KErrNone);
   455 	test(m.iFrees==2);
   456 	test(m.iAllocs==3);
   457 	test(m.iReallocs==2);
   458 	test(a.Append(1)==KErrNone);
   459 	test(m.iFrees==2);
   460 	test(m.iAllocs==3);
   461 	test(m.iReallocs==2);
   462 	test(a.Append(2)==KErrNone);
   463 	test(m.iFrees==2);
   464 	test(m.iAllocs==3);
   465 	test(m.iReallocs==2);
   466 	test(a.Reserve(0x20000000)==KErrNoMemory);
   467 	test(m.iFrees==2);
   468 	test(m.iAllocs==3);
   469 	test(m.iReallocs==2);
   470 	test(m.iFrees==2);
   471 	test(m.iAllocs==3);
   472 	test(m.iReallocs==2);
   473 	test(a.Reserve(8)==KErrNone);
   474 	test(m.iFrees==2);
   475 	test(m.iAllocs==3);
   476 	test(m.iReallocs==3);
   477 	test(a.Append(3)==KErrNone);
   478 	test(a.Append(4)==KErrNone);
   479 	test(a.Append(5)==KErrNone);
   480 	test(a.Append(6)==KErrNone);
   481 	test(a.Append(7)==KErrNone);
   482 	test(a.Append(8)==KErrNone);
   483 	test(a.Count()==8);
   484 	test(m.iFrees==2);
   485 	test(m.iAllocs==3);
   486 	test(m.iReallocs==3);
   487 	TInt i;
   488 	for (i=0; i<=8; ++i)
   489 		{
   490 		test(a.Reserve(i)==KErrNone);
   491 		test(m.iFrees==2);
   492 		test(m.iAllocs==3);
   493 		test(m.iReallocs==3);
   494 		}
   495 	test(a.Append(9)==KErrNone);
   496 	test(m.iFrees==2);
   497 	test(m.iAllocs==3);
   498 	test(m.iReallocs==4);
   499 	a.Close();
   500 	test(m.iFrees==3);
   501 	test(m.iAllocs==3);
   502 	test(m.iReallocs==4);
   503 #ifdef _DEBUG
   504 	__UHEAP_FAILNEXT(1);
   505 	test(a.Count()==0);
   506 	test(a.Reserve(0)==KErrNone);
   507 	test(m.iFrees==3);
   508 	test(m.iAllocs==3);
   509 	test(m.iReallocs==4);
   510 	test(m.iFailedAllocs==0);
   511 	test(a.Reserve(1)==KErrNoMemory);
   512 	test(m.iFrees==3);
   513 	test(m.iAllocs==4);
   514 	test(m.iReallocs==4);
   515 	test(m.iFailedAllocs==1);
   516 	test(a.Reserve(1)==KErrNone);
   517 	test(m.iFrees==3);
   518 	test(m.iAllocs==5);
   519 	test(m.iReallocs==4);
   520 	test(m.iFailedAllocs==1);
   521 	a.Close();
   522 	test(m.iFrees==4);
   523 	test(m.iAllocs==5);
   524 	test(m.iReallocs==4);
   525 	test(m.iFailedAllocs==1);
   526 #endif
   527 	m.Uninstall();
   528 	TUint count = 0x80000000u / sizeof(T);
   529 
   530 	// don't do this in the heap monitored section because
   531 	// throwing a C++ exception allocates and frees memory
   532 	TRAP(r,a.ReserveL(count));
   533 	test(r==KErrNoMemory);
   534 	}
   535 
   536 void TestReserve()
   537 	{
   538 	test.Start(_L("Test Reserve()"));
   539 	__UHEAP_MARK;
   540 
   541 	TestReserveT<TInt>();
   542 	TestReserveT<TInt64>();
   543 
   544 	__UHEAP_MARKEND;
   545 	test.End();
   546 	}
   547 
   548 GLDEF_C TInt E32Main()
   549 	{
   550 
   551 	CTrapCleanup* trapHandler=CTrapCleanup::New();
   552 	test(trapHandler!=NULL);
   553 
   554 	test.Title();
   555 	test.Start(_L("Simple array tests"));
   556 #ifdef _DEBUG
   557 	DoAllocTests();
   558 #endif
   559 	TestReserve();
   560 	__UHEAP_MARK;
   561 	DoRArrayTests();
   562 	__UHEAP_MARKEND;
   563 	__UHEAP_MARK;
   564 	DoIntArrayTests();
   565 	__UHEAP_MARKEND;
   566 	__UHEAP_MARK;
   567 	DoUintArrayTests();
   568 	__UHEAP_MARKEND;
   569 	__UHEAP_MARK;
   570 	DoPointerArrayTests();
   571 	__UHEAP_MARKEND;
   572 	__UHEAP_MARK;
   573 	TRAPD(ret,DoArrayLeavingInterfaceTest());
   574 	test(ret==KErrNone);
   575 	__UHEAP_MARKEND;
   576 	__UHEAP_MARK;
   577 	TRAP(ret,DoPointerArrayLeavingInterfaceTest());
   578 	test(ret==KErrNone);
   579 	__UHEAP_MARKEND;
   580 	__UHEAP_MARK;
   581 	TRAP(ret,DoTIntArrayLeavingInterfaceTest());
   582 	test(ret==KErrNone);
   583 	__UHEAP_MARKEND;
   584 	__UHEAP_MARK;
   585 	TRAP(ret,DoTUintArrayLeavingInterfaceTest());
   586 	test(ret==KErrNone);
   587 	__UHEAP_MARKEND;
   588 	__UHEAP_MARK;
   589 	DoSimpleArrayTests();
   590 	__UHEAP_MARKEND;
   591 	__UHEAP_MARK;
   592 	DoPointerArrayAnyTests();
   593 	__UHEAP_MARKEND;
   594 	__UHEAP_MARK;
   595 	TRAP(ret,DoPointerArrayAnyLeavingInterfaceTest());
   596 	test(ret==KErrNone);
   597 	__UHEAP_MARKEND;
   598 	__UHEAP_MARK;
   599 	DoSpeedTests();
   600 	__UHEAP_MARKEND;
   601 	test.End();
   602 
   603 	delete trapHandler;
   604 	return KErrNone;
   605 	}