--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/StifTFwIf/src/StifTFwIf.cpp Tue Feb 02 01:57:15 2010 +0200
@@ -0,0 +1,1845 @@
+/*
+* 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 <e32base.h>
+#include <e32svr.h>
+#include "UIEngineEvent.h"
+#include <stifinternal/UIEngineContainer.h>
+#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<CTestInfo>& 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<CTestInfo>& 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 <msgtype> <srcid> <dstid>
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIf::AtsReceive( const TDesC& aMessage )
+ {
+ RDebug::Print(_L("CStifTFwIf::AtsReceive"));
+
+ 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 );
+ AtsSend( resp->Message() );
+
+ // Error reported with protocol message, return success
+ delete msg;
+ delete resp;
+ return KErrNone;
+ }
+
+ switch( msg->iMsgType )
+ {
+ case CStifTFwIfProt::EMsgReserve:
+ {
+ 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 );
+ }
+ AtsSend( resp->Message() );
+
+ }
+ break;
+ case CStifTFwIfProt::EMsgRelease:
+ {
+ // 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 );
+ }
+ AtsSend( resp->Message() );
+ }
+ break;
+ case CStifTFwIfProt::EMsgRemote:
+ {
+ // 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 );
+ }
+ AtsSend( resp->Message() );
+ }
+ break;
+ case CStifTFwIfProt::EMsgResponse:
+ {
+ // 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<CTestInfo> 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<KTestScripterNameLength> 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::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