diff -r 7fdc9a71d314 -r 8ad140f3dd41 stif/StifTFwIf/src/UIEngineContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stif/StifTFwIf/src/UIEngineContainer.cpp Wed Oct 13 16:17:58 2010 +0300 @@ -0,0 +1,612 @@ +/* +* 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: CUIEngine: This object executes test cases from STIF +* Test Framework. +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include "UIEnginePrinter.h" +#include "UIEngineRunner.h" +#include "UIEngineRemote.h" +#include "Logging.h" + + +// EXTERNAL DATA STRUCTURES +// None + +// EXTERNAL FUNCTION PROTOTYPES +// None + +// CONSTANTS +// None + +// MACROS +#ifdef LOGGER +#undef LOGGER +#endif +#define LOGGER iUIEngine->iLogger + +// LOCAL CONSTANTS AND MACROS +// None + +// MODULE DATA STRUCTURES +// None + +// LOCAL FUNCTION PROTOTYPES +// None + +// FORWARD DECLARATIONS +// None + +// ==================== LOCAL FUNCTIONS ======================================= +// None + +// ================= MEMBER FUNCTIONS ========================================= + + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: CUIEngineContainer + + Description: Default constructor + + C++ default constructor can NOT contain any code, that + might leave. + + Parameters: CUIEngine* aUIEngine: in: Pointer to CUIEngine interface + TTestInfo& aTestInfo: in: Test information + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +CUIEngineContainer::CUIEngineContainer( CUIEngine* aUIEngine, + const TTestInfo& aTestInfo, + RTestEngineServer& aTestEngineServ, + RTestEngine& aTestEngine ) : + iUIEngine( aUIEngine ), + iTestInfo( aTestInfo ), + iTestInfoPckg( iTestInfo ), + iState( ENotStarted ) + { + __TRACE( KPrint, ( _L( "CUIEngineContainer::CUIEngineContainer.") ) ); + + // Get handles to test engine + iTestEngineServ = aTestEngineServ; + iTestEngine = aTestEngine; + + __ASSERT_ALWAYS( aUIEngine, User::Panic( _L("Null pointer"), KErrGeneral ) ); + + } + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: ConstructL + + Description: Symbian OS second phase constructor + + Symbian OS default constructor can leave + + Parameters: None + + Return Values: None + + Errors/Exceptions: Leaves if called Open method returns error + + Status: Draft + +------------------------------------------------------------------------------- +*/ +void CUIEngineContainer::ConstructL() + { + __TRACE( KPrint, ( _L( "CUIEngineContainer::ConstructL.") ) ); + + // Open test case + User::LeaveIfError( iTestCase.Open( iTestEngineServ, iTestInfoPckg ) ); + } + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: NewL + + Description: Two-phased constructor. + + Parameters: CUIEngine* aUIEngine: in: pointer to CUIEngine Interface + TTestInfo& aTestInfo: in: Test info + + Return Values: CUIEngineRunner* : pointer to created runner object + + Errors/Exceptions: Leaves if memory allocation for CUIEngineRunner fails + Leaves if ConstructL leaves + + Status: Draft + +------------------------------------------------------------------------------- +*/ +CUIEngineContainer* CUIEngineContainer::NewL( CUIEngine* aUIEngine, + const TTestInfo& aTestInfo, + RTestEngineServer& aTestEngineServ, + RTestEngine& aTestEngine ) + { + CUIEngineContainer* self = + new ( ELeave ) CUIEngineContainer( aUIEngine, + aTestInfo, + aTestEngineServ, + aTestEngine ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: ~CUIEngineContainer + + Description: Destructor + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +CUIEngineContainer::~CUIEngineContainer() + { + + __TRACE( KPrint, ( _L( "CUIEngineContainer::~CUIEngineContainer.") ) ); + + delete iPrinter; + delete iRunner; + delete iRemote; + + // Close test case + iTestCase.Close(); + + } + + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: StartContinerL + + Description: StartContinerL call CUIEngineRunner to starting test case execution + + Parameters: None + + Return Values: TInt KErrNone: Always returned KErrNone + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +TInt CUIEngineContainer::StartContainerL() + { + + __TRACE( KPrint, ( _L( "CUIEngineContainer::StartContainerL. Running test case: %S"), + &( iTestInfo.iTestCaseInfo.iTitle ) ) ); + + // Start printer + iPrinter = CUIEnginePrinter::NewL( this ); + iPrinter->StartL( iTestCase ); + + // Start remote + iRemote = CUIEngineRemote::NewL( this ); + iRemote->StartL( iTestCase ); + + // Start runner + iRunner = CUIEngineRunner::NewL( this ); + iRunner->StartL( iTestCase ); + + // Update state of test case + iState = ERunning; + + __TRACE( KPrint, ( _L( "CUIEngineContainer::StartContainerL: started") ) ); + + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: CancelTest + + Description: CancelTest cancels test case execution + + Parameters: None + + Return Values: TInt KErrNone: Always returned KErrNone + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CUIEngineContainer::CancelTest() + { + + if ( iState == ERunning || iState == EPaused ) + { + __TRACE( KPrint, ( _L( "CUIEngineContainer::CancelTest") ) ); + + // Cancel test case execution + iTestCase.CancelAsyncRequest( ETestCaseRunTestCase ); + + } + + return KErrNone; + } + + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: PauseTest + + Description: PauseTest pauses test case execution + + Parameters: None + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CUIEngineContainer::PauseTest() + { + TInt ret(KErrNone); + + if ( iState == ERunning ) + { + ret = iTestCase.Pause(); + + __TRACE( KPrint, ( _L( "CUIEngineContainer::PauseTest. Ret = %d"), ret ) ); + + if ( ret == KErrNone) + { + iState = EPaused; + } + } + + return ret; + } + + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: ResumeTest + + Description: PauseTest resumes test case execution + + Parameters: None + + Return Values: Symbian OS error: Error code + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt CUIEngineContainer::ResumeTest() + { + TInt ret(KErrNone); + + if ( iState == EPaused ) + { + ret = iTestCase.Resume(); + + __TRACE( KPrint, ( _L( "CUIEngineContainer::ResumeTest. Ret = %d"), ret ) ); + + if ( ret == KErrNone) + { + iState = ERunning; + } + } + + return ret; + } + + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: TestCaseExecuted + + Description: TestCaseExecuted informs that test case is executed + + Parameters: TFullTestResult& aFullTestResult: in: Full information of + test case execution. Includes also test case results + + Return Values: None + + Errors/Exceptions: TInt KErrNone: Always returned KErrNone + + Status: Draft + +------------------------------------------------------------------------------- +*/ +void CUIEngineContainer::TestCaseExecuted( TFullTestResult& aFullTestResult, + TInt aStatus ) + { + + iState = EExecuted; + + // Set execution result + if( ( KErrNone != aStatus ) && + ( aFullTestResult.iCaseExecutionResultCode == KErrNone ) && + ( aFullTestResult.iTestResult.iResult == KErrNone ) ) + { + aFullTestResult.iTestResult.iResultDes.Copy( + _L("Completed with error") ); + aFullTestResult.iCaseExecutionResultType = + TFullTestResult::ECaseErrorFromModule; + aFullTestResult.iCaseExecutionResultCode = aStatus; + } + + __TRACE( KPrint, ( _L( "CUIEngineContainer::TestCaseExecuted.") ) ); + + // Test execution is not completed before all prints are + // delivered to UI. + if( !iPrinter->IsRunning() || + ( aStatus != KErrNone ) || + ( aFullTestResult.iCaseExecutionResultCode != KErrNone ) ) + { + // Call TestExecuted of CUIEngine interface + iUIEngine->TestExecuted(this, aFullTestResult); + // 1. This method is called from CUIEngineRunner::RunL() and it is + // last operation => no other call to CUIEngineContainer class. + // 2. TestExecuted() method takes this pointer. Inside TestExecuted() + // will be deleted the this pointer => iUIEngine not valid anymore. + // 1 and 2 => Do not handle any CUIEngineContainer variable here + // because memory is not valid anymore. + //e.g. iState = EFinished; // illegal operation here->crash + + } + + } + + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: PrintProgress + + Description: PrintProgress prints information from test case + + Parameters: TTestProgress& aProgress: in: Progress info + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +void CUIEngineContainer::PrintProgress( TTestProgress& aProgress ) + { + if( iState == ERunning ) + { + // Only running cases may print + iUIEngine->PrintProg( this, aProgress ); + } + else + { + __TRACE( KPrint, + ( _L("%S: %S"), &aProgress.iDescription, &aProgress.iText ) ); + } + } + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: PrintsDone + + Description: Signals that printing is completed + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +void CUIEngineContainer::PrintsDone() + { + if( iState == EExecuted ) + { + // Call TestExecuted of CUIEngine interface + iUIEngine->TestExecuted(this, iRunner->FullResult() ); + } + } + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: RemoteSend + + Description: RemoteSend forwards remote protocol messages from master + + Parameters: + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +void CUIEngineContainer::RemoteSend( const TDesC& aRemoteMsg, + TInt /* aStatus */ ) + { + + __TRACE( KPrint, ( _L( "CUIEngineContainer::RemoteSend.") ) ); + + // Save master id if doesn't exists already + if( iMasterId == 0 ) + { + CStifTFwIfProt* msg = NULL; + TRAPD( err, + msg = CStifTFwIfProt::NewL(); + msg->SetL( aRemoteMsg ); + ); + if( err != KErrNone ) + { + delete msg; + // oom + return; + } + iMasterId = msg->SrcId(); + delete msg; + } + + // Call AtsSend of CUIEngine interface + iUIEngine->RemoteMsg( this, aRemoteMsg ); + + } + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: GoingToReboot + + Description: Inform UI that phone is going to rebooted + + Parameters: + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +TInt CUIEngineContainer::GoingToReboot( TRequestStatus& aStatus ) + { + + __TRACE( KPrint, ( _L( "CUIEngineContainer::GoingToReboot.") ) ); + + // Forward + return iUIEngine->GoingToReboot( this, aStatus ); + + } + +/* +------------------------------------------------------------------------------- + + Class: CUIEngineContainer + + Method: RemoteReceive + + Description: RemoteReceive forwards remote protocol messages to master + + Parameters: + + Return Values: None + + Errors/Exceptions: None + + Status: Draft + +------------------------------------------------------------------------------- +*/ +TInt CUIEngineContainer::RemoteReceive( const TDesC& aRemoteMsg ) + { + + __TRACE( KPrint, ( _L( "CUIEngineContainer::RemoteReceive.") ) ); + + // Check master test case status, FIX110 + if( iState != ERunning ) + { + __TRACE( KError, ( _L( "Master case not running") ) ); + + return KErrNotFound; + } + + HBufC8* buf = HBufC8::New( aRemoteMsg.Length() ); + if( buf == NULL ) + { + return KErrNoMemory; + } + + TPtr8 tmp = buf->Des(); + tmp.Copy( aRemoteMsg ); + TInt ret = iTestCase.NotifyRemoteMsg( tmp, EStifCmdReceive ); + delete buf; + + return ret; + + } + +// ================= OTHER EXPORTED FUNCTIONS ================================= + +// End of File