diff -r 3406c99bc375 -r 07b41fa8d1dd stif/TestEngine/src/TestEngine.cpp --- a/stif/TestEngine/src/TestEngine.cpp Thu Jul 15 20:25:38 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6214 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: This module contains implementation of -* CTestEngineServer class member functions. -* -*/ - -// INCLUDE FILES -#include -#include -#include -#include "TestEngine.h" -#include "TestEngineClient.h" -#include "TestEngineCommon.h" -#include -#include "TestModuleController.h" -#include "TestCaseController.h" -#include "TestReport.h" -#include "Logging.h" -#include "SettingServerClient.h" -//--PYTHON-- begin -#include "StifPython.h" -#include "StifPythonFunEng.h" -//--PYTHON-- end - -// EXTERNAL DATA STRUCTURES -// None - -// EXTERNAL FUNCTION PROTOTYPES -// None - -// CONSTANTS -_LIT( KTestModule, "TestModule=" ); -_LIT( KTestCaseFile, "TestCaseFile=" ); -_LIT( KTestCaseNumber, "TestCaseNumber=" ); -_LIT( KTestCaseTitle, "TestCaseTitle=" ); -_LIT( KStateCode, "StateCode=" ); -_LIT( KStateName, "StateName=" ); - -// MACROS -// None - -// LOCAL CONSTANTS AND MACROS -// None - -// MODULE DATA STRUCTURES -struct TThreadStartTestEngine - { - RThread iEngineThread; // The server thread - RSemaphore iStarted; // Startup syncronisation semaphore - }; - -// LOCAL FUNCTION PROTOTYPES -// None - -// FORWARD DECLARATIONS -// None - -// ==================== LOCAL FUNCTIONS ======================================= -// None - -// ================= MEMBER FUNCTIONS ========================================= - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Function: ErrorPrint - - Description: ErrorPrint - - Parameters: const TInt aPriority: in: Priority of error - TPtrC aError: in: Error description - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ErrorPrint( const TInt aPriority, - TPtrC aError ) - { - TErrorNotification error; - TErrorNotificationPckg errorPckg ( error ); - - error.iModule = _L("TestEngine"); - error.iPriority = aPriority; - error.iText = aError; - - ErrorPrint( errorPckg ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestModule - - Method: ErrorPrint - - Description: Sends error notification - - Parameters: TErrorNotificationPckg aError: in: Error - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ErrorPrint( TErrorNotificationPckg aError ) - { - // Add new item to end of queue - if ( iErrorQueue.Append ( aError() ) != KErrNone ) - { - RDebug::Print (_L("Error message lost")); - return; - } - - ProcessErrorQueue(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestModule - - Method: ProcessErrorQueue - - Description: Process error queue - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ProcessErrorQueue() - { - // If message is available, complete first item from queue - if ( iErrorMessageAvailable ) - { - - if ( iErrorQueue.Count() > 0 ) - { - TErrorNotification err = iErrorQueue[0]; - TErrorNotificationPckg errPckg(err); - iErrorQueue.Remove(0); - - TInt r( KErrNone ); - - TRAP( r, iErrorMessage.WriteL( 0, errPckg ) ); - - // Do not handle errors - - iErrorMessageAvailable = EFalse; - iErrorMessage.Complete( KErrNone ); - } - } - - } - -/* -------------------------------------------------------------------------------- - - Function: LeaveIfErrorWithNotify - - Description: If error leave with notify - - Parameters: TInt aCode: in: Error code - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::LeaveIfErrorWithNotify( TInt aCode ) - { - LeaveIfErrorWithNotify ( aCode, _L("Check testengine log") ); - - } - -/* -------------------------------------------------------------------------------- - - Function: LeaveIfErrorWithNotify - - Description: If error leave with notify - - Parameters: TInt aCode: in: Error code - const TDesC& aText: in: Descriptive text - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::LeaveIfErrorWithNotify( TInt aCode, - const TDesC& aText ) - { - if ( aCode != KErrNone ) - { - LeaveWithNotifyL ( aCode, aText ); - } - - } - -/* -------------------------------------------------------------------------------- - - Function: LeaveWithNotifyL - - Description: Leave with notify - - Parameters: TInt aCode: in: Error code - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::LeaveWithNotifyL( TInt aCode ) - { - LeaveWithNotifyL ( aCode, _L("Check testengine log") ); - - } - -/* -------------------------------------------------------------------------------- - - Function: LeaveWithNotifyL - - Description: Leave with notify - - Parameters: TInt aCode: in: Error code - const TDesC& aText: in: Descriptive text - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::LeaveWithNotifyL( TInt aCode, - const TDesC& aText ) - { - ErrorPrint ( 0, aText ); - User::Leave ( aCode ); - - } - -#define LOGGER iLogger - -/* -------------------------------------------------------------------------------- - - Function: ThreadFunction - - Description: The thread function, where Test Engine lives in. - - Parameters: TAny* aStarted: in: Start info - - Return Values: TInt: Returns always KErrNone - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestEngineServer::ThreadFunction( TAny* aStarted ) - { -// __UHEAP_MARK; - - // Create cleanup stack - CTrapCleanup* cleanup = CTrapCleanup::New(); - __ASSERT_ALWAYS( cleanup, PanicServer( ECreateTrapCleanup ) ); - - // Get start-up information - TThreadStartTestEngine* startInfo = ( TThreadStartTestEngine* ) aStarted; - __ASSERT_ALWAYS( startInfo, PanicServer( ENoStartupInformation ) ); - - // Construct and install active scheduler - CActiveScheduler* scheduler = new CActiveScheduler; - __ASSERT_ALWAYS( scheduler, PanicServer( EMainSchedulerError ) ); - CActiveScheduler::Install( scheduler ); - - // Construct server, an active object - CTestEngineServer* server = NULL; - TRAPD( err, server = CTestEngineServer::NewL() ); - __ASSERT_ALWAYS( !err, PanicServer( ESvrCreateServer ) ); - - // Inform that we are up and running - startInfo->iStarted.Signal(); - - // Global mutex(handling according to the name) - RMutex startupMutex; - // Try to create global mutex, CREATE - TInt ret = startupMutex.CreateGlobal( KStifTestServerStartupMutex ); - if( ret != KErrNone ) - { - // Mutex already create, OPEN - ret = startupMutex.OpenGlobal( KStifTestServerStartupMutex ); - } - if( ret != KErrNone ) - { - // Not able to create or open mutex - return ret; - } - - // Start handling requests - CActiveScheduler::Start(); - - startupMutex.Close(); - - // Should come here after RTestEngineServer is closed - delete server; - delete scheduler; - delete cleanup; - -// __UHEAP_MARKEND; - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: CTestEngineServer - - Description: Default constructor - - C++ default constructor can NOT contain any code, that - might leave. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestEngineServer::CTestEngineServer() : - CServer2( CTestEngineServer::ETestEngineServerPriority ), - iSessionCount( 0 ) - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: ConstructL - - Description: Symbian OS second phase constructor - - Symbian OS default constructor can leave. - - Parameters: None - - Return Values: None - - Errors/Exceptions: Leaves if CObjectConIx::NewL leaves - Leaves if CStifLogger::NewL leaves - Leaves if StartL leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngineServer::ConstructL() - { - // Create report setting - iTestReportSettings = CTestReportSettings::NewL(); - // Create container - iContainerIndex = CObjectConIx::NewL(); - - // Create logger, in Wins use HTML in HW default logger - TLoggerSettings loggerSettings; - - // Directory must create by hand if test engine log wanted - loggerSettings.iCreateLogDirectories = EFalse; - - loggerSettings.iOverwrite = ETrue; - loggerSettings.iTimeStamp = ETrue; - loggerSettings.iLineBreak = ETrue; - loggerSettings.iEventRanking = EFalse; - loggerSettings.iThreadId = EFalse; - loggerSettings.iHardwareFormat = CStifLogger::ETxt; -#ifndef FORCE_STIF_INTERNAL_LOGGING_TO_RDEBUG - loggerSettings.iEmulatorFormat = CStifLogger::EHtml; - loggerSettings.iEmulatorOutput = CStifLogger::EFile; - loggerSettings.iHardwareOutput = CStifLogger::EFile; -#else - RDebug::Print( _L( "STIF Test Engine logging forced to RDebug" ) ); - loggerSettings.iEmulatorFormat = CStifLogger::ETxt; - loggerSettings.iEmulatorOutput = CStifLogger::ERDebug; - loggerSettings.iHardwareOutput = CStifLogger::ERDebug; -#endif - loggerSettings.iUnicode = EFalse; - loggerSettings.iAddTestCaseTitle = EFalse; - - iLogger = CStifLogger::NewL( _L( "C:\\logs\\testframework\\testengine\\"), - _L( "testengine" ), - loggerSettings ); - // Start Server - StartL( KTestEngineName ); - - __TRACE(KVerbose, (_L( "CTestEngineServer::ConstructL: Server Created" ) ) ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: NewL - - Description: Two-phased constructor. - - Parameters: None - - Return Values: CTestEngineServer* : pointer to CTestEngineServer object - - Errors/Exceptions: Leaves if construction of CBufferArray fails - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestEngineServer* CTestEngineServer::NewL() - { - CTestEngineServer* self = new ( ELeave ) CTestEngineServer(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: ~CTestEngineServer - - Description: Destructor - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestEngineServer::~CTestEngineServer() - { - delete iContainerIndex; - - __TRACE(KAlways, ( _L( "---------------- Log Ended ----------------" ) ) ); - delete iLogger; - - delete iTestReportSettings; - iTestReportSettings = NULL; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: NewContainerL - - Description: Create new container - - Parameters: None - - Return Values: None - - Errors/Exceptions: Leaves if called CreateL method leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CObjectCon* CTestEngineServer::NewContainerL() - { - CObjectCon* container = iContainerIndex->CreateL(); - - iSessionCount++; - - return container; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: DeleteContainer - - Description: Deletes a container - - Parameters: CObjectCon* - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngineServer::DeleteContainer( CObjectCon* aContainer ) - { - iContainerIndex->Remove( aContainer ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: SessionClosed - - Description: Inform Server that session is closed. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngineServer::SessionClosed() - { - // Decrease session count - iSessionCount--; - - // Check if last session is closed - if ( iSessionCount <= 0 ) - { - // Stop the active scheduler - // Execution will continue in ThreadFunction() - CActiveScheduler::Stop(); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: NewSessionL - - Description: Create a new client session for this server. - - Parameters: const TVersion& aVersion: in: Client side version number - - Return Values: CSharableSession* : pointer to CSharableSession object - - Errors/Exceptions: Leaves if given version is incorrect - Leaves if CTestEngine::NewL leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CSession2* CTestEngineServer::NewSessionL( const TVersion &aVersion, - const RMessage2& /*aMessage*/ ) const - { - // Check that version is ok - TVersion v( KTestEngineMajorVersionNumber, - KTestEngineMinorVersionNumber, - KTestEngineBuildVersionNumber ); - if ( !User::QueryVersionSupported( v, aVersion ) ) - { - User::Leave( KErrNotSupported ); - } - - return CTestEngine::NewL( ( CTestEngineServer* ) this ); - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: PanicServer - - Description: Panic the server - - Parameters: TTestEnginePanic aPanic: in: Panic number - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngineServer::PanicServer( TTestEnginePanic aPanic ) - { - _LIT( KTestServer, "CTestEngineServer" ); - User::Panic( KTestServer, aPanic ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineServer - - Method: Logger - - Description: Return the pointer to iLogger. - - Parameters: None - - Return Values: CStifLogger*: Pointer to StifLogger - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CStifLogger* CTestEngineServer::Logger() - { - return iLogger; - - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CTestEngine class member functions. - -------------------------------------------------------------------------------- -*/ -#undef LOGGER -#define LOGGER Logger() - -// ================= MEMBER FUNCTIONS ========================================= - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: CTestEngine - - Description: Default constructor - - C++ default constructor can NOT contain any code, that - might leave. - - Parameters: RThread& aClient: in: Client's thread - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ - CTestEngine::CTestEngine() : - CSession2(), - iReportMode( CTestReport::ETestReportFull ), - iReportOutput( CTestReport::ETestReportNone ), - iEnumerateModuleCount( 0 ), - iIsTestReportGenerated( EFalse ), - iDisableMeasurement( EEnableAll) - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ConstructL - - Description: Symbian OS second phase constructor - - Symbian OS default constructor can leave. - - Parameters: CTestEngineServer* aServer: in: Pointer to CTestEngineServer - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ConstructL( CTestEngineServer* aServer ) - { - // Log version info - TInt majorV; - TInt minorV; - TInt buildV; - TBuf<30> relDate; - TStifUtil::STIFVersion(majorV, minorV, buildV, relDate); - RDebug::Print(_L( "STIF startup... version %d.%d.%d (%S)"), majorV, minorV, buildV, &relDate); - - - // Second-phase construct base class - //CSession2::CreateL(); - - iTestEngineServer = aServer; - - // Create new object index - iTestEngineSubSessions = CObjectIx::NewL(); - - // Create new object index - iTestCases = CObjectIx::NewL(); - - // Initialize the object container from Server - iContainer = iTestEngineServer->NewContainerL(); - - __TRACE(KInit, (_L( "STIF startup... version %d.%d.%d (%S)"), majorV, minorV, buildV, &relDate)); - __TRACE( KInit, ( _L( "CTestEngine::ConstructL: Test Engine Created" ) ) ); - - - RFs iFs; - User::LeaveIfError( iFs.Connect() ); - _LIT(KCSteve,"C:\\Testframework\\"); - iFs.MkDirAll(KCSteve); - - iFs.Close(); - - iRebootDefaultPath.Set( _L( "C:\\TestFramework\\" ) ); - iRebootDefaultFilename.Set( _L( "Reboot.txt" ) ); - - TPtrC dllName; - dllName.Set( _L( "StifHWResetStub.dll" ) ); - iDeviceResetDllName = dllName.AllocL(); - - iDefaultTimeout = 0; - iUITestingSupport = EFalse; - iSeparateProcesses = EFalse; - - iIndexTestModuleControllers = 1; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: NewL - - Description: Two-phased constructor. - - Parameters: RThread& aClient : Client's thread - CTestEngineServer* aServer : Pointer to CTestEngineServer - - Return Values: CTestEngine* : pointer to CTestEngine object - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestEngine* CTestEngine::NewL( CTestEngineServer* aServer ) - { - CTestEngine* self = new ( ELeave ) CTestEngine(); - CleanupStack::PushL( self ); - self->ConstructL( aServer ); - CleanupStack::Pop(); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: CloseSession - - Description: Close client server session to Test Engine - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::CloseSession() - { - __TRACE( KInit, ( _L( "CTestEngine::CloseSession" ) ) ); - - iErrorQueue.Close(); - - // Delete test report - delete iTestReport; - iTestReport = NULL; - - // Delete device reset module's DLL name - delete iDeviceResetDllName; - iDeviceResetDllName = NULL; - - // Delete state events - iStateEvents.ResetAndDestroy(); - iStateEvents.Close(); - - //Delete Client events - iClientEvents.ResetAndDestroy(); - iClientEvents.Close(); - - // Remove contents of iTestCases - if ( iTestCases ) - { - TInt handle; - CObject* object = NULL; - TInt count = iTestCases->Count(); - - for ( TInt i = 0; i < count; i++ ) - { - object = iTestCases->operator[](i); - if ( object ) - { - handle = iTestCases->At( object ); - iTestCases->Remove( handle ); - } - } - - delete iTestCases; - iTestCases = NULL; - } - - iTestCaseArray.Close(); - delete iTestEngineSubSessions; - iTestEngineSubSessions = NULL; - - // Delete the object container - // This provides unique ids for the objects of this session - iTestEngineServer->DeleteContainer( iContainer ); - - // Inform server that session is closed - iTestEngineServer->SessionClosed(); - - delete iIniFile; - iIniFile = NULL; - - delete iRebootPath; - iRebootPath = NULL; - - delete iRebootFilename; - iRebootFilename = NULL; - - delete iRebootParams; - iRebootParams = 0; - - __TRACE(KVerbose, ( _L( "CTestEngine::CloseSession finished" ) ) ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: CountResources - - Description: Resource counding - - Parameters: None - - Return Values: TInt Resource count - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::CountResources() - { - return iResourceCount; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: NumResources - - Description: Get resources, writes to Message() - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::NumResources( const RMessage2& aMessage ) - { - - TInt ret( 0 ); - - TPckgBuf countPckg( iResourceCount ); - - TRAP( ret, aMessage.WriteL( 0, countPckg ) ); - - if ( ret != KErrNone ) - { - PanicClient( EBadDescriptor, aMessage ); - } - - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: PanicClient - - Description: Panic the client - - Parameters: TTestEnginePanic aPanic: in: Panic number - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::PanicClient( TTestEnginePanic aPanic, - const RMessage2& aMessage ) const - { - iTestEngineServer->Logger()->Log( CStifLogger::ERed, _L( "CTestEngine::PanicClient [%d]" ), aPanic ); - - _LIT( KTestEngine, "CTestEngine" ); - - aMessage.Panic( KTestEngine, aPanic ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ServiceL - - Description: Message handling method that calls trapped DispatchMessageL - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Error from DispatchMessageL is trapped and handled - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ServiceL( const RMessage2& aMessage ) - { - TRAPD( ret, DispatchMessageL( aMessage ) ); - if ( ret != KErrNone ) - { - __TRACE(KError, ( CStifLogger::ERed, _L( "CTestEngine::DispatchMessageL Function=[%d], left with [%d]" ), - aMessage.Function(), ret ) ); - if( ret == KErrNoMemory ) - { - __TRACE( KError, ( CStifLogger::ERed, _L( "No memory available. Some possibility to do: 1. Reduce test case count. 2. Increase StifTestEngine's heap size." ) ) ); - } - aMessage.Complete( ret ); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: DispatchMessageL - - Description: Actual message handling - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::DispatchMessageL( const RMessage2& aMessage ) - { - iComplete = ETrue; - iReturn = KErrNone; - - switch ( aMessage.Function() ) - { - case ETestEngineServerCloseSession: - { - if ( !iIsTestReportGenerated && iTestReport ) - { - iTestReport->GenerateReportL(); - iIsTestReportGenerated = ETrue; - } - CloseSession(); - break; - } - case ETestEngineCreateSubSession: - { - InitEngineL( aMessage ); - break; - } - case ETestEngineCloseSubSession: - { - CloseTestEngineL( aMessage.Int3() ); - break; - } - case ETestEngineSetAttribute: - { - SetAttributeL( aMessage ); - break; - } - - case ETestEngineAddTestModule: - { - AddTestModuleL( aMessage ); - break; - } - case ETestEngineRemoveTestModule: - { - iReturn = RemoveTestModuleL( aMessage ); - break; - } - case ETestEngineAddConfigFile: - { - AddConfigFileL( aMessage ); - break; - } - case ETestEngineRemoveConfigFile: - { - RemoveConfigFileL( aMessage ); - break; - } - case ETestEngineEnumerateTestCases: - { - EnumerateTestCasesL( aMessage ); - break; - } - case ETestEngineGetTestCases: - { - GetTestCasesL( aMessage ); - break; - } - case ETestEngineCancelAsyncRequest: - { - CancelAsyncRequest( aMessage ); - break; - } - case ETestEngineEvent: - { - EventControlL( aMessage ); - iComplete = EFalse; - break; - } - case ETestEngineErrorNotification: - { - HandleErrorNotificationL( aMessage ); - iComplete = EFalse; - break; - } - case ETestEngineLoggerSettings: - { - LoggerSettings( aMessage ); - break; - } - case ETestEngineCloseLoggerSettings: - { - CloseLoggerSettings(); - break; - } - case ETestEngineReportTestCase: - { - iReturn = AddTestCaseToTestReport(aMessage); - break; - } - // Subsession specific functions - case ETestCaseCreateSubSession: - { - NewTestCaseL( aMessage ); - break; - } - case ETestCaseCloseSubSession: - { - DeleteTestCase( aMessage.Int3() ); - break; - } - case ETestCaseRunTestCase: - { - TestCaseByHandle( aMessage.Int3(), aMessage )->RunTestCaseL( aMessage ); - iComplete = EFalse; - break; - } - case ETestCasePause: - { - iReturn = TestCaseByHandle( aMessage.Int3(), aMessage )->Pause(); - break; - } - case ETestCaseResume: - { - iReturn = TestCaseByHandle( aMessage.Int3(), aMessage )->Resume(); - break; - } - case ETestCaseNotifyProgress: - { - TestCaseByHandle( aMessage.Int3(), aMessage )->NotifyProgressL( aMessage ); - iComplete = EFalse; - break; - } - case ETestCaseNotifyRemoteType: - { - TestCaseByHandle( aMessage.Int3(), aMessage )->NotifyRemoteTypeL( aMessage ); - iComplete = EFalse; - break; - } - case ETestCaseNotifyRemoteMsg: - { - TestCaseByHandle( aMessage.Int3(), aMessage )->NotifyRemoteMsgL( aMessage ); - iComplete = EFalse; - break; - } - case ETestCaseCancelAsyncRequest: - { - TestCaseByHandle( - aMessage.Int3(), aMessage )->CancelAsyncRequest( aMessage ); - break; - } - default: - { - User::Leave( KErrNotSupported ); - break; - } - } - - if ( iComplete ) - { - aMessage.Complete( iReturn ); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: InitTestReportAndLoggerVarL - - Description: Initialize Test report and Logger's overwrite parameters - - Parameters: None - - Return Values: None - - Errors/Exceptions: Leaves if memory allocation fails - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::InitTestReportAndLoggerVarL() - { - // Test report settings initialization - iTestEngineServer->iTestReportSettings->iCreateTestReport = ETrue; - _LIT( path, "C:\\LOGS\\TestFramework\\"); - _LIT( name, "TestReport"); - delete iTestEngineServer->iTestReportSettings->iPath; - iTestEngineServer->iTestReportSettings->iPath = NULL; - iTestEngineServer->iTestReportSettings->iPath = path().AllocL(); - delete iTestEngineServer->iTestReportSettings->iName; - iTestEngineServer->iTestReportSettings->iName = NULL; - iTestEngineServer->iTestReportSettings->iName = name().AllocL(); - iTestEngineServer->iTestReportSettings->iFormat = CStifLogger::ETxt; - iTestEngineServer->iTestReportSettings->iOutput = CStifLogger::EFile; - iTestEngineServer->iTestReportSettings->iOverwrite = ETrue; - - // Initializations to indicator is setting in use - iTestEngineServer->iLoggerSettings.iIsDefined.iCreateLogDir = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iPath = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iHwPath = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iFormat = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iHwFormat = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iOutput = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iHwOutput = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iOverwrite = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iLineBreak = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iTimeStamp = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iEventRanking = EFalse; - iTestEngineServer->iLoggerSettings.iIsDefined.iThreadId = EFalse; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: InitEngineL - - Description: Init the test engine - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::InitEngineL( const RMessage2& aMessage ) - { - - // Parse reboot file - ParseRebootParamsL(); - - TName iniFileName; - - // Read ini file name from aMessage - aMessage.ReadL( 0, iniFileName ); - TStifUtil::CorrectFilePathL( iniFileName ); - - iIniFile = iniFileName.AllocL(); - - // HBufC to TPtrC - TPtrC iniFile( iIniFile->Des() ); - - __TRACE( KInit, ( CStifLogger::EBold, _L( "CTestEngine::InitEngineL\t iIniFile=[%S]" ), iIniFile ) ); - - // Connect to the Setting server and open handle(Handle will close when - // closing TestEngine). - TInt ret = iSettingServer.Connect(); - if ( ret != KErrNone ) - { - User::Leave( ret ); - } - - InitTestReportAndLoggerVarL(); - - if ( iniFile.Length() > 0 ) - { - Logger()->WriteDelimiter(); - __TRACE( KInit,( _L( "Starting to parse initialization file" ) ) ); - - // Set initialization file information to Setting server's side. - ret = iSettingServer.SetIniFileInformation( iniFileName ); - if ( ret != KErrNone ) - { - User::Leave( ret ); - } - // Struct to Logger settigs. - TLoggerSettings loggerSettings; - // Parse Logger defaults from STIF initialization file. - ret = iSettingServer.ReadLoggerSettingsFromIniFile( loggerSettings ); - if ( ret != KErrNone ) - { - User::Leave( ret ); - } - - // Create parser for parsing ini file - CStifParser* parser = NULL; - TRAPD( r, parser = CStifParser::NewL( _L(""), iniFile ) ); - if ( r != KErrNone ) - { - __TRACE( KError,( CStifLogger::ERed, _L( "Can't open ini-file [%S], code %d" ), &iniFile, r ) ); - LeaveWithNotifyL(r); - } - - CleanupStack::PushL( parser ); - - CSTIFTestFrameworkSettings* settings = NULL; - TRAPD( settings_ret, settings = CSTIFTestFrameworkSettings::NewL() ); - CleanupStack::PushL( settings ); - if ( settings_ret != KErrNone ) - { - __TRACE( KError,( CStifLogger::ERed, _L( "CSTIFTestFrameworkSettings class object creation fails") ) ); - LeaveWithNotifyL( settings_ret ); - } - - ReadEngineDefaultsL( parser, settings ); - - SetLoggerSettings( loggerSettings ) ; - - TRAP(r, ReadTestModulesL( parser )); - if(r != KErrNone) - { - __TRACE(KError, (CStifLogger::ERed, _L("Reading test modules finished with error [%d]"), r)); - User::Leave(r); - } - - CleanupStack::PopAndDestroy( settings ); - CleanupStack::PopAndDestroy( parser ); - __TRACE( KInit, ( _L( "Configuration file reading finished" ) ) ); - } - else - { - __TRACE( KInit,( CStifLogger::EBold, _L( "Initialisation file not specified." ) ) ); - } - - Logger()->WriteDelimiter(); - - // Create Test Reporter if allowed - if ( iTestEngineServer->iTestReportSettings->iCreateTestReport ) - { - TRAPD(err, iTestReport = - CTestReport::NewL( *(iTestEngineServer->iTestReportSettings), - ( CTestReport::TTestReportMode ) iReportMode )); - if(err!=KErrNone) - { - iTestReport = NULL; - __TRACE( KInit,( CStifLogger::ERed, _L( "Test report creation failed with error: %d, test report not created." ), err ) ); - __TRACE( KInit,( CStifLogger::ERed, _L( "Check your testreport settings from testframework.ini file (e.g. TestReportFilePath)." ) ) ); - } - } - - // Create test engine subsession object - CTestEngineSubSession* testEngineSubSession = - CTestEngineSubSession::NewL( this ); - CleanupStack::PushL( testEngineSubSession ); - - // Add object to object container to generate unique id - iContainer->AddL( testEngineSubSession ); - - // Add object to object index - // This returns a unique handle so we can get it again - TInt handle = iTestEngineSubSessions->AddL( testEngineSubSession ); - - // Write the handle to client - TPckg handlePckg( handle ); - - TRAPD( res, aMessage.WriteL( 3, handlePckg ) ); - if ( res != KErrNone ) - { - iTestEngineSubSessions->Remove( handle ); - PanicClient( EBadDescriptor, aMessage ); - return; - } - - CleanupStack::Pop( testEngineSubSession ); - - // Notch up another resource - iResourceCount++; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ReadEngineDefaults - - Description: Parse Test Engine defaults from STIF - initialization file. - - Parameters: CStifParser& parser: in: CStifParser object - CSTIFTestFrameworkSettings* aSettings: in: - CSTIFTestFrameworkSettings object - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ReadEngineDefaultsL( CStifParser* aParser, - CSTIFTestFrameworkSettings* aSettings ) - { - __TRACE( KInit,( _L( "" ) ) ); - __TRACE( KInit,( _L( "Start parsing engine defaults" ) ) ); - TInt get_ret( KErrNone ); - - CStifSectionParser* sectionParser = NULL; - - // Parse Engine's default values - _LIT( KDefaultsStart, "[Engine_Defaults]" ); - _LIT( KDefaultsEnd, "[End_Defaults]" ); - __TRACE( KInit,( _L( "Starting to search sections" ) ) ); - sectionParser = aParser->SectionL( KDefaultsStart, KDefaultsEnd ); - CleanupStack::PushL( sectionParser ); - if ( sectionParser ) - { - __TRACE( KInit,( _L( "Found '%S' and '%S' sections" ), &KDefaultsStart, &KDefaultsEnd ) ); - - // Get Test Report Mode - __TRACE( KInit,( _L( "Parsing Test report mode" ) ) ); - TUint reportMode( 0 ); - get_ret = aSettings->GetReportModeL( sectionParser, - _L( "TestReportMode=" ), reportMode ); - if ( get_ret == KErrNone ) - { - __TRACE( KInit,( _L( "Report mode: %d"), reportMode ) ); - iReportMode = reportMode; - } - else - { - __TRACE( KInit,( _L( "Report mode not found or not given" ) ) ); - } - - // Indicator to test report creation - __TRACE( KInit,( _L( "Parsing Test report creation indicator" ) ) ); - TBool createTestReport( 0 ); - get_ret = aSettings->GetBooleanSettingsL( sectionParser, - _L( "CreateTestReport=" ), createTestReport ); - if ( get_ret == KErrNone ) - { - __TRACE( KInit,( _L( "Test report creation indicator: %d"), createTestReport ) ); - iTestEngineServer->iTestReportSettings->iCreateTestReport = createTestReport; - } - else - { - __TRACE( KInit,( _L( "Creation indicator not found or not given" ) ) ); - } - - // Get Test report path settings - if ( iTestEngineServer->iTestReportSettings->iCreateTestReport ) - { - __TRACE( KInit,( _L( "Parsing Test report path" ) ) ); - TPtrC path; - get_ret = aSettings->GetFileSetting( sectionParser, - _L( "TestReportFilePath=" ), path ); - if ( get_ret == KErrNone ) - { - __TRACE( KInit,( _L( "Test report path: %S"), &path ) ); - // Delete old one before setting new one - delete iTestEngineServer->iTestReportSettings->iPath; - iTestEngineServer->iTestReportSettings->iPath = NULL; - iTestEngineServer->iTestReportSettings->iPath = path.AllocL(); - } - else - { - __TRACE( KInit,( _L( "Path not found or not given" ) ) ); - } - } - - // Get Test report name settings - if ( iTestEngineServer->iTestReportSettings->iCreateTestReport ) - { - __TRACE( KInit,( _L( "Parsing Test report filename" ) ) ); - TPtrC name; - get_ret = aSettings->GetFileSetting( sectionParser, - _L( "TestReportFileName=" ), name ); - if ( get_ret == KErrNone ) - { - __TRACE( KInit,( _L( "Test report filename: %S"), &name ) ); - // Delete old one before setting new one - delete iTestEngineServer->iTestReportSettings->iName; - iTestEngineServer->iTestReportSettings->iName = NULL; - iTestEngineServer->iTestReportSettings->iName = name.AllocL(); - } - else - { - __TRACE( KInit,( _L( "Filename not found or not given" ) ) ); - } - } - - // Get Test report format settings - if ( iTestEngineServer->iTestReportSettings->iCreateTestReport ) - { - __TRACE( KInit,( _L( "Parsing Test report format" ) ) ); - CStifLogger::TLoggerType type; - TBool xml; - get_ret = aSettings->GetFormatL( sectionParser, - _L( "TestReportFormat=" ), type, xml ); - if ( get_ret == KErrNone ) - { - __TRACE( KInit,( _L( "Test report format: %d, xml: %d"), type, xml ) ); - iTestEngineServer->iTestReportSettings->iFormat = type; - iTestEngineServer->iTestReportSettings->iXML = xml; - } - else - { - __TRACE( KInit,( _L( "Format not found or not given" ) ) ); - } - } - - // Get Test report output settings - if ( iTestEngineServer->iTestReportSettings->iCreateTestReport ) - { - __TRACE( KInit,( _L( "Parsing Test report output" ) ) ); - CStifLogger::TOutput output; - get_ret = aSettings->GetOutputL( sectionParser, - _L( "TestReportOutput=" ), output ); - if ( get_ret == KErrNone ) - { - __TRACE( KInit,( _L( "Test report output: %d"), output ) ); - iTestEngineServer->iTestReportSettings->iOutput = output; - } - else - { - __TRACE( KInit,( _L( "Output not found or not given" ) ) ); - } - } - - // Get Test report file creation mode (overwrite settings) - if ( iTestEngineServer->iTestReportSettings->iCreateTestReport ) - { - __TRACE( KInit,( _L( "Parsing Test report file writing mode" ) ) ); - TBool overwrite; - get_ret = aSettings->GetOverwriteL( sectionParser, - _L( "TestReportFileCreationMode=" ), overwrite ); - if ( get_ret == KErrNone ) - { - __TRACE( KInit,( _L( "Test report file creation mode: %d"), overwrite ) ); - iTestEngineServer->iTestReportSettings->iOverwrite = overwrite; - } - else - { - __TRACE( KInit,( _L( "Writing mode not found or not given" ) ) ); - } - } - // Get device reset module's DLL name - __TRACE( KInit,( _L( "Parsing device reset module's DLL name" ) ) ); - TPtrC deviceResetName; - get_ret = aSettings->GetFileSetting( sectionParser, - _L( "DeviceResetDllName=" ), deviceResetName ); - if ( get_ret == KErrNone ) - { - __TRACE( KInit,( _L( "Device reset module's name: %S"), &deviceResetName ) ); - // Delete old one before setting new one - delete iDeviceResetDllName; - iDeviceResetDllName = NULL; - iDeviceResetDllName = deviceResetName.AllocL(); - } - else - { - __TRACE( KInit,( _L( "Device reset module's name not found or not given" ) ) ); - } - - // Get measurement disable option - CStifItemParser* item = NULL; - TRAPD( ret, item = sectionParser->GetItemLineL( _L( "DisableMeasurement=" ), ENoTag ) ); - if( ( ret != KErrNone ) || ( item == NULL ) ) - { - __TRACE( KInit,( _L( "Measurement 'DiableMeasurement=' not found or not given" ) ) ); - delete item; - item = NULL; - } - else - { - CleanupStack::PushL( item ); - TPtrC string; - ret = item->GetString( KNullDesC(), string ); - while( ret == KErrNone ) - { - HBufC* stringHbuf = string.AllocL(); - TPtr modifiableString = stringHbuf->Des(); - modifiableString.LowerCase(); - - if( modifiableString == KStifMeasurementDisableNone || - modifiableString == KStifMeasurementDisableAll || - modifiableString == KStifMeasurement01 || - modifiableString == KStifMeasurement02 || - modifiableString == KStifMeasurement03 || - modifiableString == KStifMeasurement04 || - modifiableString == KStifMeasurement05 || - modifiableString == KStifMeasurementBappea ) - { - __TRACE( KInit,( _L( "Measurement disable option: %S"), &modifiableString ) ); - DisableStifMeasurement( modifiableString ); - } - else if( modifiableString == _L( "#" ) ) - { - delete stringHbuf; - stringHbuf = NULL; - break; - } - else - { - __TRACE( KInit,( _L( "Measurement disable option not found or not given" ) ) ); - delete stringHbuf; - stringHbuf = NULL; - break; - } - delete stringHbuf; - ret = item->GetNextString( string ); - } - CleanupStack::PopAndDestroy( item ); - item = NULL; - } - - // Get timeout value option - __TRACE(KInit, (_L("Parsing default timeout value"))); - iDefaultTimeout = 0; - item = NULL; - TRAP(ret, item = sectionParser->GetItemLineL(_L("Timeout=" ), ENoTag)); - if( ( ret != KErrNone ) || ( item == NULL ) ) - { - __TRACE(KInit, (_L("'Timeout' option not found or not given"))); - delete item; - item = NULL; - } - else - { - CleanupStack::PushL( item ); - TPtrC string; - ret = item->GetString(KNullDesC(), string); - if(string.Length() > 0) - { - TLex lex(string); - ret = lex.Val(iDefaultTimeout); - if(ret != KErrNone) - { - __TRACE(KError, (_L("Could not convert timeout value '%S' to integer. Error %d. Ignoring this setting."), &string, ret)); - } - if(iDefaultTimeout < 0) - { - __TRACE(KError, (_L("'Timeout' value cannot be negative. Resetting to 0."))); - iDefaultTimeout = 0; - } - } - else - { - __TRACE(KInit, (_L("'Timeout' value not given"))); - } - CleanupStack::PopAndDestroy( item ); - item = NULL; - } - __TRACE(KInit, (_L("'Timeout' value set to %d"), iDefaultTimeout)); - iDefaultTimeout *= 1000; - - // Get UITestingSupport value option - __TRACE(KInit, (_L("Parsing UITestingSupport value"))); - iUITestingSupport = EFalse; - item = NULL; - TRAP(ret, item = sectionParser->GetItemLineL(_L("UITestingSupport=" ), ENoTag)); - if((ret != KErrNone) || (item == NULL)) - { - __TRACE(KInit, (_L("'UITestingSupport' option not found"))); - delete item; - item = NULL; - } - else - { - CleanupStack::PushL(item); - TPtrC string; - ret = item->GetString(KNullDesC(), string); - if(string.Length() > 0) - { - iUITestingSupport = (string == _L("YES")); - } - else - { - __TRACE(KInit, (_L("'UITestingSupport' value not given"))); - } - CleanupStack::PopAndDestroy(item); - item = NULL; - } - __TRACE(KInit, (_L("'UITestingSupport' value set to %d"), iUITestingSupport)); - - // Get SeparateProcesses value option - __TRACE(KInit, (_L("Parsing SeparateProcesses value"))); - iSeparateProcesses = EFalse; - item = NULL; - TRAP(ret, item = sectionParser->GetItemLineL(_L("SeparateProcesses=" ), ENoTag)); - if((ret != KErrNone) || (item == NULL)) - { - __TRACE(KInit, (_L("'SeparateProcesses' option not found"))); - delete item; - item = NULL; - } - else - { - CleanupStack::PushL(item); - TPtrC string; - ret = item->GetString(KNullDesC(), string); - if(string.Length() > 0) - { - iSeparateProcesses = (string == _L("YES")); - } - else - { - __TRACE(KInit, (_L("'SeparateProcesses' value not given"))); - } - CleanupStack::PopAndDestroy(item); - item = NULL; - } - __TRACE(KInit, (_L("'SeparateProcesses' value set to %d"), iSeparateProcesses)); - } - else - { - __TRACE( KInit,( _L( "Not found '%S' and '%S' sections" ), &KDefaultsStart, &KDefaultsEnd ) ); - } - __TRACE( KInit,( _L( "End parsing engine defaults" ) ) ); - CleanupStack::PopAndDestroy( sectionParser ); - - // Store engine settings to SettingServer - RSettingServer settingServer; - TInt ret = settingServer.Connect(); - if(ret != KErrNone) - { - __TRACE(KError, (_L("Could not connect to SettingServer [%d] and store engine settings"), ret)); - } - else - { - TEngineSettings settings; - settings.iUITestingSupport = iUITestingSupport; - settings.iSeparateProcesses = iSeparateProcesses; - ret = settingServer.StoreEngineSettings(settings); - if(ret != KErrNone) - { - __TRACE(KError, (_L("Could not store engine settings to SettingServer [%d]"), ret)); - } - else - { - __TRACE(KInit, (_L("Engine settings succesfully stored to SettingServer"))); - } - settingServer.Close(); - } - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: SetLoggerSettings - - Description: Set parsed logger's settings to TestEngine side. - - Parameters: TLoggerSettings& aLoggerSettings: in: Parsed logger settings - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestEngine::SetLoggerSettings( TLoggerSettings& aLoggerSettings ) - { - iTestEngineServer->iLoggerSettings = aLoggerSettings; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ParseTestModulesL - - Description: Parse and search for module info and fill list of modules. - - Parameters: CStifParser* aParser: in: CStifParser object - CTestModuleList* aModuleList: in: list of modules - TPtrC& aSectionStart: in: descriptor with start of section string - TPTrC& aSectionEnd: in: descriptor with end of section string - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ParseTestModulesL(CStifParser* aParser, CTestModuleList* aModuleList, const TDesC& aSectionStart, const TDesC& aSectionEnd) - { - //First let's find all modules given in Stif's ini file and store that info in CTestModuleList object - CStifSectionParser* sectionParser = NULL; - CStifItemParser* item = NULL; - - sectionParser = aParser->SectionL(aSectionStart, aSectionEnd); - - TBool sectionOK; - - while(sectionParser) - { - sectionOK = ETrue; - __TRACE(KInit, (_L("Found '%S' and '%S' sections"), &aSectionStart, &aSectionEnd)); - CleanupStack::PushL(sectionParser); - __TRACE(KInit, (_L("Starting to read module information"))); - - // Get name of module - _LIT(KModuleName, "ModuleName="); - item = sectionParser->GetItemLineL(KModuleName); - CleanupStack::PushL(item); - if(!item) - { - __TRACE(KError, (CStifLogger::ERed, _L("'%S' not found from Module section. Skipping whole section."), &KModuleName)); - sectionOK = EFalse; - } - else - { - __TRACE(KInit, (_L("'%S' found"), &KModuleName)); - } - - TName moduleName; - TInt ret(KErrNone); - - if(sectionOK) - { - TPtrC name; - ret = item->GetString(KModuleName, name); - if(ret != KErrNone) - { - __TRACE(KError, (CStifLogger::ERed, _L("Module name parsing ended with error [%d]. Skipping whole section"), ret)); - sectionOK = EFalse; - } - else - { - __TRACE(KInit, (_L("Module '%S' found from ini-file"), &name)); - moduleName.Copy(name); - moduleName.LowerCase(); - ret = aModuleList->AddTestModule(moduleName); - if(ret != KErrNone && ret != KErrAlreadyExists) - { - CleanupStack::PopAndDestroy(item); - __TRACE(KError, (CStifLogger::ERed, _L("Could not add module to list of modules. Error %d"), ret)); - LeaveIfErrorWithNotify(ret); - } - } - } - CleanupStack::PopAndDestroy(item); - - //Get pointer to added module - if(sectionOK) - { - CTestModuleInfo* moduleInfo = aModuleList->GetModule(moduleName); - if(!moduleInfo) - { - __TRACE(KError, (CStifLogger::ERed, _L("Could not add get module info from list"))); - LeaveIfErrorWithNotify(KErrNotFound); - } - - // Get ini file, if it exists - __TRACE(KInit, (_L("Start parsing ini file"))); - _LIT(KIniFile, "IniFile="); - item = sectionParser->GetItemLineL(KIniFile); - if(item) - { - __TRACE(KInit, (_L("'%S' found"), &KIniFile)); - CleanupStack::PushL(item); - TPtrC iniFile; - ret = item->GetString(KIniFile, iniFile); - if(ret == KErrNone) - { - // Module inifile (might be empty) OK - TFileName filename; - filename.Copy(iniFile); - TStifUtil::CorrectFilePathL( filename ); - filename.LowerCase(); - __TRACE(KInit, (CStifLogger::EBold, _L("Initialization file '%S' found, file can be empty"), &iniFile)); - moduleInfo->SetIniFile(filename); - } - else - { - __TRACE(KInit, (_L("Initialization file not found"))); - } - CleanupStack::PopAndDestroy(item); - } - else - { - __TRACE(KInit, (_L("'%S' not found"), &KIniFile)); - } - - // Get config (testcase) file - __TRACE(KInit, (_L("Start parsing cfg files"))); - TPtrC cfgTag; - for(TInt i = 0; i < 2; i++) - { - //Set tag for config files - if(i == 0) - { - cfgTag.Set(_L("ConfigFile=")); - } - else - { - cfgTag.Set(_L("TestCaseFile=")); - } - //Read data - item = sectionParser->GetItemLineL(cfgTag); - while(item) - { - CleanupStack::PushL(item); - __TRACE(KInit, (_L("Item '%S' found"), &cfgTag)); - TPtrC cfgFile; - ret = item->GetString(cfgTag, cfgFile); - if(ret == KErrNone) - { - TFileName ifile; - ifile.Copy(cfgFile); - TStifUtil::CorrectFilePathL( ifile ); - ifile.LowerCase(); - __TRACE(KInit, (_L("Configuration file '%S' found"), &ifile)); - moduleInfo->AddCfgFile(ifile); - } - else - { - __TRACE(KInit, (_L("Configuration file not found"))); - } - CleanupStack::PopAndDestroy(item); - item = sectionParser->GetNextItemLineL(cfgTag); - } - } - - __TRACE(KInit, (_L("Module '%S' information read correctly"), &moduleName)); - } - else - { - __TRACE(KError, (_L("Module '%S' information skipped"), &moduleName)); - } - - // Get next section... - CleanupStack::PopAndDestroy(sectionParser); - sectionParser = aParser->NextSectionL(aSectionStart, aSectionEnd); - } - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ReadTestModules - - Description: Parse Test modules and module information from - STIF initialization file. - - Parameters: CStifParser& parser: in: CStifParser object - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ReadTestModulesL(CStifParser* aParser) - { - __TRACE( KInit, (_L(""))); - __TRACE( KInit, (CStifLogger::EBold, _L("Start parsing test modules"))); - - //Create CTestModuleList object. It will keep information about all found test modules, - //its initialization files and test case (config) files. - CTestModuleList* moduleList = CTestModuleList::NewL(Logger()); - CleanupStack::PushL(moduleList); - - // Parse Test Module information - _LIT(KTestModuleStart, "[New_Module]"); - _LIT(KTestModuleEnd, "[End_Module]"); - - __TRACE(KInit, (_L("Starting to search module sections"))); - TRAPD(err, ParseTestModulesL(aParser, moduleList, KTestModuleStart, KTestModuleEnd)); - if(err != KErrNone) - { - __TRACE(KError, (CStifLogger::ERed, _L("Parsing test modules returned error [%d]"), err)); - User::Leave(err); - } - __TRACE(KInit, (CStifLogger::EBold, _L("End parsing test modules"))); - __TRACE(KInit, (_L(""))); - - //Now, find included test modules and also add them to CTestModuleList object. - _LIT(KIncludeModuleStart, "[New_Include_Module]"); - _LIT(KIncludeModuleEnd, "[End_Include_Module]"); - - __TRACE(KInit, (CStifLogger::EBold, _L("Start parsing included modules"))); - CTestCaseFileInfo* finfo = moduleList->GetUncheckedCfgFile(); - while(finfo) - { - TFileName fname; - finfo->GetCfgFileName(fname); - - __TRACE(KInit, (_L("checking file: '%S'"), &fname)); - finfo->SetChecked(); - - CStifParser* parser = NULL; - - TRAPD(err, parser = CStifParser::NewL(_L(""), fname)); - if(err == KErrNotFound) - { - __TRACE(KError, (CStifLogger::ERed, _L("Could not open file '%S'"), &fname)); - } - else if(err != KErrNone) - { - __TRACE(KError, (CStifLogger::ERed, _L("Could not create parser for file '%S'"), &fname)); - LeaveIfErrorWithNotify(err); - } - else - { - CleanupStack::PushL(parser); - - ParseTestModulesL(parser, moduleList, KIncludeModuleStart, KIncludeModuleEnd); - - CleanupStack::PopAndDestroy(parser); - } - - finfo = moduleList->GetUncheckedCfgFile(); - } - - __TRACE(KInit, (CStifLogger::EBold, _L("End parsing included modules"))); - __TRACE(KInit, (_L(""))); - - //Now, when all modules have been found, create them - __TRACE(KInit, (CStifLogger::EBold, _L("Start creating modules"))); - TBool afterReset = EFalse; - if(iRebootParams) - { - afterReset = ETrue; - } - CTestModuleInfo* moduleInfo = NULL; - TInt i; - TInt modCnt = moduleList->Count(); - - for(i = 0; i < modCnt; i++) - { - moduleInfo = moduleList->GetModule(i); - if(!moduleInfo) - { - __TRACE(KInit, (CStifLogger::ERed, _L("Could not get module info at index %d"), i)); - TName error; - error.AppendFormat(_L("Could not get module info at index %d"), i); - ErrorPrint(1, error); - continue; - } - - TName moduleName; - moduleInfo->GetModuleName(moduleName); - - // Create module controller - __TRACE(KInit, (_L("Creating module controller for '%S'"), &moduleName)); - CTestModuleController* module = NULL; - if( moduleName == _L( "testscripter" ) ) - { - module = CTestModuleController::NewL(this, moduleName, afterReset, ETrue); - } - else - { - module = CTestModuleController::NewL(this, moduleName, afterReset); - } - CleanupStack::PushL(module); - __TRACE(KInit, (_L("Module controller created"))); - - // Get ini file, if exists - __TRACE(KInit, (_L("Checking ini file"))); - TFileName ini; - moduleInfo->GetIniFileName(ini); - if(ini.Length() == 0) - { - __TRACE(KInit, (_L("Ini file not found"))); - } - - TRAPD(err, module->InitL(ini, KNullDesC)); - if(err != KErrNone) - { - __TRACE(KInit, (CStifLogger::ERed, _L("Module '%S' loading failed: %d"), &moduleName, err)); - TName error; - error.AppendFormat(_L("Module '%S' loading failed: %d"), &moduleName, err); - ErrorPrint(1, error); - - CleanupStack::PopAndDestroy(module); - continue; - } - - //Add test case files - __TRACE(KInit, (_L("Checking cfg files"))); - TInt cfgCnt = moduleInfo->CountCfgFiles(); - TInt j; - TFileName cfgFile; - for(j = 0; j < cfgCnt; j++) - { - moduleInfo->GetCfgFileName(j, cfgFile); - if(cfgFile.Length() > 0) - { - __TRACE(KInit, (_L("Adding config file '%S'"), &cfgFile)); - module->AddConfigFileL(cfgFile); - } - else - { - __TRACE(KInit, (_L("Got empty config filename"))); - } - } - if(cfgCnt == 0) - { - __TRACE(KInit, (_L("Cfg file not found"))); - } - - __TRACE(KInit, (_L("Module '%S' created correctly"), &moduleName)); - - // Store module for later use - User::LeaveIfError(iModules.Append(module)); - CleanupStack::Pop(module); - } - - __TRACE(KInit, (CStifLogger::EBold, _L("End creating test modules"))); - __TRACE(KInit, (_L(""))); - - //Check if there are any modules added to Stif - if (iModules.Count() == 0) - { - __TRACE(KInit, (_L("Not found '%S' and '%S' sections"), &KTestModuleStart, &KTestModuleEnd)); - __TRACE(KInit, (CStifLogger::EBold, _L("Test module(s) not defined in initialisation file"))); - // Note is printed from UI, not from here anymore - // ErrorPrint( 0 , _L("Test modules not found. Check testengine log")); - } - - //Delete CTestModuleList object. It is not needed any more - CleanupStack::PopAndDestroy(moduleList); - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: TestModuleConfigFileL - - Description: Add config file to test module - - Parameters: CTestModuleController* aModule: in: CTestModuleController - object. - CStifSectionParser* aSectionParser: in: CStifSectionParser - object. - TDesC& aTag :in: Founded tag. - - Return Values: None - - Errors/Exceptions: Leaves if GetNextItemLineL leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::TestModuleConfigFileL( CTestModuleController* aModule, - CStifSectionParser* aSectionParser, - TDesC& aTag ) - { - // Add config files to Test Module - TPtrC configFile; - CStifItemParser* item = NULL; - item = aSectionParser->GetItemLineL( aTag ); - - TInt cfgFiles = 0; - TFileName config; - - TInt ret( 0 ); - - while ( item ) - { - __TRACE( KInit,( _L( "Found '%S' section" ), &aTag ) ); - CleanupStack::PushL( item ); - ret = item->GetString( aTag, configFile ); - if ( ret != KErrNone ) - { - CleanupStack::PopAndDestroy( item ); - __TRACE( KError, ( CStifLogger::ERed, _L( "File parsing left with error [%d]" ), ret ) ); - } - else - { - config = configFile; - aModule->AddConfigFileL( config ); - - // Module configfile (might be empty) OK - __TRACE( KInit,( _L( "Adding configuration file [%S]" ), &config ) ); - cfgFiles++; - CleanupStack::PopAndDestroy( item ); - } - item = aSectionParser->GetNextItemLineL( aTag ); - } - - // Print trace - if ( cfgFiles == 0) - { - __TRACE( KInit,( _L( "Module does not have '%S' files") , &aTag ) ); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ModuleControllerByName - - Description: Return the module controller specified by given parameter. - - Parameters: const TName& aModuleName: in: Test module name - - Return Values: CTestModuleController* : pointer to CTestModuleController - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestModuleController* CTestEngine::ModuleControllerByName( - const TName& aModuleName ) - { - TInt modules = iModules.Count(); - - for ( TInt i = 0; i < modules; i++ ) - { - if ( iModules[i]->ModuleName( aModuleName ) == aModuleName ) - { - return iModules[i]; - } - } - return NULL; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: GetFreeOrCreateModuleControllerL - - Description: Return free module controller specified by given parameter. - If it can't be found, new one will be created. - - Parameters: TTestInfo& aTestInfo: test info structure - CTestModuleController** aRealModuleController: for test scripter a real module controller will be returned - - Return Values: CTestModuleController* : pointer to CTestModuleController - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestModuleController* CTestEngine::GetFreeOrCreateModuleControllerL(TTestInfo& aTestInfo, - CTestModuleController** aRealModuleController) - { - TInt i, j; - *aRealModuleController = NULL; - - TInt modules = iModules.Count(); - - //Find out which way it should be processed - //New way means that Stif is going to find free test module controller - //(free means that it does not run any test case) - TBool oldWay = ETrue; - if((iUITestingSupport && aTestInfo.iModuleName.Find(KTestScripterName) == 0) - || (aTestInfo.iModuleName == KPythonScripter) - || (iSeparateProcesses)) - { - __TRACE(KInit, (_L("Module controllers handling mode: exclusive"))); - //Exclusive mode means that every test case must be run in separate module controller. - oldWay = EFalse; - } - else - { - __TRACE(KInit, (_L("Module controllers handling mode: normal"))); - oldWay = ETrue; - } - - //If option is not set and it is not python scripter case - //(python scripter always should look for free module controller) - //This is the old way - if(oldWay) - { - __TRACE(KInit, (_L("Find test module controller for [%S]"), &aTestInfo.iModuleName)); - for(i = 0; i < modules; i++) - { - if(iModules[i]->ModuleName(aTestInfo.iModuleName) == aTestInfo.iModuleName) - { - __TRACE(KInit, (_L("Found test module controller for [%S]"), &aTestInfo.iModuleName)); - return iModules[i]; - } - } - __TRACE(KInit, (_L("Test module controller for [%S] NOT FOUND"), &aTestInfo.iModuleName)); - return NULL; - } - - //This is a new way - __TRACE(KInit, (_L("Find free test module controller for [%S]"), &aTestInfo.iModuleName)); - - TName moduleName(aTestInfo.iModuleName); - CTestModuleController* parentController = NULL; - - //First find original test module controller (parent) - for(TInt i = 0; i < modules; i++) - { - if(iModules[i]->ModuleName(moduleName) == moduleName) - { - parentController = iModules[i]; - __TRACE(KInit, (_L("Original (parent) module controller found [%S]"), &moduleName)); - break; - } - } - - //Search free module controller among parent's children - if(parentController) - { - //TestScripter is handled in other way - if(moduleName.Find(KTestScripterName) == 0) - { - __TRACE(KInit, (_L("This is testscripter case. Searching real module controller."))); - *aRealModuleController = parentController->GetFreeOrCreateModuleControllerL(aTestInfo, iUITestingSupport); - return parentController; - } - - //When UITestingSupport always create new module controller! - TInt childrenCount = parentController->iChildrenControllers.Count(); - for(TInt i = 0; i < childrenCount; i++) - { - if(parentController->iChildrenControllers[i]->iTestCaseCounter == 0) - { - if(iUITestingSupport && aTestInfo.iModuleName.Find(KTestScripterName) == 0) - { - __TRACE(KInit, (_L("Free module controller found but in UITestingSupport mode always new one will be created"))); - } - else - { - __TRACE(KInit, (_L("Free module controller found [%S]"), parentController->iChildrenControllers[i]->iName)); - return parentController->iChildrenControllers[i]; - } - } - else - { - __TRACE(KInit, (_L("Module controller [%S] found but it is not free (it runs %d test cases)"), parentController->iChildrenControllers[i]->iName, parentController->iChildrenControllers[i]->iTestCaseCounter)); - } - } - } - else - { - __TRACE(KError, (_L("Parent module controller NOT found [%S]"), &moduleName)); - User::Leave(KErrNotFound); - } - - //No free module controller has been found. Create new one. - TBuf<10> ind; - ind.Format(_L("%d"), GetIndexForNewTestModuleController()); - moduleName.Append(_L("@")); - moduleName.Append(ind); - __TRACE(KInit, (_L("Free module controller not found. Creating new one [%S]."), &moduleName)); - - //Create server and active object (This uses CTestModuleController::InitL()) - CTestModuleController* module = CTestModuleController::NewL(this, moduleName, parentController->iAfterReboot); - CleanupStack::PushL(module); - - TRAPD(err, module->InitL(parentController->iInifile, aTestInfo.iConfig)); - if(err != KErrNone) - { - __TRACE(KInit, (_L("InitL fails with error: %d for module [%S]" ), err, &moduleName)); - User::Leave(err); - } - __TRACE(KInit, (_L("New module controller created [%S]."), &moduleName)); - - // Store module for later use - User::LeaveIfError(parentController->iChildrenControllers.Append(module)); - CleanupStack::Pop(module); - __TRACE(KInit, (_L("Child added to [%S] controller. Currently it has %d children:"), parentController->iName, parentController->iChildrenControllers.Count())); - for(j = 0; j < parentController->iChildrenControllers.Count(); j++) - { - __TRACE(KInit, (_L(" %d. [%S]"), j + 1, parentController->iChildrenControllers[j]->iName)); - } - - return module; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: SetAttributeL - - Description: Sets attributes to Test Framework - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leave if ReadL leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::SetAttributeL( const RMessage2& aMessage ) - { - __TRACE( KVerbose, ( _L( "CTestEngine::SetAttributeL" ) ) ); - - TAttribute attribute; - TName genericTName; - - // Read attribute from aMessage - attribute = (TAttribute)aMessage.Int0(); - - switch( attribute ) - { - // Path attribute - case ELogPath: - { - // Read path from aMessage. - // NOTE!If message length is over TName, ReadL will cut the message - // to allowed size and won't return any error code or leave code. - aMessage.ReadL( 1, genericTName ); - - // Handle to Setting server. - RSettingServer settingServer; - // Connect to the Setting server and create session - TInt ret = settingServer.Connect(); - if ( ret != KErrNone ) - { - User::Leave( ret ); - } - settingServer.SetNewIniFileSetting( genericTName ); - // Close Setting server session - settingServer.Close(); - break; - } - // Reboot directory - case ERebootPath: - { - // Read reboot path from aMessage. - // NOTE!If message length is over TName, ReadL will cut the message - // to allowed size and won't return any error code or leave code. - aMessage.ReadL( 1, genericTName ); - // Allocated dynamically iRebootPath size and copies aMessage path. - iRebootPath = genericTName.AllocL(); - break; - } - // Reboot path - case ERebootFilename: - { - // Read reboot path from aMessage. - // NOTE!If message length is over TName, ReadL will cut the message - // to allowed size and won't return any error code or leave code. - aMessage.ReadL( 1, genericTName ); - // Allocated dynamically iRebootFilename size and copies aMessage - // filename. - iRebootFilename = genericTName.AllocL(); - break; - } - // Measurement configuration info - case EStifMeasurementOn: - { - // Read Measurement configuration info from aMessage. - aMessage.ReadL( 1, genericTName ); - - // Set info to test engine - User::LeaveIfError( EnableStifMeasurement( genericTName ) ); - break; - } - // Measurement configuration info - case EStifMeasurementOff: - { - // Read Measurement configuration info from aMessage. - aMessage.ReadL( 1, genericTName ); - - // Set info to test engine - User::LeaveIfError( DisableStifMeasurement( genericTName ) ); - break; - } - default: - { - __TRACE( KVerbose, ( _L( "Not valid attribute" ) ) ); - } - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: AddTestModuleL - - Description: Adds new Test Module - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - Leaves if name length is zero - - Status: Approved: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestEngine::AddTestModuleL( const RMessage2& aMessage ) - { - __TRACE( KVerbose, ( _L( "CTestEngine::AddTestModuleL" ) ) ); - TName name; - TFileName iniFile; - - // Read test module name from aMessage - aMessage.ReadL( 0, name ); - - if( name.Length() == 0 ) - { - LeaveWithNotifyL( KErrArgument ); - } - // Read ini file name from aMessage - aMessage.ReadL( 1, iniFile ); - - name.LowerCase(); - // Remove optional '.DLL' from file name - TParse parse; - parse.Set( name, NULL, NULL ); - - if ( parse.Ext() == _L(".dll") ) - { - const TInt len = parse.Ext().Length(); - name.Delete ( name.Length()-len, len ); - } - - __TRACE( KInit, ( - _L( "CTestEngine::AddTestModuleL, Adding Module:[%S]"), &name ) ); - - // Check if test module already exists - CTestModuleController* testModule = ModuleControllerByName( name ); - if ( testModule == NULL ) - { - TBool afterReset = EFalse; - if( iRebootParams && iRebootParams->iTestModule == name ) - { - afterReset = ETrue; - } - - // Create module controller - CTestModuleController* module = NULL; - if( name == _L( "testscripter" ) ) - { - module = CTestModuleController::NewL( this, name, afterReset, ETrue ); - } - else - { - //CTestModuleController* module = - module = CTestModuleController::NewL( this, name, afterReset ); - } - CleanupStack::PushL( module ); - - module->InitL( iniFile, KNullDesC ); - - // Store module for later use - User::LeaveIfError( iModules.Append( module ) ); - CleanupStack::Pop( module ); - // Done - iReturn = KErrNone; - - __TRACE( KInit, ( - _L( "CTestEngine::AddTestModuleL, module added correctly") ) ); - } - else - { - iReturn = KErrAlreadyExists; - __TRACE( KInit, ( - _L( "CTestEngine::AddTestModuleL, module already added, all ok.") ) ); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: RemoveTestModuleL - - Description: Removes Test Module - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: TInt KErrNone: No errors occurred - KErrNotFound: Test module not found - KErrInUse: Test module is in use, cannot be removed - - Errors/Exceptions: Leaves if some of called leaving methods leaves - Leaves if moduleName length is zero - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::RemoveTestModuleL( const RMessage2& aMessage ) - { - __TRACE( KInit, ( _L( "CTestEngine::RemoveTestModuleL" ) ) ); - // Read Module name from message - TName moduleName; - aMessage.ReadL( 0, moduleName ); - if( moduleName.Length() == 0 ) - { - LeaveWithNotifyL( KErrArgument ); - } - - moduleName.LowerCase(); - // Remove optional '.DLL' from file name - TParse parse; - parse.Set( moduleName, NULL, NULL ); - - if ( parse.Ext() == _L(".dll") ) - { - const TInt len = parse.Ext().Length(); - moduleName.Delete ( moduleName.Length()-len, len ); - } - - __TRACE(KInit, (_L("Going to remove module controller [%S]"), &moduleName)); - // Check that the module that will be removed exists - TInt moduleCount = iModules.Count(); - TBool found = EFalse; - TInt moduleIndex; - for ( moduleIndex = 0; moduleIndex < moduleCount; moduleIndex++ ) - { - if ( iModules[moduleIndex]->ModuleName( moduleName ) == moduleName ) - { - found = ETrue; - break; - } - } - - if ( !found ) - { - // Test Module does not exists - __TRACE(KInit, (_L("Module controller [%S] to be removed NOT FOUND"), &moduleName)); - return KErrNotFound; - } - // Check module controller and its children - if(iModules[moduleIndex]->iTestCaseCounter > 0) - { - __TRACE(KInit, (_L("Cannot remove module controller [%S], it is running %d test cases"), &moduleName, iModules[moduleIndex]->iTestCaseCounter)); - return KErrInUse; - } - TInt j; - for(j = 0; j < iModules[moduleIndex]->iChildrenControllers.Count(); j++) - { - if(iModules[moduleIndex]->iChildrenControllers[j]->iTestCaseCounter > 0) - { - __TRACE(KInit, (_L("Cannot remove module controller [%S], its child [%S] is running %d test cases"), &moduleName, iModules[moduleIndex]->iChildrenControllers[j]->iName, iModules[moduleIndex]->iChildrenControllers[j]->iTestCaseCounter)); - return KErrInUse; - } - } - // Test cases not running so we can remove the Test Module - __TRACE(KInit, (_L("Removing module controller [%S]"), &moduleName)); - CTestModuleController* module = iModules[moduleIndex]; - iModules.Remove(moduleIndex); - delete module; - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: CloseTestEngineL - - Description: Close test engine - - Parameters: None - - Return Values: None - - Errors/Exceptions: Leaves if GenerateReportL leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::CloseTestEngineL( TUint aHandle ) - { - __TRACE( KInit, ( _L( "CTestEngine::CloseTestEngineL" ) ) ); - // Remove all module controllers - iModules.ResetAndDestroy(); - iModules.Close(); - - // If test report is created - if( iTestReport ) - { - iTestReport->GenerateReportL(); - iIsTestReportGenerated = ETrue; - } - - // Close Setting server, no handle available anymore - iSettingServer.Close(); - - // Get test case from container - CTestEngineSubSession* testEngineSubSession = ( CTestEngineSubSession* )iTestEngineSubSessions->At( aHandle ); - - // Do nothing if invalid handle - if ( testEngineSubSession == NULL ) - { - // Handle might be already deleted, so do nothing. - return; - } - - iTestEngineSubSessions->Remove( aHandle ); - - // Decrement resource count - iResourceCount--; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: AddConfigFileL - - Description: Adds new config file to Test Module - - Parameters: const RMessage& aMessage: in: Server Message - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - Leaves if module length is zero - Leaves if configFile length is zero - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::AddConfigFileL( const RMessage2& aMessage ) - { - TName module; - TFileName configFile; - - // Read module name from aMessage - aMessage.ReadL( 0, module ); - - if( module.Length() == 0 ) - { - LeaveWithNotifyL( KErrArgument ); - } - // Read config file name from aMessage - aMessage.ReadL( 1, configFile ); - - if( configFile.Length() == 0 ) - { - LeaveWithNotifyL( KErrArgument ); - } - - module.LowerCase(); - // Remove optional '.DLL' from file name - TParse parse; - parse.Set( module, NULL, NULL ); - - if ( parse.Ext() == _L(".dll") ) - { - const TInt len = parse.Ext().Length(); - module.Delete ( module.Length()-len, len ); - } - - __TRACE( KInit, ( _L( "Adding config file [%S] to [%S] module"), &configFile, &module ) ); - - // Get correct test module controller - CTestModuleController* testModule = ModuleControllerByName( module ); - if ( testModule == NULL ) - { - __TRACE( KError, ( CStifLogger::ERed, _L( "Added configure file has an invalid module:[%S]"), &module ) ); - LeaveWithNotifyL ( KErrNotFound ); - } - - // Add config file to Module - testModule->AddConfigFileL( configFile ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: RemoveConfigFileL - - Description: Removes a config file from test module - - Parameters: const RMessage& aMessage: in: Server Message - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - Leaves if module length is zero - Leaves if configFile length is zero - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestEngine::RemoveConfigFileL( const RMessage2& aMessage ) - { - TName module; - TFileName configFile; - - // Read module name from aMessage - aMessage.ReadL( 0, module ); - - if( module.Length() == 0 ) - { - LeaveWithNotifyL( KErrArgument ); - } - // Read config file name from aMessage - aMessage.ReadL( 1, configFile ); - - if( configFile.Length() == 0 ) - { - LeaveWithNotifyL( KErrArgument ); - } - - module.LowerCase(); - // Remove optional '.DLL' from file name - TParse parse; - parse.Set( module, NULL, NULL ); - - if ( parse.Ext() == _L(".dll") ) - { - const TInt len = parse.Ext().Length(); - module.Delete ( module.Length()-len, len ); - } - - __TRACE( KInit, ( _L( "Removing config file [%S] from [%S] module"), &configFile, &module ) ); - - // Get correct test module controller - CTestModuleController* testModule = ModuleControllerByName( module ); - if ( testModule == NULL ) - { - __TRACE( KError, ( CStifLogger::ERed, _L( "Added configure file has an invalid module:[%S]"), &module ) ); - LeaveWithNotifyL ( KErrNotFound ); - } - - // Remove config file from Module - testModule->RemoveConfigFileL( configFile ); - - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: EnumerateTestCasesL - - Description: Enumerates test cases - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Panics the client if enumeration is already pending - Leaves if called StartEnumerateL method leaves - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestEngine::EnumerateTestCasesL( const RMessage2& aMessage ) - { - __TRACE( KInit, ( _L( "CTestEngine::EnumerateTestCasesL" ) ) ); - // Check if enumerate is ongoing!! - __ASSERT_ALWAYS( iEnumerateModuleCount == 0, PanicClient( EReqPending, aMessage ) ); - - iCaseCount = 0; - iEnumError = KErrNone; - - TInt count = iModules.Count(); - if ( count == 0 ) - { - - __TRACE( KInit, ( CStifLogger::EBold, _L( "Test module(s) not loaded - returning 0 test cases" ) ) ); - - // Note is printed from UI - // ErrorPrint(0, _L("No test modules, check testengine log")); - // Write test case count to client - TCaseCount countPckg( 0 ); - TRAPD( err, aMessage.WriteL( 0, countPckg ) ); - - // Request will be completed in DispatchMessageL - iReturn = err; - } - else - { - for ( TInt i = 0; i < count; i++ ) - { - // Send enumerate request to each test module. - iModules[i]->StartEnumerateL(); - iEnumerateModuleCount++; - } - - // Message is completed later from EnumerationCompleted function - iComplete = EFalse; - - // Store the message - iEnumerationMessage = aMessage; - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: EnumerationCompleted - - Description: Return the module controller specified by given parameter. - - Parameters: TInt aCount: in: Count of test cases - TInt aError: in: Symbian OS Error code: Error from Test Module - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestEngine::EnumerationCompleted( TInt aCount, TInt aError ) - { - // Increment test case count by aCount - iCaseCount+= aCount; - - if ( aError != KErrNone ) - { - iEnumError = aError; - } - - iEnumerateModuleCount--; - - if ( iEnumerateModuleCount == 0 ) - { - - TInt attrib = CStifLogger::ENoStyle; - if ( iCaseCount == 0 ) - { - attrib = CStifLogger::EBold; - } - __TRACE( KInit, ( attrib, _L( "Test case enumeration completed, testcase count %d"), iCaseCount ) ); - - // Write test case count to client - TCaseCount countPckg( iCaseCount ); - TRAPD( err, iEnumerationMessage.WriteL( 0, countPckg ) ); - - if ( err != KErrNone ) - { - iEnumError = err; - __TRACE( KError, ( CStifLogger::ERed, _L( "CTestEngine::EnumerationCompleted: Failed %d"), iEnumError ) ); - } - - // Complete request - iEnumerationMessage.Complete( iEnumError ); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: GetTestCasesL - - Description: Get test cases - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leaves if enumeration is not yet complete - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::GetTestCasesL( const RMessage2& aMessage ) - { - __TRACE( KVerbose, ( _L( "CTestEngine::GetTestCasesL" ) ) ); - - const TInt len = sizeof( TTestInfo ); - - // Loop through all test modules - TInt moduleCount = iModules.Count(); - TInt pos = 0; - TInt totalCount = 0; - for ( TInt i = 0; i < moduleCount; i++ ) - { - CTestModuleController* module = iModules[i]; - - // Check that test cases are enumerated first - if ( !module->EnumerationComplete() ) - { - __TRACE( KError, ( CStifLogger::ERed, _L( "CTestEngine::GetTestCasesL, Test Cases not yet enumerated!" ) ) ); - LeaveIfErrorWithNotify( KErrNotFound ); - } - - CFixedFlatArray* testCases = module->TestCasesL(); - CleanupStack::PushL( testCases ); - - // Loop through all test cases got from test module - const TInt caseCount = testCases->Count(); - totalCount+=caseCount; - - for ( TInt j = 0; j < caseCount; j++ ) - { - if(((*testCases)[j]).iTestCaseInfo.iTimeout == 0 && iDefaultTimeout > 0) - { - ((*testCases)[j]).iTestCaseInfo.iTimeout = iDefaultTimeout; - } - - // Construct package for source data - TTestInfoPckg tmpPackage( ( *testCases )[j] ); - - // Copy test case package to client's memory - aMessage.WriteL( 0, tmpPackage, pos ) ; - - pos = pos + len; - } - CleanupStack::PopAndDestroy( testCases ); - - // Free allocated test cases because not needed anymore - module->FreeTestCases(); - - } - - __TRACE( KVerbose, ( _L( "CTestEngine::GetTestCasesL, case count %d" ), totalCount ) ); - - // Finished - iReturn = KErrNone; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: CancelAsyncRequest - - Description: Asynchronous requests are canceled by this function. - - Parameters: const RMessage aMessage - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestEngine::CancelAsyncRequest( const RMessage2& aMessage ) - { - switch ( aMessage.Int0() ) - { - case ETestEngineEnumerateTestCases: - { - TInt count = iModules.Count(); - for ( TInt i=0; i < count; i++ ) - { - // Cancel enumerate - iModules[i]->Cancel(); - } - break; - } - - case ETestEngineErrorNotification: - { - if ( iErrorMessageAvailable ) - { - iErrorMessageAvailable = EFalse; - iErrorMessage.Complete ( KErrCancel ); - } - } - break; - case ETestEngineEvent: - // Event command cannot be cancelled - // Only EWaitEvent can be cancelled with ECancelWait - default: - PanicClient( EBadRequest, aMessage ); - break; - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: EventControlL - - Description: Controls event system. - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestEngine::EventControlL( const RMessage2& aMessage ) - - { - __TRACE( KVerbose, ( _L( "CTestEngine::EventControlL" ) ) ); - TInt ret = KErrNone; - - // Read EventIf from aMessage - TEventIf event; - TEventIfPckg eventIfPckg( event ); - aMessage.ReadL( 0, eventIfPckg ); - - // EWaitEvent, EReqEvent and ERelEvent need processing here - if( ( event.Type() == TEventIf::EWaitEvent ) || - ( event.Type() == TEventIf::EReqEvent ) || - ( event.Type() == TEventIf::ERelEvent ) || - ( event.Type() == TEventIf::ECancelWait ) ) - { - TInt ind = 0; - TInt count = iClientEvents.Count(); - const TDesC& eventName = event.Name(); - // Search event from client event list - for( ind=0; ind < count; ind++ ) - { - if( iClientEvents[ind]->Name() == eventName ) - { - break; - } - } - - switch( event.Type() ) - { - // Handle event waiting - case TEventIf::EWaitEvent: - { - // Check that we found event from client events list - if( ind == count ) - { - ret = KErrNotFound; - } - else - { - TEventMsg* eventEntry = iClientEvents[ind]; - - __TRACE( KVerbose, ( _L( "CTestEngine::EventControlL: Waiting %S (count %i)"), - &event.Name(), count ) ); - - // Waiting is completed either from here in Wait method - // if event is already pending, - // or from Set method in CtlEvent when event is set. - eventEntry->Wait( aMessage ); - return; - } - } - break; - case TEventIf::ECancelWait: - { - // Check that we found event from client events list - if( ind == count ) - { - ret = KErrNotFound; - } - else - { - TEventMsg* eventEntry = iClientEvents[ind]; - - __TRACE( KVerbose, ( _L( "CTestEngine::EventControlL: Cancel waiting %S (count %i)"), - &event.Name(), count ) ); - - eventEntry->CancelWait(); - } - } - break; - // Handle event request - case TEventIf::EReqEvent: - { - // Check that event is not already requested - if( ind < count ) - { - // Already exists - ret = KErrArgument; - } - else - { - // Requested events are added to iClientEvents - TEventMsg* eventEntry = new TEventMsg; - if( eventEntry == NULL ) - { - ret = KErrNoMemory; - } - else - { - CleanupStack::PushL( eventEntry ); - eventEntry->Copy( event ); - // Check if state event is set already - if( IsStateEventAndSet( event.Name() ) ) - { - // If it was set already, set the event - eventEntry->Set( TEventIf::EState ); - } - ret = iClientEvents.Append( eventEntry ); - if( ret != KErrNone ) - { - CleanupStack::PopAndDestroy( eventEntry ); - } - else - { - CleanupStack::Pop( eventEntry ); - - __TRACE( KVerbose, ( _L( "CTestEngine::EventControlL: Req added %S (count %i)"), - &event.Name(), iClientEvents.Count() ) ); - } - } - } - } - break; - // Release event - case TEventIf::ERelEvent: - { - // Released events are deleted from iClientEvents - // Check that we found entry from client events list - if( ind == count ) - { - ret = KErrNotFound; - } - else - { - __TRACE( KVerbose, ( _L( "CTestEngine::EventControlL: Release event %S (count %i)"), - &event.Name(), iClientEvents.Count() ) ); - - TEventMsg* eventEntry = iClientEvents[ind]; - iClientEvents.Remove( ind ); - eventEntry->Release(); - delete eventEntry; - } - } - break; - default: // This should never happen!!! - { - _LIT( KEngine, "CTestEngine" ); - User::Panic( KEngine, KErrGeneral ); - } - break; - } - } - else - { - // ESetEvent and EUnsetEvent are only forwarded - TRequestStatus req; - CtlEventL( event, req ); - User::WaitForRequest( req ); - } - - aMessage.Complete( ret ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: HandleErrorNotificationL - - Description: Handle error notifications. - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::HandleErrorNotificationL( const RMessage2& aMessage ) - { - iErrorMessage = aMessage; - iErrorMessageAvailable = ETrue; - - ProcessErrorQueue(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: LoggerSettings - - Description: Get Logger's overwrite parameters - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Panics if WriteL fails - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::LoggerSettings( const RMessage2& aMessage ) - { - __TRACE( KInit, ( _L( "CTestEngine::LoggerSettings" ) ) ); - - // Copies logger settings to the package - TPckg loggerSettingsPckg( iTestEngineServer->iLoggerSettings ); - - // Writes a packege that includes the logger overwrite settings to aMessage - TRAPD( err, aMessage.WriteL( 0, loggerSettingsPckg ) ); - if ( err != KErrNone ) - { - PanicClient( EBadDescriptor, aMessage ); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: CloseLoggerSettings - - Description: Close logger settings - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::CloseLoggerSettings() - { - __TRACE( KInit, ( _L( "CTestEngine::CloseLoggerSettings" ) ) ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: TestCaseByHandle - - Description: Return test case specified by aHandle - - Parameters: TUint aHandle : in : TUint : Handle to TestCase subsession - - Return Values: CTestCase* : pointer to CTestCase object - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestCase* CTestEngine::TestCaseByHandle( TUint aHandle, const RMessage2& aMessage ) - { - // Try to get test case from test case container - CTestCase* testCase = - ( CTestCase* )iTestCases->At( aHandle ); - if ( testCase == NULL ) - { - PanicClient( EBadSubsessionHandle, aMessage ); - } - - return testCase; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: NewTestCaseL - - Description: Create new test execution subsession - - Parameters: const RMessage& aMessage: in: Server Message - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving method leaves - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestEngine::NewTestCaseL( const RMessage2& aMessage ) - { - __TRACE( KVerbose, ( _L( "CTestEngine::NewTestCaseL start" ) ) ); - - // Get data from message - TTestInfo testInfo; - TTestInfoPckg testInfoPckg = testInfo; - - TRAPD( res, aMessage.ReadL( 0, testInfoPckg ) ); - if ( res != KErrNone ) - { - PanicClient( EBadDescriptor, aMessage ); - return; - } - - testInfo.iModuleName.LowerCase(); - // Remove optional '.DLL' from file name - TParse parse; - parse.Set( testInfo.iModuleName, NULL, NULL ); - - if ( parse.Ext() == _L(".dll") ) - { - const TInt len = parse.Ext().Length(); - testInfo.iModuleName.Delete ( testInfo.iModuleName.Length()-len, len ); - } - - // Get correct test module controller - CTestModuleController* scrModule = NULL; - CTestModuleController* module = GetFreeOrCreateModuleControllerL(testInfo, &scrModule); - if ( module == NULL ) - { - //@spe PanicClient( EInvalidModuleName, aMessage ); - //@spe return; - __TRACE( KError, ( CStifLogger::ERed, _L( "Invalid module:[%S]"), &testInfo.iModuleName ) ); - LeaveWithNotifyL ( KErrNotFound ); - } - - // Create test case object - CTestCase* testCase = - CTestCase::NewL( this, module, iTestReport, testInfo, scrModule); - CleanupStack::PushL( testCase ); - - // Add object to object container to generate unique id - iContainer->AddL( testCase ); - - // Add object to object index - // This returns a unique handle so we can get it again - TInt handle = iTestCases->AddL( testCase ); - - // Write the handle to client - TPckg handlePckg( handle ); - - TRAP( res, aMessage.WriteL( 3, handlePckg ) ); - if ( res != KErrNone ) - { - iTestCases->Remove( handle ); - PanicClient( EBadDescriptor, aMessage ); - return; - } - - // Add new test case to testcase array - User::LeaveIfError( iTestCaseArray.Append( testCase ) ); - CleanupStack::Pop( testCase ); - - // Notch up another resource - iResourceCount++; - - iReturn = KErrNone; - - __TRACE( KVerbose, ( _L( "CTestEngine::NewTestCaseL done" ) ) ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: DeleteTestCase - - Description: Delete test case from container list - - Parameters: TUint aHandle: in: Handle to test case to be removed - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::DeleteTestCase( TUint aHandle ) - { - __TRACE( KVerbose, ( _L( "CTestEngine::DeleteTestCase" ) ) ); - - // Get test case from container - CTestCase* testCase = ( CTestCase* )iTestCases->At( aHandle ); - - // Do nothing if invalid handle - if ( testCase == NULL ) - { - // Handle might be already deleted, so do nothing. - return; - } - - //Get controllers - CTestModuleController* moduleController; - CTestModuleController* realModuleController; - - moduleController = testCase->GetModuleControllers(&realModuleController); - - // Check if module controllers have crashed - TBool moduleControllerCrashed = EFalse; - TBool realModuleControllerCrashed = EFalse; - - if(moduleController) - { - moduleControllerCrashed = moduleController->iTestModuleCrashDetected; - } - if(realModuleController) - { - realModuleControllerCrashed = realModuleController->iTestModuleCrashDetected; - } - - //__TRACE(KInit, (_L("CTestEngine::DeleteTestCase moduleController=[%x] crashed=[%d] realModuleController=[%x] crashed=[%d]"), moduleController, moduleControllerCrashed, realModuleController, realModuleControllerCrashed)); - // For UITestingSupport, SeparateProcesses and PythonSupport, when module is crashed, - // remove it from module lists, because it will be deleted when closing test case. - if(moduleController) - { - if(moduleControllerCrashed && iUITestingSupport && moduleController->iName->Find(KTestScripterName) == 0 - || moduleControllerCrashed && iSeparateProcesses - || moduleControllerCrashed && moduleController->iName->Find(KPythonScripter) == 0 - ) - { - __TRACE(KInit, (_L("Removing module controller from module list because of crash"))); - //Look for specific module controller and delete it - TInt i; - TInt j, children; - TInt modules = iModules.Count(); - for(i = 0; i < modules; i++) - { - if(iModules[i] == moduleController) - { - __TRACE(KInit, (_L("Module controller found - removing"))); - iModules.Remove(i); - break; - } - - //Check children of the module and if module to be deleted found there, remove it - children = iModules[i]->iChildrenControllers.Count(); - __TRACE(KInit, (_L("Checking %d children of [%S]"), children, iModules[i]->iName)); - for(j = 0; j < children; j++) - { - if(iModules[i]->iChildrenControllers[j] == moduleController) - { - __TRACE(KInit, (_L("Module controller found (child) - removing"))); - - iModules[i]->iChildrenControllers.Remove(j); - - __TRACE(KInit, (_L("Child removed from [%S] controller. Currently it has %d children:"), iModules[i]->iName, iModules[i]->iChildrenControllers.Count())); - for(TInt k = 0; k < iModules[i]->iChildrenControllers.Count(); k++) - { - __TRACE(KInit, (_L(" %d. [%S]"), k + 1, iModules[i]->iChildrenControllers[k]->iName)); - } - break; - } - } - } - } - } - if(moduleController && realModuleController) - { - if(realModuleControllerCrashed && iUITestingSupport && realModuleController->iName->Find(KTestScripterName) == 0 - || realModuleControllerCrashed && iSeparateProcesses - || realModuleControllerCrashed && realModuleController->iName->Find(KPythonScripter) == 0 - ) - { - __TRACE(KInit, (_L("Removing real module controller from module list because of crash"))); - //Remove module controller from scripter controller - moduleController->RemoveModuleController(realModuleController); - } - } - - // Close test case and remove it from container - //testCase->CloseTestCase(); - iTestCases->Remove( aHandle ); - - // Decrement resource count - iResourceCount--; - - // Remove from testcase array - iTestCaseArray.Remove( iTestCaseArray.Find( testCase ) ); - - //If this is UITestingSupport and module is not crashed, delete controller - //(in other words, kill process, because we need somehow reset the test server). - if(moduleController && !moduleControllerCrashed) - { - if(iUITestingSupport && moduleController->iName->Find(KTestScripterName) == 0) - { - if(realModuleController) - { - if(!realModuleControllerCrashed) - { - __TRACE(KInit, (_L("Delete module controller (and kill process in which test case was run)."))); - __TRACE(KInit, (_L("Real module controller provided - processing"))); - //Remove module controller from scripter controller - moduleController->DeleteModuleController(realModuleController); - } - } - else - { - __TRACE(KInit, (_L("Delete module controller (and kill process in which test case was run)."))); - __TRACE(KInit, (_L("Real module controller not provided, checking normal controllers"))); - //Look for specific module controller and delete it - TInt i; - TInt j, children; - TInt modules = iModules.Count(); - for(i = 0; i < modules; i++) - { - if(iModules[i] == moduleController) - { - __TRACE(KInit, (_L("Module controller found - deleting"))); - delete iModules[i]; - iModules.Remove(i); - break; - } - - //Check children of the module and if module to be deleted found there, remove it - children = iModules[i]->iChildrenControllers.Count(); - __TRACE(KInit, (_L("Checking %d children of [%S]"), children, iModules[i]->iName)); - for(j = 0; j < children; j++) - { - if(iModules[i]->iChildrenControllers[j] == moduleController) - { - __TRACE(KInit, (_L("Module controller found (child) - deleting"))); - - delete iModules[i]->iChildrenControllers[j]; - iModules[i]->iChildrenControllers.Remove(j); - - __TRACE(KInit, (_L("Child removed from [%S] controller. Currently it has %d children:"), iModules[i]->iName, iModules[i]->iChildrenControllers.Count())); - for(TInt k = 0; k < iModules[i]->iChildrenControllers.Count(); k++) - { - __TRACE(KInit, (_L(" %d. [%S]"), k + 1, iModules[i]->iChildrenControllers[k]->iName)); - } - break; - } - } - } - } - } - } - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: IsStateEventAndSet - - Description: Callback to check state event status. - - Parameters: const TName& aEventName: in: Event name - - Return Values: ETrue: event is set - EFalse: event is not set - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TBool CTestEngine::IsStateEventAndSet( const TName& aEventName ) - { - TInt count = iStateEvents.Count(); - for( TInt i = 0; i < count; i++ ) - { - TPtrC name = iStateEvents[i]->Des(); - if( name == aEventName ) - { - // Requested state event set already - return ETrue; - } - } - return EFalse; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: CtlEventL - - Description: Callback to control events. - - Parameters: const TEventIf& aEvent: in: event information - TRequestStatus& aStatus: in: Request status - - Return Values: CTestEventController*: CTestEventController object - - Errors/Exceptions: Leaves if CtlEventL leaves - Leaves if memory allocation fails - Leaves if unset event not found from pending - state event list - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestEventController* CTestEngine::CtlEventL( const TEventIf& aEvent, - TRequestStatus& aStatus ) - { - __TRACE( KVerbose, ( _L( "CTestEngine::CtlEventL" ) ) ); - - aStatus = KRequestPending; - - UpdateEventL( aEvent ); - return CTestEventController::NewL( this, aEvent, &aStatus ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: UpdateEventL - - Description: Update event lists. - - Parameters: const TEventIf& aEvent: in: event information - - Return Values: None - - Errors/Exceptions: Leaves if CtlEventL leaves - Leaves if memory allocation fails - Leaves if unset event not found from pending - state event list - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::UpdateEventL( const TEventIf& aEvent ) - { - // Handle ESetEvent and EUnsetEvent for state events here - if( aEvent.EventType() == TEventIf::EState ) - { - // Find event from the list - TInt count = iStateEvents.Count(); - TInt index = 0; - const TDesC& eventName = aEvent.Name(); - for( ; index < count; index++ ) - { - TPtrC name = iStateEvents[index]->Des(); - if( name == eventName ) - { - break; - } - } - - if( aEvent.Type() == TEventIf::ESetEvent ) - { - // Check that event is not already pending - if( index < count ) - { - User::Leave( KErrAlreadyExists ); - } - - // Add set event to pending state event list - HBufC* name = aEvent.Name().AllocLC(); - User::LeaveIfError( iStateEvents.Append( name ) ); - CleanupStack::Pop( name ); - } - else if( aEvent.Type() == TEventIf::EUnsetEvent ) - { - if( index == count ) - { - // Not found from state event list - User::Leave( KErrNotFound ); - } - HBufC* tmp = iStateEvents[index]; - iStateEvents.Remove( index ); - delete tmp; - } - } - else if( aEvent.Type() == TEventIf::EUnsetEvent ) - { - // Can not give Unset for indication event - User::Leave( KErrNotSupported ); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: Logger - - Description: Return the pointer to Logger. - - Parameters: None - - Return Values: CStifLogger*: Pointer to StifLogger - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CStifLogger* CTestEngine::Logger() - { - return iTestEngineServer->Logger(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: WriteRebootParams - - Description: Write the Reboot's state parameters. - - Parameters: TTestInfo& aTestInfo: in: Test case information. - TInt& aCode: in: Reboot related integer information. - TDesC& aName: in: Reboot related string information. - - Return Values: TInt: Symbian OS error - - Errors/Exceptions: Error code returned if Logger creation fails. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::WriteRebootParams( TTestInfo& aTestInfo, - TInt& aCode, - TDesC& aName ) - { - __TRACE( KVerbose, ( _L( "WriteRebootParams() starts..." ) ) ); - - // Logger's setting definitions - TLoggerSettings loggerSettings; - - loggerSettings.iCreateLogDirectories = ETrue; - loggerSettings.iOverwrite = ETrue; - loggerSettings.iTimeStamp = EFalse; - loggerSettings.iLineBreak = EFalse; - loggerSettings.iEventRanking = EFalse; - loggerSettings.iThreadId = EFalse; - // EData format because now we don't have to check file type when - // parsing this. - loggerSettings.iHardwareFormat = CStifLogger::EData; - loggerSettings.iHardwareOutput = CStifLogger::EFile; - loggerSettings.iEmulatorFormat = CStifLogger::EData; - loggerSettings.iEmulatorOutput = CStifLogger::EFile; - loggerSettings.iUnicode = EFalse; - loggerSettings.iAddTestCaseTitle = EFalse; - - // Use default setting if path or filename are not set by SetAttribute() - if( iRebootPath == NULL ) - { - iRebootPath= iRebootDefaultPath.Alloc(); - } - if( iRebootFilename == NULL ) - { - iRebootFilename= iRebootDefaultFilename.Alloc(); - } - - CStifLogger* logger = NULL; - TRAPD( ret, logger = CStifLogger::NewL( *iRebootPath, - *iRebootFilename, - loggerSettings ) ); - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "WriteRebootParams() Logger creation fails with error: " ), ret ) ); - delete logger; - return ret; - } - - // Write reboot parameters - // Because logging format is EData we need add line breaks by hand. - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "This is TestFramework's file which includes Reboot related informations" ) ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "Reboot case's related information:" ) ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "%S %S" ), &KTestModule, &aTestInfo.iModuleName ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "%S %S" ), &KTestCaseFile, &aTestInfo.iConfig ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "%S %d" ), &KTestCaseNumber, aTestInfo.iTestCaseInfo.iCaseNumber ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "%S %S" ), &KTestCaseTitle, &aTestInfo.iTestCaseInfo.iTitle ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "%S %d" ), &KStateCode, aCode ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "%S " ), &KStateName ); - logger->Log( aName ); - logger->Log( _L( "\r\n" ) ); - logger->Log( _L( "\r\n" ) ); - - delete logger; - - __TRACE( KVerbose, ( _L( "WriteRebootParams() ends" ) ) ); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ReadRebootParams - - Description: Read the Reboot parameters. - - Parameters: TTestInfo& aTestInfo: in: Test case information. - - Return Values: TInt: Symbian OS error - - Errors/Exceptions: Error code returned if Parser creation fails. - Error code returned if section creation fails. - Error code returned if item creation fails. - Error code returned if parsing operation fails. - KErrArgument returned if parsed values and test case - values are different. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::ReadRebootParams( TTestInfo& aTestInfo, - TDes& aStateDes, - TInt& aState ) - { - __TRACE( KVerbose, ( _L( "ReadRebootParams() starts..." ) ) ); - - if( iRebootParams == NULL ) - { - __TRACE( KVerbose, ( _L( "ReadRebootParams(): Reboot not done" )) ); - return KErrNotFound; - } - - // --.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.-- - // Checks parsed values and test case values - // --.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.-- - if( iRebootParams->iTestModule != aTestInfo.iModuleName || - iRebootParams->iTestCaseFile != aTestInfo.iConfig || - iRebootParams->iCaseNumber != aTestInfo.iTestCaseInfo.iCaseNumber ) - { - __TRACE( KVerbose, - ( _L( "ReadRebootParams(): Reboot not done by %S" ), - &aTestInfo.iModuleName) ); - return KErrArgument; - } - - aStateDes.Copy( iRebootParams->iStateName ); - aState = iRebootParams->iStateCode; - - // delete reboot params, to ensure that same test case - // does not get indication about reboot again - delete iRebootParams; - iRebootParams = 0; - - __TRACE( KVerbose, ( _L("ReadRebootParams() ends" ) ) ); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ParseRebootParamsL - - Description: Parse the Reboot parameters. - - Parameters: None - - Return Values: TInt: Symbian OS error - - Errors/Exceptions: Error code returned if Parser creation fails. - Error code returned if section creation fails. - Error code returned if item creation fails. - Error code returned if parsing operation fails. - KErrArgument returned if parsed values and test case - values are different. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::ParseRebootParamsL() - { - __TRACE( KVerbose, ( _L( "ParseRebootParamsL() starts..." ) ) ); - - TInt ret_parsing( 0 ); - TPtrC tmp; - - // Use default setting if path or filename are not set by SetAttribute() - if( iRebootPath == NULL ) - { - iRebootPath= iRebootDefaultPath.Alloc(); - } - if( iRebootFilename == NULL ) - { - iRebootFilename= iRebootDefaultFilename.Alloc(); - } - - // Create parser object - CStifParser* parser = NULL; - TRAPD( ret, parser = CStifParser::NewL( *iRebootPath, - *iRebootFilename ) ); - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "ReadRebootParams(): Reboot file not found" )) ); - return ret; - } - CleanupStack::PushL( parser ); - - // Create section object - CStifSectionParser* section = parser->SectionL( KNullDesC, KNullDesC ); - CleanupStack::PushL( section ); - - // Delete old reboot params - delete iRebootParams; - iRebootParams = 0; - iRebootParams = CRebootParams::NewL(); - - // ----------------------Test module parsing - CStifItemParser* item = section->GetItemLineL( KTestModule ); - CleanupStack::PushL( item ); - - // Parsing integer - ret_parsing = item->GetString( KTestModule, tmp ); - if( ret_parsing == KErrNone || ret_parsing == KErrNotFound ) - { - __TRACE( KVerbose, ( _L("ReadRebootParams(): TestModule: %S" ), &tmp ) ); - } - else - { - __TRACE( KError, - ( _L("ReadRebootParams(): TestModule parsing fails with error: " ), - ret_parsing ) ); - User::Leave( ret_parsing ); - } - iRebootParams->SetTestModuleNameL( tmp ); - CleanupStack::PopAndDestroy( item ); - - // ----------------------Testcase parsing - item = section->GetItemLineL( KTestCaseFile ); - CleanupStack::PushL( item ); - - // Parsing string - ret_parsing = item->GetString( KTestCaseFile, tmp ); - if( ret_parsing == KErrNone ) - { - __TRACE( KVerbose, ( _L("ReadRebootParams(): TestCaseFile: %S" ), &tmp ) ); - iRebootParams->SetTestCaseFileNameL( tmp ); - } - else if( ret_parsing == KErrNotFound ) - { - __TRACE( KVerbose, - ( _L("ReadRebootParams(): No testcasefile defined for test module" )) ); - } - else - { - __TRACE( KError, - ( _L("ReadRebootParams(): TestCaseFile parsing fails with error: %d " ), - ret_parsing ) ); - User::Leave( ret_parsing ); - } - CleanupStack::PopAndDestroy( item ); - - // ----------------------Testcase number parsing - item = section->GetItemLineL( KTestCaseNumber ); - CleanupStack::PushL( item ); - - // Parsing integer - ret_parsing = item->GetInt( KTestCaseNumber, iRebootParams->iCaseNumber ); - if( ret_parsing == KErrNone || ret_parsing == KErrNotFound ) - { - __TRACE( KVerbose, ( _L("ReadRebootParams(): TestCaseNumber: %d" ), - iRebootParams->iCaseNumber ) ); - } - else - { - __TRACE( KError, - ( _L("ReadRebootParams(): TestCaseNumber parsing fails with error: %d " ), - ret_parsing ) ); - User::Leave( ret_parsing ); - } - CleanupStack::PopAndDestroy( item ); - - // --.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.-- - // --.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.-- - // Next state code and name parsing if no error found - // --.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.-- - - // ----------------------State code parsing - item = section->GetItemLineL( KStateCode ); - CleanupStack::PushL( item ); - - // Parsing integer - ret_parsing = item->GetInt( KStateCode, iRebootParams->iStateCode ); - if( ret_parsing == KErrNone || ret_parsing == KErrNotFound ) - { - __TRACE( KVerbose, ( _L("ReadRebootParams(): StateCode: %d" ), - iRebootParams->iStateCode ) ); - } - else - { - __TRACE( KError, - ( _L("ReadRebootParams(): StateCode parsing fails with error: %d " ), - ret_parsing ) ); - User::Leave( ret_parsing ); - } - CleanupStack::PopAndDestroy( item ); - - // ----------------------State name parsing - ret_parsing = section->GetLine( KStateName, tmp, ENoTag ); - if( ret_parsing != KErrNone ) - { - __TRACE( KError, - ( _L("ReadRebootParams(): State name parsing fails with error: %d " ), - ret_parsing ) ); - User::Leave( ret_parsing ); - } - - iRebootParams->SetTestCaseStateL( tmp ); - - __TRACE( KVerbose, ( _L("ReadRebootParams() ends" ) ) ); - - CleanupStack::PopAndDestroy( section ); - CleanupStack::PopAndDestroy( parser ); - - // Delete file - RFs rf; - TInt retVal = rf.Connect(); - if( retVal != KErrNone ) - { - User::Leave( retVal ); - } - - TFileName file( *iRebootPath ); - file.Append( *iRebootFilename ); - rf.Delete( file ); - rf.Close(); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: PauseAllTestCases - - Description: Pause all test case(s) which are/is running. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Draft - -------------------------------------------------------------------------------- -*/ -void CTestEngine::PauseAllTestCases() - { - __TRACE( KVerbose, ( _L( "CTestEngine::PauseAllTestCases()" ) ) ); - - TInt count( 0 ); - count = iTestCaseArray.Count(); - - for( TInt a = 0; a < count; a++ ) - { - // Pause test case - iTestCaseArray[a]->Pause(); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: FlushAtsLogger - - Description: Flush ATS logger's - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Draft - -------------------------------------------------------------------------------- -*/ -void CTestEngine::FlushAtsLogger() - { - __TRACE( KVerbose, ( _L( "CTestEngine::FlushAtsLogger()" ) ) ); - - TInt count( 0 ); - count = iModules.Count(); - - for( TInt a = 0; a < count; a++ ) - { - // Pause test case - iModules[a]->AtsLogger().SaveForRebootL(); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: GetDeviceResetDllName - - Description: Get device reset module's DLL name. - - Parameters: None - - Return Values: TPtrC - - Errors/Exceptions: None - - Status: Draft - -------------------------------------------------------------------------------- -*/ -TPtrC CTestEngine::GetDeviceResetDllName() - { - __TRACE( KVerbose, ( _L( "CTestEngine::GetDeviceResetDllName()" ) ) ); - - return iDeviceResetDllName->Des(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: EnableStifMeasurement - - Description: Set measurements related information, enable measurement. - - Parameters: const TName& aInfoType: in: Enabled measurement type - - Return Values: TInt: Symbian error code - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::EnableStifMeasurement( const TDesC& aInfoType ) - { - __TRACE( KInit, ( _L( "Measurement [%S] enabled" ), &aInfoType ) ); - - if( aInfoType == KStifMeasurement01 ) - { - iDisableMeasurement &= ~EMeasurement01; - } - else if( aInfoType == KStifMeasurement02 ) - { - iDisableMeasurement &= ~EMeasurement02; - } - else if( aInfoType == KStifMeasurement03 ) - { - iDisableMeasurement &= ~EMeasurement03; - } - else if( aInfoType == KStifMeasurement04 ) - { - iDisableMeasurement &= ~EMeasurement04; - } - else if( aInfoType == KStifMeasurement05 ) - { - iDisableMeasurement &= ~EMeasurement05; - } - else if( aInfoType == KStifMeasurementBappea ) - { - iDisableMeasurement &= ~EBappea; - } - else if( aInfoType == KStifMeasurementDisableAll ) - { - __TRACE( KInit, ( _L( "All measurements are disabled" ) ) ); - iDisableMeasurement &= EDisableAll; // Does change anything !!! - } - else if( aInfoType == KStifMeasurementEnableAll ) - { - __TRACE( KInit, ( _L( "All measurements types are enabled" ) ) ); - iDisableMeasurement &= EEnableAll; - } - else - { - __TRACE( KInit, ( _L( "Measurement [%S] not recognized" ), &aInfoType ) ); - return KErrArgument; - } - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: DisableStifMeasurement - - Description: Set measurements related information, disable measurement. - - Parameters: const TName& aInfoType: in: Disabled measurement type - - Return Values: TInt: Symbian error code - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::DisableStifMeasurement( const TDesC& aInfoType ) - { - __TRACE( KInit, ( _L( "Measurement [%S] disabled" ), &aInfoType ) ); - - if( aInfoType == KStifMeasurement01 ) - { - iDisableMeasurement |= EMeasurement01; - } - else if( aInfoType == KStifMeasurement02 ) - { - iDisableMeasurement |= EMeasurement02; - } - else if( aInfoType == KStifMeasurement03 ) - { - iDisableMeasurement |= EMeasurement03; - } - else if( aInfoType == KStifMeasurement04 ) - { - iDisableMeasurement |= EMeasurement04; - } - else if( aInfoType == KStifMeasurement05 ) - { - iDisableMeasurement |= EMeasurement05; - } - else if( aInfoType == KStifMeasurementBappea ) - { - iDisableMeasurement |= EBappea; - } - else if( aInfoType == KStifMeasurementDisableAll ) - { - __TRACE( KInit, ( _L( "All measurements are disabled" ) ) ); - iDisableMeasurement |= EDisableAll; - } - else if( aInfoType == KStifMeasurementEnableAll ) - { - __TRACE( KInit, ( _L( "All measurements types are enabled" ) ) ); - iDisableMeasurement |= EEnableAll; // Does change anything !!! - } - // This option can be defined in TestFramework.ini file - else if( aInfoType == KStifMeasurementDisableNone ) - { - __TRACE( KInit, ( _L( "All measurements types are enabled" ) ) ); - iDisableMeasurement = EEnableAll; // Sets to 0 - } - else - { - __TRACE( KInit, ( _L( "Measurement [%S] not recognized" ), &aInfoType ) ); - return KErrArgument; - } - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: StifMeasurement - - Description: Get measurements related information. Returns is measurement - disable. - - Parameters: None - - Return Values: TInt: Indication what measurement types is/are disabled. - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::StifMeasurement() - { - return iDisableMeasurement; - - } -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: TestModuleCrash - - Description: This method is called only when test module crashed - with KErrServerTerminated (-15). - Clones new TestModuleController: - - Find crashed testmodulecontroller - - Creates new copy of that testmodulecontroller - - Replaces old crashed testmodulecontroller with this new one - - Parameters: CTestModuleController* aTestModuleController: in: TestModuleController - Return Values: None - - Errors/Exceptions: Leaves if error happens when adding clone to the list - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::TestModuleCrash(CTestModuleController* aTestModuleController) - { - TName crashModuleName = aTestModuleController->ModuleName(KNullDesC); - __TRACE(KInit, (_L("Handling crashed test module [%S]"), &crashModuleName)); - TBool isTestScripter(EFalse); - - // Find crashed test module controller - CTestScripterController* testScripterController = aTestModuleController->iTestScripterController; - if(testScripterController) - { - isTestScripter = ETrue; - } - - // If UITestingSupport or SeparateProcesses is enabled, there is no need - // to create clone of Test Module Controller, because it will be created - // automatically when needed. - if(iUITestingSupport && crashModuleName.Find(KTestScripterName) == 0 - || iSeparateProcesses - || (crashModuleName.Find(KPythonScripter) == 0) - ) - { - __TRACE(KInit, (_L("Handling crashed test module with enabled UITestingSupport or SeparateProcesses is not needed"))); - aTestModuleController->iTestModuleCrashDetected = ETrue; - return; - } - - // Clone crashed module - TBool afterReset = EFalse; - if(iRebootParams && iRebootParams->iTestModule == crashModuleName) - { - afterReset = ETrue; - } - - CTestModuleController* clone; - clone = aTestModuleController->CloneL(aTestModuleController, afterReset, testScripterController); - - // Replaces crashed testmodulecontroller with this new one - // Note: Old Testmodulecontroller is deleted in CTestModuleController::CaseFinished - // that is called from CTestCase::~CTestCase() - - TInt index = KErrNotFound; - if(isTestScripter) - { - index = testScripterController->iTestScripter.Find(aTestModuleController); - __TRACE(KInit, (_L("Crashed module index [%d]"), index)); - if(index != KErrNotFound) - { - testScripterController->iTestScripter.Remove(index); - } - testScripterController->iTestScripter.Append(clone); - } - else - { - index = iModules.Find(aTestModuleController); - __TRACE(KInit, (_L("Crashed module index [%d]"), index)); - if(index != KErrNotFound) - { - iModules.Remove(index); - } - iModules.Append(clone); - } - __TRACE(KInit, (_L("End of handling crashed test module"))); - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: ExecuteCommandL - - Description: Executes command received from test case. - The method was created to allow test case to kill itself. - - Parameters: aTestCaseHandle: handler to test case - Return Values: None - - Errors/Exceptions: Leaves if error happens when adding clone to the list - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngine::ExecuteCommandL(TCommand aCommand, TDesC8& aParamsPckg) - { - TInt testCaseHandle = 0; - // Get params - switch(aCommand) - { - case EStopExecution: - { - //Unpack received parameters - TStopExecutionCommandParams par; - TStopExecutionCommandParamsPckg parPack(par); - parPack.Copy(aParamsPckg); - - __TRACE(KInit, (_L("CTestEngine::ExecuteCommandL received command [%d] type [%d] code [%d] test handle [%d]"), TInt(aCommand), TInt(par.iType), TInt(par.iCode), par.iTestCaseHandle)); - - //Get test case handle - testCaseHandle = par.iTestCaseHandle; - - break; - } - case ESendTestModuleVersion: - { - TSendTestModuleVesionCommandParams par; - TSendTestModuleVesionCommandParamsPckg parPack(par); - parPack.Copy(aParamsPckg); - - TTestModuleVersionInfo testModuleVersionInfo; - testModuleVersionInfo.iMajor = par.iMajor; - testModuleVersionInfo.iMinor = par.iMinor; - testModuleVersionInfo.iBuild = par.iBuild; - testModuleVersionInfo.iTestModuleName = par.iTestModuleName; - if(iTestReport) - { - iTestReport->AddTestModuleVersion(testModuleVersionInfo); - } - - return; - } - default: - __TRACE(KError, (_L("CTestEngine::ExecuteCommandL Unknown command [%d]"), TInt(aCommand))); - return; - } - - // Get test case from container - CTestCase* testCase = (CTestCase*)iTestCases->At(testCaseHandle); - - // Log some info if invalid handle - if(testCase == NULL) - { - __TRACE(KInit, ( _L( "CTestEngine::ExecuteCommandL - invalid handle. Unable to get test case to execute command [%d]"), TInt(aCommand))); - return; - } - - testCase->ExecuteCommandL(aCommand, aParamsPckg); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: GetIndexForNewTestModuleController - - Description: Returns new index for test module controller. - This number is appended to module controller name. - This method is used when option to run every test case in - separate process is set to on. - - Parameters: aTestCaseHandle: handler to test case - Return Values: None - - Errors/Exceptions: Leaves if error happens when adding clone to the list - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::GetIndexForNewTestModuleController(void) - { - return iIndexTestModuleControllers++; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngine - - Method: AddTestCaseToTestReport - - Description: Get parameters from message and add test case to test report. - - Parameters: aMessage: message - Return Values: error id - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestEngine::AddTestCaseToTestReport(const RMessage2& aMessage) - { - if(iTestReport) - { - // Read test data - TTestInfo testInfo; - TTestInfoPckg testInfoPckg(testInfo); - - TFullTestResult fullTestResult; - TFullTestResultPckg fullTestResultPckg(fullTestResult); - - TRAPD(err, aMessage.ReadL(0, testInfoPckg)); - if(err) - { - __TRACE(KError, (_L("Leave when reading TTestInfo in AddTestCaseToTestReport [%d]"), err)); - return err; - } - - TRAP(err, aMessage.ReadL(1, fullTestResultPckg)); - if(err) - { - __TRACE(KError, (_L("Leave when reading TFullTestResult in AddTestCaseToTestReport [%d]"), err)); - return err; - } - - TRAP(err, iTestReport->AddTestCaseResultL(testInfo, fullTestResult, aMessage.Int2())); - if(err) - { - __TRACE(KError, (_L("Leave from test report in AddTestCaseToTestReport [%d]"), err)); - return err; - } - } - else - { - __TRACE(KError, (_L("TestReport not initialized in AddTestCaseToTestReport"))); - return KErrNotReady; - } - - return KErrNone; - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CTestEngineSubSession class member functions. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineSubSession - - Method: CTestEngineSubSession - - Description: Default constructor - - C++ default constructor can NOT contain any code, that - might leave. - - Parameters: CTestEngine* aEngine: in: Pointer to Test Engine - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CTestEngineSubSession::CTestEngineSubSession( CTestEngine* aEngine ) : - iTestEngine( aEngine ) - { - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineSubSession - - Method: ConstructL - - Description: Symbian OS second phase constructor - - Symbian OS default constructor can leave. - - Parameters: None - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestEngineSubSession::ConstructL() - { - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineSubSession - - Method: NewL - - Description: Two-phased constructor. - - Parameters: CTestEngine* aEngine: in: Pointer to Test Engine - - Return Values: CTestEngineSubSession* : pointer to created CTestEngineSubSession object - - Errors/Exceptions: Leaves if ConstructL leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestEngineSubSession* CTestEngineSubSession::NewL( CTestEngine* aEngine ) - { - CTestEngineSubSession* self = new ( ELeave ) CTestEngineSubSession( aEngine ); - CleanupClosePushL( *self ); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestEngineSubSession - - Method: ~CTestEngineSubSession - - Description: Destructor - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestEngineSubSession::~CTestEngineSubSession() - { - } - - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CTestCase class member functions. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: CTestCase - - Description: Default constructor - - C++ default constructor can NOT contain any code, that - might leave. - - Parameters: CTestEngine* aEngine: in: Pointer to Test Engine - CTestModuleController* aModuleController: in: Pointer to - Module Controller - TTestInfo& aTestInfo: in: Test info for this test case - CTestModuleController* aRealModuleController: in: Pointer to - module controller used inside in scripter controller - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CTestCase::CTestCase( CTestEngine* aEngine, - CTestModuleController* aModuleController, - TTestInfo& aTestInfo, - CTestModuleController* aRealModuleController ) : - iTestEngine( aEngine ), - iTestModule( aModuleController ), - iRealModuleController (aRealModuleController) - { - - // This method must be called to find out how - // many testcases are currently ongoing by increasing iTestCaseCounter. - // This is a part of the implementation for - // supporting test module crashing with -15 - iTestModule->CaseCreated(); - - // Store handle to RTestServer - //If test scripter is used (it uses internally module controllers) - //then use it (real module controller). - if(iRealModuleController) - { - iTestServer = iRealModuleController->Server(aTestInfo); - } - else - { - iTestServer = iTestModule->Server( aTestInfo ); - } - - //If real test module controller is provided, increase test case count - if(iRealModuleController) - { - iRealModuleController->CaseCreated(); - } - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: ConstructL - - Description: Symbian OS second phase constructor - - Symbian OS default constructor can leave. - - Parameters: CTestReport* aTestReport: in: Pointer to Test Report - TTestInfo& aTestInfo: in: Test Info for this test case - - Return Values: None - - Errors/Exceptions: Leaves if RTestExecution::Open returns error - Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::ConstructL( CTestReport* aTestReport, - TTestInfo& aTestInfo ) - { - __TRACE( KVerbose, ( _L( "CTestCase::ConstructL" ) ) ); - - // Open handle to RTestExecution - User::LeaveIfError( iTestExecution.Open( iTestServer, - aTestInfo.iTestCaseInfo.iCaseNumber, aTestInfo.iConfig ) ); - - // Make new test case runner - iTestCaseController = CTestCaseController::NewL( iTestEngine, - aTestReport, iTestModule->AtsLogger(), iTestExecution, aTestInfo ); - - // Make new test case printer - iTestCasePrint = CTestProgressNotifier::NewL( iTestEngine, - iTestExecution ); - - iTestCaseEvent = CTestEventNotifier::NewL( iTestEngine, iTestExecution ); - - iTestCaseRemoteCmd = CTestRemoteCmdNotifier::NewL( iTestEngine, - iTestExecution, - iTestCaseController, - iTestModule->AtsLogger() ); - - iTestCaseCommand = CTestCommandNotifier::NewL(iTestEngine, iTestExecution); - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: NewL - - Description: Two-phased constructor. - - Parameters: CTestEngine* aEngine: in: Pointer to Test Engine - CTestModuleController* aModuleController: in: Pointer to - Module Controller - CTestReport* aTestReport: in: Pointer to Test Report - TTestInfo& aTestInfo: in: Test Info for this test case - - Return Values: CTestCase* : pointer to created CTestCase object - - Errors/Exceptions: Leaves if ConstructL leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestCase* CTestCase::NewL( CTestEngine* aEngine, - CTestModuleController* aModuleController, - CTestReport* aTestReport, - TTestInfo& aTestInfo, - CTestModuleController* aRealModuleController ) - { - CTestCase* self = new ( ELeave ) CTestCase( aEngine, aModuleController, aTestInfo, aRealModuleController ); - CleanupClosePushL( *self ); - self->ConstructL( aTestReport, aTestInfo ); - CleanupStack::Pop(); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: ~CTestCase - - Description: Destructor - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestCase::~CTestCase() - { - CloseTestCase(); - - // This added method call is a part of the implementation for - // supporting test module crashing with -15. - // It checks that can old Testmodulecontroller be deletd or not - if( iTestModule != NULL ) - { - iTestModule->CaseFinished(); - } - - //If real test module controller is provided, decrease test case count - if( iRealModuleController != NULL ) - { - iRealModuleController->CaseFinished(); - } - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: CloseTestCase - - Description: Close session - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::CloseTestCase() - { - __TRACE( KVerbose, ( _L( "CTestCase::CloseTestCase" ) ) ); - - // Free allocated resources - delete iTestCaseController; - iTestCaseController = NULL; - delete iTestCasePrint; - iTestCasePrint = NULL; - delete iTestCaseRemoteCmd; - iTestCaseRemoteCmd = NULL; - - delete iTestCaseEvent; - iTestCaseEvent = NULL; - - delete iTestCaseCommand; - iTestCaseCommand = NULL; - - iTestExecution.Close(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: RunTestCaseL - - Description: Enumerates test cases - - Parameters: const RMessage& aMessage: in: Server Message - - Return Values: None - - Errors/Exceptions: Leaves if some of called leaving methods leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::RunTestCaseL( const RMessage2& aMessage ) - { - __TRACE( KVerbose, ( _L( "CTestCase::RunTestCaseL" ) ) ); - // Start active objects for running test case - iTestCaseController->StartL( aMessage ); - iTestCaseEvent->Start(); - iTestCaseCommand->Start(); - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: Pause - - Description: Suspend the test case execution - - Parameters: None - - Return Values: TInt: Return value from RTestExecution::Pause - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestCase::Pause() - { - __TRACE( KVerbose, ( _L( "CTestCase::Pause" ) ) ); - - return iTestExecution.Pause(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: Resume - - Description: Resume the suspended test case execution - - Parameters: None - - Return Values: TInt: Return value from RTestExecution::Resume - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestCase::Resume() - { - __TRACE( KVerbose, ( _L( "CTestCase::Resume" ) ) ); - - return iTestExecution.Resume(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: NotifyProgressL - - Description: Notifies progresses from Test Module - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leaves if called StartL method leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::NotifyProgressL( const RMessage2& aMessage ) - { - __TRACE( KVerbose, ( _L( "CTestCase::NotifyProgressL" ) ) ); - iTestCasePrint->StartL( aMessage ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: NotifyRemoteTypeL - - Description: Notifies remote commands from Test Module - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leaves if called StartL method leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::NotifyRemoteTypeL( const RMessage2& aMessage ) - { - - __TRACE( KVerbose, ( _L( "CTestCase::NotifyRemoteTypeL" ) ) ); - iTestCaseRemoteCmd->EnableReceive( aMessage ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: NotifyRemoteMsgL - - Description: Notifies remote commands from Test Module - - Parameters: const RMessage& aMessage: in: Server message - - Return Values: None - - Errors/Exceptions: Leaves if called StartL method leaves - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::NotifyRemoteMsgL( const RMessage2& aMessage ) - { - - __TRACE( KVerbose, ( _L( "CTestCase::NotifyRemoteMsgL" ) ) ); - switch( aMessage.Int1() ) - { - case EStifCmdSend: - { - iTestCaseRemoteCmd->GetReceivedMsg( aMessage ); - } - break; - case EStifCmdReceive: - { - TInt len = aMessage.Int2(); - if( len <= 0 ) - { - User::Leave( KErrGeneral ); - } - HBufC8* buf = HBufC8::NewLC( len ); - - TPtr8 tmp = buf->Des(); - aMessage.ReadL( 0, tmp ); - - TInt ret = iTestExecution.ReadRemoteCmdInfo( tmp, EStifCmdReceive ); - - CleanupStack::PopAndDestroy( buf ); - - aMessage.Complete( ret ); - } - break; - case EStifCmdRebootProceed: - { - TInt value = 0; - TPckg tmp( value ); - aMessage.ReadL( 0, tmp ); - - TInt ret = iTestExecution.ReadRemoteCmdInfo( tmp, - EStifCmdRebootProceed, - value ); - aMessage.Complete( ret ); - } - break; - default: - { - User::Leave( KErrGeneral ); - } - } - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: CancelAsyncRequest - - Description: Asynchronous requests are canceled by this function. - - Parameters: const RMessage aMessage - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::CancelAsyncRequest( const RMessage2& aMessage ) - { - switch ( aMessage.Int0() ) - { - case ETestCaseRunTestCase: - { - iTestCaseController->Cancel(); - iTestCaseEvent->Cancel(); - break; - } - case ETestCaseNotifyProgress: - { - iTestCasePrint->Cancel(); - break; - } - case ETestCaseNotifyRemoteType: - { - iTestCaseRemoteCmd->CancelReq(); - break; - } - case ETestCaseNotifyCommand: - { - iTestCaseCommand->Cancel(); - break; - } - default: - iTestEngine->PanicClient( EBadRequest, aMessage ); - break; - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: ModuleName - - Description: Return the name of Test Module. - - Parameters: None - - Return Values: const TFileName& : Test Module owning this test case - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -const TDesC& CTestCase::ModuleName() - { - return iTestModule->ModuleName( KNullDesC ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: CtlEvent - - Description: Control events - - Parameters: const TEventIf& aEvent: in: Event - TRequestStatus& aStatus: in: Request status - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::CtlEvent( const TEventIf& aEvent, TRequestStatus& aStatus ) - { - __ASSERT_ALWAYS( iTestCaseEvent, User::Panic( _L( "TestEngine event panic" ), KErrArgument ) ); - - iTestCaseEvent->CtlEvent( aEvent, aStatus ); - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: CheckCtlEvent - - Description: Check if CtlEvent should be called - - Parameters: const TEventIf& aEvent: in: Event - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TBool CTestCase::CheckCtlEvent( const TEventIf& aEvent ) - { - return iTestCaseEvent->CheckCtlEvent( aEvent ); - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: Logger - - Description: Return the pointer to Logger. - - Parameters: None - - Return Values: CStifLogger*: Pointer to StifLogger - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CStifLogger* CTestCase::Logger() - { - return iTestEngine->Logger(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: ExecuteCommaandL - - Description: Executes command received from test case. - - Parameters: aStifCommand command to be executed - aParam1 parameter to command - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::ExecuteCommandL(TCommand aCommand, TDesC8& aParamsPckg) - { - switch(aCommand) - { - case EStopExecution: - { - //Unpack received parameters - TStopExecutionCommandParams par; - TStopExecutionCommandParamsPckg parPack(par); - parPack.Copy(aParamsPckg); - - __TRACE(KVerbose, (_L("CTestCase::ExecuteCommandL command [%d] type [%d] code [%d]"), TInt(aCommand), TInt(par.iType), par.iCode)); - - iTestCaseController->Suicide(par.iType, par.iCode); - break; - } - default: - __TRACE(KVerbose, (_L("CTestCase::ExecuteCommandL unknown command [%d]"), TInt(aCommand))); - return; - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: GetModuleControllers - - Description: Return module controller and real module controller - - Parameters: aRealModuleController: out: real module controller - - Return Values: module controller - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestModuleController* CTestCase::GetModuleControllers(CTestModuleController** aRealModuleController) - { - *aRealModuleController = iRealModuleController; - return iTestModule; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: ResetModuleController - - Description: Set new module controller for test case (only in case when - original controller crashed) - - Parameters: aModuleController: in: new module controller - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::ResetModuleController(CTestModuleController* aModuleController) - { - iTestModule = aModuleController; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestCase - - Method: ResetRealModuleController - - Description: Set new real module controller for test case (only in case - when original controller crashed). - - Parameters: aRealModuleController: in: new real module controller - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestCase::ResetRealModuleController(CTestModuleController* aRealModuleController) - { - iRealModuleController = aRealModuleController; - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - Default constructor - -------------------------------------------------------------------------------- -*/ -CTestReportSettings::CTestReportSettings() - { - iCreateTestReport = ETrue; - iPath = NULL; - iName = NULL; - iFormat = CStifLogger::ETxt; - iOutput = CStifLogger::EFile; - iOverwrite = ETrue; - iXML = EFalse; - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - Two-phased constructor. - -------------------------------------------------------------------------------- -*/ -CTestReportSettings* CTestReportSettings::NewL() - { - CTestReportSettings* self = new ( ELeave ) CTestReportSettings(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - Symbian OS second phase constructor - -------------------------------------------------------------------------------- -*/ -void CTestReportSettings::ConstructL() - { - - } -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - Destructor - -------------------------------------------------------------------------------- -*/ -CTestReportSettings::~CTestReportSettings() - { - delete iPath; - iPath = NULL; - delete iName; - iName = NULL; - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CRebootParams class member functions. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - -/* -------------------------------------------------------------------------------- - - Class: CRebootParams - - Method: CRebootParams - - Description: Default constructor - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Draft - -------------------------------------------------------------------------------- -*/ -CRebootParams::CRebootParams() - { - } - -/* -------------------------------------------------------------------------------- - - Class: CRebootParams - - Method: ConstructL - - Description: Symbian OS second phase constructor - - - Parameters: None - - Return Values: None - - Errors/Exceptions: Leaves if RTestExecution::Open returns error - Leaves if some of called leaving methods leaves - - Status: Draft - -------------------------------------------------------------------------------- -*/ -void CRebootParams::ConstructL() - { - } - -/* -------------------------------------------------------------------------------- - - Class: CRebootParams - - Method: NewL - - Description: Two-phased constructor. - - Parameters: none - - Return Values: CRebootParams* : pointer to created CRebootParams object - - Errors/Exceptions: Leaves if ConstructL leaves - - Status: Draft - -------------------------------------------------------------------------------- -*/ -CRebootParams* CRebootParams::NewL() - { - - CRebootParams* self = new ( ELeave ) CRebootParams(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CRebootParams - - Method: ~CRebootParams - - Description: Destructor - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Draft - -------------------------------------------------------------------------------- -*/ -CRebootParams::~CRebootParams() - { - - delete iTestModuleBuf; - iTestModuleBuf = 0; - delete iTestCaseFileBuf; - iTestCaseFileBuf = 0; - delete iTestCaseTitleBuf; - iTestCaseTitleBuf = 0; - delete iStateNameBuf; - iStateNameBuf = 0; - - } - - -/* -------------------------------------------------------------------------------- - - Class: CRebootParams - - Method: SetTestModuleNameL - - Description: Setter - - Parameters: const TDesC& aName: in: name to set - - Return Values: None - - Errors/Exceptions: Leaves if memory allocation fails - - Status: Draft - -------------------------------------------------------------------------------- -*/ -void CRebootParams::SetTestModuleNameL( const TDesC& aName ) - { - - delete iTestModuleBuf; - iTestModuleBuf = 0; - iTestModuleBuf = aName.AllocLC(); - iTestModule.Set( iTestModuleBuf->Des() ); - CleanupStack::Pop( iTestModuleBuf ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CRebootParams - - Method: SetTestModuleNameL - - Description: Setter - - Parameters: const TDesC& aName: in: name to set - - Return Values: None - - Errors/Exceptions: Leaves if memory allocation fails - - Status: Draft - -------------------------------------------------------------------------------- -*/ -void CRebootParams::SetTestCaseFileNameL( const TDesC& aName ) - { - - delete iTestCaseFileBuf; - iTestCaseFileBuf = 0; - iTestCaseFileBuf = aName.AllocLC(); - iTestCaseFile.Set( iTestCaseFileBuf->Des() ); - CleanupStack::Pop( iTestCaseFileBuf ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CRebootParams - - Method: SetTestModuleNameL - - Description: Setter - - Parameters: const TDesC& aName: in: name to set - - Return Values: None - - Errors/Exceptions: Leaves if memory allocation fails - - Status: Draft - -------------------------------------------------------------------------------- -*/ -void CRebootParams::SetTestCaseTitleL( const TDesC& aName ) - { - - delete iTestCaseTitleBuf; - iTestCaseTitleBuf = 0; - iTestCaseTitleBuf = aName.AllocLC(); - iTestCaseTitle.Set( iTestCaseTitleBuf->Des() ); - CleanupStack::Pop( iTestCaseTitleBuf ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CRebootParams - - Method: SetTestModuleNameL - - Description: Setter - - Parameters: const TDesC& aName: in: name to set - - Return Values: None - - Errors/Exceptions: Leaves if memory allocation fails - - Status: Draft - -------------------------------------------------------------------------------- -*/ -void CRebootParams::SetTestCaseStateL( const TDesC& aName ) - { - - delete iStateNameBuf; - iStateNameBuf = 0; - iStateNameBuf = aName.AllocLC(); - iStateName.Set( iStateNameBuf->Des() ); - CleanupStack::Pop( iStateNameBuf ); - - } - - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of TEventMsg class member functions. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - -/* -------------------------------------------------------------------------------- - - Class: TEventMsg - - Method: TEventMsg - - Description: Default constructor - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TEventMsg::TEventMsg(): - TEventIf(), - iWaitPending(EFalse), - iStateEventPending(EFalse), - iStatus( NULL ) - { - } - -/* -------------------------------------------------------------------------------- - - Class: TEventMsg - - Method: ~TEventMsg - - Description: Destructor - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TEventMsg::~TEventMsg() - { - if( iWaitPending ) - { - iWaitMsg.Complete( KErrCancel ); - iWaitPending = EFalse; - } - - if( iStatus ) - { - User::RequestComplete( iStatus, KErrCancel ); - } - - } - -/* -------------------------------------------------------------------------------- - - Class: TEventMsg - - Method: Set - - Description: Set event. - - Parameters: TEventType aEventType: in: Event type - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void TEventMsg::Set( TEventType aEventType ) - { - iEventType = aEventType; - if( aEventType == EState ) - { - iStateEventPending = ETrue; - } - if( iWaitPending ) - { - TEventIf event; - event.Copy( *this ); - TEventIfPckg eventIfPckg( event ); - iWaitMsg.WriteL( 0, eventIfPckg ); - - iWaitMsg.Complete( KErrNone ); - iWaitPending = EFalse; - } - } - -/* -------------------------------------------------------------------------------- - - Class: TEventMsg - - Method: Wait - - Description: Wait event. - - Parameters: const RMessage& aMessage: in: Message - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void TEventMsg::Wait( const RMessage2& aMessage ) - { - if( iStateEventPending ) - { - TEventIf event; - event.Copy( *this ); - TEventIfPckg eventIfPckg( event ); - aMessage.WriteL( 0, eventIfPckg ); - aMessage.Complete( KErrNone ); - } - else - { - iWaitMsg = aMessage; - iWaitPending = ETrue; - } - } - -/* -------------------------------------------------------------------------------- - - Class: TEventMsg - - Method: CancelWait - - Description: Cancel pending Wait - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void TEventMsg::CancelWait() - { - if( iWaitPending ) - { - iWaitMsg.Complete( KErrCancel ); - iWaitPending = EFalse; - } - } - -/* -------------------------------------------------------------------------------- - - Class: TEventMsg - - Method: Release - - Description: Release event. Unset released. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void TEventMsg::Release() - { - - if( iStatus ) - { - User::RequestComplete( iStatus, KErrNone ); - } - - } -/* -------------------------------------------------------------------------------- - - Class: TEventMsg - - Method: Unset - - Description: Unset event. Blocks until Release is called. - - Parameters: TRequestStatus& aStatus: in: Status - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void TEventMsg::Unset( TRequestStatus& aStatus ) - { - - iStatus = &aStatus; - - } - -// ================= OTHER EXPORTED FUNCTIONS ================================= - -/* -------------------------------------------------------------------------------- - - Function: StartEngine - - Description: This is called from the client. - - Parameters: None - - Return Values: TInt KErrNone: No errors occured - KErrNoMemory: Memory is too low to create Test Engine - Other error code: Error got from iEngineThread.Create() - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -EXPORT_C TInt StartEngine() - { - __UHEAP_MARK; - - // check server not already started - TFindServer findTestEngineServer( KTestEngineName ); - TFullName name; - if ( findTestEngineServer.Next( name ) == KErrNone ) - { - // Server already started, nothing to do - __UHEAP_MARKEND; - return KErrNone; - } - - // Construct start-up information object - TThreadStartTestEngine* startInfo = new TThreadStartTestEngine(); - if ( startInfo == NULL ) - { - __UHEAP_MARKEND; - return KErrNoMemory; - } - - startInfo->iStarted.CreateLocal( 0 ); // Create start-up semaphore - - // Create thread - TInt ret = startInfo->iEngineThread.Create( - KTestEngineName , // name of thread - CTestEngineServer::ThreadFunction, // thread function - KDefaultStackSize*4, // stack - KTestEngineMinHeapSize,KTestEngineMaxHeapSize*4,// Heap - startInfo // parameter to thread - // function - ); - - if ( ret != KErrNone ) - { - startInfo->iStarted.Close(); - delete startInfo; - __UHEAP_MARKEND; - return ret; - } - - // Now start thread - startInfo->iEngineThread.SetPriority( EPriorityMuchMore ); // set its - // priority - startInfo->iEngineThread.Resume(); // kick it - // into life - - // Wait until the thread is started - startInfo->iStarted.Wait(); - - // Clean-up - startInfo->iEngineThread.Close(); - startInfo->iStarted.Close(); - - - delete startInfo; - - __UHEAP_MARKEND; - - return KErrNone; - - } - -// End of File