diff -r bbd31066657e -r 8bb370ba6d1d testexecfw/stf/stfui/uiengine/src/StifTFwIf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecfw/stf/stfui/uiengine/src/StifTFwIf.cpp Fri Apr 09 10:46:28 2010 +0800 @@ -0,0 +1,1918 @@ +/* +* 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: CStifTFwIf: This object executes test cases from +* STIF Test Framework. +* +*/ + +// INCLUDE FILES +#include +#include +#include "UIEngineEvent.h" +#include +#include "StifTFwIf.h" +#include "StifTFw.h" +#include "Logging.h" +#include "StifPython.h" + +// EXTERNAL DATA STRUCTURES +// None + +// EXTERNAL FUNCTION PROTOTYPES +// None + +// CONSTANTS +// None + +// MACROS +#ifdef LOGGER +#undef LOGGER +#endif +#define LOGGER iStifTFw->iLogger + +// LOCAL CONSTANTS AND MACROS +// None + +// MODULE DATA STRUCTURES +// None + +// LOCAL FUNCTION PROTOTYPES +// None + +// FORWARD DECLARATIONS +// None + +// ==================== LOCAL FUNCTIONS ======================================= + +// ================= MEMBER FUNCTIONS ========================================= + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: CStifTFwIf + + Description: Default constructor + + C++ default constructor can NOT contain any code, that + might leave. + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C CStifTFwIf::CStifTFwIf() + { + __RDEBUG( _L( "CStifTFwIf::CStifTFwIf()" ) ); + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: ~CStifTFwIf + + Description: Destructor + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C CStifTFwIf::~CStifTFwIf() + { + __RDEBUG( _L( "CStifTFwIf::~CStifTFwIf()" ) ); + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: Open + + Description: Open test engine. + + Parameters: TDesC& aTestFrameworkIni: in: Initialization file to Test Framework + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::Open( TDesC& aTestFrameworkIni ) + { + RDebug::Print(_L("CStifTFwIf::Open")); + TInt err( KErrNone ); + TRAP( err, + iStifTFw = CStifTFw::NewL( this ); + ) + + return iStifTFw->iUIEngine->Open( aTestFrameworkIni ); + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: Close + + Description: Close test engine. + + Parameters: None + + Return Values: TInt KErrNone: Always returned KErrNone + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::Close() + { + RDebug::Print(_L("CStifTFwIf::Close")); + + iStifTFw->DeleteData(); //Delete objects before closing session to TestEngine server + iStifTFw->iUIEngine->Close(); + + delete iStifTFw; + iStifTFw = 0; + + return KErrNone; + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: SetAttribute + + Description: Used to set attributes for Test Framework. + + Parameters: TAttribute aAttribute: in: Attribute type + TDesC& aValue: in: Attribute value + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::SetAttribute( TAttribute aAttribute, + const TDesC& aValue ) + { + RDebug::Print(_L("CStifTFwIf::SetAttribute")); + // Check aValue max length + if( aValue.Length() > KMaxName ) + { + __TRACE( KPrint, ( CStifLogger::EError, _L( "CStifTFwIf::SetAttribute() method's second parameter length is incorrect" ) ) ); + return KErrArgument; + } + + TInt ret = iStifTFw->iUIEngine->TestEngine().SetAttribute( aAttribute, aValue ); + + if ( ret != KErrNone ) + { + __TRACE( KPrint, ( _L( "CStifTFwIf::SetAttribute() method fails with error:%d" ), ret ) ); + return ret; + } + + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: AddTestModule + + Description: Add test module to module list of test engine + + Parameters: TDesC& aModuleName: in: Testmodule, which is added to module list + TDesC& aIniFile: in: Initialization file to the test module + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::AddTestModule( TDesC& aModuleName, + TDesC& aIniFile ) + { + RDebug::Print(_L("CStifTFwIf::AddTestModule")); + + return iStifTFw->iUIEngine->AddTestModule( aModuleName, aIniFile ); + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: RemoveTestModule + + Description: Add test module to module list of test engine + + Parameters: TDesC& aModuleName: in: Testmodule, which is removed of module list + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::RemoveTestModule( TDesC& aModuleName ) + { + RDebug::Print(_L("CStifTFwIf::RemoveTestModule")); + + return iStifTFw->iUIEngine->RemoveTestModule( aModuleName ); + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: AddTestCaseFile + + Description: Add test case file to test case file list of test engine + + Parameters: TDesC& aModuleName: in: Testmodule, which own test cases of test case list. + TDesC& aCaseFile: in: Test case list, which is added to test case list + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::AddTestCaseFile( TDesC& aModuleName, TDesC& aCaseFile ) + { + RDebug::Print(_L("CStifTFwIf::AddTestCaseFile")); + + return iStifTFw->iUIEngine->AddTestCaseFile( aModuleName, aCaseFile ); + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: RemoveTestCaseFile + + Description: Remove test case file of test case file list of test engine + + Parameters: TDesC& aModuleName: in: Testmodule, which own test cases of test case list + TDesC& aCaseFile: in: Test case list, which is removed of test case list + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::RemoveTestCaseFile( TDesC& aModuleName, TDesC& aCaseFile ) + { + RDebug::Print(_L("CStifTFwIf::RemoveTestCaseFile")); + + return iStifTFw->iUIEngine->RemoveTestCaseFile( aModuleName, aCaseFile ); + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: GetTestCases + + Description: Get test cases of enumerated list of test engine. Method is copied + list of test cases to aTestCaseInfo. Copied tests are test cases + of test module (aTestModule) and defined + in test case file (aTestCaseFile), which are given as argument + + Method copied all enumerated test cases if aTestModule + and aTestCaseFile are not defined + + Parameters: RPointerArray& aTestCaseInfo: inout: List of test cases + TDesC& aModuleName: in: Testmodule, which own test cases of test case list + TDesC& aTestCaseFile: in: Test case list, which is got of test case list + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::GetTestCases( RPointerArray& aTestCaseInfo, + TDesC& aTestModule, + TDesC& aTestCaseFile ) + { + RDebug::Print(_L("CStifTFwIf::GetTestCases")); + + TRAPD( ret, + ret = iStifTFw->iUIEngine->GetTestCasesL( aTestCaseInfo, + aTestModule, + aTestCaseFile ); + ); + + return ret; + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: StartTestCase + + Description: Start test case execution. + + Parameters: TInt& aTestId: in: ID for test case. Test ID given of address of + current CStifTFwIfContainer. + + const CTestInfo& aTestInfo: in: Test case information + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::StartTestCase( TInt& aTestId, + const CTestInfo& aTestInfo ) + { + RDebug::Print(_L("CStifTFwIf::StartTestCase")); + + CUIEngineContainer* container = NULL; + + TInt ret = iStifTFw->iUIEngine->StartTestCase( container, + aTestInfo ); + + if( ret != KErrNone ) + { + return ret; + } + + // Add container to test case execution table + ret = iStifTFw->iTestExecutionTable.Append( container ); + if( ret != KErrNone ) + { + iStifTFw->iUIEngine->AbortStartedTestCase( container ); + return ret; + } + + // Get test id. + aTestId = (TInt)container; + + __TRACE( KPrint, ( _L( "aTestId: %d"), aTestId ) ); + __TRACE( KPrint, ( _L( "aTest case: %S"), &(aTestInfo.TestCaseTitle()) ) ); + + return ret; + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: CancelTestCase + + Description: Cancel test case execution + + Parameters: TInt& aTestId: in: ID for test case + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::CancelTestCase( TInt aTestId ) + { + RDebug::Print(_L("CStifTFwIf::CancelTestCase")); + TInt ret(KErrNone); + + // Find test case from execution table + TInt index = iStifTFw->iTestExecutionTable.Find( ( CUIEngineContainer* )aTestId ); + + // Check if test id is found + if( index < 0) + { + __TRACE( KPrint, ( _L( "CStifTFwIf::CancelTestCase. Container not found. TestId = %d"), aTestId ) ); + + return index; + } + + // Cancel test + ret = iStifTFw->iTestExecutionTable[index]->CancelTest(); + __TRACE( KPrint, ( _L( "CStifTFwIf::CancelTestCase. Canceled testId %d"), aTestId ) ); + + return ret; + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: PauseTestCase + + Description: Pause test case execution + + Parameters: TInt& aTestId: in: ID for test case + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::PauseTestCase( TInt aTestId ) + { + RDebug::Print(_L("CStifTFwIf::PauseTestCase")); + TInt ret(KErrNone); + + // Find test case from execution table + TInt index = iStifTFw->iTestExecutionTable.Find( ( CUIEngineContainer*) aTestId ); + + // Check if test id is found + if( index < 0 ) + { + __TRACE( KPrint, ( _L( "CStifTFwIf::PauseTestCase. Container not found: testId = %d"), aTestId ) ); + + return index; + } + + // Pause test + ret = iStifTFw->iTestExecutionTable[index]->PauseTest(); + + __TRACE( KPrint, ( _L( "CStifTFwIf::PauseTest. Paused testId %d"), aTestId ) ); + return ret; + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: ResumeTestCase + + Description: Resume test case execution + + Parameters: TInt& aTestId: in: ID for test case + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::ResumeTestCase( TInt aTestId ) + { + RDebug::Print(_L("CStifTFwIf::ResumeTestCase")); + TInt ret(KErrNone); + + // Find test case from execution table + TInt index = iStifTFw->iTestExecutionTable.Find( ( CUIEngineContainer* ) aTestId ); + + // Check if test id is found + if( index < 0 ) + { + __TRACE( KPrint, ( _L( "CStifTFwIf::ResumeTestCase. Container not found: TestId = %d"), aTestId ) ); + + return index; + } + + // Resume test + ret = iStifTFw->iTestExecutionTable[index]->ResumeTest(); + + __TRACE( KPrint, ( _L( "CStifTFwIf::ResumeTestCase. Resumed testId %d"), aTestId ) ); + + return ret; + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: AtsReceive + + Description: Handles remote protocol message receives + + Parameters: const TDesC& aMessage: in: Protocol message received + + Return Values: Symbian OS error code: In oom and is protocol message header + parsing fails, i.e. error in + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFwIf::AtsReceive( const TDesC& aMessage ) + { + RDebug::Print(_L("CStifTFwIf::AtsReceive")); + RDebug::Print( _L("[STIF Master/Slave received message] %S"), &aMessage ); + + CStifTFwIfProt* msg = NULL; + CStifTFwIfProt* resp = NULL; + TRAPD( err, msg = CStifTFwIfProt::NewL(); ); + if( err != KErrNone ) + { + return err; + } + TRAP( err, resp = CStifTFwIfProt::NewL(); ); + if( err != KErrNone ) + { + delete msg; + return err; + } + TInt error = KErrNone; + TInt ret = KErrNone; + + // Parse received message + TRAP( err, + error = msg->SetL( aMessage ) + ); + if( err != KErrNone ) + { + __TRACE( KError, ( _L( "AtsReceive: message header parsing failed [%d]"), err ) ); + delete msg; + delete resp; + return err; + } + + // Create response + TRAP( err, resp->CreateL(); ); + if( err != KErrNone ) + { + delete msg; + delete resp; + return err; + } + + resp->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgResponse ); + + if( error != KErrNone ) + { + __TRACE( KError, ( _L( "AtsReceive: message parsing failed [%d]"), error ) ); + resp->AppendId( SETID( DevId(), 0 ) ); + resp->AppendId( msg->SrcId() ); + resp->Append( CStifTFwIfProt::MsgType, msg->iMsgType ); + resp->Append( CStifTFwIfProt::RespParam, CStifTFwIfProt::ERespResult, error ); + + RDebug::Print( _L("[STIF Master/Slave sending response] %S"), &resp->Message() ); + AtsSend( resp->Message() ); + + // Error reported with protocol message, return success + delete msg; + delete resp; + return KErrNone; + } + + switch( msg->iMsgType ) + { + case CStifTFwIfProt::EMsgReserve: + { + RDebug::Print( _L("[STIF Slave handling request] %S"), &aMessage ); + + if( msg->iRemoteType != CStifTFwIfProt::ERemotePhone ) + { + __TRACE( KError, ( _L( "AtsReceive: reserve for illegal type received") ) ); + error = KErrGeneral; + } + // Check IDs + if( ( msg->SrcDevId() == 0 ) || + ( msg->SrcTestId() == 0 ) ) + { + __TRACE( KError, ( _L( "AtsReceive: reserve for illegal srcid received") ) ); + error = KErrGeneral; + } + if( msg->DstId() != 0 ) + { + // Not a broadcast + if( ( msg->DstDevId() != DevId() ) || + ( msg->DstTestId() != 0 ) ) + { + __TRACE( KError, ( _L( "AtsReceive: reserve for illegal dstid received") ) ); + error = KErrGeneral; + } + } + TInt index = iStifTFw->iMasterArray.Find( msg->SrcId() ); + if( index >= 0 ) + { + error = KErrInUse; + __TRACE( KError, ( _L( "AtsReceive: master has already reserved slave") ) ); + } + else + { + iStifTFw->iMasterArray.Append( msg->SrcId() ); + } + + resp->AppendId( SETID( DevId(), 0 ) ); + resp->AppendId( msg->SrcId() ); + resp->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgReserve ); + if( error != KErrNone ) + { + resp->Append( CStifTFwIfProt::RespParam, CStifTFwIfProt::ERespResult, error ); + } + + RDebug::Print( _L("[STIF Slave sending response] %S"), &resp->Message() ); + AtsSend( resp->Message() ); + + } + break; + case CStifTFwIfProt::EMsgRelease: + { + RDebug::Print( _L("[STIF Slave handling request] %S"), &aMessage ); + + // Check protocol ids + if( ( msg->SrcDevId() == 0 ) || + ( msg->SrcTestId() == 0 ) || + ( msg->DstTestId() != 0 ) ) + { + __TRACE( KError, ( _L( "AtsReceive: release for illegal srcid or dstid received") ) ); + error = KErrGeneral; + } + else if( msg->DstDevId() != DevId() ) + { + __TRACE( KError, ( _L( "AtsReceive: release for illegal dstid received") ) ); + error = KErrNotFound; + } + else + { + // Check Master identifier + // First check that specific master has reserved us + TInt index = iStifTFw->iMasterArray.Find( msg->SrcId() ); + if( index < 0 ) + { + error = KErrNotFound; + } + else + { + // Search test case from execution table + TInt count = iStifTFw->iTestRemoteExecutionTable.Count(); + for( TInt ind = 0; ind < count; ind++ ) + { + if( iStifTFw->iTestRemoteExecutionTable[ind]->RemoteId() == + msg->SrcId() ) + { + __TRACE( KError, ( _L( "Release: test case running for %x"), + msg->SrcId() ) ); + error = KErrInUse; + break; + } + } + if( error == KErrNone ) + { + iStifTFw->iMasterArray.Remove( index ); + } + } + } + + resp->AppendId( msg->DstId() ); + resp->AppendId( msg->SrcId() ); + resp->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRelease ); + + if( error != KErrNone ) + { + resp->Append( CStifTFwIfProt::RespParam, CStifTFwIfProt::ERespResult, error ); + } + + RDebug::Print( _L("[STIF Slave sending response] %S"), &resp->Message() ); + AtsSend( resp->Message() ); + } + break; + case CStifTFwIfProt::EMsgRemote: + { + RDebug::Print( _L("[STIF Slave handling request] %S"), &aMessage ); + + // Check protocol ids + TInt index = iStifTFw->iMasterArray.Find( msg->SrcId() ); + if( ( msg->SrcDevId() == 0 ) || + ( msg->SrcTestId() == 0 ) || + ( msg->DstDevId() == 0 ) ) + { + __TRACE( KError, ( _L( "AtsReceive: remote for illegal srcid or dstid received") ) ); + error = KErrGeneral; + } + else if( index < 0 ) + { + __TRACE( KError, ( _L( "AtsReceive: remote for illegal srcid received") ) ); + error = KErrNotFound; + } + else + { + + __TRACE( KError, ( _L( "AtsReceive: Call AtsRemote") ) ); + RDebug::Print(_L("CStifTFwIf::AtsReceive remote command received, calling AtsRemote")); + error = iStifTFw->AtsRemote( *msg, *resp ); + RDebug::Print(_L("CStifTFwIf::AtsReceive remote command received, AtsRemote return")); + } + + if( error != KErrNone ) + { + resp->AppendId( msg->DstId() ); + resp->AppendId( msg->SrcId() ); + resp->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ); + resp->Append( CStifTFwIfProt::CmdType, msg->iCmdType ); + resp->Append( CStifTFwIfProt::RespParam, + CStifTFwIfProt::ERespResult, + error ); + } + + RDebug::Print( _L("[STIF Slave sending response] %S"), &resp->Message() ); + AtsSend( resp->Message() ); + } + break; + case CStifTFwIfProt::EMsgResponse: + { + RDebug::Print( _L("[STIF Master handling response] %S"), &aMessage ); + + // Responses ae forwarded to master + CUIEngineContainer* container = NULL; + TInt count = iStifTFw->iTestRemoteExecutionTable.Count(); + TInt index = 0; + for( index = 0 ; index < count; index++ ) + { + if( iStifTFw->iTestRemoteExecutionTable[index]->MasterId() == + msg->SrcId() ) + { + __TRACE( KError, ( _L( "Response for %x"), + msg->SrcId() ) ); + container = iStifTFw->iTestRemoteExecutionTable[index]; + break; + } + } + if( container == NULL ) + { + count = iStifTFw->iTestExecutionTable.Count(); + for( index = 0 ; index < count; index++ ) + { + if( iStifTFw->iTestExecutionTable[index]->MasterId() == + msg->DstId() ) + { + __TRACE( KError, ( _L( "Response for %x"), + msg->SrcId() ) ); + container = iStifTFw->iTestExecutionTable[index]; + break; + } + } + } + + if( container == NULL ) + { + __TRACE( KError, ( _L( "AtsReceive: response to srcid %x that is not a running master"), + msg->SrcId() ) ); + ret = KErrNotFound; + } + else + { + ret = container->RemoteReceive( aMessage ); + } + } + break; + default: + __TRACE( KError, ( _L( "AtsReceive: invalid message")) ); + ret = KErrNotSupported; + } + + delete msg; + delete resp; + return ret; + + } + +/* +------------------------------------------------------------------------------- + + DESCRIPTION + + CStifTFw: This object executes test cases from STIF Test Framework. + +------------------------------------------------------------------------------- +*/ + +// MACROS +#ifdef LOGGER +#undef LOGGER +#endif +#define LOGGER iLogger + +// ================= MEMBER FUNCTIONS ========================================= + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: NewL + + Description: Construct the CStifTFw class + + Parameters: None + + Return Values: CStifTFw* New object + + Errors/Exceptions: Leaves if memory allocation fails or + ConstructL leaves. + + Status: Draft + +------------------------------------------------------------------------------- +*/ +CStifTFw* CStifTFw::NewL( CStifTFwIf* aStifTFwIf ) + { + RDebug::Print(_L("CStifTFw::NewL")); + + CStifTFw* self = new ( ELeave ) CStifTFw( aStifTFwIf ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: ConstructL + + Description: Second level constructor. + + Parameters: None + + Return Values: None + + Errors/Exceptions: Leaves on error + + Status: Draft + +------------------------------------------------------------------------------- +*/ +void CStifTFw::ConstructL() + { + RDebug::Print(_L("CStifTFw::ConstructL")); + + iUIEngine = CUIEngine::NewL( (CUIIf*) this ); + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: CStifTFw + + Description: Default constructor + + C++ default constructor can NOT contain any code, that + might leave. + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +CStifTFw::CStifTFw( CStifTFwIf* aStifTFwIf ): + iStifTFwIf( aStifTFwIf ) + { + + __RDEBUG( _L( "CStifTFw::CStifTFw()" ) ); + + } + + +/* +------------------------------------------------------------------------------- + + Class: CStifTFwIf + + Method: ~CStifTFwIf + + Description: Destructor + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +CStifTFw::~CStifTFw() + { + __RDEBUG( _L( "CStifTFw::~CStifTFw() begin" ) ); + + RDebug::Print(_L("CStifTFw::~CStifTFw resetting iTestExecutionTable cnt=%d"), iTestExecutionTable.Count()); + iTestExecutionTable.Reset(); + RDebug::Print(_L("CStifTFw::~CStifTFw resetting iTestRemoteExecutionTable cnt=%d"), iTestRemoteExecutionTable.Count()); + iTestRemoteExecutionTable.Reset(); + RDebug::Print(_L("CStifTFw::~CStifTFw resetting iEventArray cnt=%d"), iEventArray.Count()); + iEventArray.ResetAndDestroy(); + RDebug::Print(_L("CStifTFw::~CStifTFw resetting iMasterArray cnt=%d"), iMasterArray.Count()); + iMasterArray.Reset(); + + RDebug::Print(_L("CStifTFw::~CStifTFw closing iTestExecutionTable cnt=%d"), iTestExecutionTable.Count()); + iTestExecutionTable.Close(); + RDebug::Print(_L("CStifTFw::~CStifTFw closing iTestRemoteExecutionTable cnt=%d"), iTestRemoteExecutionTable.Count()); + iTestRemoteExecutionTable.Close(); + RDebug::Print(_L("CStifTFw::~CStifTFw closing iEventArray cnt=%d"), iEventArray.Count()); + iEventArray.Close(); + RDebug::Print(_L("CStifTFw::~CStifTFw closing iMasterArray cnt=%d"), iMasterArray.Count()); + iMasterArray.Close(); + + //Moved from the beginning of destructor, because objects from some arrays during resetting and/or closing + //have tried to call methods of iUIEngine. + RDebug::Print(_L("CStifTFw::~CStifTFw deleteing iUiEngine address=%d"), iUIEngine); + delete iUIEngine; + + RDebug::Print(_L("CStifTFw::~CStifTFw end")); + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: AtsRemote + + Description: Remote ATS call + + Parameters: const TDesC& aMessage: in: + + Return Values: KErrNotSupported + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +TInt CStifTFw::AtsRemote( CStifTFwIfProt& aReq, CStifTFwIfProt& aResp ) + { + RDebug::Print(_L("CStifTFw::AtsRemote start, iCmdType=%d "), aReq.iCmdType); + + TInt ret = KErrNone; + + switch( aReq.iCmdType ) + { + case CStifTFwIfProt::ECmdRun: + { + RDebug::Print(_L("CStifTFw::AtsRemote iCmdType CStifTFwIfProt::ECmdRun ")); + ret = AtsRemoteRun( aReq, aResp ); + break; + } + case CStifTFwIfProt::ECmdPause: + case CStifTFwIfProt::ECmdResume: + case CStifTFwIfProt::ECmdCancel: + { + RDebug::Print(_L("CStifTFw::AtsRemote iCmdType CStifTFwIfProt::ECmdPause,Resume,Cancel ")); + ret = AtsRemoteTestCtl( aReq, aResp ); + break; + } + case CStifTFwIfProt::ECmdRequest: + case CStifTFwIfProt::ECmdRelease: + { + RDebug::Print(_L("CStifTFw::AtsRemote iCmdType CStifTFwIfProt::ECmdRequest,Release ")); + ret = AtsRemoteEventCtl( aReq, aResp ); + break; + } + case CStifTFwIfProt::ECmdSetEvent: + case CStifTFwIfProt::ECmdUnsetEvent: + { + RDebug::Print(_L("CStifTFw::AtsRemote iCmdType CStifTFwIfProt::ECmdSetEvent,Unset start ")); + ret = AtsRemoteEventCtl( aReq, aResp ); + RDebug::Print(_L("CStifTFw::AtsRemote iCmdType CStifTFwIfProt::ECmdSetEvent,Unset end ")); + break; + } + default: + { + RDebug::Print(_L("CStifTFw::AtsRemote iCmdType UNSUPPORTED value=%d "), aReq.iCmdType); + return KErrNotSupported; + } + } + + return ret; + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: GetCaseNumByTitle + + Description: Enumerates test cases from given module and finds test case index by title + + Parameters: TDesC& aModule: in: module name + TDesC& aTestCaseFile: in: cfg file + TDesC& aTitle: in: test case title + TInt& aCaseNum: in out: test case index + + Return Values: KErrNone if everything is ok + KErrNotFound if there is no such test case + + Errors/Exceptions: None. + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +TInt CStifTFw::GetCaseNumByTitle(TDesC& aModule, TDesC& aTestCaseFile, TDesC& aTitle, TInt& aCaseNum) + { + RDebug::Print(_L("CStifTFw::GetCaseNumByTitle looking for test case number module=[%S] cfg=[%S] title=[%S]"), &aModule, &aTestCaseFile, &aTitle); + //Allocate table + RPointerArray allTestInfos; + CleanupClosePushL(allTestInfos); + TInt ret = KErrNone; + + //Enumerate test cases + RDebug::Print(_L("CStifTFw::GetCaseNumByTitle enumerating test cases")); + if(aTestCaseFile == _L("dummy.cfg")) + { + TName t = _L(""); + ret = iStifTFwIf->GetTestCases(allTestInfos, aModule, t); + } + else + { + ret = iStifTFwIf->GetTestCases(allTestInfos, aModule, aTestCaseFile); + } + + if(ret != KErrNone) + { + RDebug::Print(_L("Test cases enumeration from module [%S] and file [%S] has returned an error %d"), &aModule, &aTestCaseFile, ret); + } + else + { + //Searching through the table + RDebug::Print(_L("CStifTFw::GetCaseNumByTitle searching through the test cases table containing %d cases"), allTestInfos.Count()); + ret = KErrNotFound; + for(TInt i = 0; i < allTestInfos.Count(); i++) + { + if(allTestInfos[i]->TestCaseTitle() == aTitle) + { + aCaseNum = i; + //TestScripter relies on 1-based indexing + if((aModule.Find(KTestScripterName) != KErrNotFound) || (aModule.Find(KPythonScripter) != KErrNotFound) || (aModule.Find(KTestCombinerName) != KErrNotFound)) + aCaseNum++; + ret = KErrNone; + break; + } + } + } + if(ret == KErrNotFound) + { + RDebug::Print(_L("CStifTFw::GetCaseNumByTitle test case not found")); + } + else if(ret == KErrNone) + { + RDebug::Print(_L("CStifTFw::GetCaseNumByTitle test case number found: %d"), aCaseNum); + } + else + { + RDebug::Print(_L("CStifTFw::GetCaseNumByTitle error %d"), ret); + } + + //Some cleaning + allTestInfos.Reset(); + CleanupStack::PopAndDestroy(); + + return ret; + } + +/* + Class: CStifTFw + + Method: AtsRemoteRun + + Description: Remote run ATS call + + Parameters: const TDesC& aMessage: in: + + Return Values: KErrNotSupported + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +TInt CStifTFw::AtsRemoteRun( CStifTFwIfProt& aReq, CStifTFwIfProt& aResp ) + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun start")); + + TInt ret = KErrNone; + TUint16 testid = 0; + + if( ( aReq.DstDevId() == 0 ) || + ( aReq.DstTestId() != 0 ) ) + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun Protocol violation")); + // Protocol violation + __TRACE( KError, ( _L( "AtsReceive: remote run for illegal dstid received") ) ); + return KErrGeneral; + } + + if ( aReq.DstDevId() != iStifTFwIf->DevId() ) + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun Not our protocol message")); + // Not our protocol message + __TRACE( KError, ( _L( "AtsReceive: remote run for illegal dstdevid received") ) ); + return KErrNotFound; + } + + + if( aReq.iModule.Length() == 0 ) + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun No test module name given")); + __TRACE( KError, ( _L("No mandatory test module name given as run parameter") ) ); + ret = KErrNotFound; + } + else if(aReq.iTestCaseNumber < 0 && aReq.iTitle.Length() == 0) + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun No test case number given")); + __TRACE( KError, ( _L("No mandatory test case number given as run parameter") ) ); + ret = KErrNotFound; + } + else + { + TBufC myTestscripter; + myTestscripter = KTestScripterName; + + if( ( aReq.iModule.Find( myTestscripter ) != KErrNotFound ) ) + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun TestScripter module")); + // If testmodule's type is testscripter, then iModule has name + // "testscripter_testcasefile". AddTestModule method takes + // testscripter type of module without _testcasefile, so we cannot + // give iModule name as parameter. + + // Adding testscripter type of testmodule + RDebug::Print(_L("CStifTFw::AtsRemoteRun calling AddTestModule")); + ret = iStifTFwIf->AddTestModule( myTestscripter, aReq.iIniFile ); + if( ret != KErrNone ) + { + __TRACE( KError, ( _L( "CStifTFw::AtsRemoteRun: AddTestModule failed [%d]"), ret ) ); + + // It is ok if test module is already loaded to test engine + if( ret == KErrAlreadyExists ) + { + __TRACE( KPrint, ( _L( "Test module already exists at testengine, no problem") ) ); + } + } + // Adding testscripter testcasefile + RDebug::Print(_L("CStifTFw::AtsRemoteRun calling AddTestCaseFile")); + ret = iStifTFwIf->AddTestCaseFile( myTestscripter, aReq.iTestCaseFile ); + if( ret != KErrNone ) + { + // It is ok if test case file is already loaded to test engine + if( ret == KErrAlreadyExists ) + { + __TRACE( KPrint, ( _L( "Testcasefile already exists at testengine, no problem") ) ); + } + // Got other error, log info about it + else + { + __TRACE( KError, ( _L( "CStifTFw::AtsRemoteRun: AddTestCaseFile failed [%d]"), ret ) ); + __TRACE( KError, ( _L( "Testscripter needs to have test case file loaded successfully, please check path and file name!") ) ); + } + } + } + else + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun It is not a TestScripter module ")); + // For testmodules other than testscripter + RDebug::Print(_L("CStifTFw::AtsRemoteRun calling AddTestModule ")); + ret = iStifTFwIf->AddTestModule( aReq.iModule, aReq.iIniFile ); + if( ret != KErrNone ) + { + __TRACE( KError, ( _L( "CStifTFw::AtsRemoteRun: AddTestModule failed [%d]"), ret ) ); + + // It is ok if test module is already loaded to test engine + if( ret == KErrAlreadyExists ) + { + __TRACE( KPrint, ( _L( "Test module already exists at testengine, no problem") ) ); + } + } + } + if(aReq.iTitle.Length() != 0) + { + aReq.iTestCaseNumber = -1; + //Get test case number from title + ret = GetCaseNumByTitle(aReq.iModule, aReq.iTestCaseFile, aReq.iTitle, aReq.iTestCaseNumber); + //Check test case number + if(aReq.iTestCaseNumber < 0) + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun No test case number could be found using given title parameter")); + __TRACE(KError, (_L("No mandatory test case number could be found using given title parameter"))); + return KErrNotFound; + } + } + + CTestInfo *testCase = CTestInfo::NewL(); + CleanupStack::PushL( testCase ); + // Copy to CTestInfo. + + if( ( aReq.iModule.Find( KTestScripterName ) != KErrNotFound ) ) + { + testCase->SetModuleName( KTestScripterName ); + } + else + { + testCase->SetModuleName( aReq.iModule ); + } + testCase->SetTestCaseNumber( aReq.iTestCaseNumber ); + testCase->SetTestCaseFile( aReq.iTestCaseFile ); + + // Create container. + CUIEngineContainer* container = NULL; + + RDebug::Print(_L("CStifTFw::AtsRemoteRun calling StartTestCase ")); + ret = iUIEngine->StartTestCase( container, + *testCase ); + + CleanupStack::PopAndDestroy( testCase ); + + if( ret != KErrNone ) + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun test case starting FAILED ")); + __TRACE( KError, ( _L( "Test case starting failed [%d]"), ret ) ); + } + else + { + RDebug::Print(_L("CStifTFw::AtsRemoteRun Add container")); + // Add container to test case execution table + container->SetRemoteId( aReq.SrcId() ); + testid = TESTID( (TInt)container ); + ret = iTestRemoteExecutionTable.Append( container ); + __TRACE( KError, ( _L( "Test case started [%x]"), testid ) ); + } + } + + aResp.AppendId( SETID( iStifTFwIf->DevId(), testid ) ); + aResp.AppendId( aReq.SrcId() ); + aResp.Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ); + aResp.Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdRun ); + if( ret != KErrNone ) + { + aResp.Append( CStifTFwIfProt::RunStatus, + CStifTFwIfProt::ERunError ); + aResp.Append( CStifTFwIfProt::RunStatusParams, + CStifTFwIfProt::ERunResult, ret ); + } + else + { + aResp.Append( CStifTFwIfProt::RunStatus, + CStifTFwIfProt::ERunStarted ); + } + // Response is created, return success + ret = KErrNone; + + RDebug::Print(_L("CStifTFw::AtsRemoteRun end ")); + return ret; + + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: AtsRemoteTestCtl + + Description: Remote run ATS call + + Parameters: const TDesC& aMessage: in: + + Return Values: KErrNotSupported + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +TInt CStifTFw::AtsRemoteTestCtl( CStifTFwIfProt& aReq, CStifTFwIfProt& aResp ) + { + RDebug::Print(_L("CStifTFw::AtsRemoteTestCtl")); + + TInt ret = KErrNone; + + if( ( aReq.DstDevId() == 0 ) || + ( aReq.DstTestId() == 0 ) ) + { + // Protocol violation + __TRACE( KError, ( _L( "AtsReceive: remote test control for illegal dstid received") ) ); + return KErrGeneral; + } + + if ( aReq.DstDevId() != iStifTFwIf->DevId() ) + { + // Not our protocol message + __TRACE( KError, ( _L( "AtsReceive: remote test control for illegal dstdevid received") ) ); + return KErrNotFound; + } + + // Find test case from execution table + TInt count = iTestRemoteExecutionTable.Count(); + TInt index = 0; + for(; index < count; index++ ) + { + if( TESTID( iTestRemoteExecutionTable[index] ) == + aReq.DstTestId() ) + { + break; + } + } + + // Check that test id is found + if( index == count ) + { + __TRACE( KError, ( _L( "PauseTestCase. Container not found: testId: %x"), + aReq.DstTestId() ) ); + return KErrNotFound; + } + + switch( aReq.iCmdType ) + { + case CStifTFwIfProt::ECmdPause: + // Pause test + __TRACE( KPrint, ( _L( "PauseTest: %x"), aReq.DstTestId() ) ); + ret = iTestRemoteExecutionTable[index]->PauseTest(); + break; + case CStifTFwIfProt::ECmdResume: + // Resume test + __TRACE( KPrint, ( _L( "ResumeTestCase: %x"), aReq.DstTestId() ) ); + ret = iTestRemoteExecutionTable[index]->ResumeTest(); + break; + case CStifTFwIfProt::ECmdCancel: + // Cancel test + __TRACE( KPrint, ( _L( "CancelTestCase: %x"), aReq.DstTestId() ) ); + ret = iTestRemoteExecutionTable[index]->CancelTest(); + break; + default: + return KErrNotSupported; + } + if( ret == KErrNone ) + { + // Success response is created here + aResp.AppendId( aReq.DstId() ); + aResp.AppendId( aReq.SrcId() ); + aResp.Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ); + aResp.Append( CStifTFwIfProt::CmdType, aReq.iCmdType ); + } + + return ret; + + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: AtsRemoteEventCtl + + Description: Remote run ATS call + + Parameters: const TDesC& aMessage: in: + + Return Values: KErrNotSupported + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +TInt CStifTFw::AtsRemoteEventCtl( CStifTFwIfProt& aReq, + CStifTFwIfProt& aResp ) + { + RDebug::Print(_L("CStifTFw::AtsRemoteEventCtl start ")); + + if( ( aReq.DstDevId() == 0 ) || + ( aReq.DstTestId() != 0 ) ) + { + // Protocol violation + __TRACE( KError, ( _L( "AtsReceive: remote event control for illegal dstid received") ) ); + return KErrGeneral; + } + + if ( aReq.DstDevId() != iStifTFwIf->DevId() ) + { + // Not our protocol message + __TRACE( KError, ( _L( "AtsReceive: remote event control for illegal dstdevid received") ) ); + return KErrNotFound; + } + + if( aReq.iEventName.Length() == 0 ) + { + __TRACE( KError, ( _L("No event name given") ) ); + return KErrNotFound; + } + + switch( aReq.iCmdType ) + { + case CStifTFwIfProt::ECmdRequest: + { + RDebug::Print(_L("CStifTFw::AtsRemoteEventCtl ECmdRequest ")); + CUIEngineEvent* eventCtl = NULL; + TRAPD( err, eventCtl = CUIEngineEvent::NewL( iUIEngine ); ); + if( err != KErrNone ) + { + return err; + } + err = iEventArray.Append( eventCtl ); + if( err != KErrNone ) + { + delete eventCtl; + return err; + } + + eventCtl->Request( aReq.iEventName, aReq.SrcId(), + SETID( iStifTFwIf->DevId(), 0 ) ); + + aResp.AppendId( aReq.DstId() ); + aResp.AppendId( aReq.SrcId() ); + aResp.Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ); + aResp.Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdRequest ); + aResp.Append( CStifTFwIfProt::EventStatus, + CStifTFwIfProt::EEventActive ); + aResp.Append( aReq.iEventName ); + } + break; + case CStifTFwIfProt::ECmdSetEvent: + { + RDebug::Print(_L("CStifTFw::AtsRemoteEventCtl ECmdMasterSetEvent ")); + REventSystem eventSys; + + TInt err = KErrNone; + if ( aReq.iEventType == TEventIf::EState ) + { + TRAP( err, eventSys.SetEventL( aReq.iEventName ) ); + } + else + { + TRAP( err, eventSys.SetIndicationEventL( aReq.iEventName ) ); + } + + if ( err != KErrNone ) + { + return err; + } + + aResp.AppendId( aReq.DstId() ); + aResp.AppendId( aReq.SrcId() ); + aResp.Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ); + aResp.Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdSetEvent ); + aResp.Append( CStifTFwIfProt::EventStatus, + CStifTFwIfProt::EEventSet ); + aResp.Append( aReq.iEventName ); + if ( aReq.iEventType == TEventIf::EState ) + { + aResp.Append( CStifTFwIfProt::EventStatusParams, + CStifTFwIfProt::EEventType, + CStifTFwIfProt::EventType, + TEventIf::EState ); + } + } + break; + case CStifTFwIfProt::ECmdUnsetEvent: + { + RDebug::Print(_L("CStifTFw::AtsRemoteEventCtl ECmdMasterUnsetEvent ")); + + REventSystem eventSys; + TRAPD( err, eventSys.UnsetEventL( aReq.iEventName ) ); + + if ( err != KErrNone ) + { + return err; + } + + aResp.AppendId( aReq.DstId() ); + aResp.AppendId( aReq.SrcId() ); + aResp.Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ); + aResp.Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdUnsetEvent ); + aResp.Append( CStifTFwIfProt::EventStatus, + CStifTFwIfProt::EEventUnset ); + aResp.Append( aReq.iEventName ); + } + break; + case CStifTFwIfProt::ECmdRelease: + { + RDebug::Print(_L("CStifTFw::AtsRemoteEventCtl ECmdRelease ")); + TInt count = iEventArray.Count(); + TInt index = 0; + for(; index < count; index++ ) + { + if( ( iEventArray[index]->EventName() == aReq.iEventName ) && + ( iEventArray[index]->Master() == aReq.SrcId() ) ) + { + // Found correct event + CUIEngineEvent* eventCtl = iEventArray[index]; + eventCtl->Release(); + iEventArray.Remove(index); + delete eventCtl; + break; + } + } + if( index == count ) + { + return KErrNotFound; + } + + aResp.AppendId( aReq.DstId() ); + aResp.AppendId( aReq.SrcId() ); + aResp.Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ); + aResp.Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdRelease ); + aResp.Append( aReq.iEventName ); + + } + break; + default: + RDebug::Print(_L("CStifTFw::AtsRemoteEventCtl NotSupported")); + return KErrNotSupported; + } + + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: TestExecuted + + Description: + + Parameters: CUIEngineContainer* aContainer: Address of current + CUIEngineContainer is test case ID. + + TFullTestResult& aFullTestResult: in: Test result of executed test case + + Return Values: TInt KErrNone: Always returned KErrNone + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C void CStifTFw::TestExecuted( CUIEngineContainer* aContainer, + TFullTestResult& aFullTestResult ) + { + RDebug::Print(_L("CStifTFw::TestExecuted")); + TInt testExecutionResult = aFullTestResult.iCaseExecutionResultCode; + TTestResult testResult = aFullTestResult.iTestResult; + + // Find Container from test execution table + TInt index = iTestExecutionTable.Find( aContainer ); + if( index >= 0 ) + { + // Remove Container from test case execution table + iTestExecutionTable.Remove( index ); + + iStifTFwIf->TestCompleted( (TInt)aContainer, testExecutionResult, testResult ); + __TRACE( KPrint, ( _L( "CStifTFw::TestExecuted. TestID %d executed"), (TInt)aContainer ) ); + } + else + { + // Find Container from test remote execution table + index = iTestRemoteExecutionTable.Find( aContainer ); + // Check if test id is found from remote tests + if( index >= 0 ) + { + // Remove Container from test case execution table + iTestRemoteExecutionTable.Remove( index ); + + CStifTFwIfProt* resp = NULL; + TRAPD( err, resp = CStifTFwIfProt::NewL() ); + if( err != KErrNone ) + { + // oom + return; + } + + // Create response + TRAP( err, resp->CreateL(); ); + if( err != KErrNone ) + { + delete resp; + // Oom + return; + } + resp->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgResponse ); + resp->AppendId( SETID( iStifTFwIf->DevId(), TESTID( (TInt) aContainer ) ) ); + resp->AppendId( aContainer->RemoteId() ); + resp->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ); + resp->Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdRun ); + resp->Append( CStifTFwIfProt::RunStatus, + CStifTFwIfProt::ERunReady ); + if( testExecutionResult != KErrNone ) + { + resp->Append( CStifTFwIfProt::RunStatusParams, + CStifTFwIfProt::ERunResult, + testExecutionResult ); + switch( aFullTestResult.iCaseExecutionResultType ) + { + case TFullTestResult::ECasePanic: + resp->Append( CStifTFwIfProt::RunStatusParams, + CStifTFwIfProt::ERunCategory, + CStifTFwIfProt::ResultCategory, + CStifTFwIfProt::EResultPanic ); + break; + case TFullTestResult::ECaseTimeout: + resp->Append( CStifTFwIfProt::RunStatusParams, + CStifTFwIfProt::ERunCategory, + CStifTFwIfProt::ResultCategory, + CStifTFwIfProt::EResultTimeout ); + break; + case TFullTestResult::ECaseLeave: + resp->Append( CStifTFwIfProt::RunStatusParams, + CStifTFwIfProt::ERunCategory, + CStifTFwIfProt::ResultCategory, + CStifTFwIfProt::EResultLeave ); + break; + case TFullTestResult::ECaseException: + resp->Append( CStifTFwIfProt::RunStatusParams, + CStifTFwIfProt::ERunCategory, + CStifTFwIfProt::ResultCategory, + CStifTFwIfProt::EResultException ); + break; + default: + // The rest are normal execution results + break; + } + } + else + { + resp->Append( CStifTFwIfProt::RunStatusParams, + CStifTFwIfProt::ERunResult, + testResult.iResult ); + } + + iStifTFwIf->AtsSend( resp->Message() ); + __TRACE( KPrint, ( _L( "TestExecuted: %x"), TESTID(aContainer) ) ); + delete resp; + } + } + + if( index >= 0 ) + { + __TRACE( KPrint, ( _L( "Execution result %d"), testExecutionResult ) ); + __TRACE( KPrint, ( _L( "Test result(%S) %d"), &testResult.iResultDes, testResult.iResult ) ); + } + else + { + __TRACE( KPrint, ( _L( "CStifTFw::TestExecuted. Container not found: TestId = %d"), + (TInt)aContainer ) ); + User::Panic( _L("CStifTFw"), KErrNotFound ); + } + + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: PrintProg + + Description: + + Parameters: CUIEngineContainer* aContainer: in: Address of current + CUIEngineContainer is test case ID + + TTestProgress& aProgress: in: Progress information from test case + + Return Values: TInt KErrNone: Always returned KErrNone + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFw::PrintProg( CUIEngineContainer* aContainer, + TTestProgress& aProgress ) + { + RDebug::Print(_L("CStifTFw::PrintProg")); + + if( aContainer == NULL ) + { + return KErrArgument; + } + if( ( aProgress.iDescription.Length() == 0 ) && + ( aProgress.iText.Length() == 0 ) ) + + { + return KErrArgument; + } + +//Stif-50 - the following code has been commented out to get messages on slave +// // Find Container from test execution table and remove it +// TInt index = iTestExecutionTable.Find(aContainer); +// +// // Check if test id is found +// if( index >= 0 ) +// { +// // Forward if found, prints are not forwarded from slave to master + iStifTFwIf->Print( (TInt)aContainer, aProgress ); +// } + + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: RemoteMsg + + Description: + + Parameters: const TDesC& aMessage: in: Remote message + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFw::RemoteMsg( CUIEngineContainer* /*aContainer*/, + const TDesC& aMessage) + { + RDebug::Print(_L("CStifTFw::RemoteMsg")); + + if( aMessage.Length() == 0 ) + { + return KErrArgument; + } + // Forward message + iStifTFwIf->AtsSend( aMessage ); + + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: RemoteMsg + + Description: + + Parameters: const TDesC& aMessage: in: Remote message + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CStifTFw::GoingToReboot( CUIEngineContainer* /*aContainer*/, + TRequestStatus& aStatus ) + { + RDebug::Print(_L("CStifTFw::GoingToReboot")); + + aStatus = KRequestPending; + // Forward reboot indication + iStifTFwIf->GoingToDoReset(); + TRequestStatus* rs = &aStatus; + User::RequestComplete( rs, KErrNone ); + + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CStifTFw + + Method: DeleteData + + Description: Delete arrays before closing session to test engine server + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +void CStifTFw::DeleteData() + { + RDebug::Print(_L("CStifTFw::DeleteData resetting iTestExecutionTable cnt=%d"), iTestExecutionTable.Count()); + iTestExecutionTable.Reset(); + RDebug::Print(_L("CStifTFw::DeleteData resetting iTestRemoteExecutionTable cnt=%d"), iTestRemoteExecutionTable.Count()); + iTestRemoteExecutionTable.Reset(); + RDebug::Print(_L("CStifTFw::DeleteData resetting iEventArray cnt=%d"), iEventArray.Count()); + iEventArray.ResetAndDestroy(); + RDebug::Print(_L("CStifTFw::DeleteData resetting iMasterArray cnt=%d"), iMasterArray.Count()); + iMasterArray.Reset(); + } + +// End of File