dbgsrv/coredumpserver/plugins/formatters/dexc/test/tdexcformatter.cpp
changeset 0 c6b0df440bee
equal deleted inserted replaced
-1:000000000000 0:c6b0df440bee
       
     1 // Copyright (c) 2007-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 //
       
    15 
       
    16 #include <e32std.h>
       
    17 #include <e32base.h>
       
    18 #include "tdexcformatter.h"
       
    19 #include "dexcformatter.h"
       
    20 
       
    21 CDexcFormatterTest * CDexcFormatterTest::NewL(RTest &itest)
       
    22 {
       
    23     CDexcFormatterTest *self = CDexcFormatterTest::NewLC(itest);
       
    24     CleanupStack::Pop();
       
    25     return self;
       
    26 }
       
    27 
       
    28 CDexcFormatterTest * CDexcFormatterTest::NewLC(RTest &itest)
       
    29 {
       
    30     CDexcFormatterTest *self = new(ELeave) CDexcFormatterTest(itest);
       
    31     CleanupStack::PushL(self);
       
    32     self->ConstructL();
       
    33     return self;
       
    34 }
       
    35 
       
    36 void CDexcFormatterTest::ConstructL()
       
    37 {
       
    38     server = new(ELeave) CTestCrashDataSource;
       
    39     formatter = CDexcFormatter::NewL();
       
    40     writer = CTestDataSave::NewL();
       
    41     formatter->ConfigureDataSourceL(server);
       
    42     formatter->ConfigureDataSaveL(writer);
       
    43 }
       
    44 
       
    45 CDexcFormatterTest::CDexcFormatterTest(RTest &aTest) : itest(aTest) { }
       
    46 
       
    47 CDexcFormatterTest::~CDexcFormatterTest()
       
    48 {
       
    49     delete server;
       
    50     delete writer;
       
    51     delete formatter;
       
    52 }
       
    53 
       
    54 void CDexcFormatterTest::CleanupEComArray(TAny* aArray)
       
    55 {
       
    56 	(static_cast<RImplInfoPtrArray*> (aArray))->ResetAndDestroy();
       
    57     REComSession::FinalClose();
       
    58 }
       
    59 
       
    60 void CDexcFormatterTest::TestSuiteL(TSuite aSuite) const
       
    61 {
       
    62     RDebug::Print(_L("-> TestSuite(%d)\n"), aSuite);
       
    63     TInt err;
       
    64     TBuf<23> name(KTestName); 
       
    65     name.AppendNum(aSuite);
       
    66     itest.Next(name);
       
    67 
       
    68     switch(aSuite)
       
    69     {
       
    70         case EConfigData:
       
    71         {
       
    72             RDebug::Print(_L("EConfigData starting...\n"));
       
    73             TRAP(err, formatter->ConfigureDataSourceL(server));
       
    74             itest(err == KErrNone);
       
    75             itest(server == formatter->iDataSource);
       
    76 
       
    77             TRAP(err, formatter->ConfigureDataSaveL(writer));
       
    78             itest(err == KErrNone);
       
    79             itest(writer == formatter->iDataSave);
       
    80 
       
    81             TRAP(err, formatter->ConfigureDataSourceL(NULL)); 
       
    82             itest(err == KErrNoMemory);
       
    83 
       
    84             TRAP(err, formatter->ConfigureDataSaveL(NULL));
       
    85             itest(err == KErrNoMemory);
       
    86             RDebug::Print(_L("EConfigData passed!\n"));
       
    87             break;
       
    88         }
       
    89 
       
    90         case EFindImplementation:
       
    91         {
       
    92 		
       
    93             RDebug::Print(_L("EFindImplementation starting...\n"));
       
    94             RImplInfoPtrArray infoArray;
       
    95             TCleanupItem cleanup(CDexcFormatterTest::CleanupEComArray, (TAny*)&infoArray);
       
    96             CleanupStack::PushL(cleanup);
       
    97             
       
    98             TRAPD(err, CDexcFormatter::ListAllImplementationsL(infoArray));
       
    99             itest(err == KErrNone);
       
   100 
       
   101 			CCoreDumpFormatter* findImpFormatter = 0;            
       
   102             RBuf description;
       
   103             description.CreateL(MaxPluginDescription);
       
   104             CleanupClosePushL(description);
       
   105 
       
   106             err = KErrNotFound;
       
   107             for (TInt i = 0; i < infoArray.Count(); i++)
       
   108             {
       
   109                 TUid uid = infoArray[i]->ImplementationUid();
       
   110                 findImpFormatter  = CCoreDumpFormatter::NewL(uid);
       
   111 				findImpFormatter->GetDescription(description);
       
   112                 delete findImpFormatter;
       
   113                 RDebug::Print(_L("found plugin[%d]: (%S)\n"), i, &description);
       
   114                 if(description == KPluginDescription())
       
   115                 {
       
   116                     itest(uid == KDexcFormatterUid);
       
   117                     err = KErrNone;
       
   118                     break;
       
   119                 }
       
   120                 description.Zero();
       
   121             }
       
   122             CleanupStack::PopAndDestroy();
       
   123             itest(err == KErrNone);
       
   124             CleanupStack::PopAndDestroy(); // infoArray, results in a call to CleanupEComArray
       
   125             break;
       
   126 
       
   127         }
       
   128 
       
   129         case EConfigParams:
       
   130         {
       
   131 			RDebug::Print(_L("EConfigParams starting\n"));
       
   132 
       
   133 			_LIT( KTrueFalseOpt, "True,False" );
       
   134 			_LIT( KFalseOpt, "False" );
       
   135 			_LIT( KTrueOpt, "True" );
       
   136 
       
   137             TInt err;
       
   138             COptionConfig * param = NULL;
       
   139 		    TInt paramsCount = formatter->GetNumberConfigParametersL(); //it should be non leaving call
       
   140             itest(paramsCount == formatter->iConfigList.Count());
       
   141 
       
   142             TRAP(err, param = formatter->GetConfigParameterL(0));
       
   143             itest(param->Index() == CDexcFormatter::EDumpStack);
       
   144 			itest(param->Uid() == KDEXCFormatterUid );
       
   145             itest(param->Source() == COptionConfig::EFormatterPlugin);
       
   146             itest(param->Type() == COptionConfig::ETBool);
       
   147             itest(param->Options() == KTrueFalseOpt);
       
   148             itest(param->ValueAsBool() == 1);
       
   149 			param = NULL;
       
   150 
       
   151             TRAP(err, param = formatter->GetConfigParameterL(1));
       
   152             itest(param->Index() == CDexcFormatter::EAsciiStack);
       
   153 			itest(param->Uid() == KDEXCFormatterUid );
       
   154             itest(param->Source() == COptionConfig::EFormatterPlugin);
       
   155             itest(param->Type() == COptionConfig::ETBool);
       
   156             itest(param->Options() == KTrueFalseOpt);
       
   157             itest(param->ValueAsBool() == 0);
       
   158 			param = NULL;
       
   159 
       
   160 			RDebug::Printf("->TRAP(err, param = formatter->GetConfigParameterL(paramsCount))\n");
       
   161             TRAP(err, param = formatter->GetConfigParameterL(paramsCount));
       
   162             itest(err == KErrBadHandle);
       
   163 			param = NULL;
       
   164 
       
   165 			RDebug::Printf("formatter->SetConfigParameterL( 0, (TInt)EFalse, KFalseOpt );\n");
       
   166 		    TRAP(err, formatter->SetConfigParameterL( 0, (TInt)EFalse, KFalseOpt ));
       
   167 			itest(err == KErrNone);
       
   168 			itest(formatter->iConfigList[0]->ValueAsBool() == EFalse);
       
   169 			TRAP(err, param = formatter->GetConfigParameterL(0));
       
   170             itest(formatter->iConfigList[0]->ValueAsBool() == EFalse);
       
   171             itest(param->ValueAsDesc() == KFalseOpt);
       
   172 
       
   173 			RDebug::Printf("formatter->SetConfigParameterL( 0, (TInt)ETrue, KTrueOpt );\n");
       
   174 		    TRAP(err, formatter->SetConfigParameterL( 0, (TInt)ETrue, KNullDesC ));
       
   175 			itest(err == KErrNone);
       
   176 			TRAP(err, param = formatter->GetConfigParameterL(0));
       
   177 			itest(formatter->iConfigList[0]->ValueAsBool());
       
   178             itest(param->ValueAsDesc() == KTrueOpt);
       
   179             
       
   180 			RDebug::Print(_L("EConfigParams finished\n"));
       
   181 
       
   182             break;
       
   183         }
       
   184 
       
   185         case EDumpLog:
       
   186         {           
       
   187 			RDebug::Print(_L("EDumpLog starting.... \n"));
       
   188             //            0123456789012345678901234567890123456789012345678901234567890123456789012345
       
   189             _LIT8(KLine, "----------------------------------------------------------------------------");
       
   190             //                  0 12345678901234567890 1 23456789012345   6 78901234567890 1 2345678901234?
       
   191             _LIT8(KLogDump, "%S\r\nEKA2 USER CRASH LOG\r\nThread Name: %S\r\nThread ID: %u\r\nUser Stack %08X-%08X\r\n");
       
   192             TBuf8<65+76+KMaxName+11+16> reference; //line, thread name, id and 2x 8-digits
       
   193 
       
   194             //add newLC
       
   195             CThreadInfo *thread = CThreadInfo::NewL(KCrashTid,
       
   196                                                     KCrashThreadName,
       
   197                                                     KCrashPid,
       
   198                                                     KCrashThreadPriority,
       
   199                                                     KCrashSvcStackPtr,
       
   200                                                     KCrashSvcStackAddr,
       
   201                                                     KCrashSvcStackSize,
       
   202                                                     KCrashUsrStackAddr,
       
   203                                                     KCrashUsrStackSize);
       
   204             
       
   205 			RDebug::Print(_L("  -> writer->OpenL(_L(\"\"), handle)\n"));
       
   206             writer->OpenL(_L("")); //clear writer buffer
       
   207             formatter->DumpLogL(*thread);
       
   208             delete thread;
       
   209             itest(writer->iData != KLogDump());
       
   210             reference.Format(KLogDump, &KLine, &KCrashThreadName8, KCrashTid, KCrashUsrStackAddr, KCrashUsrStackAddr + KCrashUsrStackSize);
       
   211             itest(writer->iData == reference);
       
   212 			RDebug::Print(_L("EDumpLog finished\n"));
       
   213             break;
       
   214         }
       
   215 
       
   216         case EDumpPanicInfo:
       
   217         {
       
   218 			RDebug::Print(_L("EDumpPanicInfo starting.... \n"));
       
   219             //                 0123456  7 8 9 0
       
   220 			_LIT8(KPanicDump, "Panic: %S-%d\r\n");
       
   221             RBuf8 reference; 
       
   222             reference.CreateL(KPanicDump().Length() + 11 + KMaxExitCategoryName);
       
   223             CleanupClosePushL(reference);
       
   224 
       
   225             TCrashInfo crash;
       
   226             crash.iReason = KCrashReason;
       
   227             crash.iCategory = KCrashCategory;
       
   228 
       
   229             writer->OpenL(_L("")); //clear writer buffer
       
   230             formatter->DumpPanicInfoL(crash);
       
   231             itest(writer->iData != KPanicDump());
       
   232 
       
   233     		reference.Format(KPanicDump, &KCrashCategory8, KCrashReason);
       
   234 
       
   235             itest(writer->iData == reference);
       
   236 
       
   237             CleanupStack::PopAndDestroy(); //reference
       
   238 			RDebug::Print(_L("EDumpPanicInfo finished\n"));
       
   239             break;
       
   240         }
       
   241 
       
   242         case EDumpExcInfo:
       
   243         {
       
   244 			RDebug::Print(_L("EDumpExcInfo starting.... \n"));
       
   245 
       
   246             _LIT8(KExcDump, "\r\nUNHANDLED EXCEPTION:\r\ncode=%d PC=%08x FAR=%08x FSR=%08x\r\nR13svc=%08x R14svc=%08x SPSRsvc=%08x\r\n");
       
   247             //     012345 6 7890123456789012345678901234567890123 4 5
       
   248             RBuf8 reference;
       
   249             reference.CreateL(KExcDump().Length() + 11 + 6*4);
       
   250             CleanupClosePushL(reference);
       
   251 
       
   252             TCrashInfo crash;
       
   253 			crash.iType = TCrashInfo::ECrashException;
       
   254 			crash.iContext.iExcCode = KCrashExcCode;
       
   255 
       
   256             crash.iContext.iFaultAddress = KCrashFaultAddress;
       
   257             crash.iContext.iFaultStatus = KCrashFaultStatus;
       
   258 
       
   259 			crash.iContext.iR15 = KRegValue32 + KCrashTid;
       
   260 			crash.iContext.iR13Svc = crash.iContext.iR15 + 1;
       
   261 			crash.iContext.iR14Svc = crash.iContext.iR15 + 2;
       
   262 			crash.iContext.iSpsrSvc = crash.iContext.iR15 + 3;
       
   263 
       
   264             writer->Open(_L("")); //clear writer buffer
       
   265             formatter->DumpExcInfoL(crash);
       
   266 
       
   267 			RDebug::Print( _L("-> itest(writer->iData != KExcDump())\n") );
       
   268             itest(writer->iData != KExcDump());
       
   269 
       
   270             TInt32 code = KCrashExcCode;
       
   271             TInt32 pc = KRegValue32 + KCrashTid; //index of r15
       
   272             TInt32 far = KCrashFaultAddress; 
       
   273             TInt32 fsr = KCrashFaultStatus;
       
   274             TInt32 r13svc = KRegValue32 + KCrashTid + 1; //index of r13svc
       
   275             TInt32 r14svc = KRegValue32 + KCrashTid + 2; //index of r14svc
       
   276             TInt32 spsr = KRegValue32 + KCrashTid + 3; //index of spsr 
       
   277 
       
   278             reference.Format(KExcDump, code, pc, far, fsr, r13svc, r14svc, spsr);
       
   279 
       
   280 			/*
       
   281 			RBuf8 referencePrint;
       
   282 		    referencePrint.CreateL(256);
       
   283 			referencePrint.Copy( reference );
       
   284 			char *tonp = (char*) referencePrint.PtrZ();
       
   285 			LOG_MSG2("  KExcDump=%s\n", tonp);
       
   286 			referencePrint.Close();
       
   287 			writer->Print();
       
   288 			*/
       
   289 			RDebug::Print( _L("-> itest(writer->iData == reference)\n") );
       
   290 			itest(writer->iData == reference);
       
   291 
       
   292             CleanupStack::PopAndDestroy(); //reference
       
   293 			RDebug::Print(_L("EDumpExcInfo finished\n"));
       
   294 
       
   295             break;
       
   296         }
       
   297 
       
   298         case EDumpRegisters:
       
   299         {
       
   300 			RDebug::Print(_L("EDumpRegisters starting.... \n"));
       
   301 
       
   302             _LIT8(KCpsrDump, "\r\nUSER REGISTERS:\r\nCPSR=%08x\r\n");
       
   303             _LIT8(KRegsDump, "r%02d=%08x %08x %08x %08x\r\n");
       
   304             RBuf8 reference;
       
   305             reference.CreateL(KCpsrDump().Length() + 4 + KCoreRegsCount * (KRegsDump().Length() + 4*4));
       
   306             CleanupClosePushL(reference);
       
   307 
       
   308             writer->Open(_L("")); //clear writer buffer
       
   309             TRAP(err, formatter->DumpRegistersL(KCrashTid));
       
   310             itest(err == KErrNone);
       
   311             itest(writer->iData != KRegsDump());
       
   312 
       
   313             TInt32 cpsr = KRegValue32 + KCrashTid + 16; //index of cpsr 
       
   314 
       
   315             reference.Format(KCpsrDump, cpsr); 
       
   316             TBuf8<41> line;
       
   317             #define REG_VAL(i) ( KRegValue32 + KCrashTid + i )
       
   318             for(TInt i = 0; i < KCoreRegsCount; i+=4)
       
   319             {
       
   320                 TInt reg0 = REG_VAL(i);
       
   321                 TInt reg1 = REG_VAL(i+1);
       
   322                 TInt reg2 = REG_VAL(i+2);
       
   323                 TInt reg3 = REG_VAL(i+3);
       
   324                 line.Format(KRegsDump, i, reg0, reg1, reg2, reg3);
       
   325                 reference.Append(line);
       
   326             }
       
   327             #undef REG_VAL
       
   328             itest(writer->iData == reference);
       
   329             CleanupStack::PopAndDestroy(); //reference
       
   330 			RDebug::Print(_L("EDumpRegisters finished\n"));
       
   331 
       
   332             break;
       
   333         }
       
   334 
       
   335         case EDumpCodeSegs:
       
   336         {
       
   337 			RDebug::Print(_L("EDumpCodeSegs starting.... \n"));
       
   338 
       
   339             _LIT8(KSegsLine, "%08X-%08X %S\r\n");
       
   340             RBuf8 line;
       
   341             CleanupClosePushL(line);
       
   342             line.CreateL(KSegsLine().Length() + 2*4 + KMaxFileName);
       
   343             //               0123456789012345679012
       
   344 	        _LIT8(KSegsDump, "\r\nCODE SEGMENTS:\r\n");
       
   345             RBuf8 reference;
       
   346             CleanupClosePushL(reference);
       
   347             reference.CreateL(KSegsDump().Length() + KCodeSegsCount * (line.MaxLength()) + 76);
       
   348 
       
   349             writer->Open(_L("")); //clear writer buffer
       
   350             formatter->DumpCodeSegsL(KCrashPid);
       
   351 			//writer->Print();
       
   352 
       
   353             itest(writer->iData != KSegsDump());
       
   354 			RDebug::Print( _L(" writer->iData.Length() = %d\n"), writer->iData.Length() );
       
   355 
       
   356             reference = KSegsDump();
       
   357             TUint base;
       
   358             TUint size;
       
   359 
       
   360 			// See CTestCrashDataSource::GetCodeSegmentsL()
       
   361             
       
   362 			base = KCrashCodeRunAddr + KCrashPid;
       
   363 			size= KCrashCodeSize + KCrashPid;
       
   364             line.Format(KSegsLine, base, base + size, &KCrashProcessName8);
       
   365             reference.Append(line);
       
   366 
       
   367 			base = KCrashCodeRunAddr + KCrashPid + 1;
       
   368 			size= KCrashCodeSize + KCrashPid + 1;
       
   369             line.Format(KSegsLine, base, base + size, &KLibName1_8);
       
   370             reference.Append(line);
       
   371 
       
   372 			base = KCrashCodeRunAddr + KCrashPid + 2;
       
   373 			size= KCrashCodeSize + KCrashPid + 2;
       
   374             line.Format(KSegsLine, base, base + size, &KLibName2_8);
       
   375             reference.Append(line);
       
   376            
       
   377             reference.Append(_L8("\r\n"));
       
   378 
       
   379 			/*
       
   380 			RBuf8 referencePrint;
       
   381 		    referencePrint.CreateL(256);
       
   382 			referencePrint.Copy( reference );
       
   383 			char *tonp = (char*) referencePrint.PtrZ();
       
   384 			LOG_MSG2("  KCodeSeg=%s\n", tonp);
       
   385 			referencePrint.Close();
       
   386 			writer->Print();
       
   387 			*/
       
   388 
       
   389 			itest(writer->iData == reference);
       
   390             CleanupStack::PopAndDestroy(2);
       
   391 			RDebug::Print(_L("EDumpCodeSegs finished\n"));
       
   392             break;
       
   393         }
       
   394 
       
   395         case EDumpStack:
       
   396         {
       
   397 			RDebug::Print(_L("EDumpStack starting.... \n"));
       
   398 			_LIT( KFalseOpt, "False" );
       
   399 
       
   400             CThreadInfo *thread = CThreadInfo::NewL(KCrashTid,
       
   401                                                     KCrashThreadName,
       
   402                                                     KCrashPid,
       
   403                                                     KCrashThreadPriority,
       
   404                                                     KCrashSvcStackPtr,
       
   405                                                     KCrashSvcStackAddr,
       
   406                                                     KCrashSvcStackSize,
       
   407                                                     KCrashUsrStackAddr,
       
   408                                                     KCrashUsrStackSize);
       
   409 
       
   410 			CleanupStack::PushL(thread);
       
   411 
       
   412             RBuf8 stack;
       
   413             stack.CreateL(KCrashUsrStackSize*5);
       
   414             CleanupClosePushL(stack);
       
   415             
       
   416             writer->Open(_L("")); //clear writer buffer
       
   417 		    formatter->SetConfigParameterL( 1, (TInt32)EFalse, KFalseOpt ); //binary dump
       
   418             formatter->DumpStackL(KCrashTid, *thread); 
       
   419 
       
   420             for( TInt i = 0; i < KCrashUsrStackSize; i++ )
       
   421 		    {
       
   422                 stack.Append((TUint8*)&i, 1);
       
   423             }
       
   424 
       
   425 			RDebug::Printf("itest(writer->iData == stack);");
       
   426             itest(writer->iData == stack);
       
   427             itest(writer->iData != _L8(""));
       
   428             stack.Zero();
       
   429 
       
   430             for(TInt i = 0; i < KCrashUsrStackSize; i+=16)
       
   431             {
       
   432                 stack.AppendNumFixedWidth(KCrashUsrStackAddr + i, EHex, 8);
       
   433                 stack.Append(_L8(": "));
       
   434                 for(TInt j = 0; j < 16; ++j)
       
   435                 {
       
   436                     stack.AppendNumFixedWidth(i+j, EHex, 2); 
       
   437                     stack.Append(' ');
       
   438                 }
       
   439                 for(TInt j = 0; j < 16; ++j)
       
   440                 {
       
   441                     TInt c = i+j;
       
   442                     if(c < 0x20 || c >= 0x7f) //something writable
       
   443 						c = 0x2e; //.
       
   444                     stack.Append(TChar(c));
       
   445                 }
       
   446                 stack.AppendFormat(_L8("\r\n"));
       
   447             }
       
   448 
       
   449             writer->OpenL(_L("")); //clear writer buffer
       
   450 			RDebug::Printf("formatter->SetConfigParameterL( 1, (TInt)ETrue, KNullDesC );");
       
   451 		    formatter->SetConfigParameterL( 1, (TInt)ETrue, KNullDesC ); //ascii dump
       
   452 
       
   453 			RDebug::Printf("formatter->DumpStackL(KCrashTid, *thread);");
       
   454             formatter->DumpStackL(KCrashTid, *thread); 
       
   455 
       
   456 			RDebug::Printf("itest(writer->iData == stack);");
       
   457             itest(writer->iData == stack);
       
   458             itest(writer->iData != _L8(""));
       
   459             CleanupStack::PopAndDestroy();
       
   460 			CleanupStack::PopAndDestroy(thread);
       
   461 			RDebug::Print(_L("EDumpStack finished\n"));
       
   462             break;
       
   463         }
       
   464         
       
   465         default:
       
   466             break;
       
   467     }
       
   468     RDebug::Print(_L("<- TestSuite(%d)\n"), aSuite);
       
   469 }
       
   470 
       
   471 void RunTestsL()
       
   472 {
       
   473     RDebug::Print(_L("-> RunTestsL()\n"));
       
   474 
       
   475     CDexcFormatterTest::TSuite suite[] = {
       
   476                                          CDexcFormatterTest::ENone,
       
   477                                          CDexcFormatterTest::EConfigData,
       
   478                                          CDexcFormatterTest::EFindImplementation,
       
   479                                          CDexcFormatterTest::EConfigParams,
       
   480                                          CDexcFormatterTest::EGetDescription,
       
   481                                          CDexcFormatterTest::EDumpLog,
       
   482                                          CDexcFormatterTest::EDumpPanicInfo,
       
   483                                          CDexcFormatterTest::EDumpExcInfo,
       
   484                                          CDexcFormatterTest::EDumpRegisters,
       
   485 										 CDexcFormatterTest::EDumpCodeSegs,
       
   486 										 CDexcFormatterTest::EDumpStack,
       
   487                                          CDexcFormatterTest::ECrash
       
   488                                          };
       
   489 
       
   490     RTest rtest(KTestTitle);
       
   491     rtest.Title(); 
       
   492     rtest.Start(_L(""));
       
   493     CDexcFormatterTest::TSuite *test = suite; 
       
   494 
       
   495     while(*test != CDexcFormatterTest::ECrash)
       
   496     {
       
   497         CDexcFormatterTest *itester = CDexcFormatterTest::NewLC(rtest);
       
   498         itester->TestSuiteL(*test++);
       
   499         CleanupStack::PopAndDestroy();
       
   500     }
       
   501 
       
   502     rtest.End();
       
   503     rtest.Close();
       
   504     RDebug::Print(_L("<- RunTestsL()\n"));
       
   505 }
       
   506 
       
   507 TInt E32Main()
       
   508 {
       
   509     RDebug::Print(_L("-> E32Main()\n"));
       
   510 	__UHEAP_MARK;
       
   511 	CTrapCleanup* cleanup = CTrapCleanup::New();
       
   512     __ASSERT_ALWAYS(cleanup, User::Panic(_L("D_EXC_TEST-NO_CLEANUP"), KErrNoMemory));
       
   513 
       
   514     TRAPD(err, RunTestsL());
       
   515 	__ASSERT_ALWAYS(!err, User::Panic(_L("D_EXC_TEST-RunTestsL trapped with error: "), err));
       
   516 
       
   517 	delete cleanup;
       
   518 	__UHEAP_MARKEND;
       
   519     RDebug::Print(_L("<- E32Main()\n"));
       
   520     return err;
       
   521 }
       
   522