stif/TestServer/src/Testserversession.cpp
branchRCL_3
changeset 59 8ad140f3dd41
equal deleted inserted replaced
49:7fdc9a71d314 59:8ad140f3dd41
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 * 
       
    14 * Description: This module contains implementation of CTestServer 
       
    15 * class member functions.
       
    16 *
       
    17 */
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32std.h>
       
    21 #include <e32svr.h>
       
    22 #include "TestEngineClient.h"
       
    23 #include <StifTestModule.h>
       
    24 #include <stifinternal/TestServerClient.h>
       
    25 #include "TestServer.h"
       
    26 #include "TestServerCommon.h"
       
    27 #include "TestServerModuleIf.h"
       
    28 
       
    29 // EXTERNAL DATA STRUCTURES
       
    30 
       
    31 // EXTERNAL FUNCTION PROTOTYPES  
       
    32 
       
    33 // CONSTANTS
       
    34 
       
    35 // MACROS
       
    36 
       
    37 // LOCAL CONSTANTS AND MACROS
       
    38 
       
    39 // MODULE DATA STRUCTURES
       
    40 // Struct to pass parameters to server thread
       
    41 struct TThreadStartTestServerSession
       
    42     {
       
    43     RThread    iServerThread; // The server thread
       
    44     RSemaphore iStarted;      // Startup syncronisation semaphore   
       
    45     TInt       iStartupResult;// Start-up result
       
    46     };
       
    47 
       
    48 // LOCAL FUNCTION PROTOTYPES
       
    49 
       
    50 // FORWARD DECLARATIONS
       
    51 
       
    52 // ==================== LOCAL FUNCTIONS =======================================
       
    53 
       
    54 // None
       
    55 
       
    56 // ================= MEMBER FUNCTIONS =========================================
       
    57 
       
    58 /*
       
    59 -------------------------------------------------------------------------------
       
    60 
       
    61     Class: CTestCasesList
       
    62 
       
    63     Method: NewL
       
    64 
       
    65     Description: Create new test cases list    
       
    66 
       
    67     Parameters: const TDesC& aConfigFileName :in:  Config file name
       
    68 
       
    69     Return Values: CTestCasesList* Pointer to new test cases list
       
    70 
       
    71     Errors/Exceptions: Leaves if memory allocation fails or ConstructL leaves.
       
    72 
       
    73     Status: Approved
       
    74 
       
    75 -------------------------------------------------------------------------------
       
    76 */
       
    77 CTestCasesList* CTestCasesList::NewL( const TDesC& aConfigFileName )
       
    78     {    
       
    79     CTestCasesList* self = new(ELeave)CTestCasesList;
       
    80     CleanupStack::PushL( self );
       
    81     self->ConstructL( aConfigFileName );
       
    82     CleanupStack::Pop( self );
       
    83     return self;
       
    84     }
       
    85 
       
    86 /*
       
    87 -------------------------------------------------------------------------------
       
    88 
       
    89     Class: CTestCasesList
       
    90 
       
    91     Method: ~CTestCasesList
       
    92 
       
    93     Description: Destructor    
       
    94 
       
    95     Parameters: 
       
    96 
       
    97     Return Values: 
       
    98 
       
    99     Errors/Exceptions: 
       
   100 
       
   101     Status: Approved
       
   102 
       
   103 -------------------------------------------------------------------------------
       
   104 */
       
   105 CTestCasesList::~CTestCasesList()
       
   106     {
       
   107     delete iConfigFileName;
       
   108     iConfigFileName = NULL;
       
   109     iTestCases.ResetAndDestroy();
       
   110     iTestCases.Close();
       
   111     }
       
   112 
       
   113 /*
       
   114 -------------------------------------------------------------------------------
       
   115 
       
   116     Class: CTestCasesList
       
   117 
       
   118     Method: AppendTestCaseL
       
   119 
       
   120     Description: Appends test case.
       
   121 
       
   122     Parameters: const TDesC& aTestCaseTitle  in: Test case title
       
   123 
       
   124     Return Values: 
       
   125 
       
   126     Errors/Exceptions: Leaves if memory allocation fails
       
   127 
       
   128     Status: Approved
       
   129 
       
   130 -------------------------------------------------------------------------------
       
   131 */
       
   132 void CTestCasesList::AppendTestCaseL( const TDesC& aTestCaseTitle )
       
   133     {
       
   134     HBufC* testCaseTitle = aTestCaseTitle.AllocL();
       
   135     CleanupStack::PushL( testCaseTitle );
       
   136     iTestCases.AppendL( testCaseTitle );
       
   137     CleanupStack::Pop( testCaseTitle );
       
   138     }
       
   139 
       
   140 /*
       
   141 -------------------------------------------------------------------------------
       
   142 
       
   143     Class: CTestCasesList
       
   144 
       
   145     Method: GetTestCaseTitleL
       
   146 
       
   147     Description: Returns specified test case title  
       
   148 
       
   149     Parameters: TInt aIndex: in: Requested test case index. 
       
   150 
       
   151     Return Values: Test case title.
       
   152 
       
   153     Errors/Exceptions: Leaves if test case index is invalid
       
   154 
       
   155     Status: Approved
       
   156 
       
   157 -------------------------------------------------------------------------------
       
   158 */
       
   159 const TDesC& CTestCasesList::GetTestCaseTitleL( TInt aIndex ) const
       
   160     {    
       
   161     if ( ( aIndex < 0 ) || ( aIndex >= iTestCases.Count() ) )
       
   162         {
       
   163         User::Leave( KErrNotFound );
       
   164         }
       
   165     return *iTestCases[ aIndex ];
       
   166     }
       
   167 
       
   168 /*
       
   169 -------------------------------------------------------------------------------
       
   170 
       
   171     Class: CTestCasesList
       
   172 
       
   173     Method: GetConfigFileName
       
   174 
       
   175     Description: Returns config file name  
       
   176 
       
   177     Parameters: 
       
   178 
       
   179     Return Values: Config file name.
       
   180 
       
   181     Errors/Exceptions: 
       
   182 
       
   183     Status: Approved
       
   184 
       
   185 -------------------------------------------------------------------------------
       
   186 */
       
   187 const TDesC& CTestCasesList::GetConfigFileName() const
       
   188     {    
       
   189     return *iConfigFileName;
       
   190     }
       
   191 
       
   192 /*
       
   193 -------------------------------------------------------------------------------
       
   194 
       
   195     Class: CTestCasesList
       
   196 
       
   197     Method: Count
       
   198 
       
   199     Description: Returns count of test cases.    
       
   200 
       
   201     Parameters: 
       
   202 
       
   203     Return Values: Test cases count.
       
   204 
       
   205     Errors/Exceptions: 
       
   206 
       
   207     Status: Approved
       
   208 
       
   209 -------------------------------------------------------------------------------
       
   210 */
       
   211 TInt CTestCasesList::Count() const
       
   212     {
       
   213     return iTestCases.Count();
       
   214     }
       
   215 
       
   216 /*
       
   217 -------------------------------------------------------------------------------
       
   218 
       
   219     Class: CTestCasesList
       
   220 
       
   221     Method: ResetAndDestroy
       
   222 
       
   223     Description: Resets list of test cases.    
       
   224 
       
   225     Parameters: 
       
   226 
       
   227     Return Values: 
       
   228 
       
   229     Errors/Exceptions: 
       
   230 
       
   231     Status: Approved
       
   232 
       
   233 -------------------------------------------------------------------------------
       
   234 */
       
   235 void CTestCasesList::ResetAndDestroy()
       
   236     {    
       
   237     iTestCases.ResetAndDestroy();
       
   238     }
       
   239 
       
   240 /*
       
   241 -------------------------------------------------------------------------------
       
   242 
       
   243     Class: CTestCasesList
       
   244 
       
   245     Method: ~CTestCasesList
       
   246 
       
   247     Description: Destructor    
       
   248 
       
   249     Parameters: 
       
   250 
       
   251     Return Values: 
       
   252 
       
   253     Errors/Exceptions: 
       
   254 
       
   255     Status: Approved
       
   256 
       
   257 -------------------------------------------------------------------------------
       
   258 */
       
   259 CTestCasesList::CTestCasesList()
       
   260     {
       
   261     }
       
   262 
       
   263 /*
       
   264 -------------------------------------------------------------------------------
       
   265 
       
   266     Class: CTestCasesList
       
   267 
       
   268     Method: ~CTestCasesList
       
   269 
       
   270     Description: Destructor    
       
   271 
       
   272     Parameters: 
       
   273 
       
   274     Return Values: 
       
   275 
       
   276     Errors/Exceptions: 
       
   277 
       
   278     Status: Approved
       
   279 
       
   280 -------------------------------------------------------------------------------
       
   281 */
       
   282 void CTestCasesList::ConstructL( const TDesC& aConfigFileName )
       
   283     {
       
   284     iConfigFileName = aConfigFileName.AllocL();
       
   285     }
       
   286 
       
   287 /*
       
   288 -------------------------------------------------------------------------------
       
   289 
       
   290     Class: CTestModule
       
   291 
       
   292     Method: NewL
       
   293 
       
   294     Description: Create new Test Module    
       
   295 
       
   296     Parameters: RThread& aClient              :in:  Handle to client
       
   297                 CTestServer* aServer          :in:  Pointer to server
       
   298 
       
   299     Return Values: CTestModule*                     Pointer to new test module
       
   300 
       
   301     Errors/Exceptions: Leaves if memory allocation fails or ConstructL leaves.
       
   302 
       
   303     Status: Approved
       
   304 
       
   305 -------------------------------------------------------------------------------
       
   306 */
       
   307 CTestModule* CTestModule::NewL( CTestServer* aServer )
       
   308     {
       
   309 
       
   310     CTestModule* self=new( ELeave ) CTestModule();
       
   311     CleanupStack::PushL( self );
       
   312     self->ConstructL( aServer );
       
   313     CleanupStack::Pop();
       
   314     return self;
       
   315     }
       
   316 
       
   317 /*
       
   318 -------------------------------------------------------------------------------
       
   319 
       
   320     Class: CTestModule
       
   321 
       
   322     Method: CTestModule
       
   323 
       
   324     Description: Constructor.
       
   325     Initialise base class.
       
   326 
       
   327     Parameters: RThread& aClient              :in:  Handle to client
       
   328 
       
   329     Return Values: None
       
   330 
       
   331     Errors/Exceptions: None
       
   332 
       
   333     Status: Approved
       
   334 
       
   335 -------------------------------------------------------------------------------
       
   336 */
       
   337 CTestModule::CTestModule() :
       
   338     CSession2(),
       
   339     iIni(0, 0)
       
   340     {
       
   341     }
       
   342 
       
   343 /*
       
   344 -------------------------------------------------------------------------------
       
   345 
       
   346     Class: CTestModule
       
   347 
       
   348     Method: ~CTestModule
       
   349 
       
   350     Description: Destructor.
       
   351     Deallocate memory and close handles.
       
   352 
       
   353     Parameters: None
       
   354 
       
   355     Return Values: None
       
   356 
       
   357     Errors/Exceptions: None.
       
   358 
       
   359     Status: Proposal
       
   360 
       
   361 -------------------------------------------------------------------------------
       
   362 */
       
   363 CTestModule::~CTestModule()
       
   364     {
       
   365 
       
   366     __TRACE( KVerbose, ( _L( "Closing test module" ) ) );
       
   367         
       
   368     // Free test case related data. No error checking here, because if freeing
       
   369     // fails, then nothing can be done in destructor.
       
   370     FreeCaseData();
       
   371 
       
   372     // Delete all test module instances.
       
   373     // Cleanup all RTestExecution has been opened by client but not properly
       
   374     // closed for example if timeout occurs and client died. This almost do
       
   375     // same than CloseSession() in "if( iTestExecutionHandle )" branch.
       
   376     if( iTestExecutionHandle )
       
   377         {
       
   378         TInt handle = 0;
       
   379         CObject* theObj = NULL;
       
   380         TInt count = iTestExecutionHandle->Count();
       
   381 
       
   382         for( TInt i = 0 ; i < count; i++ )
       
   383             {
       
   384             // Get pointer to CTestExecution
       
   385             theObj=iTestExecutionHandle->operator[]( i );
       
   386             if( theObj )
       
   387                 {
       
   388                 handle=iTestExecutionHandle->At( theObj );
       
   389 
       
   390                 CTestExecution* testcase = (CTestExecution*) theObj;
       
   391                 // Cancels test(s) execution(timeout, exit, etc)
       
   392                 // For example TestCombiner is timeouted => TestCombiner's
       
   393                 // TestServer+TestModule(s) should cancel also.
       
   394                 testcase->CancelTestExecution();
       
   395                 // CTestExecution will panic if test case is ongoing!!! This
       
   396                 // should be stopped, client should handless this.
       
   397                 iTestExecutionHandle->Remove( handle );
       
   398                 }
       
   399             }
       
   400 
       
   401         delete iTestExecutionHandle;
       
   402         iTestExecutionHandle = NULL;
       
   403 
       
   404         }
       
   405 
       
   406     // Delete all FREE Test Module instances.
       
   407     if( iTestModuleInstances )
       
   408         {
       
   409         iTestModuleInstances->ResetAndDestroy();
       
   410         delete iTestModuleInstances;
       
   411         iTestModuleInstances = NULL;
       
   412         }
       
   413 
       
   414     // Delete ini file heap buffer
       
   415     delete iIniBuffer;
       
   416     iIniBuffer = NULL;
       
   417 
       
   418     // Delete array of test case titles
       
   419     iTestCaseTitlesMap.ResetAndDestroy();
       
   420     iTestCaseTitlesMap.Close();
       
   421     }
       
   422 
       
   423 /*
       
   424 -------------------------------------------------------------------------------
       
   425 
       
   426     Class: CTestModule
       
   427 
       
   428     Method: ConstructL
       
   429 
       
   430     Description: Second level constructor.
       
   431     
       
   432     Parameters: CTestServer* aServer          :in:  Server
       
   433 
       
   434     Return Values: None
       
   435 
       
   436     Errors/Exceptions: Leaves if:
       
   437                        base class CreateL leaves
       
   438                        Object index creation fails
       
   439                        Object container creation fails
       
   440                        Pointer array construction fails                       
       
   441 
       
   442     Status: Approved
       
   443 
       
   444 -------------------------------------------------------------------------------
       
   445 */
       
   446 void CTestModule::ConstructL( CTestServer* aServer )
       
   447     {
       
   448 
       
   449 	__TRACE( KVerbose, ( _L( "CTestModule::ConstructL - constructing server session" ) ) );
       
   450 
       
   451     // second-phase construct base class
       
   452     //CSession2::CreateL( /* *aServer */ );
       
   453     iTestServer = aServer;
       
   454 
       
   455     // create new object index
       
   456     iTestExecutionHandle = CObjectIx::NewL();
       
   457 
       
   458     // Initialize the object container using the object
       
   459     // container index in the server.
       
   460     iContainer = iTestServer->NewContainerL();
       
   461 
       
   462     iTestModuleInstances = new( ELeave ) RPointerArray<CTestModuleContainer>;
       
   463 
       
   464 	__TRACE( KError, ( _L( "CTestModule::ConstructL - constructing server session done" ) ) );
       
   465 
       
   466     }
       
   467 
       
   468 
       
   469 /*
       
   470 -------------------------------------------------------------------------------
       
   471 
       
   472     Class: CTestModule
       
   473 
       
   474     Method: CountResources
       
   475 
       
   476     Description: Resource counting
       
   477 
       
   478     Parameters: None
       
   479 
       
   480     Return Values: TInt                             Resource count
       
   481 
       
   482     Errors/Exceptions: None
       
   483 
       
   484     Status: Approved
       
   485 
       
   486 -------------------------------------------------------------------------------
       
   487 */
       
   488 TInt CTestModule::CountResources()
       
   489     {
       
   490 
       
   491     return iResourceCount;
       
   492 
       
   493     }
       
   494 
       
   495 
       
   496 /*
       
   497 -------------------------------------------------------------------------------
       
   498 
       
   499     Class: CTestModule
       
   500 
       
   501     Method: NumResources
       
   502 
       
   503     Description: Get resources, writes to Message()
       
   504 
       
   505     Parameters: None
       
   506 
       
   507     Return Values: None
       
   508 
       
   509     Errors/Exceptions: Panic client if result can't be written to descriptor.
       
   510 
       
   511     Status: Approved
       
   512 
       
   513 -------------------------------------------------------------------------------
       
   514 */
       
   515 void CTestModule::NumResources( const RMessage2& aMessage )
       
   516     {
       
   517 
       
   518     TPckgBuf<TInt> countPckg( iResourceCount );
       
   519 
       
   520     TRAPD( r, aMessage.WriteL( 0, countPckg ) );
       
   521     if( r !=KErrNone )
       
   522         {
       
   523         PanicClient( EBadDescriptor, aMessage );
       
   524         }
       
   525 
       
   526     }
       
   527 
       
   528 /*
       
   529 -------------------------------------------------------------------------------
       
   530 
       
   531     Class: CTestModule
       
   532 
       
   533     Method: PanicClient
       
   534 
       
   535     Description: Panic clients.
       
   536 
       
   537     Parameters: TInt aPanic                   :in:  Panic code
       
   538 
       
   539     Return Values: None
       
   540 
       
   541     Errors/Exceptions: None
       
   542 
       
   543     Status: Approved
       
   544 
       
   545 -------------------------------------------------------------------------------
       
   546 */
       
   547 void CTestModule::PanicClient( const TInt aPanic, const RMessage2& aMessage ) const
       
   548     {
       
   549 
       
   550     __TRACE( KError,( _L( "CTestModule::PanicClient code = %d" ), aPanic ) );
       
   551 
       
   552     _LIT( KTxtTestModule,"CTestModule" );
       
   553 
       
   554     aMessage.Panic( KTxtTestModule, aPanic );
       
   555     }
       
   556 
       
   557 
       
   558 /*
       
   559 -------------------------------------------------------------------------------
       
   560 
       
   561     Class: CTestModule
       
   562 
       
   563     Method: CloseSession
       
   564 
       
   565     Description: Close session
       
   566 
       
   567     Parameters: None
       
   568 
       
   569     Return Values: TInt: Symbian error code.
       
   570 
       
   571     Errors/Exceptions: None
       
   572 
       
   573     Status: Approved
       
   574 
       
   575 -------------------------------------------------------------------------------
       
   576 */
       
   577 TInt CTestModule::CloseSession( const RMessage2& aMessage )
       
   578     {
       
   579 
       
   580     __TRACE( KMessage,( _L( "CTestModule::CloseSession in" ) ) );
       
   581 
       
   582     // Delete all unclosed subsession handle before closing session.
       
   583     // Remove iTestExecutionHandle contents. iTestExecutionHandle countains
       
   584     // CTestExecution that handles test case have been created.
       
   585     if( iTestExecutionHandle )
       
   586         {
       
   587         TInt handle = 0;
       
   588         CObject* theObj = NULL;
       
   589         TInt count = iTestExecutionHandle->Count();        
       
   590         for ( TInt i = count - 1; i >= 0; i-- )
       
   591             {
       
   592             theObj=iTestExecutionHandle->operator[]( i );
       
   593             if( theObj )
       
   594                 {
       
   595                 handle=iTestExecutionHandle->At( theObj );
       
   596                 // CTestExecution will panic if test case is ongoing!!! This
       
   597                 // should be stopped, client should handle this.
       
   598                 iTestExecutionHandle->Remove( handle );
       
   599                 }
       
   600             }
       
   601 
       
   602         delete iTestExecutionHandle;
       
   603         iTestExecutionHandle = NULL;
       
   604         }
       
   605 
       
   606     // Deletion must be done here, because the "CloseSession" message is 
       
   607     // completed before execution continues from CActiveScheduler::Start 
       
   608     // location, and the main thread can continue execution 
       
   609     // and therefore shutdown itself and all threads in that process.
       
   610     
       
   611     // Delete the object container
       
   612     iTestServer->DeleteContainer( iContainer );
       
   613 
       
   614     // Free test case related data
       
   615     TInt r = FreeCaseData();
       
   616 
       
   617     // Delete all FREE Test Module instances
       
   618     iTestModuleInstances->ResetAndDestroy();
       
   619     delete iTestModuleInstances;
       
   620     iTestModuleInstances = NULL;
       
   621 
       
   622      // Inform server that session is closed
       
   623     iTestServer->SessionClosed();
       
   624 
       
   625 	// Check for avoiding multiple complete, see CTestModule::ServiceL()
       
   626     if( r != KErrNone )
       
   627         {
       
   628 		// In error cases do not complete, just return
       
   629         __TRACE( KMessage,( _L( "CTestModule::CloseSession out (1)" ) ) );
       
   630         return r;
       
   631         }
       
   632 
       
   633     aMessage.Complete( KErrNone );
       
   634 
       
   635     // After active scheduler shutdown is done, execution continues from
       
   636     // CTestServer::ThreadFunction()
       
   637 
       
   638     __TRACE( KMessage,( _L( "CTestModule::CloseSession out (2)" ) ) );
       
   639     return r;
       
   640     }
       
   641 
       
   642 
       
   643 /*
       
   644 -------------------------------------------------------------------------------
       
   645 
       
   646     Class: CTestModule
       
   647 
       
   648     Method: ServiceL
       
   649 
       
   650     Description: Trap harness for dispatcher
       
   651 
       
   652     Parameters: const RMessage& aMessage  :inout:   Message
       
   653 
       
   654     Return Values: None
       
   655 
       
   656     Errors/Exceptions: None
       
   657 
       
   658     Status: Proposal
       
   659 
       
   660 -------------------------------------------------------------------------------
       
   661 */
       
   662 void CTestModule::ServiceL( const RMessage2& aMessage )
       
   663     {
       
   664 
       
   665     // NOTE! HW testing slows down dramatically if adds commants here
       
   666 
       
   667     //__TRACE( KMessage,( _L( "CTestModule::ServiceL in" ) ) );
       
   668 
       
   669     TInt r = KErrNone;
       
   670     TRAPD( ret, r = DispatchMessageL( aMessage ) );
       
   671 
       
   672     if ( ret != KErrNone )
       
   673         {
       
   674         // Complete message on leaving cases with leave code.
       
   675         __TRACE( KError, ( CStifLogger::ERed, _L( "CTestModule::DispatchMessageL leaved" ) ) );
       
   676         aMessage.Complete( ret );
       
   677         }
       
   678 
       
   679     // Complete message with error code originating from message handling
       
   680     // function.
       
   681     if ( r != KErrNone )
       
   682         {
       
   683         __TRACE( KError, ( CStifLogger::ERed, _L( "CTestModule::DispatchMessageL returned error" ) ) );
       
   684         aMessage.Complete( r );
       
   685         }
       
   686 
       
   687      // __TRACE( KMessage,( _L( "CTestModule::ServiceL out" ) ) );
       
   688 
       
   689     }
       
   690 
       
   691 
       
   692 /*
       
   693 -------------------------------------------------------------------------------
       
   694 
       
   695     Class: CTestModule
       
   696 
       
   697     Method: DispatchMessageL
       
   698 
       
   699     Description: Dispatch message, calls corresponding function to do it.
       
   700 
       
   701     Parameters: const RMessage& aMessage  :inout:   Message to be handled
       
   702 
       
   703     Return Values: TInt                             Error code
       
   704 
       
   705     Errors/Exceptions: Leaves if operation handling function leaves
       
   706 
       
   707     Status: Proposal
       
   708 
       
   709 -------------------------------------------------------------------------------
       
   710 */
       
   711 TInt CTestModule::DispatchMessageL( const RMessage2& aMessage )
       
   712     {
       
   713 
       
   714     __TRACE( KMessage,( _L( "CTestModule::DispatchMessageL %d" ),
       
   715         aMessage.Function()  ) );
       
   716     switch( aMessage.Function() )
       
   717     {
       
   718     // Session specific
       
   719     case ETestServerCloseSession:                // Close whole session
       
   720         {
       
   721 		__TRACE( KError ,( _L( "Closing test module session" ) ) );
       
   722         return CloseSession( aMessage );
       
   723         }
       
   724     case ETestServerGetServerThreadId:           // Get Server ThreadId
       
   725         {
       
   726 		__TRACE( KError ,( _L( "Return server thread id" ) ) );
       
   727         return GetServerThreadIdL( aMessage );
       
   728         }
       
   729 
       
   730     case ETestModuleCreateSubSession :           // Create new test module subsession
       
   731         {
       
   732 		__TRACE( KError,( _L( "Creating test module session" ) ) );
       
   733         return CreateModuleSessionL( aMessage );
       
   734         }
       
   735 
       
   736     case ETestModuleCloseSubSession:             // Close module subsession
       
   737         {
       
   738         // Nothing to do.
       
   739         aMessage.Complete( KErrNone );
       
   740         return KErrNone;
       
   741         }
       
   742 
       
   743     case ETestExecutionCreateSubSession:         // Create new test execution subsession
       
   744         {
       
   745         return NewTestExecutionL( aMessage );
       
   746         }
       
   747  
       
   748     case ETestModuleEnumerateTestCases:          // Enumerate test cases
       
   749         {
       
   750 		__TRACE( KError,( _L( "Enumerating test cases" ) ) );
       
   751         return EnumerateTestCasesL( aMessage );
       
   752         }
       
   753         
       
   754     case ETestModuleGetTestCases:                // Get test cases
       
   755         {
       
   756         return GetTestCasesL( aMessage );
       
   757         }
       
   758 
       
   759     case ETestModuleErrorNotification:           // Request error notification
       
   760         {
       
   761         return HandleErrorNotificationL( aMessage );
       
   762         }
       
   763 
       
   764     case ETestModuleCancelAsyncRequest:
       
   765         {
       
   766         return CancelAsyncRequestL( aMessage );
       
   767         }
       
   768   
       
   769     // Subsession specific
       
   770     case ETestExecutionRunTestCase:              // Run test case
       
   771         {
       
   772 		__TRACE( KInit,( _L( "Running test case" ) ) );
       
   773         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   774         return testCase->RunTestCase( aMessage );
       
   775         }
       
   776         
       
   777     case ETestExecutionNotifyProgress:           // Test case prints
       
   778         {
       
   779         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   780         return testCase->NotifyPrint( aMessage );
       
   781         }
       
   782 
       
   783     case ETestExecutionNotifyEvent:              // Event notifications
       
   784         {
       
   785         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   786         return testCase->NotifyEvent( aMessage );
       
   787         }
       
   788         
       
   789     case ETestExecutionNotifyRemoteCmd:          // RemoteCmd notifications
       
   790         {
       
   791         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   792         return testCase->NotifyRemoteCmd( aMessage );
       
   793         }
       
   794     case ETestExecutionReadRemoteCmdInfo:          // RemoteCmd reading
       
   795         {
       
   796         //CTestExecution* testCase=CaseFromHandle( aMessage.Int3() );
       
   797         //return testCase->NotifyRemoteCmd( aMessage );
       
   798         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   799         return testCase->ReadRemoteCmdInfo( aMessage );
       
   800         }
       
   801 
       
   802 
       
   803     case ETestExecutionResume:                   // Resume case execution
       
   804         {
       
   805 		__TRACE( KVerbose,( _L( "Resuming test execution" ) ) );
       
   806         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   807         return testCase->Resume( aMessage );
       
   808         }
       
   809         
       
   810     case ETestExecutionPause:                    // Pause case execution
       
   811         {
       
   812 		__TRACE( KVerbose,( _L( "Pausing test execution" ) ) );
       
   813         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   814         return testCase->Pause( aMessage );
       
   815         }
       
   816             
       
   817     case ETestExecutionCloseSubSession:          // Close execution subsession
       
   818         {
       
   819         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   820         return testCase->CloseTestExecution( aMessage );
       
   821         }
       
   822 
       
   823     case ETestExecutionCancelAsyncRequest:       // Cancel async request
       
   824         {
       
   825         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   826         return testCase->CancelRequestL( aMessage );
       
   827         }
       
   828     case ETestExecutionNotifyCommand:            // Command notifications
       
   829         {
       
   830         CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
       
   831         return testCase->NotifyCommand( aMessage );
       
   832         }
       
   833 
       
   834     default:                                     // Invalid request
       
   835         {
       
   836         PanicClient( EBadRequest, aMessage );
       
   837         return KErrNotSupported;
       
   838         }
       
   839     }
       
   840 
       
   841     }
       
   842 
       
   843 
       
   844 /*
       
   845 -------------------------------------------------------------------------------
       
   846 
       
   847     Class: CTestModule
       
   848 
       
   849     Method: EnumerateTestCases
       
   850 
       
   851     Description: Enumerates test cases and returns test case count by writing
       
   852     result to client side package.
       
   853 
       
   854     Function obtains a TestModule and calls EnumerateTestCases from it.
       
   855     Test module will be released when calling GetTestCases function.
       
   856 
       
   857     Parameters: const RMessage& aMessage  :inout:   Message to be handled
       
   858 
       
   859     Return Values: TInt                             Operation result
       
   860 
       
   861     Errors/Exceptions: None
       
   862 
       
   863     Status: Proposal
       
   864 
       
   865 -------------------------------------------------------------------------------
       
   866 */
       
   867 TInt CTestModule::EnumerateTestCasesL( const RMessage2& aMessage )
       
   868     {
       
   869 
       
   870     __TRACE( KMessage,( _L( "CTestModule::EnumerateTestCasesL in" ) ) );
       
   871  
       
   872     // Get data from message
       
   873     TFileName config;
       
   874     TRAPD( res, aMessage.ReadL( 0, config ) );
       
   875     if(res == KErrDied)
       
   876         {
       
   877         RDebug::Print(_L("CTestModule::EnumerateTestCasesL() Reading from RMessage ended with KErrDied. Client is not alive anymore and this request will be ignored"));
       
   878         return res;
       
   879         }
       
   880     else if( res != KErrNone )
       
   881         {
       
   882         RDebug::Print(_L("CTestModule::EnumerateTestCasesL() #1 Panic client with [%d], res=[%d]"), EBadDescriptor, res);
       
   883         PanicClient( EBadDescriptor, aMessage );
       
   884         return res;
       
   885         }
       
   886 
       
   887     // Free old case data
       
   888     User::LeaveIfError( FreeCaseData() );
       
   889 
       
   890     // Get test cases from the test module
       
   891     User::LeaveIfError( GetTestModule( iEnumerateModule, config ) );
       
   892 
       
   893     // Enumerate test cases
       
   894     iEnumerateModule->EnumerateTestCases( config );
       
   895 
       
   896     // Something fatal?
       
   897     TInt r = iEnumerateModule->OperationErrorResult();
       
   898     if(  r != KErrNone )
       
   899         {
       
   900         // Enumeration module have crashed.
       
   901         delete iEnumerateModule;
       
   902         iEnumerateModule = NULL;
       
   903 
       
   904         return r;
       
   905         }
       
   906 
       
   907     // Error from module?
       
   908     if( iEnumerateModule->ModuleResult() != KErrNone )
       
   909         {
       
   910         return iEnumerateModule->ModuleResult();
       
   911         }
       
   912 
       
   913     // Write count to Ptr1()
       
   914     const RPointerArray<TTestCaseInfo>* testCases = iEnumerateModule->TestCases();
       
   915     
       
   916     if( testCases == NULL )
       
   917         {
       
   918         User::Leave( KErrGeneral );
       
   919         }
       
   920     
       
   921     CTestCasesList* testCasesList = NULL;
       
   922     for ( TInt i = 0; i < iTestCaseTitlesMap.Count(); i++ )
       
   923         {
       
   924         if ( iTestCaseTitlesMap[ i ]->GetConfigFileName() == config )
       
   925             {
       
   926             testCasesList = iTestCaseTitlesMap[ i ];
       
   927             break;
       
   928             }
       
   929         }
       
   930     if ( testCasesList == NULL )
       
   931         {
       
   932         testCasesList = CTestCasesList::NewL( config );
       
   933         CleanupStack::PushL( testCasesList );
       
   934         iTestCaseTitlesMap.AppendL( testCasesList );
       
   935         CleanupStack::Pop( testCasesList );
       
   936         }
       
   937     
       
   938     // Store titles (for further use, i.e. when asked for title from the interface via CTestModuleIf->CTestThreadContainer->CTestModuleContainer)
       
   939     testCasesList->ResetAndDestroy();
       
   940     TInt i;
       
   941     for(i = 0; i < testCases->Count(); i++)
       
   942         {
       
   943         //Handle situation when test cases are enumerated not as 0-based (testscripter, ...)
       
   944         if(i == 0 && (*testCases)[i]->iCaseNumber > 0)
       
   945             {
       
   946             testCasesList->AppendTestCaseL( KNullDesC );
       
   947             }
       
   948         testCasesList->AppendTestCaseL( (*testCases)[i]->iTitle );
       
   949         }
       
   950     
       
   951     TPckgBuf<TInt> countPckg( testCases->Count() );
       
   952     TRAP( res, aMessage.WriteL( 1, countPckg ) );
       
   953     if(res == KErrDied)
       
   954         {
       
   955         RDebug::Print(_L("CTestModule::EnumerateTestCasesL() Writing to RMessage ended with KErrDied. Client is not alive anymore and this request will be ignored"));
       
   956         return res;
       
   957         }
       
   958     else if( res != KErrNone )
       
   959         {
       
   960         RDebug::Print(_L("CTestModule::EnumerateTestCasesL() #2 Panic client with [%d], res=[%d], config=[%S]"), EBadDescriptor, res, &config);
       
   961         PanicClient( EBadDescriptor, aMessage );
       
   962         return res;
       
   963         }
       
   964 
       
   965     // All ok, complete message
       
   966     aMessage.Complete( KErrNone );
       
   967 
       
   968     __TRACE( KMessage,( _L( "CTestModule::EnumerateTestCasesL out" ) ) );
       
   969     
       
   970     return KErrNone;
       
   971 
       
   972     }
       
   973 
       
   974 
       
   975 /*
       
   976 -------------------------------------------------------------------------------
       
   977 
       
   978     Class: CTestModule
       
   979 
       
   980     Method: GetTestCasesL
       
   981 
       
   982     Description: Get test cases. Enumerate test cases must be called before
       
   983     calling this function.
       
   984 
       
   985     Function releases the test module reserved by EnumerateTestCase().
       
   986 
       
   987     Parameters: const RMessage& aMessage  :inout:   Message to be handled
       
   988 
       
   989     Return Values: TInt                             Operation result
       
   990 
       
   991     Errors/Exceptions: Leaves if cases have not been enumerated.
       
   992 
       
   993     Status: Proposal
       
   994 
       
   995 -------------------------------------------------------------------------------
       
   996 */
       
   997 TInt CTestModule::GetTestCasesL( const RMessage2& aMessage )
       
   998     {
       
   999 
       
  1000     __TRACE( KMessage,( _L( "CTestModule::GetTestCasesL in" ) ) );
       
  1001 
       
  1002     // Leave if cases have not been enumerated.
       
  1003     //User::LeaveIfNull(( TAny* ) iEnumerateModule->TestCases() );
       
  1004     if( ( TAny* ) iEnumerateModule->TestCases() == NULL )
       
  1005         {
       
  1006         User::Leave( KErrGeneral );
       
  1007         }
       
  1008 
       
  1009     const TInt len = sizeof( TTestCaseInfo );
       
  1010     
       
  1011     // Get cases
       
  1012     const RPointerArray<TTestCaseInfo>& cases = *iEnumerateModule->TestCases();
       
  1013 
       
  1014     // Get number of cases
       
  1015     const TInt Kcount = cases.Count();
       
  1016 
       
  1017     // Loop through case and copy then to client's descriptor.
       
  1018     for( TInt i = 0; i < Kcount; i++ )
       
  1019         {
       
  1020 
       
  1021         // Construct package for source data
       
  1022         TTestCaseInfoPckg tmpPackage( *cases[i] );
       
  1023 
       
  1024         // Write to correct location
       
  1025         aMessage.WriteL( 0, tmpPackage, i *len );
       
  1026 
       
  1027         }
       
  1028 
       
  1029     // Free case data and the test module
       
  1030     User::LeaveIfError( FreeCaseData() );
       
  1031 
       
  1032     // Finished
       
  1033     aMessage.Complete( KErrNone );
       
  1034 
       
  1035     __TRACE( KMessage,( _L( "CTestModule::GetTestCasesL out" ) ) );
       
  1036 
       
  1037     return KErrNone;
       
  1038 
       
  1039     }
       
  1040 
       
  1041 
       
  1042 /*
       
  1043 -------------------------------------------------------------------------------
       
  1044 
       
  1045     Class: CTestModule
       
  1046 
       
  1047     Method: HandleErrorNotification
       
  1048 
       
  1049     Description: Request error notification.
       
  1050 
       
  1051     Parameters: const RMessage& aMessage  :inout:   Message to be handled
       
  1052 
       
  1053     Return Values: TInt                             Operation result
       
  1054 
       
  1055     Errors/Exceptions: None
       
  1056 
       
  1057     Status: Proposal
       
  1058 
       
  1059 -------------------------------------------------------------------------------
       
  1060 */
       
  1061 TInt CTestModule::HandleErrorNotificationL( const RMessage2& aMessage )
       
  1062     {
       
  1063     
       
  1064     iErrorMessage = aMessage;
       
  1065     iErrorMessageAvailable = ETrue;
       
  1066 
       
  1067     return KErrNone;
       
  1068 
       
  1069     }
       
  1070 
       
  1071 /*
       
  1072 -------------------------------------------------------------------------------
       
  1073 
       
  1074     Class: CTestModule
       
  1075 
       
  1076     Method: GetServerThreadId
       
  1077 
       
  1078     Description: Request server state notification.
       
  1079 
       
  1080     Parameters: const RMessage& aMessage :inout: Message to be handled
       
  1081 
       
  1082     Return Values: TInt Operation result
       
  1083 
       
  1084     Errors/Exceptions: None
       
  1085 
       
  1086     Status: Proposal
       
  1087 
       
  1088 -------------------------------------------------------------------------------
       
  1089 */
       
  1090 TInt CTestModule::GetServerThreadIdL( const RMessage2& aMessage )
       
  1091     {
       
  1092       
       
  1093     TInt id( iTestServer->GetServerThreadId() );
       
  1094    
       
  1095     TPckg<TThreadId> threadIdPckg( id );
       
  1096    
       
  1097     TRAPD( res, aMessage.WriteL( 0, threadIdPckg ) );
       
  1098     
       
  1099       // Finished
       
  1100     aMessage.Complete( res );
       
  1101     
       
  1102     return KErrNone;
       
  1103 
       
  1104     }      
       
  1105 
       
  1106 /*
       
  1107 -------------------------------------------------------------------------------
       
  1108 
       
  1109     Class: CTestModule
       
  1110 
       
  1111     Method: CancelAsyncRequest
       
  1112 
       
  1113     Description: Cancels asynchronous request
       
  1114 
       
  1115     Parameters: const RMessage& aMessage  :inout:   Message to be handled
       
  1116 
       
  1117     Return Values: TInt                             Operation result
       
  1118 
       
  1119     Errors/Exceptions: None
       
  1120 
       
  1121     Status: Proposal
       
  1122 
       
  1123 -------------------------------------------------------------------------------
       
  1124 */
       
  1125 TInt CTestModule::CancelAsyncRequestL( const RMessage2& aMessage )
       
  1126     {
       
  1127     
       
  1128     switch ( aMessage.Int0() )
       
  1129         {
       
  1130         case ETestModuleErrorNotification:
       
  1131             {
       
  1132             if ( iErrorMessageAvailable )
       
  1133                 {
       
  1134                 iErrorMessage.Complete ( KErrCancel );
       
  1135                 iErrorMessageAvailable = EFalse;
       
  1136                 }
       
  1137             aMessage.Complete ( KErrNone );
       
  1138             break;
       
  1139             }
       
  1140 
       
  1141         default:
       
  1142             {
       
  1143             PanicClient( EInvalidRequestCancel, aMessage );
       
  1144             break;
       
  1145             }
       
  1146         }
       
  1147 
       
  1148     return KErrNone;
       
  1149 
       
  1150     }
       
  1151 
       
  1152 /*
       
  1153 -------------------------------------------------------------------------------
       
  1154 
       
  1155     Class: CTestModule
       
  1156 
       
  1157     Method: ErrorPrint
       
  1158 
       
  1159     Description: Prints error
       
  1160 
       
  1161     Parameters: const TInt aPriority :in: Priority
       
  1162                 TPtrC aError: in: Error
       
  1163 
       
  1164     Return Values: None
       
  1165 
       
  1166     Errors/Exceptions: None
       
  1167 
       
  1168     Status: Proposal
       
  1169 
       
  1170 -------------------------------------------------------------------------------
       
  1171 */
       
  1172 void CTestModule::ErrorPrint( const TInt aPriority, 
       
  1173                               TPtrC aError )
       
  1174     {
       
  1175 
       
  1176     if ( iErrorMessageAvailable )
       
  1177         {        
       
  1178         TErrorNotification error;
       
  1179         TErrorNotificationPckg errorPckg ( error );
       
  1180 
       
  1181         error.iModule = _L("TestServer");
       
  1182         error.iPriority = aPriority;
       
  1183         error.iText = aError;
       
  1184 
       
  1185         TRAPD( r, iErrorMessage.WriteL( 0, errorPckg ) );
       
  1186         
       
  1187         // Do not handle errors
       
  1188         iErrorMessageAvailable = EFalse;
       
  1189         iErrorMessage.Complete( r );
       
  1190 
       
  1191         }
       
  1192     else
       
  1193         {
       
  1194         RDebug::Print (_L("Error message lost %d [%S]"), aPriority, &aError );
       
  1195         }
       
  1196     
       
  1197     }
       
  1198 
       
  1199 /*
       
  1200 -------------------------------------------------------------------------------
       
  1201 
       
  1202     Class: CTestModule
       
  1203 
       
  1204     Method: FreeCaseData
       
  1205 
       
  1206     Description: Frees the test case data and test module that is used in
       
  1207     enumeration.
       
  1208 
       
  1209     Parameters: None
       
  1210 
       
  1211     Return Values: TInt                             Error code
       
  1212 
       
  1213     Errors/Exceptions: None
       
  1214 
       
  1215     Status: Proposal
       
  1216 
       
  1217 -------------------------------------------------------------------------------
       
  1218 */
       
  1219 TInt CTestModule::FreeCaseData()
       
  1220     {
       
  1221 
       
  1222     __TRACE( KMessage,( _L( "CTestModule::FreeCaseData in" ) ) );
       
  1223  
       
  1224     TInt r = KErrNone;
       
  1225 
       
  1226     if( iEnumerateModule )
       
  1227         {
       
  1228         
       
  1229         // Deallocate testcase memory
       
  1230         iEnumerateModule->FreeEnumerationData();
       
  1231 
       
  1232         // Free the module
       
  1233         r = FreeTestModule( iEnumerateModule );
       
  1234 
       
  1235         iEnumerateModule = NULL;
       
  1236 
       
  1237         }
       
  1238 
       
  1239     __TRACE( KMessage,( _L( "CTestModule::FreeCaseData out" ) ) );
       
  1240 
       
  1241     return r;
       
  1242 
       
  1243     }
       
  1244 
       
  1245 
       
  1246 /*
       
  1247 -------------------------------------------------------------------------------
       
  1248 
       
  1249     Class: CTestModule
       
  1250 
       
  1251     Method: CreateModuleSessionL
       
  1252 
       
  1253     Description: Creates a new module session.
       
  1254     Just take the initialisation file name from message.
       
  1255 
       
  1256     Parameters: const RMessage& aMessage  :inout:   Message to be handled
       
  1257 
       
  1258     Return Values: TInt                             Operation result
       
  1259 
       
  1260     Errors/Exceptions: Leaves if memory allocation fails
       
  1261 
       
  1262     Status: Proposal
       
  1263 
       
  1264 -------------------------------------------------------------------------------
       
  1265 */
       
  1266 TInt CTestModule::CreateModuleSessionL( const RMessage2& aMessage )
       
  1267     {
       
  1268 
       
  1269     __TRACE( KMessage,( _L( "CTestModule::CreateModuleSession in" ) ) );
       
  1270 
       
  1271     // Take parameters
       
  1272     TFileName ini;
       
  1273     TRAPD( res, aMessage.ReadL( 0, ini ) );
       
  1274     if( res != KErrNone )
       
  1275         {
       
  1276         PanicClient( EBadDescriptor, aMessage );
       
  1277         return res;
       
  1278         }
       
  1279 
       
  1280     // Construct heap buffer for initialization file name
       
  1281     iIniBuffer = HBufC::NewL( ini.Length() );
       
  1282     iIni.Set ( iIniBuffer->Des() );
       
  1283     iIni.Copy ( ini );
       
  1284 
       
  1285     aMessage.Complete( KErrNone );
       
  1286 
       
  1287     __TRACE( KMessage,( _L( "CTestModule::CreateModuleSession out" ) ) );
       
  1288 
       
  1289     return KErrNone;
       
  1290 
       
  1291     }
       
  1292 
       
  1293 /*
       
  1294 -------------------------------------------------------------------------------
       
  1295 
       
  1296     Class: CTestModule
       
  1297 
       
  1298     Method: NewTestExecutionL
       
  1299 
       
  1300     Description: Create new test execution subsession
       
  1301     
       
  1302     Parameters: const RMessage& aMessage  :inout:   Message to be handled
       
  1303     
       
  1304     Return Values: TInt                             Operation result
       
  1305 
       
  1306     Errors/Exceptions: Function leaves if object can't be created or
       
  1307                        it can't be added to container.
       
  1308                        Function panics client if message contains invalid
       
  1309                        descriptor.
       
  1310 
       
  1311     Status: Proposal
       
  1312     
       
  1313 -------------------------------------------------------------------------------
       
  1314 */
       
  1315 TInt CTestModule::NewTestExecutionL( const RMessage2& aMessage )
       
  1316     {
       
  1317 
       
  1318     __TRACE( KMessage,( _L( "CTestModule::NewTestExecutionL in" ) ) );
       
  1319 
       
  1320     // Get data from message
       
  1321     TInt caseNumber = aMessage.Int0();
       
  1322     TFileName config;
       
  1323     
       
  1324     TRAPD( res, aMessage.ReadL( 1, config ) );
       
  1325     if( res != KErrNone )
       
  1326         {
       
  1327         PanicClient( EBadDescriptor, aMessage );
       
  1328         return res;
       
  1329         }
       
  1330 
       
  1331     // Make new object
       
  1332     CTestExecution* execution=CTestExecution::NewL( this, caseNumber, config );
       
  1333 
       
  1334     // add object to object container to generate unique id
       
  1335     iContainer->AddL( execution );
       
  1336 
       
  1337     // add object to object index; this returns a unique handle so we can get it again
       
  1338     TInt handle=iTestExecutionHandle->AddL( execution );
       
  1339 
       
  1340     // write the handle to client
       
  1341     TPckg<TInt> handlePckg( handle );
       
  1342     TRAP( res, aMessage.WriteL( 3, handlePckg ) );
       
  1343     if( res != KErrNone )
       
  1344         {
       
  1345         iTestExecutionHandle->Remove( handle );
       
  1346         PanicClient( EBadDescriptor, aMessage );
       
  1347         return res;
       
  1348         }
       
  1349 
       
  1350     // notch up another resource
       
  1351     iResourceCount++;
       
  1352 
       
  1353     // Complete message
       
  1354     aMessage.Complete( KErrNone );
       
  1355 
       
  1356     __TRACE( KMessage,( _L( "CTestModule::NewTestExecutionL out" ) ) );
       
  1357 
       
  1358     return KErrNone;
       
  1359     }
       
  1360 
       
  1361 /*
       
  1362 -------------------------------------------------------------------------------
       
  1363 
       
  1364     Class: CTestModule
       
  1365 
       
  1366     Method: DeleteTestExecution
       
  1367 
       
  1368     Description: Deletes Test Execution by handle
       
  1369 
       
  1370     Parameters: const TUint aHandle           :in:  Handle
       
  1371 
       
  1372     Return Values: None
       
  1373 
       
  1374     Errors/Exceptions: Panics client if invalid handle
       
  1375 
       
  1376     Status: Proposal
       
  1377 
       
  1378 -------------------------------------------------------------------------------
       
  1379 */
       
  1380 void CTestModule::DeleteTestExecution( const TUint aHandle, const RMessage2& aMessage )
       
  1381     {
       
  1382 
       
  1383     // Verify that handle is valid
       
  1384     CaseFromHandle( aHandle, aMessage );
       
  1385 
       
  1386     // Remove object
       
  1387     iTestExecutionHandle->Remove( aHandle );
       
  1388 
       
  1389     // Decrement resource count.
       
  1390     iResourceCount--;
       
  1391 
       
  1392     }
       
  1393 
       
  1394 
       
  1395 /*
       
  1396 -------------------------------------------------------------------------------
       
  1397 
       
  1398     Class: CTestModule
       
  1399 
       
  1400     Method: CaseFromHandle
       
  1401 
       
  1402     Description: Return subsession from handle
       
  1403 
       
  1404     Parameters: const TUint aHandle           :in:  Handle
       
  1405 
       
  1406     Return Values: CTestExecution*                  Test Execution object
       
  1407 
       
  1408     Errors/Exceptions: Function panics client if invalid handle.
       
  1409 
       
  1410     Status: Approved
       
  1411     
       
  1412 -------------------------------------------------------------------------------
       
  1413 */
       
  1414 CTestExecution* CTestModule::CaseFromHandle( const TUint aHandle, const RMessage2& aMessage ) const
       
  1415     {
       
  1416 
       
  1417     CTestExecution* testcase =( CTestExecution* ) iTestExecutionHandle->At( aHandle );
       
  1418 
       
  1419     if( testcase == NULL )
       
  1420         {
       
  1421         PanicClient( EBadSubsessionHandle, aMessage );
       
  1422         }
       
  1423 
       
  1424     return testcase;
       
  1425 
       
  1426     }
       
  1427 
       
  1428 
       
  1429 /*
       
  1430 -------------------------------------------------------------------------------
       
  1431 
       
  1432     Class: CTestModule
       
  1433 
       
  1434     Method: GetTestModule
       
  1435 
       
  1436     Description: Gets a CTestModuleBase*. If there is a free entry
       
  1437     in the free list, then it is returned. Otherwise a new one is created.
       
  1438 
       
  1439     Parameters: CTestModuleContainer*& aContainer: out: container pointer.
       
  1440                 const TDesC& aConfig: in: Test case (config) file name.
       
  1441 
       
  1442     Return Values: Symbian OS error code
       
  1443     
       
  1444     Errors/Exceptions: None
       
  1445 
       
  1446     Status: Proposal
       
  1447 
       
  1448 -------------------------------------------------------------------------------
       
  1449 */
       
  1450 TInt CTestModule::GetTestModule( CTestModuleContainer*& aContainer,
       
  1451                                     const TDesC& aConfig )
       
  1452     {
       
  1453     TInt ret = KErrNone;
       
  1454 
       
  1455     if( iTestModuleInstances->Count() )
       
  1456         {
       
  1457         // Return an existing one        
       
  1458         aContainer =( *iTestModuleInstances )[0];
       
  1459         iTestModuleInstances->Remove( 0 );
       
  1460 		__TRACE( KInit,( _L( "Reusing old test module container instance at 0x%x" ), (TUint32) aContainer ) );
       
  1461         }
       
  1462     else
       
  1463         {
       
  1464         // Create a new one    
       
  1465         __TRACE( KInit,( _L( "Creating new test module instance" ) ) );
       
  1466         TRAPD( err, aContainer = CTestModuleContainer::NewL( 
       
  1467                                                 iTestServer->ModuleName(),
       
  1468                                                 this,
       
  1469                                                 aConfig ) );
       
  1470 
       
  1471         // If module can't be created, then return NULL.
       
  1472         if( err )
       
  1473             {
       
  1474             __TRACE( KError,( _L( "Can't create new test module container instance" ) ) );
       
  1475             aContainer = NULL;
       
  1476             ret = err;
       
  1477             }
       
  1478 		else
       
  1479 			{
       
  1480 			__TRACE( KInit,( _L( "Test module instance container created" ) ) );
       
  1481 			}
       
  1482 
       
  1483         if( aContainer )
       
  1484             {
       
  1485 
       
  1486             // Initialise module
       
  1487             aContainer->Initialize( iTestServer->ModuleName(), iTestServer->FirstTime() );
       
  1488 
       
  1489             if( aContainer->OperationErrorResult() != KErrNone )
       
  1490                 {
       
  1491                 // Can't initialise module, delete it
       
  1492                 __TRACE( KError,( CStifLogger::ERed, _L( "Operation error, can't initialize test module container instance" ) ) );
       
  1493                 ret = aContainer->OperationErrorResult();                    
       
  1494                 delete aContainer;
       
  1495                 aContainer = NULL;
       
  1496                 }
       
  1497             else if( aContainer->ModuleResult() != KErrNone )
       
  1498                 {
       
  1499                 // Can't initialise module, delete it
       
  1500                 __TRACE( KError,( CStifLogger::ERed, _L( "Module error, can't initialize test module container instance" ) ) );
       
  1501                 ret = aContainer->ModuleResult();
       
  1502                 delete aContainer;
       
  1503                 aContainer = NULL;
       
  1504                 }
       
  1505             else
       
  1506                 {
       
  1507                 // Module initialised properly, clear the first time flag.
       
  1508                 iTestServer->ClearFirstTime();
       
  1509 				__TRACE( KInit,( _L( "Test module container initialized at 0x%x" ), (TUint32) aContainer ) );
       
  1510                 }
       
  1511             }
       
  1512         }
       
  1513 
       
  1514     return ret;
       
  1515 
       
  1516     }
       
  1517 
       
  1518 
       
  1519 /*
       
  1520 -------------------------------------------------------------------------------
       
  1521 
       
  1522     Class: CTestModule
       
  1523 
       
  1524     Method: FreeTestModule
       
  1525 
       
  1526     Description:Frees a CTestModuleContainer. This function can be called
       
  1527     from the context of the test execution thread.
       
  1528     
       
  1529     Parameters: CTestModuleContainer* aModule :in:  Module to be freed
       
  1530     
       
  1531     Return Values: TInt                             Error code
       
  1532 
       
  1533     Errors/Exceptions: None
       
  1534 
       
  1535     Status: Proposal
       
  1536     
       
  1537 -------------------------------------------------------------------------------
       
  1538 */
       
  1539 TInt CTestModule::FreeTestModule( CTestModuleContainer* aModule )
       
  1540     {
       
  1541   
       
  1542     // Free the module
       
  1543     TInt r = iTestModuleInstances->Append( aModule );
       
  1544     if( r != KErrNone )
       
  1545         {
       
  1546         delete aModule;
       
  1547         aModule = NULL;
       
  1548         }
       
  1549 
       
  1550     return r;
       
  1551 
       
  1552     }
       
  1553 
       
  1554 /*
       
  1555 -------------------------------------------------------------------------------
       
  1556 
       
  1557     Class: CTestModule
       
  1558 
       
  1559     Method: IniName
       
  1560 
       
  1561     Returns the initialisation file name
       
  1562     
       
  1563     Parameters: None
       
  1564     
       
  1565     Return Values: const TDesC&                     Initialisation file name
       
  1566 
       
  1567     Errors/Exceptions: None
       
  1568 
       
  1569     Status: Proposal
       
  1570     
       
  1571 -------------------------------------------------------------------------------
       
  1572 */
       
  1573 
       
  1574 const TDesC& CTestModule::IniName() const
       
  1575     {
       
  1576 
       
  1577     return iIni;
       
  1578 
       
  1579     }
       
  1580 
       
  1581 /*
       
  1582 -------------------------------------------------------------------------------
       
  1583 
       
  1584     Class: CTestModule
       
  1585 
       
  1586     Method: Name
       
  1587 
       
  1588     Returns the module name
       
  1589     
       
  1590     Parameters: None
       
  1591     
       
  1592     Return Values: const TDesC&                     Initialisation file name
       
  1593 
       
  1594     Errors/Exceptions: None
       
  1595 
       
  1596     Status: Proposal
       
  1597     
       
  1598 -------------------------------------------------------------------------------
       
  1599 */
       
  1600 const TDesC& CTestModule::Name() const
       
  1601     {
       
  1602 
       
  1603     return iTestServer->ModuleName();
       
  1604 
       
  1605     }
       
  1606 
       
  1607 /*
       
  1608 -------------------------------------------------------------------------------
       
  1609 
       
  1610     Class: CTestModule
       
  1611 
       
  1612     Method: GetTestCaseTitleL
       
  1613 
       
  1614     Gets title of currently running test case
       
  1615     
       
  1616     Parameters: None
       
  1617     
       
  1618     Return Values: TInt aTestCaseNumber: in: index of currently running test case
       
  1619                    TDes& aTestCaseTitle: out: test case title
       
  1620 
       
  1621     Errors/Exceptions: None
       
  1622 
       
  1623     Status: Proposal
       
  1624     
       
  1625 -------------------------------------------------------------------------------
       
  1626 */
       
  1627 void CTestModule::GetTestCaseTitleL(TInt aTestCaseNumber, const TDesC& aConfigFile,TDes& aTestCaseTitle)
       
  1628     {
       
  1629     CTestCasesList* testCasesList = NULL;
       
  1630     for ( TInt i = 0; i < iTestCaseTitlesMap.Count(); i++ )
       
  1631         {
       
  1632         if ( iTestCaseTitlesMap[ i ]->GetConfigFileName() == aConfigFile )
       
  1633             {
       
  1634             testCasesList = iTestCaseTitlesMap[ i ];
       
  1635             break;
       
  1636             }
       
  1637         }
       
  1638     if ( testCasesList == NULL )
       
  1639         {
       
  1640         User::Leave( KErrNotFound );
       
  1641         }
       
  1642     
       
  1643     RDebug::Print(_L("Trying to get test case title from module. Index=%d, count=%d"), aTestCaseNumber, testCasesList->Count() );
       
  1644     
       
  1645     aTestCaseTitle.Copy( testCasesList->GetTestCaseTitleL( aTestCaseNumber ) );
       
  1646     }
       
  1647 
       
  1648 
       
  1649 /*
       
  1650 -------------------------------------------------------------------------------
       
  1651 
       
  1652     Class: CTestModule
       
  1653 
       
  1654     Method: GetTestServer
       
  1655 
       
  1656     Gets pointer to TestServer
       
  1657     
       
  1658     Parameters: None
       
  1659     
       
  1660     Return Values: CTestServer : pointer to TestServer
       
  1661 
       
  1662     Errors/Exceptions: None
       
  1663 
       
  1664     Status: Proposal
       
  1665     
       
  1666 -------------------------------------------------------------------------------
       
  1667 */
       
  1668 CTestServer* CTestModule::GetTestServer()
       
  1669     {
       
  1670     return iTestServer;
       
  1671     }
       
  1672 
       
  1673 // End of File