--- a/stif/TestCombiner/src/TestCombiner.cpp Thu Jul 15 20:25:38 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6619 +0,0 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: This module contains the implementation of
-* CTestCombiner class member functions.
-*
-*/
-
-// INCLUDE FILES
-#include <StifTestEventInterface.h>
-#include <StifLogger.h>
-#include "TestCombiner.h"
-#include "TestKeywords.h"
-#include "TestCase.h"
-#include "TestCombinerEvent.h"
-#include "Logging.h"
-//--PYTHON-- begin
-#include "StifPython.h"
-#include "StifPythonFunComb.h"
-//--PYTHON-- end
-#include "SettingServerClient.h"
-
-// EXTERNAL DATA STRUCTURES
-// None
-
-// EXTERNAL FUNCTION PROTOTYPES
-// None
-
-// CONSTANTS
-_LIT( KTestRunner, "CTestRunner" );
-_LIT( KRemoteTimer, "CRemoteTimer" );
-_LIT( KRemoteReceiver, "CRemoteReceiver" );
-
-// MACROS
-#ifdef LOGGER
-#undef LOGGER
-#endif
-#define LOGGER iLog
-
-// LOCAL CONSTANTS AND MACROS
-_LIT(KTitle, "title");
-_LIT(KTimeout, "timeout");
-_LIT(KPriority, "priority");
-
-//printing macros
- _LIT( KExecute, "Execute");
-
-// MODULE DATA STRUCTURES
-// None
-
-// LOCAL FUNCTION PROTOTYPES
-// None
-
-// FORWARD DECLARATIONS
-// None
-
-// ==================== LOCAL FUNCTIONS =======================================
-// None
-
-// ================= MEMBER FUNCTIONS =========================================
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: CTestCombiner
-
- Description: Default constructor
-
- C++ default constructor can NOT contain any code, that
- might leave.
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestCombiner::CTestCombiner():
- iSchedulerActive( EFalse ),
- iRunningTests( 0 ),
- iResult( KErrNone ),
- iEventPckg( iEvent ),
- iRemoteTimeout( KRemoteProtocolTimeout ),
- iCancelIfError( EFalse ),
- iFailedTestCase( 0 ),
- iLoopIsUsed( EFalse )
- {
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: ConstructL
-
- Description: Symbian OS second phase constructor
-
- Symbian OS default constructor can leave.
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::ConstructL()
- {
- // TRAPed to avoid crashing if logfile creation fails,
- // so we can run test without logging to file
- TRAPD( err, iStdLog = CStifLogger::NewL( KTestCombinerLogDir,
- KTestCombinerLogFile );
- );
- if( err != KErrNone )
- {
- iStdLog = NULL;
- __RDEBUG( (_L("Creating logfile failed") ) );
- }
- iLog = iStdLog;
-
- //Read logger settings to check whether test case name is to be
- //appended to log file name.
- RSettingServer settingServer;
- TInt ret = settingServer.Connect();
- if(ret != KErrNone)
- {
- User::Leave(ret);
- }
- // Struct to StifLogger settigs.
- TLoggerSettings loggerSettings;
- // Parse StifLogger defaults from STIF initialization file.
- ret = settingServer.GetLoggerSettings(loggerSettings);
- if(ret != KErrNone)
- {
- User::Leave(ret);
- }
-
- // Get engine settings
- TEngineSettings engineSettings;
- ret = settingServer.GetEngineSettings(engineSettings);
- if(ret != KErrNone)
- {
- __TRACE(KError, (_L("Could not retrieve engine settings from SettingServer [%d]"), ret));
- iUITestingSupport = EFalse;
- iSeparateProcesses = EFalse;
- }
- else
- {
- iUITestingSupport = engineSettings.iUITestingSupport;
- iSeparateProcesses = engineSettings.iSeparateProcesses;
- __TRACE(KMessage, (_L("Engine settings retrieved from SettingServer. UITestingSupport [%d] SeparateProcesses [%d]"), iUITestingSupport, iSeparateProcesses));
- }
-
- // Close Setting server session
- settingServer.Close();
- iAddTestCaseTitleToLogName = loggerSettings.iAddTestCaseTitle;
-
- iIndexTestModuleControllers = 1;
-
- __TRACE( KPrint, ( _L("New TestCombiner") ) );
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: NewL
-
- Description: Two-phased constructor.
-
- Parameters: None
-
- Return Values: CTestCombiner*: new object
-
- Errors/Exceptions: Leaves if new or ConstructL leaves.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestCombiner* CTestCombiner::NewL()
- {
-
- CTestCombiner* self = new (ELeave) CTestCombiner();
-
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop();
-
- return self;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: ~CTestCombiner
-
- Description: Destructor
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestCombiner::~CTestCombiner()
- {
- iLoopAllocationArray.Reset();
- iLoopAllocationArray.Close();
- iLoopIsUsed = EFalse;
-
- iTestCases.ResetAndDestroy();
- iTestModules.ResetAndDestroy();
- iEventArray.ResetAndDestroy();
- iSlaveArray.ResetAndDestroy();
- iSendReceive.ResetAndDestroy();
-
- iTestCases.Close();
- iTestModules.Close();
- iEventArray.Close();
- iSlaveArray.Close();
- iSendReceive.Close();
-
- // Stop all remaining measurement modules
- const TInt count_meas = iTestMeasurementArray.Count();
- for( TInt b = 0; b < count_meas; b++ )
- {
- iTestMeasurementArray[b]->iMeasurement->Stop();
- }
- iTestMeasurementArray.ResetAndDestroy();
- iTestMeasurementArray.Close();
-
- delete iSectionParser;
- delete iRemoteReceiver;
- delete iTestRunner;
-
- iLog = NULL;
- delete iStdLog;
- iStdLog = NULL;
- delete iTCLog;
- iTCLog = NULL;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: InitL
-
- Description: InitL is used to initialize the Test Module.
-
- Parameters: const TFileName& aIniFile: in: Initialization file
- TBool aFirstTime: in: First time flag
-
- Return Values: Symbian OS error code
-
- Errors/Exceptions: Leaves if ReadInitializationL leaves
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TInt CTestCombiner::InitL( TFileName& aIniFile,
- TBool /*aFirstTime*/ )
- {
-
- __TRACEFUNC();
-
- if( aIniFile.Length() > 0 )
- {
- // Read initialization from test case file
- ReadInitializationL( aIniFile );
- }
-
- return KErrNone;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetTestCases
-
- Description: GetTestCases is used to inquired test cases
-
- Parameters: const TFileName& aConfigFile: in: Config file name
- RPointerArray<RTestEngine::TTestCaseInfo>& aTestCases: out:
- Array of TestCases
-
- Return Values: KErrNone: Success
- KErrNotFound: Testcases not found
-
- Errors/Exceptions: Leaves if CStifParser::NewL leaves
- Leaves if CStifParser::SectionL leaves
- Leaves if CStifParser::NextSectionL leaves
- Leaves if memory allocation fails
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestCombiner::GetTestCasesL( const TFileName& aConfigFile,
- RPointerArray<TTestCaseInfo>& aTestCases )
- {
- __TRACEFUNC();
-
- if( aConfigFile.Length() == 0 )
- {
- __TRACE( KError, (_L("No test case script file given") ) );
- __RDEBUG( (_L("No test case script file given") ) );
- return KErrNotFound;
- }
-
- CStifParser* parser = NULL;
- TRAPD( err, parser =
- CStifParser::NewL( _L(""), aConfigFile, CStifParser::ECStyleComments ) );
- if( err != KErrNone )
- {
- __TRACE( KError, (_L("Test case script file not found") ) );
- __RDEBUG( (_L("Test case script file not found") ) );
- return KErrNotFound;
- }
- CleanupStack::PushL( parser );
- CStifSectionParser* section;
- TPtrC tmp;
- TInt index = 0;
- TInt ret = KErrNone;
-
- section = parser->SectionL( KTestStartTag, KTestEndTag );
- if( section == NULL )
- {
- ret = KErrNotFound;
- }
- else
- {
- while( section )
- {
- CleanupStack::PushL( section );
-
- if( section->GetLine( KTitle, tmp, ENoTag ) == KErrNone )
- {
- if( tmp.Length() > KMaxName )
- {
- tmp.Set( tmp.Left( KMaxName ) );
- }
- TTestCaseInfo* tc = new ( ELeave ) TTestCaseInfo();
- CleanupStack::PushL( tc );
- __TRACE( KVerbose, (_L("TestCase: %S"), &tmp));
- tc->iTitle.Copy( tmp );
- tc->iCaseNumber = ++index;
- CStifItemParser* item = section->GetItemLineL( KTimeout );
- if( item )
- {
- TInt timeout; // In milliseconds
- ret = item->GetInt( KTimeout, timeout );
- if( ret != KErrNone )
- {
- __TRACE( KError, (_L("Illegal timeout")));
- User::Leave( ret );
- }
- tc->iTimeout = (TInt64)timeout*1000;
- __TRACE( KMessage, (_L("Timeout: %i"), tc->iTimeout.Int64() ));
- }
- item = section->GetItemLineL( KPriority );
- if( item )
- {
- ret = item->GetInt( KPriority, tc->iPriority );
- if( ret != KErrNone )
- {
- TPtrC priority;
- ret = item->GetString( KPriority, priority );
- if( ret != KErrNone )
- {
- __TRACE( KError, (_L("Illegal priority")));
- User::Leave( ret );
- }
- switch( TTCKeywords::Parse( priority,
- TTCKeywords::Priority ) )
- {
- case TTCKeywords::EPriHigh:
- tc->iPriority = TTestCaseInfo::EPriorityHigh;
- break;
- case TTCKeywords::EPriNormal:
- tc->iPriority = TTestCaseInfo::EPriorityNormal;
- break;
- case TTCKeywords::EPriLow:
- tc->iPriority = TTestCaseInfo::EPriorityLow;
- break;
- default:
- __TRACE( KError, (_L("Illegal priority")));
- User::Leave( KErrArgument );
- }
- }
- __TRACE( KMessage, (_L("Priority: %i"), tc->iPriority ));
- }
-
- aTestCases.Append(tc);
- CleanupStack::Pop( tc );
- }
- CleanupStack::PopAndDestroy( section );
- section = parser->NextSectionL( KTestStartTag, KTestEndTag );
- }
- }
-
- CleanupStack::PopAndDestroy( parser );
-
- __TRACE( KPrint, ( _L( "Configfile '%S', testcases %d" ),
- &aConfigFile, index ));
-
- return ret;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: RunTestCaseL
-
- Description: Run a specified testcase.
-
- RunTestCaseL is used to run an individual test case specified
- by aTestCase.
-
- Parameters: const TInt aCaseNumber: in: Testcase number
- const TFileName& aConfig: in: Configuration file name
- TTestResult& aResult: out; test case result
-
- Return Values: KErrNone: Test case started succesfully.
- KErrNotFound: Testcase not found
- KErrUnknown: Unknown TestCombiner error
- Any other SymbianOS error
-
- Errors/Exceptions: Leaves if GetTestCaseL leaves
- Leaves if RunTestL leaves
- Leaves if memory allocation fails
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestCombiner::RunTestCaseL( const TInt aCaseNumber,
- const TFileName& aConfig,
- TTestResult& aResult )
- {
- __TRACEFUNC();
-
- __TRACE( KMessage, (_L("***Testcase started***")));
-
- //Open new log file with test case title in file name
- if(iAddTestCaseTitleToLogName)
- {
- //Close test case log if exists
- if(iTCLog)
- {
- delete iTCLog;
- iTCLog = NULL;
- }
- TFileName logFileName;
- TName title;
- TestModuleIf().GetTestCaseTitleL(title);
-
- logFileName.Format(KTestCombinerLogFileWithTitle, &title);
- iTCLog = CStifLogger::NewL(KTestCombinerLogDir, logFileName);
- iLog = iTCLog;
- }
-
- /*
- * Allow memory leaks, because Defines are leaved untouched
- * after test case execution. Real memory leaks are detected with
- * UHEAP macros.
- */
- TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksMem );
-
- // Read initialization from test case file
- ReadInitializationL( aConfig );
-
- __UHEAP_MARK;
-
- iSectionParser = GetTestCaseL( aCaseNumber, aConfig );
-
- // Check parsing result
- if( iSectionParser == NULL )
- {
- __TRACE( KError, (_L("***Parsing testcase failed***")));
- __UHEAP_MARKEND;
- return KErrNotFound;
- }
-
- CActiveScheduler* activeScheduler =
- new ( ELeave ) CActiveScheduler();
- CleanupStack::PushL( activeScheduler );
- CActiveScheduler::Install( activeScheduler );
-
- // Resetting these variables to normal state @js
- iFailedTestCase = 0;
- iCancelIfError = EFalse;
- iScriptFailed = KErrNone;
- iScriptFailedDescription.Copy(KNullDesC);
-
- // Run the given testcase described in iSectionParser section
- RunTestL();
-
- CleanupStack::PopAndDestroy( activeScheduler );
-
- delete iSectionParser;
- iSectionParser = NULL;
-
- TInt ret = KErrNone;
- // Check if test case starting failed
- if( iResult != KErrNone )
- {
- TestModuleIf().Printf( KPrintPriHigh, _L("Result"), _L("Starting FAILED"));
- __TRACE( KError, (_L("***Starting testcase FAILED***")));
- ret = iResult;
- aResult.iResult = -2;
- aResult.iResultDes = _L("Testcase script execution failed");
- }
- else if(iScriptFailed != KErrNone)
- {
- TestModuleIf().Printf( KPrintPriHigh, _L("Result"), _L("Script execution FAILED"));
- __TRACE( KError, (_L("***Sscript execution FAILED***")));
- aResult.iResult = iScriptFailed;
- if(iScriptFailedDescription != KNullDesC)
- {
- aResult.iResultDes.Copy(iScriptFailedDescription);
- }
- else
- {
- aResult.iResultDes = _L("Testcase script execution failed");
- }
- }
- else
- {
- __TRACE( KPrint, (_L("***Testcase completed***")));
-
- // Testcombiner succeeded to start all testcases,
- // check individual testcase results
- TInt count = iTestCases.Count();
- TInt i = iFailedTestCase;
- // iFailedTestCase is either 0 or the number of failed test case if
- // canceliferror was given and a test case has failed
-
- for(; i < count; i++ )
- {
- // All cases should be completed now
- if( iTestCases[i]->State() != CTCTestCase::ETestCaseCompleted )
- {
- // This is some unknown internal TestCombiner error
- // Should not happen
- __TRACE( KError, (_L("TestCase (%S) not completed"),
- &iTestCases[i]->TestId() ));
- ret = KErrUnknown;
- break;
- }
-
- // Interpret execution result type from returned result
- TInt executionResult = TFullTestResult::ECaseExecuted; // Ok
- if( iTestCases[i]->iResult.iCaseExecutionResultType >=
- TFullTestResult::ECaseLeave )
- {
- // Some abnormal execution result type
- executionResult = iTestCases[i]->iResult.iCaseExecutionResultType;
- }
-
- // Check expected execution result type
- if( executionResult != iTestCases[i]->ExpectedResultCategory() )
- {
- // expected and returned result types differ
- aResult.iResult = KErrGeneral;
- aResult.iResultDes.Copy( _L("Test case completed with ") );
- aResult.iResultDes.Append(
- TTCKeywords::ResultCategory(
- iTestCases[i]->iResult.iCaseExecutionResultType ));
- aResult.iResultDes.Append( _L(" and expected was ") );
- aResult.iResultDes.Append(
- TTCKeywords::ResultCategory(
- iTestCases[i]->ExpectedResultCategory() ));
- AppendTestResultToResultDes(aResult.iResultDes, iTestCases[i]->iResult.iTestResult.iResultDes);
- __TRACE( KPrint, ( _L( "%S"), &aResult.iResultDes ) );
- break;
- }
-
- // Check normal test result
- if( iTestCases[i]->ExpectedResultCategory() ==
- TFullTestResult:: ECaseExecuted )
- {
- // Normal completion, check result
- if( iTestCases[i]->iResult.iTestResult.iResult !=
- iTestCases[i]->ExpectedResult() )
- {
- __TRACE( KPrint, ( _L( "Test failed, expect(%d) != result(%d)"),
- iTestCases[i]->ExpectedResult(),
- iTestCases[i]->iResult.iTestResult.iResult ));
- // We return the first error result as aResult
- if( iTestCases[i]->iResult.iTestResult.iResult != KErrNone )
- {
- aResult = iTestCases[i]->iResult.iTestResult;
- }
- else
- {
- aResult.iResult = KErrGeneral;
- aResult.iResultDes.Copy( _L("Test case completed with KErrNone and expected "));
- aResult.iResultDes.AppendNum( iTestCases[i]->ExpectedResult() );
- AppendTestResultToResultDes(aResult.iResultDes, iTestCases[i]->iResult.iTestResult.iResultDes);
- }
- break;
- }
- }
- else
- {
- // Abnormal completion, i.e. panic, leave, exception or timeout
- if( iTestCases[i]->iResult.iCaseExecutionResultCode !=
- iTestCases[i]->ExpectedResult() )
- {
- __TRACE( KPrint, ( _L( "Test failed, expect errorcode(%d) != result(%d)"),
- iTestCases[i]->ExpectedResult(),
- iTestCases[i]->iResult.iCaseExecutionResultCode ) );
- // We return the first error result as aResult
- aResult = iTestCases[i]->iResult.iTestResult;
- // override result with real error code
- aResult.iResult = iTestCases[i]->iResult.iCaseExecutionResultCode;
- break;
- }
- }
- }
- if( i == count )
- {
- TestModuleIf().Printf( KPrintPriHigh, _L("Result"), _L("PASSED"));
- __TRACE( KPrint, (_L("***Test case result: PASSED***")));
- aResult.iResult = KErrNone;
- aResult.iResultDes.Copy( _L("Test case succeeded") );
- }
- else
- {
- TestModuleIf().Printf( KPrintPriHigh, _L("Result"), _L("FAILED"));
- __TRACE( KPrint, (_L("***Test case result: FAILED***")));
- }
- }
-
- // Release all pending event requests
- TEventIf event( TEventIf::ERelEvent );
- TInt eventCount = iEventArray.Count();
- for( TInt ind=0; ind < eventCount; ind++ )
- {
- event.SetName( iEventArray[ind]->Name() );
- TestModuleIf().Event( event );
- }
-
- iLoopAllocationArray.Reset();
- iLoopAllocationArray.Close();
- iLoopIsUsed = EFalse;
-
- // Delete all completed and checked testcases
- // Do not change the deletion order of events and test cases!!!
- iEventArray.ResetAndDestroy();
- iTestCases.ResetAndDestroy();
- iTestModules.ResetAndDestroy();
- iSlaveArray.ResetAndDestroy();
-
- iSendReceive.ResetAndDestroy();
-
- // Stop all remaining measurement modules
- const TInt count_meas = iTestMeasurementArray.Count();
- for( TInt b = 0; b < count_meas; b++ )
- {
- iTestMeasurementArray[b]->iMeasurement->Stop();
- }
- iTestMeasurementArray.ResetAndDestroy();
- iTestMeasurementArray.Close();
-
- __UHEAP_MARKEND;
-
- //If log was replaced then restore it
- if(iAddTestCaseTitleToLogName)
- {
- iLog = iStdLog;
- delete iTCLog;
- iTCLog = NULL;
- }
-
- return ret;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetTestCaseL
-
- Description: Get specified test case section from configfile.
-
- Parameters: const TInt aCaseNumber: in: Test case number
- const TFileName& aConfig: in: Configfile name
-
- Return Values: CSectionParser*: pointer to test case section
-
- Errors/Exceptions: Leaves if CStifParser::NewL leaves
- Leaves if CStifParser::SectionL leaves
- Leaves if memory allocation fails
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CStifSectionParser* CTestCombiner::GetTestCaseL( const TInt aCaseNumber,
- const TFileName& aConfig )
- {
- __TRACEFUNC();
- CStifParser* parser =
- CStifParser::NewL( _L(""), aConfig, CStifParser::ECStyleComments );
- CleanupStack::PushL( parser );
-
- CStifSectionParser* section =
- parser->SectionL( KTestStartTag, KTestEndTag, aCaseNumber );
-
- CleanupStack::PopAndDestroy( parser );
- return section;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: ReadInitializationL
-
- Description: Read initialization from file.
-
- Parameters: const TDesC& aIniFile: in: File that contains initialization
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::ReadInitializationL( const TDesC& aIniFile )
- {
- CStifParser* parser = NULL;
-
- // Open file
- TRAPD( err, parser =
- CStifParser::NewL( _L(""), aIniFile, CStifParser::ECStyleComments ) );
- if( ( err == KErrNone ) && parser )
- {
- CleanupStack::PushL( parser );
- __TRACE( KMessage, (_L("Read initialization from [%S]"),
- &aIniFile ) );
-
- // Read initialization parameters
- CStifSectionParser* section = parser->SectionL( KInitStartTag,
- KInitEndTag );
- if( section )
- {
- CleanupStack::PushL( section );
- __TRACE( KMessage, (_L("Read initializations")) );
-
- // Read RCP timeout
- CStifItemParser* item = section->GetItemLineL( KInitRcpTimeout );
- if( item != NULL )
- {
- __TRACE( KMessage, (_L("Got RCP timeout definition")) );
- CleanupStack::PushL( item );
-
- TInt value;
- if( item->GetInt( KInitRcpTimeout, value )
- != KErrNone )
- {
- __TRACE( KError, (_L("No RCP timeout value given")) );
- User::Leave( KErrGeneral );
- }
- // Change from seconds to milliseconds
- iRemoteTimeout = value*1000*1000;
- CleanupStack::PopAndDestroy( item );
- }
-
- CleanupStack::PopAndDestroy( section );
- }
-
- // Read defines
- section = parser->SectionL( KDefineStartTag, KDefineEndTag );
- while(section)
- {
- CleanupStack::PushL( section );
- __TRACE( KMessage, (_L("Read defines")) );
-
- TPtrC name;
- TPtrC value;
- CStifItemParser* item = section->GetItemLineL( _L("") );
- while( item )
- {
- CleanupStack::PushL( item );
-
- if( item->GetString( _L(""), name ) != KErrNone )
- {
- __TRACE( KError, (_L("No define name given")) );
- User::Leave( KErrGeneral );
- }
- if( item->Remainder( value ) != KErrNone )
- {
- __TRACE( KError, (_L("No define value given")) );
- User::Leave( KErrGeneral );
- }
- TInt count = iDefined.Count();
- TInt i = 0;
- for( ; i < count; i++ )
- {
- if( iDefined[i]->Name() == name )
- {
- __TRACE( KMessage, (_L("Update define %S:%S"), &name, &value ) );
- // Update existing
- iDefined[i]->SetValueL( value );
- break;
- }
- }
- if( i == count)
- {
- // New define, store it
- CDefinedValue* define = CDefinedValue::NewL( name, value );
- CleanupStack::PushL( define );
- User::LeaveIfError( iDefined.Append( define ) );
- CleanupStack::Pop( define );
- }
-
- CleanupStack::PopAndDestroy( item );
- item = section->GetNextItemLineL();
- }
- CleanupStack::PopAndDestroy( section );
- section = parser->NextSectionL(KDefineStartTag, KDefineEndTag);
- }
- CleanupStack::PopAndDestroy( parser );
- }
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: RunTestL
-
- Description: Run a testcase specified by iSectionParser.
-
- Parameters: None
-
- Return Values: None.
-
- Errors/Exceptions: Leaves if CSectionParser::GetItemLineL leaves
- Leaves if CTestRunner::NewL leaves
- Leaves if memory allocation fails
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::RunTestL()
- {
- __TRACEFUNC();
- iResult = KErrNone;
-
- TPtrC line;
- // "title" keyword must be in the first line
- User::LeaveIfError( iSectionParser->GetLine( KTitle, line, ENoTag ) );
-
- iTestRunner = CTestRunner::NewL( this );
- iRemoteReceiver = CRemoteReceiver::NewL( this );
- iRemoteReceiver->Start();
-
- __TRACE( KMessage, (_L("Run: %S"), &line));
-
- TestModuleIf().Printf( KPrintPriNorm, _L("Run"), _L("%S"), &line);
- // Rest of the job is done by test runner
- iTestRunner->SetRunnerActive();
-
- // Start activeScheduler looping testcase lines
- iSchedulerActive = ETrue;
- __TRACE( KMessage, (_L("Start CActiveScheduler")));
- CActiveScheduler::Current()->Start();
-
- TestModuleIf().Printf( KPrintPriNorm, _L("Executed"), _L("%S"), &line);
- __TRACE( KMessage, (_L("Executed: %S"), &line));
-
- delete iRemoteReceiver;
- iRemoteReceiver = NULL;
- delete iTestRunner;
- iTestRunner = NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetTestModuleL
-
- Description: Load testmodule if not already loaded, otherwise return
- description of the loaded testmodule.
-
- Parameters: TDesC& aModule: in: Module name.
- TDesC& aIniFile: in: Ini file name.
- const TDesC& aConfigFile: in: Test case(config) file name.
-
- Return Values: CTCTestModule*: pointer to testmodules description
-
- Errors/Exceptions: Leaves if CTCTestModule::NewL leaves
- Leaves if RPointerArray::Append fails
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CTCTestModule* CTestCombiner::GetTestModuleL( TDesC& aModule,
- TDesC& aIniFile,
- const TDesC& aConfigFile )
- {
- __TRACEFUNC();
- TInt count = iTestModules.Count();
- TInt i, j;
- TInt counttc;
- TInt running;
- TBool newWay = EFalse;
-
- __TRACE(KMessage, (_L("Find test module for [%S]"), &aModule));
-
- //Name for new module controller
- TName newModuleName = aModule;
-
- //Check if it is python case or UITestingSupport or SeparateProcesses mode
- newWay = (aModule.Find(KPythonScripter) == 0)
- || (iUITestingSupport && aModule.Find(KTestScripterName) == 0)
- || (iSeparateProcesses);
-
- if(newWay)
- {
- __TRACE(KMessage, (_L("TCTestModule operating mode: exclusive")));
-
- //Find module of given name
- __TRACE(KMessage, (_L("Looking for module [%S]"), &aModule));
- if(iUITestingSupport && aModule.Find(KTestScripterName) == 0)
- {
- __TRACE(KMessage, (_L("UITestingSupport option is on. New module controller will be created always")));
- }
- else
- {
- for(i = 0; i < count; i++)
- {
- TPtrC modName = iTestModules[i]->ModuleName();
- if(modName.Find(aModule) == 0)
- {
- //Check if there is running test case
- counttc = iTestCases.Count();
- running = 0;
- for(j = 0; j < counttc; j++)
- {
- if(iTestCases[j]->TestModule() == iTestModules[i] && iTestCases[j]->State() != CTestCase::ETestCaseCompleted)
- {
- //We have found at least one running test case. There is no reason to find any more,
- //because there shouldn't be because test module may run only one python scripter test case.
- running++;
- __TRACE(KMessage, (_L("Module controller found [%S], but it has running test cases"), &modName));
- break;
- }
- }
- if(running == 0)
- {
- __TRACE(KMessage, (_L("Free module controller has been found [%S]"), &modName));
- return iTestModules[i];
- }
- }
- }
- }
- //Update name of new module to be created
- newModuleName.AppendFormat(_L("@%d_"), GetIndexForNewTestModuleController());
- newModuleName.LowerCase();
- }
- else
- {
- __TRACE(KMessage, (_L("TCTestModule operating mode: normal")));
- for(i = 0; i < count; i++)
- {
- if(iTestModules[i]->ModuleName() == aModule)
- {
- // Found test module, return description
- __TRACE(KMessage, (_L("Module controller [%S] found"), &aModule));
- return iTestModules[i];
- }
- }
- }
-
- __TRACE(KMessage, (_L("Creating new test module controller [%S] with ini [%S]"), &newModuleName, &aIniFile));
- CTCTestModule* module = CTCTestModule::NewL(this, newModuleName, aIniFile, aConfigFile);
- CleanupStack::PushL(module);
-
- //Enumerate test cases
- module->GetTestCasesForCombiner(aConfigFile);
-
- //Append new module to list
- User::LeaveIfError(iTestModules.Append(module));
- CleanupStack::Pop(module);
-
- //Log some info
- if(newWay)
- {
- __TRACE(KMessage, (_L("Module [%S] added to list. Currently there are following controllers of [%S] type:"), &newModuleName, &aModule));
- j = 1;
- for(i = 0; i < iTestModules.Count(); i++)
- {
- if(iTestModules[i]->ModuleName().Find(aModule) == 0)
- {
- __TRACE(KMessage, (_L(" %d. [%S]"), j, &iTestModules[i]->ModuleName()));
- j++;
- }
- }
- }
-
- if( iLoopIsUsed )
- {
- User::LeaveIfError( iLoopAllocationArray.Append( module ) );
- }
-
- return module;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetTest
-
- Description: Get test case from testcase array.
-
- Parameters: TDesC& aTestId: in: TestId for testcase
-
- Return Values: CTCTestCase*: running/runned testcase
- NULL: Testcase with aTestId not running/runned
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestCase* CTestCombiner::GetTest( TDesC& aTestId )
- {
- __TRACEFUNC();
- // TestId is not mandatory, so length may be zero
- if( aTestId.Length() == 0 )
- {
- return NULL;
- }
-
- TInt count = iTestCases.Count();
- for( TInt i=0; i < count; i++ )
- {
- if( iTestCases[i]->TestId() == aTestId )
- {
- // Found testcase with specified TestId
- return iTestCases[i];
- }
- }
- // Test case with aTestId not found
- return NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetRunningTest
-
- Description: Get running test case.
-
- Parameters: TDesC& aTestId: in: TestId for testcase
-
- Return Values: CTCTestCase*: running testcase
- NULL: Testcase with aTestId not running
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestCase* CTestCombiner::GetRunningTest( TDesC& aTestId )
- {
- __TRACEFUNC();
-
- CTestCase* test = GetTest( aTestId );
- if( test )
- {
- if( test->State() == CTestCase::ETestCaseRunning )
- {
- return test;
- }
- else
- {
- __TRACE( KMessage, (_L("GetTest: Searched task (%S) not running (%i)"),
- &aTestId, test->State() ));
- }
- }
-
- return NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetLocalTest
-
- Description: Get local test case from testcase array.
-
- Parameters: TDesC& aTestId: in: TestId for testcase
-
- Return Values: CTCTestCase*: running/runned testcase
- NULL: Testcase with aTestId not running/runned
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CTCTestCase* CTestCombiner::GetLocalTest( TDesC& aTestId )
- {
- __TRACEFUNC();
- CTestCase* testCase = GetTest( aTestId );
- if( testCase )
- {
- if( testCase->Type() != CTestCase::ECaseLocal )
- {
- __TRACE( KMessage, (_L("GetLocalTest: Searched task (%S) not local"),
- &aTestId ));
- return NULL;
- }
- }
- return ( CTCTestCase* ) testCase;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetLocalRunningTest
-
- Description: Get local running test case.
-
- Parameters: TDesC& aTestId: in: TestId for testcase
-
- Return Values: CTCTestCase*: running/runned testcase
- NULL: Testcase with aTestId not running/runned
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CTCTestCase* CTestCombiner::GetLocalRunningTest( TDesC& aTestId )
- {
- __TRACEFUNC();
- CTestCase* testCase = GetRunningTest( aTestId );
- if( testCase )
- {
- if( testCase->Type() != CTestCase::ECaseLocal )
- {
- __TRACE( KMessage, (_L("GetLocalRunningTest: Searched task (%S) not local"),
- &aTestId ));
- return NULL;
- }
- }
-
- return ( CTCTestCase* ) testCase;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetRemoteTest
-
- Description: Get local test case from testcase array.
-
- Parameters: TDesC& aTestId: in: TestId for testcase
-
- Return Values: CTCTestCase*: running/runned testcase
- NULL: Testcase with aTestId not running/runned
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CRemoteTestCase* CTestCombiner::GetRemoteTest( TDesC& aTestId )
- {
- __TRACEFUNC();
- CTestCase* testCase = GetTest( aTestId );
- if( testCase )
- {
- if( testCase->Type() != CTestCase::ECaseRemote )
- {
- __TRACE( KMessage, (_L("GetRemoteTest: Searched task (%S) not remote"),
- &aTestId ));
- return NULL;
- }
- }
-
- return ( CRemoteTestCase* ) testCase;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetRemoteTest
-
- Description: Get remote test case from slave array.
-
- Parameters: TUint32 aSlaveId: in: Slave id for testcase
-
- Return Values: TCaseInfo*: running/runned testcase
- NULL: Testcase with aTestId not running/runned
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CRemoteTestCase* CTestCombiner::GetRemoteTest( TUint32 aSlaveId )
- {
-
- __TRACEFUNC();
-
- // Check all remote testcases
- TInt caseCount = iTestCases.Count();
- CRemoteTestCase* testCase = NULL;
- for( TInt caseInd = 0; caseInd < caseCount; caseInd++ )
- {
- if( iTestCases[caseInd]->Type() == CTestCase::ECaseRemote )
- {
- testCase = ( CRemoteTestCase* )iTestCases[caseInd];
- if( testCase->iSlaveId == aSlaveId )
- {
- return testCase;
- }
- }
- }
-
- return NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetRemoteTestRunSent
-
- Description: Get remote test case from slave array
-
- Parameters: TUint32 aSlaveId: in: Slave id for testcase
-
- Return Values: TCaseInfo*: running/runned testcase
- NULL: Testcase with aTestId not running/runned
-
- Errors/Exceptions: None
-
- Status: Draft @js
-
--------------------------------------------------------------------------------
-*/
-
-CRemoteTestCase* CTestCombiner::GetRemoteTestRunSent( TUint32 aSlaveId )
- {
-
- __TRACEFUNC();
-
- // Check all remote testcases
- TInt caseCount = iTestCases.Count();
- CRemoteTestCase* testCase = NULL;
- for( TInt caseInd = 0; caseInd < caseCount; caseInd++ )
- {
- if( iTestCases[caseInd]->Type() == CTestCase::ECaseRemote )
- {
- testCase = ( CRemoteTestCase* )iTestCases[caseInd];
-
- if( testCase->iRemoteState != CRemoteTestCase::ECaseRunSent )
- {
- continue;
- }
- if( testCase->iSlaveId == aSlaveId )
- {
- return testCase;
- }
- }
- }
-
- return NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetRemoteTest
-
- Description: Get remote test case from slave array.
-
- Parameters: TUint32 aSlaveId: in: Slave id for testcase
-
- Return Values: TCaseInfo*: running/runned testcase
- NULL: Testcase with aTestId not running/runned
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CRemoteTestCase* CTestCombiner::GetRunningRemoteTest( TUint32 aSlaveId )
- {
-
- __TRACEFUNC();
-
- // Check all remote testcases
- TInt caseCount = iTestCases.Count();
- CRemoteTestCase* testCase = NULL;
- for( TInt caseInd = 0; caseInd < caseCount; caseInd++ )
- {
- if( ( iTestCases[caseInd]->Type() == CTestCase::ECaseRemote ) &&
- ( iTestCases[caseInd]->State() == CTestCase::ETestCaseRunning ) )
- {
- testCase = ( CRemoteTestCase* )iTestCases[caseInd];
-
- if( ( testCase->iRemoteState != CRemoteTestCase::ECaseRunSent ) &&
- ( testCase->iRemoteState != CRemoteTestCase::ECaseRunning ) &&
- ( testCase->iRemoteState != CRemoteTestCase::ECaseCancelled ))
- {
- //User::Leave( KErrGeneral );
- continue;
- }
-
- if( testCase->iSlaveId == aSlaveId )
- {
- return testCase;
- }
- }
- }
-
- return NULL;
-
- }
-
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetRemoteTestSlave
-
- Description: Get remote test case running on slave
-
- Parameters: TUint32 aSlaveDevId: in: Slave id for testcase
-
- Return Values: CRemoteTestCase*: running/runned testcase
- NULL: Testcase with aTestId not running/runned
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CRemoteTestCase* CTestCombiner::GetRemoteRunningTestOnSlave(
- TUint32 aSlaveDevId )
- {
-
- __TRACEFUNC();
-
- // Check all remote testcases
- TInt caseCount = iTestCases.Count();
- CRemoteTestCase* testCase = NULL;
- for( TInt caseInd = 0; caseInd < caseCount; caseInd++ )
- {
- if( ( iTestCases[caseInd]->Type() == CTestCase::ECaseRemote ) &&
- ( iTestCases[caseInd]->State() == CTestCase::ETestCaseRunning ) )
- {
- testCase = ( CRemoteTestCase* )iTestCases[caseInd];
- if( DEVID( testCase->iSlaveId ) == DEVID( aSlaveDevId ) )
- {
- return testCase;
- }
- }
- }
-
- return NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetRemoteTestSlave
-
- Description: Gets a correct CRemoteSendReceive object on slave with
- aSlaveId.
-
- Parameters: TUint32 aSlaveId: in: Slave id CRemoteSendReceive object
-
- Return Values: CRemoteSendReceive*: Current CRemoteSendReceive object.
- NULL: CRemoteSendReceive object do not exist or found.
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CRemoteSendReceive* CTestCombiner::GetRemoteSendReceive( TUint32 aSlaveId )
- {
- __TRACEFUNC();
-
- for( TInt sr = 0; sr < iSendReceive.Count(); sr++ )
- {
- if( iSendReceive[sr]->iSlaveId == aSlaveId )
- {
- return iSendReceive[sr];
- }
- }
-
- return NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetSlave
-
- Description: Get remote slave.
-
- Parameters: TUint32 aSlaveId: in: Slave id
-
- Return Values: CSlaveInfo*: reserved slave
- NULL: slave with aSlaveId not reserved
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CSlaveInfo* CTestCombiner::GetSlave( TUint32 aSlaveId )
- {
-
- __TRACEFUNC();
-
- TInt count = iSlaveArray.Count();
- for( TInt index = 0; index < count; index++ )
- {
- if( DEVID( iSlaveArray[index]->iSlaveDevId ) == DEVID( aSlaveId) )
- {
- return iSlaveArray[index];
- }
- }
-
- return NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetSlave
-
- Description: Get remote slave.
-
- Parameters: TDesC& aSlaveName: in: Slave name
-
- Return Values: CSlaveInfo*: reserved slave
- NULL: slave with aSlaveId not reserved
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CSlaveInfo* CTestCombiner::GetSlave( TDesC& aSlaveName )
- {
-
- __TRACEFUNC();
-
- TInt count = iSlaveArray.Count();
- for( TInt index = 0; index < count; index++ )
- {
- if( iSlaveArray[index]->iName == aSlaveName )
- {
- return iSlaveArray[index];
- }
- }
-
- return NULL;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: StartTestL
-
- Description: Start specified test case from testmodule.
-
- Parameters: CStartInfo& aStartInfo: in: Test case information
-
- Return Values: KErrNone: Testcase started
- KErrAlreadyExists: testcase with same aTestId is already
- running
- Any other SymbianOS errorcode
-
- Errors/Exceptions: Leaves if CTCTestCase::NewL leaves
- Leaves if arguments are illegal
- Leaves if GetTestModuleL leaves
- Leaves if CTestExecution::Open fails
- Leaves if CTCTestCase::StartL leaves
- Leaves if RPointerArray::Append fails
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestCombiner::StartTestL( CStartInfo& aStartInfo )
- {
- __TRACEFUNC();
- // Check that TestId is unique.
- if( GetTest( aStartInfo.iTestId ) != NULL )
- {
- // If loop testing is ongoing, allow already defined testid.
- if( iLoopIsUsed )
- {
- __TRACE( KVerbose, ( _L("StartTestL: TestId (%S) already in use. Loop allows already defined TestId"),
- &aStartInfo.iTestId ));
- }
- else
- {
- __TRACE( KError, ( _L("StartTestL: TestId (%S) already in use"),
- &aStartInfo.iTestId ));
- return KErrAlreadyExists;
- }
- }
-
- __ASSERT_ALWAYS( aStartInfo.iModule.Length() < KMaxFileName,
- User::Leave( KErrArgument ) );
- __ASSERT_ALWAYS( aStartInfo.iIniFile.Length() < KMaxFileName,
- User::Leave( KErrArgument ) );
- __ASSERT_ALWAYS( aStartInfo.iConfig.Length() < KMaxFileName,
- User::Leave( KErrArgument ) );
- __ASSERT_ALWAYS( aStartInfo.iTestId.Length() < KMaxName,
- User::Leave( KErrArgument ) );
-
- __TRACE( KMessage, ( _L("Call GetTestModuleL") ));
-
- // Load Test Module
- CTCTestModule* module = NULL;
- if( (aStartInfo.iModule.Find( KTestScripterName ) != KErrNotFound)
- || (aStartInfo.iModule.Find( KPythonScripter ) != KErrNotFound)
- || (aStartInfo.iModule.Find( KTestCombinerName ) != KErrNotFound)
- )
- {
- // TestScripter in use. Give config file for parsing STIF Settings.
- module = GetTestModuleL( aStartInfo.iModule,
- aStartInfo.iIniFile,
- aStartInfo.iConfig );
- }
- else
- {
- module = GetTestModuleL( aStartInfo.iModule,
- aStartInfo.iIniFile,
- KNullDesC );
- }
-
- __TRACE( KMessage, ( _L("Create CTCTestCase") ));
-
- CTCTestCase* tc =
- CTCTestCase::NewL( this,
- aStartInfo.iModule,
- aStartInfo.iTestId,
- aStartInfo.iExpectedResult,
- aStartInfo.iCategory,
- aStartInfo.iTestCaseArguments,
- module ); //--PYTHON--
-
- CleanupStack::PushL( tc );
-
- //If name of testcase was given, find testcase number
- if(aStartInfo.iTitle != KNullDesC)
- {
- __TRACE(KMessage, (_L("Trying to find test case entitled \"%S\""), &aStartInfo.iTitle));
- aStartInfo.iCaseNum = -1;
- TInt ret = module->GetCaseNumByTitle(aStartInfo.iTitle, aStartInfo.iCaseNum);
- if(ret != KErrNone)
- {
- __TRACE(KError, (_L("Couldn't find test case entitled \"%S\". Error %d"), &aStartInfo.iTitle, ret));
- }
- else
- {
- __TRACE(KMessage, (_L("Found test case entitled \"%S\". Case num %d"), &aStartInfo.iTitle, aStartInfo.iCaseNum));
- }
- }
-
- __TRACE( KMessage, ( _L("Open TestExecution") ));
-
- User::LeaveIfError( tc->TestExecution().Open( module->TestServer(),
- aStartInfo.iCaseNum,
- aStartInfo.iConfig ) );
-
- __TRACE( KMessage, ( _L("Start testcase runner") ));
-
- // Enable testcase control before calling RunTestCase
- tc->StartL();
-
- __TRACE( KMessage,
- ( _L("Start: testid(%S), module(%S), ini(%S), config(%S), case(%d), expect(%d/%d), timeout(%d)"),
- &aStartInfo.iTestId, &aStartInfo.iModule, &aStartInfo.iIniFile,
- &aStartInfo.iConfig, aStartInfo.iCaseNum, aStartInfo.iExpectedResult,
- aStartInfo.iCategory, aStartInfo.iTimeout ));
-
- TestModuleIf().Printf( KPrintPriLow, _L("Start"),
- _L("testid(%S), module(%S), ini(%S), config(%S), case(%d), expect(%d)"),
- &aStartInfo.iTestId, &aStartInfo.iModule, &aStartInfo.iIniFile,
- &aStartInfo.iConfig, aStartInfo.iCaseNum, aStartInfo.iExpectedResult );
-
- if ( tc->TestCaseArguments().Length() > 0 )
- {
- tc->TestExecution().RunTestCase( tc->iResultPckg, tc->TestCaseArguments(), tc->iStatus );
- }
- else
- {
- tc->TestExecution().RunTestCase( tc->iResultPckg, tc->iStatus );
- }
-
- iRunningTests++;
-
- User::LeaveIfError( iTestCases.Append( tc ) );
- if( iLoopIsUsed )
- {
- User::LeaveIfError( iLoopAllocationArray.Append( tc ) );
- }
- CleanupStack::Pop( tc );
-
- return KErrNone;
-
-}
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: Complete
-
- Description: Handle completed test case.
-
- Parameters: CTCTestCase* aTestCase: in: Test case to complete
-
- Return Values: None.
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::Complete( CTestCase* aTestCase, TInt aError )
- {
- __TRACEFUNC();
-
- if( aError != KErrNone )
- {
- iResult = aError;
- }
-
- TInt count = iTestCases.Count();
- TInt i = 0;
- for(; i < count; i++ )
- {
- if( iTestCases[i] == aTestCase )
- {
- // Test Case completed
- __TRACE( KPrint, ( _L( "Complete: %S result: %d, execution result: %d, expected: %d"),
- &aTestCase->TestId(), aTestCase->iResult.iTestResult.iResult,
- aTestCase->iResult.iCaseExecutionResultCode, aTestCase->ExpectedResult() ));
- TestModuleIf().Printf( KPrintPriLow, _L("Complete"),
- _L( "%S results: test(%d) exe(%d) expect(%d)"),
- &aTestCase->TestId(), aTestCase->iResult.iTestResult.iResult,
- aTestCase->iResult.iCaseExecutionResultCode, aTestCase->ExpectedResult() );
- iRunningTests--;
- break;
- }
- }
- if( i == count )
- {
- __TRACE( KError, (_L("CTestCombiner::Complete: Test case not found!!")));
- }
-
- // Check if we were waiting this case to complete
- if( ( iWaitTestCase.Length() > 0 ) &&
- ( iWaitTestCase == aTestCase->TestId() ) )
- {
- // We were waiting this case to complete
- // Now we can proceed executing the testcase
- __TRACE( KMessage, (_L("TestCase was waiting, set runner active")));
- iTestRunner->SetRunnerActive();
- iWaitTestCase.Zero();
-
- //return; - return removed due to STIF-509 CancelIfError won't work when used together with complete command
-
- }
- else if( aTestCase->Type() == CTestCase::ECaseRemote )
- {
- __TRACE( KMessage, (_L("CTestCombiner::Complete: Remote case complete")));
- // Completed testcase was remote case,
- // check if slave should be freed
- CRemoteTestCase* remote = ( CRemoteTestCase* )aTestCase;
- if( remote->iFreeSlave )
- {
- CSlaveInfo* slave = GetSlave( remote->iSlaveId );
- if( slave )
- {
- // Free slave now
- TRAPD( err, iTestRunner->ExecuteFreeL( slave ) );
- // Continue if freeing fails
- if( err == KErrNone )
- {
- __TRACE( KMessage, (_L("Complete: Freeing slave")));
- return;
- }
- else
- {
- __TRACE( KError, (_L("Complete: Freeing slave failed")));
- }
- }
- else
- {
- __TRACE( KError, (_L("Complete: Slave not found")));
- }
- }
- }
-
- // If running test is 0, active scheduler is active and CTestRunner is
- // ready then stop active scheduler.(Operations continue from
- // CTestCombiner::RunTestL() after active scheduler start).
- if( ( iRunningTests == 0 ) &&
- iSchedulerActive &&
- ( iTestRunner->iState == CTestRunner::ERunnerReady ) )
- {
- // This was last running testcase, so we can stop
- // activescheduler
- __TRACE( KMessage, (_L("All TestCases completed, stop CActiveScheduler")));
- CActiveScheduler::Current()->Stop();
- iSchedulerActive = EFalse;
- }
- else
- {
- __TRACE( KMessage,
- (_L("CTestCombiner::Complete: %d test cases running"), iRunningTests ));
- __TRACE( KMessage,
- (_L("CTestCombiner::Complete: active %d"), iSchedulerActive ));
- if(iSchedulerActive)
- {
- __TRACE( KMessage,
- (_L("CTestCombiner::Complete: state %d"), iTestRunner->iState ));
- }
- }
-
- // Checking if user wants to skip the rest of the execution in case of error @js
- if(iCancelIfError && iSchedulerActive)
- {
- // Cancel event if it was waiting event
- if(iTestRunner->iEvent.Name() != KNullDesC && iTestRunner->iEvent.Type() == TEventIf::EWaitEvent)
- {
- TestModuleIf().CancelEvent(iTestRunner->iEvent, &iTestRunner->iStatus);
- }
-
- // Interpret execution result type from returned result
- TInt executionResult = TFullTestResult::ECaseExecuted; // Ok
- if( (aTestCase->iResult.iCaseExecutionResultType >=
- TFullTestResult::ECaseLeave ))
- {
- __TRACE( KMessage, (_L("The test case ended with error!")));
-
- // Some abnormal execution result type
- executionResult = iTestCases[i]->iResult.iCaseExecutionResultType;
- }
-
- // Check expected execution result type
- if( executionResult != aTestCase->ExpectedResultCategory() )
- {
- // expected and returned result types differ
- __TRACE( KMessage, (_L("The test case has wrong result category!")));
- // There was an error and we must stop test case execution
- iFailedTestCase = i;
- iRunningTests--;
- __TRACE( KMessage, (_L("Stopping the CActiveScheduler.")));
- CActiveScheduler::Current()->Stop();
- iSchedulerActive = EFalse;
- }
-
- // Check normal test result if activescheduler is still up & running
- if( iSchedulerActive )
- {
- if( aTestCase->ExpectedResultCategory() ==
- TFullTestResult:: ECaseExecuted)
- {
- // Normal completion, check result
- if( iTestCases[i]->iResult.iTestResult.iResult !=
- iTestCases[i]->ExpectedResult() )
- {
- __TRACE( KMessage, (_L("Result category is not what was expected!")));
- // There was an error and we must stop test case execution
- iFailedTestCase = i;
- iRunningTests = 0; //The whole test is stopped. Reset value of running tests.
- //This line caused that variable value to be -1. Test could not finish. //iRunningTests--;
- __TRACE( KMessage, (_L("Stopping the CActiveScheduler.")));
- CActiveScheduler::Current()->Stop();
- iSchedulerActive = EFalse;
- }
- }
- else
- {
- // Abnormal completion, i.e. panic, leave, exception or timeout
- if( aTestCase->iResult.iCaseExecutionResultCode !=
- aTestCase->ExpectedResult())
- {
- __TRACE( KMessage, (_L("The test case has abnormal completion!")));
- // There was an error and we must stop test case execution
- iFailedTestCase = i;
- iRunningTests--;
- __TRACE( KMessage, (_L("Stopping the CActiveScheduler.")));
- CActiveScheduler::Current()->Stop();
- iSchedulerActive = EFalse;
- }
- }
- }
- }
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: NotifyEvent
-
- Description: Asynchronous event command interface
-
- Check requested events and send unset to first requested
-
- Parameters: TEventIf& aEvent: in: Event command
- TRequestStatus& aStatus: in: TRequestStatus used in
- asynchronous command
-
- Return Values: ETrue: asynchronous command given
- EFalse: asyncronous command not given
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TBool CTestCombiner::UnsetEvent( TEventIf& aEvent,
- TRequestStatus& aStatus )
- {
-
- __TRACE( KMessage, ( _L("CTestCombiner::NotifyEvent")));
-
- // First check TestCombiner events
- TInt eventCount = iEventArray.Count();
- for( TInt i = 0; i < eventCount; i++ )
- {
- if( aEvent.Name() == iEventArray[i]->Name() )
- {
- __TRACE( KMessage, (
- _L( "Set unset pending for testcombiner's %S event"),
- &aEvent.Name() ));
- iEventArray[i]->SetRequestStatus( &aStatus );
- return ETrue;
- }
- }
-
- // Check all local testcases
- TInt caseCount = iTestCases.Count();
- TInt eventInd;
- CTCTestCase* testCase = NULL;
- for( TInt caseInd = 0; caseInd < caseCount; caseInd++ )
- {
- if( iTestCases[caseInd]->Type() == CTestCase::ECaseLocal )
- {
- testCase = ( CTCTestCase* )iTestCases[caseInd];
- eventCount = testCase->EventArray().Count();
-
- // Check all requested events
- for( eventInd = 0; eventInd < eventCount; eventInd++)
- {
- const TName& eventName =
- testCase->EventArray()[eventInd]->Event().Name();
- if( eventName == aEvent.Name() )
- {
- // Event request is pending, send control command
- iEvent.Copy( aEvent );
- __TRACE( KMessage, (
- _L( "Set unset pending for client's %S event"),
- &aEvent.Name() ));
- testCase->TestExecution().NotifyEvent( iEventPckg,
- aStatus );
- return ETrue;
- }
- }
- }
- }
-
- return EFalse;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: ReceiveResponse
-
- Description: Handles responce received from slave
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::ReceiveResponse( TDesC& aMsg )
- {
-
- __TRACEFUNC();
-
- TBool continueTask = ETrue;
- TRAPD( err, continueTask = iTestRunner->ReceiveResponseL( aMsg ) );
-
- // We start receiver again, even in error situation
- iRemoteReceiver->Start();
-
- if( err != KErrNone )
- {
- __TRACE( KError, ( _L("CTestCombiner::ReceiveResponse ERROR")));
- iResult = err;
- if( iTestRunner->IsActive() )
- {
- iTestRunner->Cancel();
- }
- else
- {
- iTestRunner->CancelTestCases();
- }
- return;
- }
-
- if( continueTask && !iTestRunner->IsActive() )
- {
- iTestRunner->SetRunnerActive();
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: RemoteTimeout
-
- Description: Handles timeouts.
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::RemoteTimeout()
- {
-
- __TRACEFUNC();
-
- iResult = KErrTimedOut;
- if( iTestRunner->IsActive() )
- {
- __TRACE( KError, (_L("Remote timeout, Cancel runner")));
- iTestRunner->Cancel();
- }
- else
- {
- __TRACE( KError, (_L("Remote timeout, Cancel test cases")));
- iTestRunner->CancelTestCases();
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: ExecuteMeasurementL
-
- Description: Executes measurement script line.
-
- Parameters: CStifItemParser* aItem: in: parsed line
-
- Return Values: TBool: in no error ETrue returned
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::ExecuteMeasurementL( CStifItemParser* aItem )
- {
- __TRACEFUNC();
-
- __TRACEFUNC();
- TPtrC type;
- TPtrC command;
-
- // Get command
- if( aItem->GetNextString( command ) != KErrNone )
- {
- __TRACE( KError, (
- _L( "Unknown argument for 'measurement' command" ) ) );
- User::Leave( KErrArgument ); // Error in parsing => Leave
- }
- // Get name
- if( aItem->GetNextString( type ) != KErrNone )
- {
- __TRACE( KError, (
- _L( "Unknown argument for 'measurement' type" ) ) );
- User::Leave( KErrArgument ); // Error in parsing => Leave
- }
-
- // Verify measurement type
- if( !( type == KParamMeasurement01 ||
- type == KParamMeasurement02 ||
- type == KParamMeasurement03 ||
- type == KParamMeasurement04 ||
- type == KParamMeasurement05 ||
- type == KParamMeasurementBappea ) )
-
- {
- __TRACE( KError, (
- _L( "Unknown measurement type:[%S]" ), &type ) );
- User::Leave( KErrArgument ); // Error in types => Leave
- }
-
- // Verify command
- if( command == _L( "start" ) )
- {
- // START measurement's process
- __TRACE( KMessage, ( _L( "Start 'measurement' with '%S'"), &type ) );
- StartMeasurementL( type, aItem );
- }
- else if( command == _L( "stop" ) )
- {
- // STOP measurement's process
- __TRACE( KMessage, ( _L( "'Stop 'measurement' with '%S'"), &type ) );
- StopMeasurementL( type );
- }
- else
- {
- __TRACE( KError, (
- _L( "Unknown command for 'measurement' command:[%S] or type:[%S]" ), &command, &type ) );
- User::Leave( KErrArgument ); // Error in commands => Leave
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: StartMeasurementL
-
- Description:
-
- Parameters: const TDesC& aType: in: Plugin type.
- CStifItemParser* aItem: in: Item object for parsing.
-
- Return Values: None.
-
- Errors/Exceptions: Leaves is bappea start or timed operation fails.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::StartMeasurementL( const TDesC& aType,
- CStifItemParser* aItem )
- {
- __TRACEFUNC();
-
- CSTIFTestMeasurement* testMeasurement = NULL;
-
- // Get Measurement configuration info
- TPtrC configurationInfo( KNullDesC() );
- if( aItem->Remainder( configurationInfo ) != KErrNone )
- {
- __TRACE( KInit, (
- _L( "Using default path and file name for measurement configure" ) ) );
- }
-
- if( aType == KParamMeasurement01 )
- {
- testMeasurement = CSTIFTestMeasurement::NewL(
- this,
- CSTIFTestMeasurement::KStifMeasurementPlugin01,
- configurationInfo );
- }
- else if( aType == KParamMeasurement02 )
- {
- testMeasurement = CSTIFTestMeasurement::NewL(
- this,
- CSTIFTestMeasurement::KStifMeasurementPlugin02,
- configurationInfo );
- }
- else if( aType == KParamMeasurement03 )
- {
- testMeasurement = CSTIFTestMeasurement::NewL(
- this,
- CSTIFTestMeasurement::KStifMeasurementPlugin03,
- configurationInfo );
- }
- else if( aType == KParamMeasurement04 )
- {
- testMeasurement = CSTIFTestMeasurement::NewL(
- this,
- CSTIFTestMeasurement::KStifMeasurementPlugin04,
- configurationInfo );
- }
- else if( aType == KParamMeasurement05 )
- {
- testMeasurement = CSTIFTestMeasurement::NewL(
- this,
- CSTIFTestMeasurement::KStifMeasurementPlugin05,
- configurationInfo );
- }
- else if( aType == KParamMeasurementBappea )
- {
- testMeasurement = CSTIFTestMeasurement::NewL(
- this,
- CSTIFTestMeasurement::KStifMeasurementBappeaProfiler,
- configurationInfo );
- }
- else
- {
- __TRACE( KError, ( _L( "Unknown plugin[%S] for 'measurement'" ), &aType ) );
- User::Leave( KErrArgument );
- }
-
- // Start test measurement
- TInt start_ret( KErrNone );
- start_ret = testMeasurement->Start();
- if( start_ret != KErrNone )
- {
- delete testMeasurement;
- __TRACE( KError, (
- _L( "CTestCombiner::StartMeasurementL(): Measurement Start() fails:[%d]" ), start_ret ) );
- User::Leave( start_ret );
- }
-
- TTestMeasurement* object = new (ELeave) TTestMeasurement();
- object->iName = aType;
- object->iMeasurement = testMeasurement;
-
- // Array for handling test measurement between different objects
- TInt ret = iTestMeasurementArray.Append( object );
- if( ret != KErrNone )
- {
- delete object;
- __TRACE( KError, (
- _L( "CTestCombiner::StartMeasurementL(): iTestMeasurementArray.Append fails:[%d]" ), ret ) );
- User::Leave( ret );
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: StopMeasurementL
-
- Description: Stops test measurement.
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::StopMeasurementL( const TDesC& aType )
- {
- __TRACEFUNC();
-
- TInt count = iTestMeasurementArray.Count();
- for( TInt i = 0; i < count; i++ )
- {
- if( iTestMeasurementArray[i]->iName == aType )
- {
- // Found measurement module, stop
- iTestMeasurementArray[i]->iMeasurement->Stop();
- // Delete data
- delete iTestMeasurementArray[i];
- // Remove pointer to deleted data(Append())
- iTestMeasurementArray.Remove( i );
- // iTestMeasurementArray can contain only one type of measurement
- // so we can break when type is removed.
- break;
- }
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: AppendTestResultToResultDes
-
- Description: Append to TC's result description (if possible due to length)
- limitation provided text in [] brackets.
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestCombiner::AppendTestResultToResultDes(TDes& aResultDescr, const TDesC& aTestCaseResultDescr)
- {
- if(aTestCaseResultDescr != KNullDesC)
- {
- _LIT(KAdditionalInfo, " [%S]");
- TInt len = aResultDescr.Length() + KAdditionalInfo().Length() + aTestCaseResultDescr.Length();
-
- if(len > KStifMaxResultDes)
- {
- len = KStifMaxResultDes - aResultDescr.Length() - KAdditionalInfo().Length();
- if(len > 0)
- {
- TPtrC descr = aTestCaseResultDescr.Mid(0, len);
- aResultDescr.AppendFormat(KAdditionalInfo, &descr);
- }
- }
- else
- {
- aResultDescr.AppendFormat(KAdditionalInfo, &aTestCaseResultDescr);
- }
- }
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestCombiner
-
- Method: GetIndexForNewTestModuleController
-
- Description: Returns new index for test module controller.
- This number is appended to module controller name.
- This method is used when option to run every test case in
- separate process is set to on.
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestCombiner::GetIndexForNewTestModuleController(void)
- {
- return iIndexTestModuleControllers++;
- }
-
-/*
--------------------------------------------------------------------------------
-
- DESCRIPTION
-
- This module contains the implementation of CTestRunner class
- member functions. CTestRunner is used to execute TestCombiner testcase by
- CTestCombiner.
-
--------------------------------------------------------------------------------
-*/
-// MACROS
-#ifdef LOGGER
-#undef LOGGER
-#endif
-#define LOGGER iTestCombiner->iLog
-
-// ================= MEMBER FUNCTIONS =========================================
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: CTestRunner
-
- Description: Default constructor
-
- C++ default constructor can NOT contain any code, that
- might leave.
-
- Parameters: CTestCombiner* aTestCombiner: in: Backpointer to CTestCombiner
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestRunner::CTestRunner( CTestCombiner* aTestCombiner ):
- CActive( CActive::EPriorityLow ), // Executed with lowest priority
- iState( ERunnerIdle ),
- iTestCombiner( aTestCombiner )
- {
- CActiveScheduler::Add( this );
- __TRACEFUNC();
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ConstructL
-
- Description: Symbian OS second phase constructor
-
- Symbian OS default constructor can leave.
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::ConstructL()
- {
- TInt ret;
-
- ret = iPauseTimer.CreateLocal();
- if(ret != KErrNone)
- {
- __TRACE( KError, (_L("Unable to create RTimer: iPauseTimer [%d] "), ret));
- User::Leave(ret);
- }
-
- ret = iPauseCombTimer.CreateLocal();
- if(ret != KErrNone)
- {
- __TRACE( KError, (_L("Unable to create RTimer: iPauseCombTimer [%d] "), ret));
- User::Leave(ret);
- }
-
- iRemoteTimer = CRemoteTimer::NewL( iTestCombiner );
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: NewL
-
- Description: Two-phased constructor.
-
- Parameters: CTestCombiner* aTestCombiner: in: Backpointer to CTestCombiner
-
- Return Values: CTestRunner*: new object
-
- Errors/Exceptions: Leaves if new or ConstructL leaves
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-
-CTestRunner* CTestRunner::NewL( CTestCombiner* aTestCombiner )
- {
- CTestRunner* self = new (ELeave) CTestRunner( aTestCombiner );
-
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop();
-
- return self;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ~CTestRunner
-
- Description: Destructor
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-
-CTestRunner::~CTestRunner()
- {
- __TRACEFUNC();
- Cancel();
-
- delete iRemoteTimer;
- iRemoteTimer = 0;
-
- delete iLine;
- iLine = 0;
-
- iPauseTimer.Close();
-
- iPauseCombTimer.Close();
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: RunL
-
- Description: Derived from CActive, handles testcase execution.
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::RunL()
- {
- __TRACEFUNC();
- __TRACE( KMessage, (_L("CTestRunner::RunL: [%d] "), iStatus.Int() ));
-
- User::LeaveIfError( iStatus.Int() );
-
- if( ( iTestCombiner == NULL ) ||
- ( iTestCombiner->iSectionParser == NULL ) )
- {
- User::Leave( KErrGeneral );
- }
-
- TBool continueTask = EFalse;
-
- // Check if there is still some time for combiner pause and we need to
- // continue pausing
- if(iPauseCombRemainingTime > 0)
- {
- // Maximum time for one RTimer::After request
- TInt maximumTime = KMaxTInt / 1000;
-
- __TRACE( KMessage, (_L("CTestRunner::RunL: Going to reissue PauseCombiner request ") ) );
- __TRACE( KMessage, (_L("CTestRunner::RunL: iRemainingTimeValue = %d"), iPauseCombRemainingTime ) );
-
- if( iPauseCombRemainingTime < maximumTime )
- {
- iPauseCombTimer.After(iStatus, (iPauseCombRemainingTime * 1000));
- iPauseCombRemainingTime = 0;
- }
- else
- {
- iPauseCombRemainingTime -= maximumTime;
- iPauseCombTimer.After(iStatus, (maximumTime * 1000));
- }
-
- SetActive();
- return;
- }
-
- // Handling runner states
- switch( iState )
- {
- case ERunnerWaitTimeout:
- {
- __TRACE( KMessage, (_L("Resume %S"), &iPausedTestCase));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec,
- KExecute, _L("Resume %S"), &iPausedTestCase);
- // Get running testcase identified with testid
- CTestCase* testCase = iTestCombiner->GetRunningTest( iPausedTestCase );
- if( testCase == NULL ) User::Leave( KErrNotFound );
- iPausedTestCase.Zero();
- if( testCase->Type() == CTestCase::ECaseLocal )
- {
- CTCTestCase* localTestCase = ( CTCTestCase* )testCase;
- // Resume execution
- User::LeaveIfError( localTestCase->TestExecution().Resume() );
- continueTask = ETrue;
- }
- else // ECaseRemote
- {
- CRemoteTestCase* remoteTestCase = ( CRemoteTestCase* )testCase;
- // Resume execution
- if( ExecuteRemoteTestCtlL( NULL,
- remoteTestCase,
- TTCKeywords::EResume ) )
- {
- continueTask = ETrue;
- }
- }
- }
- break;
- case ERunnerWaitUnset:
- iState = ERunnerIdle;
-
- // Check Unset event
- if( !CheckUnsetEvent() )
- {
- // Got event and unset has not completed
- // Should never come here
- User::Panic( KTestRunner, KErrGeneral );
- }
- break;
-
- case ERunnerRunning:
- {
- iState = ERunnerIdle;
-
- // Get next execution line from configuration section
- iEndLoopStartPos = iTestCombiner->iSectionParser->GetPosition();
- TPtrC line;
- if( iTestCombiner->iSectionParser->GetNextLine( line ) == KErrNone )
- {
- // Got new execution line
- __TRACE( KMessage, (_L("CTestRunner got line")));
-
- CStifItemParser* item = PreprocessLineL( line );
-
- if( item )
- {
- // Got new execution line
- CleanupStack::PushL( item );
-
- // Execute script line
- if( ExecuteLineL( item ) )
- {
- __TRACE( KMessage, (_L("RunL: continueTask")));
- // Set CTestRunner active again to perform
- // next execution line
- // from testcase section
- continueTask = ETrue;
- }
- CleanupStack::PopAndDestroy( item );
- }
- }
- else
- {
- // No more execution lines in testcase section
- __TRACE( KMessage,
- (_L("CTestRunner::RunL: Testcase script done (%d running)"),
- iTestCombiner->iRunningTests));
-
- if( ( iTestCombiner->iRunningTests == 0 ) &&
- iTestCombiner->iSchedulerActive )
- {
- __TRACE( KMessage,
- (_L("RunL: All TestCases done, stop CActiveScheduler")));
- CActiveScheduler::Current()->Stop();
- iTestCombiner->iSchedulerActive = EFalse;
- }
- // Now testcase section is executed,
- // so CTestRunner has done its job and stops
- iState = ERunnerReady;
-
- //If we're inside loop, then we have error
- if(iTestCombiner->iLoopIsUsed)
- {
- __TRACE(KError, (_L("Endloop keyword not found. Cannot finish test case properly.")));
- iTestCombiner->iResult = KErrGeneral;
- }
- }
- }
- break;
- case ERunnerAllocate:
- case ERunnerFree:
- case ERunnerRemote:
- default:
- __TRACE( KError,
- (_L("CTestRunner::RunL: Entered in illegal state(%d)"), iState ));
- User::Panic( KTestRunner, KErrGeneral );
- break;
- }
- if( continueTask )
- {
- SetRunnerActive();
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: DoCancel
-
- Description: Derived from CActive handles the Cancel
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::DoCancel()
- {
- __TRACEFUNC();
- __TRACE( KMessage, (_L("CTestRunner::DoCancel")));
- iTestCombiner->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), _L("DoCancel"));
-
- iPauseCombTimer.Cancel();
-
- switch( iState )
- {
- case ERunnerWaitTimeout:
- iPauseTimer.Cancel();
- break;
- case ERunnerWaitUnset:
- break;
- case ERunnerRunning:
- break;
- case ERunnerAllocate:
- case ERunnerFree:
- case ERunnerRemote:
- // Cancel remote test cases
- break;
- default:
- __TRACE( KError,
- (_L("CTestRunner::DoCancel: Entered in illegal state(%d)"), iState ));
- User::Panic( KTestRunner, KErrGeneral );
- break;
- }
-
- // Cancel all testcases
- CancelTestCases();
-
- iState = ERunnerCancel;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: RunError
-
- Description: Derived from CActive handles errors from active handler.
-
- Parameters: TInt aError: in: error from CActive
-
- Return Values: KErrNone: success
-
- Errors/Exceptions: None.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestRunner::RunError( TInt aError )
- {
- __TRACEFUNC();
- __TRACE( KMessage, (_L("CTestRunner::RunError %d"), aError));
-
- if ( iRunErrorMessage.Length() != 0 )
- {
- iTestCombiner->TestModuleIf().Printf( KPrintPriLow, _L("Runner"),
- _L("RunError : %S"), &iRunErrorMessage );
- iRunErrorMessage = KNullDesC;
- }
- else
- {
- iTestCombiner->TestModuleIf().Printf( KPrintPriLow, _L("Runner"),
- _L("RunError"));
- }
-
- iState = ERunnerError;
-
- // Return error from here
- iTestCombiner->iResult = aError;
-
- CancelTestCases();
- return KErrNone;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: PreprocessLineL
-
- Description: Preprocesses script line
-
- Parameters: TPtrC& line: in: script line
- CStifItemParser*& aItem: out: New CStifItemParser for script
- line.
-
- Return Values: HBufC* pointer if new memory that has been allocated
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-CStifItemParser* CTestRunner::PreprocessLineL( TDesC& line )
- {
-
- CStifItemParser* item = NULL;
- TPtrC tmp;
- TInt len = 0;
-
- // Decide how long buffer should be allocated
- if( line.Length() < KMaxName/2 )
- {
- len = KMaxName;
- }
- else
- {
- len = line.Length() + KMaxName;
- }
- delete iLine;
- iLine = 0;
- iLine = HBufC::NewL( len );
- TPtr parsedLine( iLine->Des() );
- len = 0;
-
- item = CStifItemParser::NewL( line, 0, line.Length() );
- CleanupStack::PushL( item);
-
- TInt ret = item->GetString( _L(""), tmp );
- while( ret == KErrNone )
- {
- len += CheckDefined( tmp );
- if( ( parsedLine.Length() + tmp.Length() + 1 ) > parsedLine.MaxLength() )
- {
- // Allocate bigger buffer
- HBufC* tmpBuf = HBufC::NewL( parsedLine.MaxLength() + KMaxName );
- CleanupStack::PushL( tmpBuf );
- TPtrC ptr( iLine->Des() );
- parsedLine.Set( tmpBuf->Des() );
- parsedLine.Copy( ptr );
- delete iLine;
- iLine = tmpBuf;
- CleanupStack::Pop( tmpBuf );
- }
- parsedLine.Append( tmp );
- parsedLine.Append( _L(" ") );
- ret = item->GetNextString( tmp );
- }
-
- CleanupStack::PopAndDestroy( item );
-
- item = CStifItemParser::NewL( parsedLine, 0, parsedLine.Length() );
-
- return item;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: CheckDefined
-
- Description: Check if aWord is some defined word
-
- Parameters: TPtrC& aWord: inout: Parsed word, defined or original returned
-
- Return Values: TInt: Length difference between new and old word
-
- Errors/Exceptions: None.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestRunner::CheckDefined( TPtrC& aWord )
- {
- TInt len = 0;
-
- // KLoopCounter word changing to current loop count value.
- if( aWord == KLoopCounter )
- {
- iLoopCounterDes.Zero();
- iLoopCounterDes.AppendNum( iLoopCounter );
- len = iLoopCounterDes.Length() - aWord.Length();
- aWord.Set( iLoopCounterDes );
- return len;
- }
-
- TInt count = iTestCombiner->iDefined.Count();
- for( TInt i = 0; i < count; i++ )
- {
- if( iTestCombiner->iDefined[i]->Name() == aWord )
- {
- len = iTestCombiner->iDefined[i]->Value().Length() - aWord.Length();
- aWord.Set( iTestCombiner->iDefined[i]->Value() );
- break;
- }
- }
- return len;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteLineL
-
- Description: Executes script line
-
- Parameters: CStifItemParser* aItem: in: script line
- TTCKeywords::TKeywords aKeyword: in: keyword index
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteLineL( CStifItemParser* aItem )
- {
- _LIT( KErrMsgUnknownKeyword, "Unknown or illegal keyword %S" );
- _LIT( KErrMsgMeasurementInvalidArgument, "Measurement : Invalid argument" );
- TBool continueTask = ETrue;
- TPtrC tmp;
-
- TPtrC keywordItem;
- // Get first word from line, i.e. keyword
- User::LeaveIfError( aItem->GetString( _L(""), keywordItem ) );
- // Parse keyword
- TInt keyword = TTCKeywords::Parse( keywordItem, TTCKeywords::Keyword );
-
- switch( keyword )
- {
- // Test case execution control cases
- case TTCKeywords::EPauseCombiner:
- continueTask = ExecuteCombinerPauseL( aItem );
- break;
- case TTCKeywords::ERun:
- continueTask = ExecuteRunL( aItem );
- break;
- case TTCKeywords::EPause:
- case TTCKeywords::EComplete:
- case TTCKeywords::ECancel:
- case TTCKeywords::EResume:
- continueTask = ExecuteTestCtlL( aItem, (TTCKeywords::TKeywords)keyword );
- break;
-
- // Event control cases
- case TTCKeywords::ESet:
- continueTask = ExecuteEventSetL( aItem );
- break;
- case TTCKeywords::EUnset:
- continueTask = ExecuteEventUnsetL( aItem );
- break;
- case TTCKeywords::ERequest:
- case TTCKeywords::EWait:
- case TTCKeywords::ERelease:
- continueTask = ExecuteEventCtlL( aItem, (TTCKeywords::TKeywords)keyword );
- break;
- case TTCKeywords::EPrint:
- {
- TName buf;
- while( aItem->GetNextString( tmp ) == KErrNone )
- {
- if( buf.Length() + tmp.Length() >= buf.MaxLength() )
- {
- break;
- }
- buf.Append( tmp );
- buf.Append( _L(" ") );
- }
-
- __TRACE( KMessage, (_L("Test: %S"), &buf ));
- iTestCombiner->TestModuleIf().Printf( KPrintPriHigh,
- _L("Test"),
- _L("%S"), &buf);
- }
- break;
- case TTCKeywords::EAllocate:
- continueTask = ExecuteAllocateL( aItem );
- break;
- case TTCKeywords::EFree:
- continueTask = ExecuteFreeL( aItem );
- break;
- case TTCKeywords::ERemote:
- continueTask = ExecuteRemoteL( aItem );
- break;
- case TTCKeywords::ETimeout:
- case TTCKeywords::EPriority:
- // not used here
- break;
- case TTCKeywords::ECancelIfError:
- // @js
- iTestCombiner->iCancelIfError = ETrue;
- break;
- case TTCKeywords::EMeasurement:
- TRAPD( retErr, iTestCombiner->ExecuteMeasurementL( aItem ) );
- if ( retErr == KErrArgument )
- {
- iRunErrorMessage = KErrMsgMeasurementInvalidArgument;
- }
- if ( retErr != KErrNone )
- {
- User::Leave( retErr );
- }
- break;
- case TTCKeywords::ELoop:
- ExecuteLoopL( aItem );
- iTestCombiner->iLoopIsUsed = ETrue;
- break;
- case TTCKeywords::EEndLoop:
- continueTask = ExecuteEndLoopL();
- break;
- case TTCKeywords::ETitle:
- // title has been handled already, this is duplicate
- default:
- {
- __TRACE( KError, (_L("Unknown or illegal keyword") ) );
- // Unknown or illegal keyword
- iRunErrorMessage.Format( KErrMsgUnknownKeyword, &keywordItem );
- User::Leave( KErrGeneral );
- }
- break;
- }
-
- __TRACE( KMessage, (_L("RunL: TestCase line executed")));
-
- return continueTask;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteRunL
-
- Description: Executes run line
-
- Parameters: CStifItemParser* aItem: in: script line
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteRunL( CStifItemParser* aItem )
- {
- _LIT( KErrMsgCaseRunError, "Run : %S[case=%d] run error" );
- __TRACE( KMessage, (_L("Run")));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec, KExecute, _L("Run"));
-
- CStartInfo* startInfo = CStartInfo::NewL();
- CleanupStack::PushL( startInfo );
-
- ParseRunParamsL( aItem, *startInfo );
-
- // Start new case with configurations parsed above
-
- iRunErrorMessage.Format( KErrMsgCaseRunError, &startInfo->iModule, startInfo->iCaseNum );
- User::LeaveIfError(
- iTestCombiner->StartTestL( *startInfo ) );
- iRunErrorMessage = KNullDesC;
-
- CleanupStack::PopAndDestroy( startInfo );
-
- return ETrue;
-
-}
-
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ParseRunParamsL
-
- Description: Parses run parameters
-
- Parameters: CStifItemParser* aItem: in: script line
- CStartInfo& aStartInfo: out: Parsed information
-
- Return Values: None
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::ParseRunParamsL( CStifItemParser* aItem,
- CStartInfo& aStartInfo )
- {
- _LIT( KErrMsgRunTestmoduleNameNotDefined, "Run : Testmodule name is not defined " );
- _LIT( KErrMsgRunCfgFileNotDefined, "Run : Testmodule configuration file is not defined" );
- _LIT( KErrMsgRunTestcaseNumberNotDefined, "Run : Testcase number is not defined or has invalid value" );
- _LIT( KErrMsgRunCfgFileNameToLong, "Run : TestScripter test case file(config)'s name is too long. Current length[%d], allowed max length[%d]. Cannot continue" );
- _LIT( KErrMsgRunInvalidExpectValue, "Run : Invalid expected result value" );
- _LIT( KErrMsgRunUnknownOrIllegalCategory, "Run : Unknown or illegal result category" );
- _LIT( KErrMsgRunInvalidTimeoutValue, "Run: Invalid testcase timeout value" );
- _LIT( KErrMsgRunUnknowOrIllegalKeyword, "Run: Unknown or illegal keyword %S" );
-
- TPtrC tmp;
- TInt ret = KErrNone;
-
- // Get mandatory run arguments
- // Testmodule name
- ret = aItem->GetNextString( tmp );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgRunTestmoduleNameNotDefined;
- User::Leave( ret );
- }
-
- aStartInfo.SetModuleNameL( tmp );
- __TRACE( KMessage, (_L("module: %S"), &aStartInfo.iModule ));
-
- // Configuration file
- ret = aItem->GetNextString( tmp );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgRunCfgFileNotDefined;
- User::Leave( ret );
- }
-
- TFileName cfgFileName( tmp );
- TStifUtil::CorrectFilePathL( cfgFileName );
- aStartInfo.SetConfigL( cfgFileName );
-
- __TRACE( KMessage, (_L("config: %S"), &aStartInfo.iConfig ));
-
- // Check is TestScripter
- if( aStartInfo.iModule.Find( KTestScripterName ) != KErrNotFound )
- {
- // TestScripter name is format: 'testscripter_testcasefilename'
-
- TParse parse;
- parse.Set( aStartInfo.iConfig, NULL, NULL );
-
- // Maximum length of TestScripter's name(Max limitation from
- // CTestModuleController creation)
- TInt maximumLength = KMaxName - ( KTestScripterNameLength + 1 );
-
- TFileName testScripterAndTestCaseFile; // InitL() takes TFileName
- testScripterAndTestCaseFile.Copy( KTestScripterName );
- testScripterAndTestCaseFile.Append( _L( "_" ) );
- if( parse.Name().Length() < maximumLength )
- {
- testScripterAndTestCaseFile.Append( parse.Name() );
- }
- else
- {
- __TRACE( KInit, ( CStifLogger::ERed,
- _L( "TestScripter test case file(config)'s name is too long. Current length[%d], allowed max length[%d]. Cannot continue" ),
- parse.Name().Length(), maximumLength ) );
- iRunErrorMessage.Format( KErrMsgRunCfgFileNameToLong, parse.Name().Length(), maximumLength );
- User::Leave( KErrArgument );
- }
-// ----
- aStartInfo.DeleteModuleName(); // Delete old name buffer for new one
- aStartInfo.SetModuleNameL( testScripterAndTestCaseFile );
- }
-
- // Testcase number
- ret = aItem->GetInt( tmp, aStartInfo.iCaseNum );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgRunTestcaseNumberNotDefined;
- User::Leave( ret );
- }
-
- __TRACE( KMessage, (_L("testcasenum: %d"), aStartInfo.iCaseNum ) );
-
- // Set mode of item parser to be able to read titles with spaces inside
- aItem->SetParsingType(CStifItemParser::EQuoteStyleParsing);
-
- // Get optional run arguments
- while( aItem->GetNextString( tmp ) == KErrNone )
- {
- TPtrC val;
- TPtrC arg;
- ParseOptArgL( tmp, arg, val );
- CheckDefined( val );
-
- // Parse optional argument
- switch( TTCKeywords::Parse( arg, TTCKeywords::RunOptArg ) )
- {
- case TTCKeywords::EExpect:
- {
- TLex ptr( val );
- ret = ptr.Val( aStartInfo.iExpectedResult );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgRunInvalidExpectValue;
- User::Leave( ret );
- }
- __TRACE( KMessage, (_L("expect=%d"), aStartInfo.iExpectedResult));
- }
- break;
- case TTCKeywords::ETestid:
- {
- aStartInfo.SetTestIdL( val );
- __TRACE( KMessage, (_L("TestId=%S"), &val));
- }
- break;
- case TTCKeywords::EIni:
- {
- __TRACE( KMessage, (_L("ini=%S"), &val));
- TFileName iniFileName( val );
- TStifUtil::CorrectFilePathL( iniFileName );
- aStartInfo.SetIniFileL( iniFileName );
- }
- break;
- case TTCKeywords::ECategory:
- {
- __TRACE( KMessage, (_L("category=%S"), &val));
- aStartInfo.iCategory = TTCKeywords::GetResultCategory( val );
- if( aStartInfo.iCategory == TFullTestResult::ECaseOngoing )
- {
- __TRACE( KError, (_L("Unknown or illegal result category")));
- //Unknown or illegal category
- iRunErrorMessage = KErrMsgRunUnknownOrIllegalCategory;
- User::Leave( KErrGeneral );
- }
- }
- break;
- case TTCKeywords::ECaseTimeout:
- {
- TLex ptr( val );
- ret = ptr.Val( aStartInfo.iTimeout );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgRunInvalidTimeoutValue;
- User::Leave( ret );
- }
- __TRACE( KMessage, (_L("timeout=%d"), aStartInfo.iTimeout ) );
- }
- break;
- case TTCKeywords::ECaseTitle:
- {
- __TRACE( KMessage, (_L("case title=%S"), &val));
- aStartInfo.SetTitleL(val);
- break;
- }
- case TTCKeywords::EArgs:
- {
- __TRACE( KMessage, (_L("case arguments=%S"), &val));
- aStartInfo.SetTestCaseArgumentsL( val );
- }
- break;
- default:
- {
- __TRACE( KError, (_L("Unknown or illegal keyword")));
- //Unknown or illegal keyword
- iRunErrorMessage.Format( KErrMsgRunUnknowOrIllegalKeyword, &arg );
- User::Leave( KErrGeneral );
- }
- }
- }
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteTestCtlL
-
- Description: Executes script line
-
- Parameters: CStifItemParser* aItem: in: script line
- TTCKeywords::TKeywords aKeyword: in: keyword index
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteTestCtlL( CStifItemParser* aItem,
- TTCKeywords::TKeywords aKeyword )
- {
- _LIT( KErrMsgTestIdNotDefined, "%S : testid is not defined" );
- _LIT( KErrMsgTestCaseNotFound, "%S : Test case %S not found" );
- TBool continueTask = ETrue;
- TPtrC tmp;
-
- TInt ret = KErrNone;
-
- TPtrC keywordStr = TTCKeywords::Keyword( aKeyword );
-
- // Parse testid
- ret = aItem->GetNextString( tmp );
- if( ret != KErrNone )
- {
- iRunErrorMessage.Format( KErrMsgTestIdNotDefined, &keywordStr );
- User::Leave( ret );
- }
-
- // Get testcase identified with testid
- CTestCase* testCase = iTestCombiner->GetTest( tmp );
- if( testCase == NULL )
- {
- __TRACE( KError, (_L("ExecuteTestCtlL: Test case %S not found"),
- &tmp));
- iRunErrorMessage.Format( KErrMsgTestCaseNotFound, &keywordStr, &tmp );
- User::Leave( KErrNotFound );
- }
-
- switch( aKeyword )
- {
- // Test case execution control cases
- case TTCKeywords::EPause:
- continueTask = ExecutePauseL( aItem, testCase );
- break;
- case TTCKeywords::EComplete:
- continueTask = ExecuteCompleteL( aItem, testCase );
- break;
- case TTCKeywords::ECancel:
- __TRACE( KMessage, (_L("Cancel %S"), &tmp));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec,
- KExecute, _L("Cancel %S"), &tmp);
- if( testCase->Type() == CTestCase::ECaseRemote )
- {
- continueTask =
- ExecuteRemoteTestCtlL( aItem, testCase, aKeyword );
- }
- else
- {
- if( testCase->State() != CTestCase::ETestCaseRunning )
- {
- __TRACE( KMessage, (_L("Cancelled task (%S) not running (%i)"),
- &tmp, testCase->State() ));
- User::Leave( KErrNotFound );
- }
- CTCTestCase* test = ( CTCTestCase* )testCase;
- // Cancel local testcase
- test->TestExecution().CancelAsyncRequest( ETestExecutionRunTestCase );
- }
- break;
- case TTCKeywords::EResume:
- {
- __TRACE( KMessage, (_L("Resume %S"), &tmp));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec,
- KExecute, _L("Resume %S"), &tmp);
- if( testCase->Type() == CTestCase::ECaseRemote )
- {
- continueTask =
- ExecuteRemoteTestCtlL( aItem, testCase, aKeyword );
- }
- else
- {
- if( testCase->State() != CTestCase::ETestCaseRunning )
- {
- __TRACE( KMessage, (_L("Resumed task (%S) not running (%i)"),
- &tmp, testCase->State() ));
- User::Leave( KErrNotFound );
- }
- CTCTestCase* test = ( CTCTestCase* )testCase;
- // Resume execution
- User::LeaveIfError( test->TestExecution().Resume() );
- }
- }
- break;
-
- default:
- // Should never come here
- User::Leave( KErrGeneral );
- break;
- }
-
- return continueTask;
-
- }
-
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteCombinerPauseL
-
- Description: Executes causes pause in TestCombiner
-
- Parameters: CStifItemParser* aItem: in: script line
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteCombinerPauseL( CStifItemParser* aItem )
-{
- _LIT( KErrMsgPauseTimeoutNotDefined, "PauseCombiner : No timeout value given or value has invalid format" );
- _LIT( KErrMsgPauseTimeoutNotPositive, "PauseCombiner : Timeout value can't be <0" );
-
- TBool continueTask = EFalse;
- TInt pauseTime;
- TInt ret = KErrNone;
-
- // Parse testid
- ret = aItem->GetNextInt( pauseTime );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgPauseTimeoutNotDefined;
- User::Leave( ret );
- }
-
- if( pauseTime < 0 )
- {
- __TRACE( KError, (_L("CTestRunner::ExecuteCombinerPauseL: Given pause value < 0")));
- iRunErrorMessage = KErrMsgPauseTimeoutNotPositive;
- User::Leave( KErrArgument );
- }
-
-
- // Maximum time for one RTimer::After request
- TInt maximumTime = KMaxTInt / 1000;
-
- // Check if pause value is suitable for RTimer::After
- if(pauseTime < maximumTime)
- {
- iPauseCombTimer.After(iStatus, pauseTime * 1000);
- iPauseCombRemainingTime = 0;
- }
- else
- {
- // Given pause value after multiplication with 1000 is
- // larger than KMaxTInt, so we need to split it and
- // re-request After with remaining value from RunL
-
- iPauseCombRemainingTime = pauseTime - maximumTime;
- iPauseCombTimer.After(iStatus, maximumTime * 1000);
- }
-
- SetActive();
-
- __TRACE(KMessage, (_L("Executing pause, time=[%d]"), pauseTime));
-
- iState = ERunnerRunning;
-
- return continueTask;
-}
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecutePauseL
-
- Description: Executes pause line
-
- Parameters: CStifItemParser* aItem: in: script line
- CTestCase* aTestcase: in: test case
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecutePauseL( CStifItemParser* aItem,
- CTestCase* aTestcase )
- {
- _LIT( KErrMsgPauseUnknownKeyword, "Pause : Unknown or illegal keyword %S" );
- _LIT( KErrMsgPauseTimeInvalidValue, "Pause : Pause time is not defined or has invalid value" );
- _LIT( KErrMsgPauseTimeNotPositive, "Pause : Pause time can't be <0" );
- TBool continueTask = ETrue;
-
- // Get optional pause arguments
- TPtrC tmp;
- iPauseTime = 0;
- while( aItem->GetNextString( tmp ) == KErrNone )
- {
- TPtrC val;
- TPtrC arg;
- ParseOptArgL( tmp, arg, val );
- CheckDefined( val );
-
- // Parse optional argument
- switch( TTCKeywords::Parse( arg, TTCKeywords::PauseOptArg ) )
- {
- case TTCKeywords::ETime:
- {
- TLex ptr( val );
- TInt ret = KErrNone;
- ret = ptr.Val( iPauseTime );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgPauseTimeInvalidValue;
- User::Leave( ret );
- }
- if ( iPauseTime < 0 )
- {
- iRunErrorMessage = KErrMsgPauseTimeNotPositive;
- User::Leave( KErrArgument );
- }
- __TRACE( KMessage, (_L("time=%d"), iPauseTime ));
- }
- break;
- default:
- __TRACE( KError, (_L("Unknown or illegal keyword")));
- //Unknown or illegal keyword
- iRunErrorMessage.Format( KErrMsgPauseUnknownKeyword, &arg );
- User::Leave( KErrGeneral );
- }
- }
-
- // Store paused testcase id if timeout was given as pause argument
- if( iPauseTime != 0 )
- {
- iPausedTestCase.Copy( aTestcase->TestId() );
- }
-
- if( aTestcase->Type() == CTestCase::ECaseRemote )
- {
- return ExecuteRemoteTestCtlL( aItem, aTestcase, TTCKeywords::EPause );
- }
- if( aTestcase->State() != CTestCase::ETestCaseRunning )
- {
- __TRACE( KMessage, (_L("Paused task (%S) not running (%i)"),
- &aTestcase->TestId(), aTestcase->State() ));
- User::Leave( KErrNotFound );
- }
- CTCTestCase* test = ( CTCTestCase* )aTestcase;
-
- // Pause execution
- User::LeaveIfError( test->TestExecution().Pause() );
-
- // Resume paused case if timeout was given
- if( iPauseTime != 0 )
- {
- continueTask = EFalse;
- iState = ERunnerWaitTimeout;
- iPauseTimer.After( iStatus, iPauseTime*1000 );
- SetActive();
- }
-
- return continueTask;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteCompleteL
-
- Description: Executes complete line
-
- Parameters: CStifItemParser* aItem: in: script line
- CTestCase* aTestcase: in: test case
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteCompleteL( CStifItemParser* /* aItem */,
- CTestCase* aTestcase )
- {
- TBool ret = ETrue;
-
- if( aTestcase->State() == CTestCase::ETestCaseCompleted )
- {
- // Requested testcase is completed already,
- // proceed testcase execution
- __TRACE( KMessage, (_L("Already completed")));
- }
- else if( aTestcase->State() == CTCTestCase::ETestCaseRunning )
- {
- // Wait testcase to complete
- iTestCombiner->iWaitTestCase.Copy( aTestcase->TestId() );
- // Stop testcase execution until testcase completed
- ret = EFalse;
- iState = ERunnerWaitTestCase;
- }
- else
- {
- // This should newer happen
- User::Leave( KErrGeneral );
- }
-
- return ret;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteEventSetL
-
- Description: Executes event set line
-
- Parameters: CStifItemParser* aItem: in: script line
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteEventSetL( CStifItemParser* aItem )
- {
- _LIT( KErrMsgSetEventNameNotDefined, "Set : event name is not defined" );
- _LIT( KErrMsgSetUnknownOrIllegalKeyword, "Set :Unknown or illegal keyword %S" );
- _LIT( KErrMsgSetStateInvalidValue, "Set : State value is not defined or has invalid format" );
- TPtrC tmp;
- TPtrC eventName;
- TInt ret = KErrNone;
-
- // Get event name
- ret = aItem->GetNextString( eventName );
- if( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgSetEventNameNotDefined;
- User::Leave( ret );
- }
- __TRACE( KMessage, (_L("Set %S"), &eventName));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec, KExecute,
- _L("Set %S"), &eventName);
- iEvent.SetName( eventName );
- iEvent.SetType( TEventIf::ESetEvent );
-
- // Get optional set arguments
- while( aItem->GetNextString( tmp ) == KErrNone )
- {
- TPtrC val;
- TPtrC arg;
- ParseOptArgL( tmp, arg, val );
- CheckDefined( val );
-
- // Parse optional set argument
- switch( TTCKeywords::Parse( arg, TTCKeywords::EventOptArg ) )
- {
- case TTCKeywords::EState:
- {
- TLex ptr( val );
- TInt tmpVal = 0;
- ret = ptr.Val( tmpVal );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgSetStateInvalidValue;
- User::Leave( ret );
- }
-
- // Only value 1 has special meaning, others are ignored
- if( tmpVal == 1 )
- {
- __TRACE( KMessage, (_L("State event")));
- iEvent.SetEventType( TEventIf::EState );
- }
- }
- break;
- default:
- __TRACE( KError, (_L("Unknown or illegal keyword")));
- //Unknown or illegal keyword
- iRunErrorMessage.Format( KErrMsgSetUnknownOrIllegalKeyword, &arg );
- User::Leave( KErrGeneral );
- }
- }
-
- // Set event
- iTestCombiner->TestModuleIf().Event( iEvent, iStatus );
- iState = ERunnerRunning;
- SetActive();
-
- return EFalse;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteEventUnsetL
-
- Description: Executes event unset line
-
- Parameters: CStifItemParser* aItem: in: script line
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteEventUnsetL( CStifItemParser* aItem )
- {
- _LIT( KErrMsgUnsetEventNameNotDefined, "Unset : Event name is not defined" );
- TPtrC eventName;
- TInt ret = KErrNone;
- // Get event name
- ret = aItem->GetNextString( eventName );
- if ( ret != KErrNone )
- {
- iRunErrorMessage = KErrMsgUnsetEventNameNotDefined;
- User::Leave( ret );
- }
-
- __TRACE( KMessage, (_L("Unset %S"), &eventName));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec, KExecute,
- _L("Unset %S"), &eventName);
- iEvent.Set( TEventIf::EUnsetEvent, eventName, TEventIf::EState );
-
- // Check if trying to unset an event that is requested
- // by testcombiner (otherwise testcombiner would deadlock)
- TInt count = iTestCombiner->iEventArray.Count();
- TInt ind = 0;
- for(; ind < count; ind++ )
- {
- if( eventName == iTestCombiner->iEventArray[ind]->Name() )
- {
- User::Leave( KErrInUse );
- }
- }
-
- // Check if some testmodule below
- // has event request pending
- if( iTestCombiner->UnsetEvent( iEvent,
- iStatus ) == EFalse )
- {
- // If they haven't requested event,
- // then check others above
- iTestCombiner->TestModuleIf().Event( iEvent, iStatus );
- iState = ERunnerRunning;
- SetActive();
-
- }
- else
- {
- // Some testmodule below has requested the event
- // Wait unset to complete
- SetActive();
- __TRACE( KPrint, ( _L("Unset: Start" ) ) );
- iState = ERunnerWaitUnset;
- // Stop execution until unset has completed
- }
- return EFalse;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteLineL
-
- Description: Executes script line
-
- Parameters: CStifItemParser* aItem: in: script line
- TTCKeywords::TKeywords aKeyword: in: keyword index
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteEventCtlL( CStifItemParser* aItem,
- TTCKeywords::TKeywords aKeyword )
- {
- _LIT( KErrMsgEventNameNotDefined, "%S : Event name is not defined" );
- _LIT( KErrMsgEequestEventAlreadyExist, "Request : Requested event %S already exists" );
- _LIT( KErrMsgWaitEventNotRequested, "Wait :Waited event %S is not requested" );
- _LIT( KErrMsgReleaseEventNotRequested, "Release : Released event %S is not requested" );
-
- TBool continueTask = ETrue;
- TPtrC eventName;
- TInt ret = KErrNone;
- TPtrC keywordStr = TTCKeywords::Keyword( aKeyword );
- // Get event name
- ret = aItem->GetNextString( eventName );
- if ( ret != KErrNone )
- {
- iRunErrorMessage.Format( KErrMsgEventNameNotDefined, &keywordStr );
- User::Leave( ret );
- }
-
- TInt count = iTestCombiner->iEventArray.Count();
- TInt ind = 0;
- for(; ind < count; ind++ )
- {
- if( eventName == iTestCombiner->iEventArray[ind]->Name() )
- {
- break;
- }
- }
-
- switch( aKeyword )
- {
- case TTCKeywords::ERequest:
- {
- __TRACE( KMessage, (_L("Request %S"), &eventName));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec,
- KExecute, _L("Request %S"), &eventName);
-
- // Check that event is not already requested
- if( ind < count )
- {
- __TRACE( KError, (_L("Requested event %S already exists"),
- &eventName));
- iRunErrorMessage.Format( KErrMsgEequestEventAlreadyExist, &eventName );
- User::Leave( KErrAlreadyExists );
- }
-
- // Add event to event array
- iEvent.SetName( eventName );
- iEvent.SetType( TEventIf::EReqEvent );
- TEventTc* event = new (ELeave) TEventTc( iTestCombiner->iLog );
- CleanupStack::PushL( event );
- event->Copy( iEvent );
- User::LeaveIfError( iTestCombiner->iEventArray.Append( event ));
- if( iTestCombiner->iLoopIsUsed )
- {
- User::LeaveIfError( iTestCombiner->iLoopAllocationArray.Append( event ) );
- }
- CleanupStack::Pop( event );
-
- // Request event
- iTestCombiner->TestModuleIf().Event( iEvent, iStatus );
- iState = ERunnerRunning;
- SetActive();
- continueTask = EFalse;
- }
- break;
- case TTCKeywords::EWait:
- {
- __TRACE( KMessage, (_L("Wait %S"), &eventName));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec, KExecute,
- _L("Wait %S"), &eventName);
-
- // Check that event is requested
- if( ind == count )
- {
- __TRACE( KError, (_L("Waited event %S is not requested"),
- &eventName));
- iRunErrorMessage.Format( KErrMsgWaitEventNotRequested, &eventName );
- User::Leave( KErrNotFound );
- }
- iEvent.SetName( eventName );
- iEvent.SetType( TEventIf::EWaitEvent );
- // Wait event
- iTestCombiner->TestModuleIf().Event( iEvent, iStatus );
- iState = ERunnerRunning;
- SetActive();
- continueTask = EFalse;
- }
- break;
- case TTCKeywords::ERelease:
- {
- __TRACE( KMessage, (_L("Release %S"), &eventName));
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec, KExecute,
- _L("Release %S"), &eventName);
- // Check that event is requested
- if( ind == count )
- {
- __TRACE( KError, (_L("Released event %S is not requested"),
- &eventName));
- iRunErrorMessage.Format( KErrMsgReleaseEventNotRequested, &eventName );
- User::Leave( KErrNotFound );
- }
- // Remove event from array
- TEventTc* event = iTestCombiner->iEventArray[ind];
- iTestCombiner->iEventArray.Remove( ind );
- delete event;
- iEvent.SetName( eventName );
- iEvent.SetType( TEventIf::ERelEvent );
-
- // Release event
- iTestCombiner->TestModuleIf().Event( iEvent, iStatus );
- iState = ERunnerRunning;
- SetActive();
- continueTask = EFalse;
- }
- break;
- default:
- {
- __TRACE( KError, (_L("Illegal keyword") ) );
-
- // Unknown or illegal keyword
- User::Leave( KErrGeneral );
- }
- break;
-
- }
- return continueTask;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteAllocateL
-
- Description: Executes allocate line
-
- Parameters: CStifItemParser* aItem: in: script line
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteAllocateL( CStifItemParser* aItem )
- {
- _LIT( KErrMsgAllocateSlaveTypeNotDefined, "Allocate : Slave type was not given for allocate" );
- _LIT( KErrMsgAllocateSlaveNameNotDefined, "Allocate : Slave name is not defined" );
- _LIT( KErrMsgAllocateSlaveAlreadyAllocated, "Allocate : Slave with name %S already allocated" );
- __TRACE( KMessage, (_L("Allocate")));
-
- TPtrC type;
- TPtrC name;
- // Get slave type
- TInt ret = aItem->GetNextString( type );
- if( ret != KErrNone )
- {
- __TRACE( KError, (_L("Slave type was not given for allocate")));
- iRunErrorMessage = KErrMsgAllocateSlaveTypeNotDefined;
- User::Leave( KErrArgument );
- }
-
- // Get slave name
- ret = aItem->GetNextString( name );
- if( ret != KErrNone )
- {
- __TRACE( KError, (_L("Slave name was not given for allocate")));
- iRunErrorMessage = KErrMsgAllocateSlaveNameNotDefined;
- User::Leave( KErrArgument );
- }
-
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec, KExecute,
- _L("Allocate %S"), &name );
-
- __TRACE( KMessage, (_L("Allocate %S [name: %S]"), &type, &name));
-
- if( iTestCombiner->GetSlave( name ) )
- {
- __TRACE( KError, (_L("Slave with name %S already allocated"),
- &name ) );
- iRunErrorMessage.Format( KErrMsgAllocateSlaveAlreadyAllocated, &name );
- User::Leave( KErrAlreadyExists );
- }
-
- CSlaveInfo* slave = CSlaveInfo::NewL( name, KRemoteProtocolMasterId );
- CleanupStack::PushL( slave );
- User::LeaveIfError( iTestCombiner->iSlaveArray.Append( slave ) );
- if( iTestCombiner->iLoopIsUsed )
- {
- User::LeaveIfError( iTestCombiner->iLoopAllocationArray.Append( slave ) );
- }
- CleanupStack::Pop( slave );
-
- CStifTFwIfProt* req = CStifTFwIfProt::NewL();
- CleanupStack::PushL( req );
- req->CreateL();
-
- // Reserve message
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgReserve ) );
- // Srcid. i.e. master id
- User::LeaveIfError(
- req->AppendId( slave->iMasterId ) );
- // DstId, broacast id
- User::LeaveIfError(
- req->AppendId( slave->iSlaveDevId ) );
- // Slave type
- User::LeaveIfError( req->Append( type ) );
-
- User::LeaveIfError(
- iTestCombiner->TestModuleIf().RemoteSend( req->Message() ) );
-
- iState = ERunnerAllocate;
- slave->iState = CSlaveInfo::ESlaveReserveSent;
-
- // Start timer
- iRemoteTimer->SetTimerActive( iTestCombiner->iRemoteTimeout );
-
- CleanupStack::PopAndDestroy( req );
-
- return EFalse;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteFreeL
-
- Description: Executes free line
-
- Parameters: CStifItemParser* aItem: in: script line
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteFreeL( CStifItemParser* aItem )
- {
- _LIT( KErrMsgFreeSlaveNameNotDefined, "Free : Slave name is not defined" );
- _LIT( KErrMsgFreeSlaveNotFound, "Free : Slave %S not found" );
- _LIT( KErrMsgFreeSlaveReserved, "Free : Slave %S in illegal state %d, cannot be released" );
- __TRACE( KMessage, (_L("Free")));
-
- TPtrC name;
- // Get slave name
- TInt ret = aItem->GetNextString( name );
- if( ret != KErrNone )
- {
- __TRACE( KError, (_L("Slave name was not given for free")));
- iRunErrorMessage = KErrMsgFreeSlaveNameNotDefined;
- User::Leave( KErrArgument );
- }
-
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec, KExecute,
- _L("Free %S"), &name );
-
- __TRACE( KMessage, (_L("Free %S"), &name ) );
-
- CSlaveInfo* slave = iTestCombiner->GetSlave( name );
- if( slave == NULL )
- {
- __TRACE( KError, (_L("Slave %S not found"), &name ));
- iRunErrorMessage.Format( KErrMsgFreeSlaveNotFound, &name );
- User::Leave( KErrNotFound );
- }
- if( slave->iState != CSlaveInfo::ESlaveReserved )
- {
- __TRACE( KError, (_L("Slave %S in illegal state %d, cannot be released"),
- &name, slave->iState ));
- iRunErrorMessage.Format( KErrMsgFreeSlaveReserved, &name, slave->iState );
- User::Leave( KErrGeneral );
- }
-
- ExecuteFreeL( slave );
-
- return EFalse;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteFreeL
-
- Description: Executes free line
-
- Parameters: CSlaveInfo* aSlave: in: slave info
-
- Return Values: None
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::ExecuteFreeL( CSlaveInfo* aSlave )
- {
-
- CRemoteTestCase* testCase =
- iTestCombiner->GetRemoteRunningTestOnSlave( aSlave->iSlaveDevId );
-
- if( testCase )
- {
- __TRACE( KMessage,
- (_L("Postpone free until testcases completed")));
- // Test cases still running on slave,
- // Free slave after test case has completed
- testCase->iFreeSlave = ETrue;
- return;
- }
-
- CStifTFwIfProt* req = CStifTFwIfProt::NewL();
- CleanupStack::PushL( req );
- req->CreateL();
-
- // Release message
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRelease ) );
- // Srcid. i.e. master id
- User::LeaveIfError(
- req->AppendId( aSlave->iMasterId ) );
- // DstId is device broadcast
- User::LeaveIfError(
- req->AppendId( SETID( DEVID( aSlave->iSlaveDevId ), 0 ) ) );
-
- User::LeaveIfError(
- iTestCombiner->TestModuleIf().RemoteSend( req->Message() ) );
-
- iState = ERunnerFree;
- aSlave->iState = CSlaveInfo::ESlaveReleaseSent;
-
- // Start timer
- iRemoteTimer->SetTimerActive( iTestCombiner->iRemoteTimeout );
-
- CleanupStack::PopAndDestroy( req );
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteRemoteL
-
- Description: Executes remote line
-
- Parameters: CStifItemParser* aItem: in: script line
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteRemoteL( CStifItemParser* aItem )
- {
- _LIT( KErrMsgRemoteSlaveNameNotDefined, "Remote : Slave name is not defined" );
- _LIT( KErrMsgRemoteSlaveNotFound, "Remore : Slave %S not found" );
- _LIT( KErrMsgRemoteIllegalState, "Remote : Slave %S in illegal state %d, cannot send remote call" );
- _LIT( KErrMsgRemoteCommandNotDefined, "Slave command name was not given for remote" );
- TPtrC name;
- TPtrC command;
- // Get slave name
- TInt ret = aItem->GetNextString( name );
- if( ret != KErrNone )
- {
- __TRACE( KError, (_L("Slave name was not given for remote")));
- iRunErrorMessage = KErrMsgRemoteSlaveNameNotDefined;
- User::Leave( KErrArgument );
- }
-
- __TRACE( KMessage, (_L("Remote command to %S"), &name));
-
- CSlaveInfo* slave = iTestCombiner->GetSlave( name );
- if( slave == NULL )
- {
- __TRACE( KError, (_L("Slave %S not found"), &name ));
- iRunErrorMessage.Format( KErrMsgRemoteSlaveNotFound, &name );
- User::Leave( KErrArgument );
- }
- if( slave->iState != CSlaveInfo::ESlaveReserved )
- {
- __TRACE( KError, (_L("Slave %S in illegal state %d, cannot send remote call"),
- &name, slave->iState ));
- iRunErrorMessage.Format( KErrMsgRemoteIllegalState, &name, slave->iState );
- User::Leave( KErrNotReady );
- }
-
- // Get remote command name
- ret = aItem->GetNextString( command );
- if( ret != KErrNone )
- {
- __TRACE( KError, (_L("Slave command name was not given for remote")));
- iRunErrorMessage = KErrMsgRemoteCommandNotDefined;
- User::Leave( KErrArgument );
- }
-
- iTestCombiner->TestModuleIf().Printf( KPrintPriExec, KExecute,
- _L("remote %S %S"), &name, &command );
-
- __TRACE( KPrint, (_L("remote %S %S"), &name, &command ) );
-
- // Parse command name
- TInt key = TTCKeywords::Parse( command, TTCKeywords::Keyword );
- TBool continueTask = ETrue;
-
- switch( key )
- {
- // Test case starting
- case TTCKeywords::ERun:
- continueTask = ExecuteRemoteRunL( aItem, slave );
- break;
-
- // Event control cases
- case TTCKeywords::ERequest:
- case TTCKeywords::EWait:
- case TTCKeywords::ERelease:
- continueTask = ExecuteRemoteEventCtlL( aItem, slave, key );
- break;
-
- case TTCKeywords::ESet:
- case TTCKeywords::EUnset:
- continueTask = ExecuteRemoteSetUnsetEventL(aItem, slave, key);
- break;
- // asynchronous 'sendreceive'
- case TTCKeywords::ESendReceive:
- continueTask = ExecuteRemoteSendReceiveL( aItem, slave );
- break;
-
- default:
- // Some unknown remote command, forward as such
- continueTask = ExecuteRemoteUnknownL( aItem, slave, command );
- break;
- }
-
- return continueTask;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteRemoteRunL
-
- Description: Handles remote run
-
- Parameters: CStifItemParser* aItem: in: script line
- CSlaveInfo* aSlave: in: slave info
- HBufC *aSetUnsetEvent: in: data needed for startInfo
- TInt aCaseNumber: in: data needed for startInfo
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution and wait response
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteRemoteRunL( CStifItemParser* aItem,
- CSlaveInfo* aSlave,
- HBufC *aSetUnsetEvent,
- TInt aCaseNumber )
- {
-
- CStifTFwIfProt* req = CStifTFwIfProt::NewL();
- CleanupStack::PushL( req );
- req->CreateL();
-
- CStartInfo* startInfo = CStartInfo::NewL();
- CleanupStack::PushL( startInfo );
- //if aSetUnsetEvent is given, then get start info from this argument
- if(aSetUnsetEvent != NULL)
- {
- TBuf<10> tmpModuleName;
- tmpModuleName.Copy(_L("suevent"));
- startInfo->SetModuleNameL(tmpModuleName);
- startInfo->SetConfigL(*aSetUnsetEvent);
- startInfo->iCaseNum = aCaseNumber;
- }
- else
- {
- ParseRunParamsL( aItem, *startInfo );
-}
-
- if( iTestCombiner->GetTest( startInfo->iTestId ) )
- {
- /*
- __TRACE( KError, (_L("´Slave test running already with testid %S"),
- &startInfo->iTestId ) );
- */
- User::Leave( KErrAlreadyExists );
- }
-
- CRemoteTestCase* remote =
- CRemoteTestCase::NewL( iTestCombiner,
- startInfo->iTestId,
- startInfo->iExpectedResult,
- startInfo->iCategory );
-
- CleanupStack::PushL( remote );
-
- // Remote message
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ) );
- // Srcid. i.e. master id
- User::LeaveIfError( req->AppendId( aSlave->iMasterId ) );
- // DstId is device broadcast
- User::LeaveIfError(
- req->AppendId( SETID( DEVID( aSlave->iSlaveDevId ), 0 ) ) );
- // Run command
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdRun ) );
- // Run parameters
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::RunParams,
- CStifTFwIfProt::ERunModule,
- startInfo->iModule ) );
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::RunParams,
- CStifTFwIfProt::ERunTestcasenum,
- startInfo->iCaseNum ));
- if( startInfo->iIniFile.Length() > 0 )
- {
- // Initialization file
- __TRACE( KMessage, (_L("ini: %S"), &startInfo->iIniFile ));
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::RunParams,
- CStifTFwIfProt::ERunInifile,
- startInfo->iIniFile ) );
- }
- if( startInfo->iConfig.Length() > 0 )
- {
- // Initialization file
- __TRACE( KMessage, (_L("config: %S"), &startInfo->iConfig ));
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::RunParams,
- CStifTFwIfProt::ERunTestcasefile,
- startInfo->iConfig ));
- }
- //Title (must be given between quotation marks in case of any spaces inside
- if( startInfo->iTitle.Length() > 0 )
- {
- __TRACE(KMessage, (_L("title: %S"), &startInfo->iTitle));
- TName tit;
- tit.Format(_L("\"title=%S\""), &startInfo->iTitle);
- User::LeaveIfError(req->Append(tit));
- }
-
- User::LeaveIfError(
- iTestCombiner->TestModuleIf().RemoteSend( req->Message() ) );
-
- remote->iRemoteState = CRemoteTestCase::ECaseRunSent;
- remote->iSlaveId = aSlave->iSlaveDevId;
- remote->StartL();
- User::LeaveIfError( iTestCombiner->iTestCases.Append( remote ) );
- if( iTestCombiner->iLoopIsUsed )
- {
- User::LeaveIfError( iTestCombiner->iLoopAllocationArray.Append( remote ) );
- }
- CleanupStack::Pop( remote );
-
- CleanupStack::PopAndDestroy( startInfo );
-
- iTestCombiner->iRunningTests++;
-
- // Start timer
- iRemoteTimer->SetTimerActive( iTestCombiner->iRemoteTimeout );
-
- iState = ERunnerRemote;
-
- CleanupStack::PopAndDestroy( req );
-
- return EFalse;
-
- }
-
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteRemoteTestCtlL
-
- Description: Handles remote testcase controlling
-
- Parameters: CStifItemParser* aItem: in: script line
- CTestCase* aTestCase: in: test case
- TInt aCmd: in: remote command
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution and wait response
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteRemoteTestCtlL( CStifItemParser* /* aItem */,
- CTestCase* aTestCase,
- TInt aCmd )
- {
-
- CRemoteTestCase* caseInfo = ( CRemoteTestCase* ) aTestCase;
-
- CStifTFwIfProt* req = CStifTFwIfProt::NewL();
- CleanupStack::PushL( req );
- req->CreateL();
- // Remote message
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ) );
- // Srcid. i.e. master id
- //req->AppendId( ( TUint32 ) this );
- User::LeaveIfError(
- req->AppendId( KRemoteProtocolMasterId ));
- // DstId, i.e.slave id
- User::LeaveIfError(
- req->AppendId( caseInfo->iSlaveId ));
-
- switch( aCmd )
- {
- case TTCKeywords::EPause:
- if( caseInfo->iRemoteState != CRemoteTestCase::ECaseRunning )
- {
- __TRACE( KError, (_L("Test case with testid %S not running"),
- &aTestCase->TestId() ));
- User::Leave( KErrGeneral );
- }
- // Pause command
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdPause ) );
- caseInfo->iRemoteState = CRemoteTestCase::ECasePauseSent;
- break;
- case TTCKeywords::EResume:
- if( caseInfo->iRemoteState != CRemoteTestCase::ECasePaused )
- {
- __TRACE( KError, (_L("Test case with testid %S not paused"),
- &aTestCase->TestId() ));
- User::Leave( KErrGeneral );
- }
- // Resume command
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdResume ));
- caseInfo->iRemoteState = CRemoteTestCase::ECaseResumeSent;
- break;
- case TTCKeywords::ECancel:
- if( ( caseInfo->iRemoteState != CRemoteTestCase::ECaseRunning ) &&
- ( caseInfo->iRemoteState != CRemoteTestCase::ECasePaused ) )
- {
- __TRACE( KError, (_L("Test case with testid %S not running"),
- &aTestCase->TestId() ));
- User::Leave( KErrGeneral );
- }
- // Cancel command
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdCancel ));
- caseInfo->iRemoteState = CRemoteTestCase::ECaseCancelSent;
- break;
- case TTCKeywords::EComplete:
- if( caseInfo->iRemoteState == CRemoteTestCase::ECaseCompleted )
- {
- __TRACE( KError, (_L("Test case with testid %S already completed"),
- &aTestCase->TestId() ));
- CleanupStack::PopAndDestroy( req );
- return ETrue;
- }
- else
- {
- iTestCombiner->iWaitTestCase = aTestCase->TestId();
- CleanupStack::PopAndDestroy( req );
- return EFalse;
- }
- default:
- // Should never come here
- User::Leave( KErrGeneral );
- }
-
- User::LeaveIfError(
- iTestCombiner->TestModuleIf().RemoteSend( req->Message() ) );
-
- // Start timer
- iRemoteTimer->SetTimerActive( iTestCombiner->iRemoteTimeout );
-
- iState = ERunnerRemote;
-
- CleanupStack::PopAndDestroy( req );
-
- return EFalse;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteRemoteEventCtlL
-
- Description: Handles remote event controlling
-
- Parameters: CStifItemParser* aItem: in: script line
- CSlaveInfo* aSlave: in: slave info
- TInt aCmd: in: remote command
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution and wait response
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteRemoteEventCtlL( CStifItemParser* aItem,
- CSlaveInfo* aSlave,
- TInt aCmd )
- {
-
- TPtrC eventName;
- // Get event name
- TInt ret = aItem->GetNextString( eventName );
- if( ret != KErrNone )
- {
- __TRACE( KError, (_L("Event name was not given for remote")));
- User::Leave( KErrArgument );
- }
-
- if( aCmd == TTCKeywords::EWait )
- {
- TEventTc* event = aSlave->GetEvent( eventName );
- if( event == NULL )
- {
- __TRACE( KError, (_L("Waited event %S not requested"),
- &eventName ) );
- User::Leave( KErrNotFound );
- }
- iState = ERunnerRunning;
- SetActive();
- event->WaitEvent( iStatus );
- // Execution continue if waited event is set or after it is set
- return EFalse;
- }
-
- CStifTFwIfProt* req = CStifTFwIfProt::NewL();
- CleanupStack::PushL( req );
-
- req->CreateL();
- // Remote message
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ));
- // Srcid. i.e. master id
- User::LeaveIfError( req->AppendId( aSlave->iMasterId ) );
- // DstId, i.e.slave device id
- User::LeaveIfError( req->AppendId( aSlave->iSlaveDevId ) );
-
- switch( aCmd )
- {
- // Event control cases
- case TTCKeywords::ERequest:
- {
- TEventTc* event = aSlave->GetEvent( eventName );
- if( event != NULL )
- {
- __TRACE( KError, (_L("Event %S already requested"),
- &eventName ) );
- User::Leave( KErrNotFound );
- }
- event = new( ELeave ) TEventTc( (TName&)eventName,
- iTestCombiner->iLog );
- CleanupStack::PushL( event );
- User::LeaveIfError( aSlave->iEvents.Append( event ) );
- CleanupStack::Pop( event );
- // Request event
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdRequest ));
- }
- break;
-
- case TTCKeywords::ERelease:
- {
- TEventIf* event = NULL;
- TInt count = aSlave->iEvents.Count();
- TInt i = 0;
- for( ; i < count; i++ )
- {
- if( aSlave->iEvents[i]->Name() == eventName )
- {
- event = aSlave->iEvents[i];
- break;
- }
- }
- if( event == NULL )
- {
- __TRACE( KError, (_L("Event not found %S"),
- &eventName ) );
- User::Leave( KErrNotFound );
- }
-
- aSlave->iEvents.Remove(i);
- delete event;
- // Release event
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdRelease ));
- }
- break;
-
- case TTCKeywords::ESet:
- {
- __TRACE( KPrint, (_L("JIRA51 CTestRunner::ExecuteRemoteEventCtlL case ESet")));
- User::LeaveIfError(req->Append(CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdSetEvent));
- break;
- }
- case TTCKeywords::EUnset:
- {
- __TRACE( KPrint, (_L("JIRA51 CTestRunner::ExecuteRemoteEventCtlL case EUnset")));
- User::LeaveIfError(req->Append(CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdUnsetEvent));
- break;
- }
- default:
- // Should never come here
- User::Leave( KErrGeneral );
- }
-
- // Event name
- User::LeaveIfError( req->Append( eventName ) );
-
- if(aCmd == TTCKeywords::ESet)
- {
- TPtrC stateEvent;
- TInt ret = aItem->GetNextString(stateEvent);
- if(ret == KErrNotFound) //indication event - add indicate keyword to message
- {
- User::LeaveIfError(req->Append(CStifTFwIfProt::EventType, TEventIf::EIndication));
- }
- else if(ret == KErrNone) //possibly state event
- {
- if(stateEvent.Compare(_L("state")) == 0) //state event - add state keyword to message
- {
- User::LeaveIfError(req->Append(CStifTFwIfProt::EventType, TEventIf::EState));
- }
- else //syntax error in the line
- {
- __TRACE(KError, (_L("Unknown keyword %S"), &stateEvent));
- }
- }
- else //syntax error in the line
- {
- __TRACE(KError, (_L("Unknown keyword (2) %S"), &stateEvent));
- }
- }
- User::LeaveIfError(
- iTestCombiner->TestModuleIf().RemoteSend( req->Message() ) );
-
- // Start timer
- iRemoteTimer->SetTimerActive( iTestCombiner->iRemoteTimeout );
-
- iState = ERunnerRemote;
-
- CleanupStack::PopAndDestroy( req );
-
- return EFalse;
-
- }
-
-TBool CTestRunner::ExecuteRemoteSetUnsetEventL(CStifItemParser* aItem,
- CSlaveInfo* aSlave,
- TInt aCmd)
- {
- TPtrC eventName;
- // Get event name
- TInt ret = aItem->GetNextString(eventName);
- if(ret != KErrNone)
- {
- __TRACE(KError, (_L("Event name was not given for remote")));
- User::Leave(KErrArgument);
- }
- // Check if this is a state set, indication set, or unset command
- TInt caseNumber = -1;
- if(aCmd == TTCKeywords::ESet)
- {
- TPtrC stateEvent;
- TInt ret = aItem->GetNextString(stateEvent);
- if(ret == KErrNotFound) //indication event - add indicate keyword to message
- {
- caseNumber = 1;
- }
- else if(ret == KErrNone) //possibly state event
- {
- if(stateEvent.Compare(_L("state")) == 0) //state event - add state keyword to message
- {
- caseNumber = 0;
- }
- else //syntax error in the line
- {
- __TRACE(KError, (_L("Unknown keyword %S"), &stateEvent));
- }
- }
- else //syntax error in the line
- {
- }
- }
- else //TTCKeyword::EUnset
- {
- caseNumber = 2;
- }
-
- if(caseNumber == -1)
- {
- __TRACE(KError, _L("Should never occur"));
- }
- // Build new descriptor with command to run hardcoded suevent test case on remote phone
- HBufC* cmd = HBufC::NewL(100);
- CleanupStack::PushL(cmd);
- TPtr cmdPtr(cmd->Des());
- cmdPtr.Copy(eventName);
- // Run remotely test case
-RDebug::Print(_L("CTestRunner::ExecuteRemoteSetUnsetEventL calling ExecuteRemoteRun"));
- TBool retval = ExecuteRemoteRunL(aItem, aSlave, cmd, caseNumber);
- // Clean data
- CleanupStack::PopAndDestroy(cmd);
-RDebug::Print(_L("CTestRunner::ExecuteRemoteSetUnsetEventL end"));
- return retval;
- }
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteRemoteSendReceiveL
-
- Description: Handles asynchronous remote sendreceive controlling
-
- Parameters: CStifItemParser* aItem: in: script line
- CSlaveInfo* aSlave: in: slave info
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution and wait response
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteRemoteSendReceiveL( CStifItemParser* aItem,
- CSlaveInfo* aSlave )
- {
- CStifTFwIfProt* req = CStifTFwIfProt::NewL();
- CleanupStack::PushL( req );
-
- // Create CRemoteSendReceive object for taking sendreceive information to
- // save for later use.
- CRemoteSendReceive* remoteSendReceive =
- CRemoteSendReceive::NewL( iTestCombiner );
-
- CleanupStack::PushL( remoteSendReceive );
-
- req->CreateL();
- // Remote message
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ) );
- // Srcid. i.e. master id
- User::LeaveIfError( req->AppendId( aSlave->iMasterId ) );
- // DstId, i.e.slave device id
- User::LeaveIfError( req->AppendId( aSlave->iSlaveDevId ) );
- // Run command
- User::LeaveIfError( req->Append(
- CStifTFwIfProt::CmdType, CStifTFwIfProt::ECmdSendReceive ) );
- // asynchronous sendreceive's parameters
- TPtrC tmp;
-
- while( aItem->GetNextString( tmp ) == KErrNone )
- {
- // Append parameters
- User::LeaveIfError( req->Append( tmp ) );
- }
-
- User::LeaveIfError(
- iTestCombiner->TestModuleIf().RemoteSend( req->Message() ) );
-
- remoteSendReceive->iRemoteState = CRemoteSendReceive::ECaseSend;
- remoteSendReceive->iSlaveId = aSlave->iSlaveDevId;
-
- // Take CRemoteSendReceive object to save in array. This can be used in
- // TestCombiner when handling responses.
- User::LeaveIfError(
- iTestCombiner->iSendReceive.Append( remoteSendReceive ) );
- if( iTestCombiner->iLoopIsUsed )
- {
- User::LeaveIfError(
- iTestCombiner->iLoopAllocationArray.Append( remoteSendReceive ) );
- }
- CleanupStack::Pop( remoteSendReceive );
-
- // Start timer
- iRemoteTimer->SetTimerActive( iTestCombiner->iRemoteTimeout );
-
- iState = ERunnerRemote;
-
- CleanupStack::PopAndDestroy( req );
-
- // Return EFalse=>start waiting response...
- return EFalse;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteRemoteUnknownL
-
- Description: Forwards messages as such
-
- Parameters: CStifItemParser* aItem: in: script line
- CSlaveInfo* aSlave: in: slave info
- TInt aCmd: in: remote command
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution and wait response
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteRemoteUnknownL( CStifItemParser* aItem,
- CSlaveInfo* aSlave,
- TDesC& aCommand )
- {
-
- CStifTFwIfProt* req = CStifTFwIfProt::NewL();
- CleanupStack::PushL( req );
-
- req->CreateL();
- // Remote message
- User::LeaveIfError(
- req->Append( CStifTFwIfProt::MsgType, CStifTFwIfProt::EMsgRemote ) );
- // Srcid. i.e. master id
- User::LeaveIfError( req->AppendId( aSlave->iMasterId ) );
- // DstId, i.e.slave device id
- User::LeaveIfError( req->AppendId( aSlave->iSlaveDevId ) );
-
- // Append command name
- User::LeaveIfError( req->Append( aCommand ) );
-
- TPtrC tmp;
- while( aItem->GetNextString( tmp ) == KErrNone )
- {
- // Append parameters
- User::LeaveIfError( req->Append( tmp ) );
- }
-
- User::LeaveIfError(
- iTestCombiner->TestModuleIf().RemoteSend( req->Message() ) );
-
- // Start timer
- iRemoteTimer->SetTimerActive( iTestCombiner->iRemoteTimeout );
-
- iState = ERunnerRemote;
-
- CleanupStack::PopAndDestroy( req );
-
- return EFalse;
-
- }
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ReceiveResponseL
-
- Description: Handles responce received from slave
-
- Parameters: TDesC& aMsg: in: message
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ReceiveResponseL( TDesC& aMsg )
- {
- __TRACE( KMessage, (_L("ReceiveResponse")));
-
- iRemoteTimer->Cancel();
-
- CStifTFwIfProt* msg = CStifTFwIfProt::NewL();
- CleanupStack::PushL( msg );
- TRAPD( err, msg->SetL( aMsg ); );
- if( err != KErrNone )
- {
- __TRACE( KError, (_L("Response parsing failed")));
- User::Leave( err );
- }
-
- // Check protocol identifiers
- if( ( msg->SrcDevId() == 0 ) ||
- ( msg->DstDevId() == 0 ) ||
- ( msg->DstTestId() == 0 ) )
- {
- __TRACE( KError, (_L("Illegal deviceid received")));
- User::Leave( KErrGeneral );
- }
-
- // This is master, cannot receive anything else but responses
- if( msg->iMsgType != CStifTFwIfProt::EMsgResponse )
- {
- __TRACE( KError, (_L("Illegal message received %d"),
- msg->iMsgType ));
- User::Leave( KErrGeneral );
- }
-
- TBool continueTask = ETrue;
- switch( msg->iRespType )
- {
- case CStifTFwIfProt::EMsgReserve:
- {
- __TRACE( KMessage, (_L("ReceiveResponse Reserve")));
- if( iState != ERunnerAllocate )
- {
- __TRACE( KError, (_L("Response reserve received in illegal state %d"),
- iState ));
- User::Leave( KErrGeneral );
- }
- // Check protocol Src test id
- if( msg->SrcTestId() != 0 )
- {
- __TRACE( KError, (_L("Illegal deviceid received")));
- User::Leave( KErrGeneral );
- }
- if( msg->iResult != KErrNone )
- {
- __TRACE( KError, (_L("Response with error %d"), msg->iResult ));
- User::Leave( msg->iResult );
- }
- CSlaveInfo* slave = NULL;
- TInt count = iTestCombiner->iSlaveArray.Count();
- for( TInt index = 0; index < count; index++ )
- {
- slave = iTestCombiner->iSlaveArray[index];
- if( ( slave->iSlaveDevId == 0 ) &&
- ( slave->iState == CSlaveInfo::ESlaveReserveSent ) )
- {
- break;
- }
- slave = NULL;
- }
- if( slave == NULL )
- {
- User::Leave( KErrNotFound );
- }
- slave->iSlaveDevId = msg->SrcId();
- slave->iState = CSlaveInfo::ESlaveReserved;
- __TRACE( KMessage, (_L("Slave allocated succesfully, continue execution")));
- }
- break;
- case CStifTFwIfProt::EMsgRelease:
- {
- __TRACE( KMessage, (_L("ReceiveResponse Release")));
- if( iState != ERunnerFree )
- {
- __TRACE( KError, (_L("Response release received in illegal state %d"),
- iState ));
- User::Leave( KErrGeneral );
- }
- // Check protocol Src test id
- if( msg->SrcTestId() != 0 )
- {
- __TRACE( KError, (_L("Illegal deviceid received")));
- User::Leave( KErrGeneral );
- }
- if( msg->iResult != KErrNone )
- {
- __TRACE( KError, (_L("Response with error %d"), msg->iResult ));
- User::Leave( msg->iResult );
- }
-
- CSlaveInfo* slave = iTestCombiner->GetSlave( msg->SrcId() );
- if( slave == NULL )
- {
- User::Leave( KErrNotFound );
- }
- slave->iState = CSlaveInfo::ESlaveReleased;
- __TRACE( KMessage, (_L("Slave freed succesfully, continue execution")));
- }
- break;
- case CStifTFwIfProt::EMsgRemote:
- {
- __TRACE( KMessage, (_L("ReceiveResponse Remote")));
- switch( msg->iCmdType )
- {
- case CStifTFwIfProt::ECmdRun:
- continueTask = ReceiveResponseRunL( *msg );
- break;
- case CStifTFwIfProt::ECmdPause:
- case CStifTFwIfProt::ECmdResume:
- case CStifTFwIfProt::ECmdCancel:
- continueTask = ReceiveResponseTestCtlL( *msg );
- break;
- case CStifTFwIfProt::ECmdRequest:
- case CStifTFwIfProt::ECmdRelease:
- case CStifTFwIfProt::ECmdSetEvent:
- case CStifTFwIfProt::ECmdUnsetEvent:
- continueTask = ReceiveResponseEventCtlL( *msg );
- break;
- case CStifTFwIfProt::ECmdSendReceive:
- continueTask = ReceiveResponseSendReceiveL( *msg );
- break;
- default:
- continueTask = ReceiveResponseUnknownL( *msg );
- break;
- }
- }
- break;
- default:
- User::Leave( KErrGeneral );
- }
-
-
- CleanupStack::PopAndDestroy( msg );
- return continueTask;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ReceiveResponseRunL
-
- Description: Handles response for run received from slave
-
- Parameters: CStifTFwIfProt& aMsg: in: protocol message parser
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ReceiveResponseRunL( CStifTFwIfProt& aMsg )
- {
-
- TPtrC tmp = CStifTFwIfProt::RunStatus(aMsg.iRunStatus);
- __TRACE( KMessage, (_L("ReceiveResponse Remote Run %S"), &tmp ));
-
- TBool continueTask = ETrue;
- switch( aMsg.iRunStatus )
- {
- case CStifTFwIfProt::ERunStarted:
- {
- // Locate testcase
- CRemoteTestCase* tcase =
- iTestCombiner->GetRemoteTestRunSent( GETDEVID( aMsg.SrcId() ) );
- if( tcase == NULL )
- {
- __TRACE( KError, (_L("Testcase not found")));
- User::Leave( KErrNotFound );
- }
- tcase->iSlaveId = aMsg.SrcId();
-
- tcase->iRemoteState = CRemoteTestCase::ECaseRunning;
- }
- break;
- case CStifTFwIfProt::ERunError:
- case CStifTFwIfProt::ERunReady:
- {
- // Locate testcase
- CRemoteTestCase* tcase =
- iTestCombiner->GetRunningRemoteTest( aMsg.SrcId() );
- if( tcase == NULL )
- {
- __TRACE( KError, (_L("Testcase not found")));
- User::Leave( KErrNotFound );
- }
-
- switch( aMsg.iResultCategory )
- {
- case CStifTFwIfProt::EResultNormal:
- tcase->iResult.iCaseExecutionResultType =
- TFullTestResult::ECaseExecuted;
- tcase->iResult.iTestResult.iResult = aMsg.iResult;
- tcase->iResult.iCaseExecutionResultCode = 0;
- break;
- case CStifTFwIfProt::EResultPanic:
- tcase->iResult.iCaseExecutionResultType =
- TFullTestResult::ECasePanic;
- tcase->iResult.iTestResult.iResult = KErrGeneral;
- tcase->iResult.iCaseExecutionResultCode = aMsg.iResult;
- break;
- case CStifTFwIfProt::EResultException:
- tcase->iResult.iCaseExecutionResultType =
- TFullTestResult::ECaseException;
- tcase->iResult.iTestResult.iResult = KErrGeneral;
- tcase->iResult.iCaseExecutionResultCode = aMsg.iResult;
- break;
- case CStifTFwIfProt::EResultTimeout:
- tcase->iResult.iCaseExecutionResultType =
- TFullTestResult::ECaseTimeout;
- tcase->iResult.iTestResult.iResult = KErrGeneral;
- tcase->iResult.iCaseExecutionResultCode = aMsg.iResult;
- break;
- case CStifTFwIfProt::EResultLeave:
- tcase->iResult.iCaseExecutionResultType =
- TFullTestResult::ECaseLeave;
- tcase->iResult.iTestResult.iResult = KErrGeneral;
- tcase->iResult.iCaseExecutionResultCode = aMsg.iResult;
- break;
- default:
- User::Leave( KErrGeneral );
- }
-
- if( ( tcase->iRemoteState == CRemoteTestCase::ECaseCancelled ) ||
- ( tcase->iRemoteState == CRemoteTestCase::ECaseRunSent ) )
- {
- // Complete for cancelled testcase or error for run request,
- // set runner active again
- continueTask = ETrue;
- }
- else
- {
- // Continued from Complete in state ECaseRunning
- continueTask = EFalse;
- }
-
- tcase->iRemoteState = CRemoteTestCase::ECaseCompleted;
-
- __TRACE( KMessage, (_L("ReceiveResponse Remote Run rq comp")));
-
- TRequestStatus* rs = &tcase->iStatus;
- // Complete testcase
- User::RequestComplete( rs, KErrNone );
-
- }
- break;
- default:
- // Should never come here
- User::Leave( KErrGeneral );
- }
-
- return continueTask;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ReceiveResponseTestCtlL
-
- Description: Handles responses for test control commands
- received from slave
-
- Parameters: CStifTFwIfProt& aMsg: in: protocol message parser
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ReceiveResponseTestCtlL( CStifTFwIfProt& aMsg )
- {
-
- if( aMsg.iResult != KErrNone )
- {
- __TRACE( KError, (_L("Response with error %d"), aMsg.iResult ));
- User::Leave( aMsg.iResult );
- }
-
- // Locate testcase
- CRemoteTestCase* tcase = iTestCombiner->GetRemoteTest( aMsg.SrcId() );
- if( tcase == NULL )
- {
- __TRACE( KError, (_L("Testcase not found")));
- User::Leave( KErrNotFound );
- }
-
- TBool continueTask = ETrue;
-
- switch( aMsg.iCmdType )
- {
- case CStifTFwIfProt::ECmdPause:
- __TRACE( KMessage, (_L("ReceiveResponse Remote Pause")));
-
- if( tcase->iRemoteState != CRemoteTestCase::ECasePauseSent )
- {
- __TRACE( KError, (_L("Pause response received in illegal state")));
- User::Leave( KErrGeneral );
- }
- tcase->iRemoteState = CRemoteTestCase::ECasePaused;
-
- // Start pause timer if timeout was given
- if( ( iPausedTestCase.Length() > 0 ) &&
- ( iPauseTime != 0 ) )
- {
- continueTask = EFalse;
- iState = ERunnerWaitTimeout;
- iPauseTimer.After( iStatus, iPauseTime*1000 );
- SetActive();
- }
- break;
- case CStifTFwIfProt::ECmdResume:
- __TRACE( KMessage, (_L("ReceiveResponse Remote Resume")));
-
- if( tcase->iRemoteState != CRemoteTestCase::ECaseResumeSent )
- {
- __TRACE( KError, (_L("Resume response received in illegal state")));
- User::Leave( KErrGeneral );
- }
- tcase->iRemoteState = CRemoteTestCase::ECaseRunning;
- break;
- case CStifTFwIfProt::ECmdCancel:
- __TRACE( KMessage, (_L("ReceiveResponse Remote Cancel")));
-
- if( tcase->iRemoteState != CRemoteTestCase::ECaseCancelSent )
- {
- __TRACE( KError, (_L("Cancel response received in illegal state")));
- User::Leave( KErrGeneral );
- }
- tcase->iRemoteState = CRemoteTestCase::ECaseCancelled;
- // Need to wait Run response with KErrCancel
- continueTask = EFalse;
- // Start timer
- iRemoteTimer->SetTimerActive( iTestCombiner->iRemoteTimeout );
- break;
- default:
- // Should never come here
- User::Leave( KErrGeneral );
- }
-
- return continueTask;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ReceiveResponseEventCtlL
-
- Description: Handles responses for event system control commands
- received from slave
-
- Parameters: CStifTFwIfProt& aMsg: in: protocol message parser
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ReceiveResponseEventCtlL( CStifTFwIfProt& aMsg )
- {
-
- CSlaveInfo* slave = iTestCombiner->GetSlave( aMsg.SrcId() );
- if( slave == NULL )
- {
- User::Leave( KErrNotFound );
- }
-
- TBool continueTask = ETrue;
- switch( aMsg.iCmdType )
- {
- case CStifTFwIfProt::ECmdRequest:
- {
- __TRACE( KMessage, (_L("ReceiveResponse Request")));
-
- TEventTc* event = slave->GetEvent( aMsg.iEventName );
- if( event == NULL )
- {
- User::Leave( KErrNotFound );
- }
- switch( aMsg.iEventStatus )
- {
- case CStifTFwIfProt::EEventActive:
- __TRACE( KMessage, (_L("Event %S active"), &aMsg.iEventName ));
- break;
- case CStifTFwIfProt::EEventSet:
- __TRACE( KMessage, (_L("Event %S set"), &aMsg.iEventName ));
- // Set event
- event->SetEvent( aMsg.iEventType );
- continueTask = EFalse;
- break;
- case CStifTFwIfProt::EEventError:
- __TRACE( KMessage, (_L("Event %S error %d"),
- &aMsg.iEventName, aMsg.iResult ));
- User::Leave( aMsg.iResult );
- default:
- User::Leave( KErrGeneral );
- }
- }
- break;
- case CStifTFwIfProt::ECmdRelease:
- __TRACE( KMessage, (_L("ReceiveResponse Release")));
- if( aMsg.iResult != KErrNone )
- {
- __TRACE( KError, (_L("Response with error %d"), aMsg.iResult ));
- User::Leave( aMsg.iResult );
- }
-
- // Everything ok, no need to do anything
- break;
- case CStifTFwIfProt::ECmdSetEvent:
- __TRACE( KMessage, (_L("ReceiveResponse SetEvent")));
- if( aMsg.iResult != KErrNone )
- {
- __TRACE( KError, (_L("Response with error %d"), aMsg.iResult ));
- User::Leave( aMsg.iResult );
- }
-
- // Everything ok, no need to do anything
- break;
- case CStifTFwIfProt::ECmdUnsetEvent:
- __TRACE( KMessage, (_L("ReceiveResponse Unset")));
- if( aMsg.iResult != KErrNone )
- {
- __TRACE( KError, (_L("Response with error %d"), aMsg.iResult ));
- User::Leave( aMsg.iResult );
- }
- // Everything ok, no need to do anything
- break;
- default:
- // Should never come here
- User::Leave( KErrGeneral );
- }
-
- return continueTask;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ReceiveResponseSendReceiveL
-
- Description: Handles responses for asynchronous sendreceive commands
- received from slave
-
- Parameters: CStifTFwIfProt& aMsg: in: protocol message parser
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ReceiveResponseSendReceiveL( CStifTFwIfProt& aMsg )
- {
-
- TPtrC tmp = CStifTFwIfProt::RunStatus(aMsg.iRunStatus);
- __TRACE( KMessage, (
- _L("ReceiveResponseSendReceiveL asynchronous Remote SendReceive %S"),
- &tmp ) );
-
- TBool continueTask = EFalse;
- switch( aMsg.iRunStatus )
- {
- case CStifTFwIfProt::ERunStarted:
- {
- // Locate CRemoteSendReceive object
- CRemoteSendReceive* sendreceive =
- iTestCombiner->GetRemoteSendReceive( GETDEVID(
- aMsg.SrcId() ) );
- if( sendreceive == NULL )
- {
- __TRACE( KError, (_L("CRemoteSendReceive object not found")));
- User::Leave( KErrNotFound );
- }
- sendreceive->iRemoteState = CRemoteSendReceive::ECaseSend;
-
- // continueTask is EFalse=>stop script file execution
- break;
- }
- case CStifTFwIfProt::ERunError:
- case CStifTFwIfProt::ERunReady:
- {
- if( aMsg.iResult != KErrNone )
- {
- __TRACE( KError, (_L("sendreceive response with error %d"), aMsg.iResult ));
- User::Leave( aMsg.iResult );
- }
-
- // Locate CRemoteSendReceive object
- CRemoteSendReceive* sendreceive =
- iTestCombiner->GetRemoteSendReceive( aMsg.SrcId() );
- if( sendreceive == NULL )
- {
- __TRACE( KError, (_L("CRemoteSendReceive object not found")));
- User::Leave( KErrNotFound );
- }
-
- // continueTask is ETrue=>continue script file execution
- continueTask = ETrue;
-
- sendreceive->iRemoteState = CRemoteSendReceive::ECaseCompleted;
-
- __TRACE( KMessage, (
- _L( "ReceiveResponseSendReceiveL asynchronous Remote SendReceive rq comp" ) ) );
- break;
- }
- default:
- {
- // Should never come here
- User::Leave( KErrGeneral );
- }
- }
- return continueTask;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ReceiveResponseUnknownL
-
- Description: Handles responses for unspecified commands
-
- Parameters: CStifTFwIfProt& aMsg: in: protocol message parser
-
- Return Values: ETrue: continue script file execution
- EFalse: stop script file execution
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ReceiveResponseUnknownL( CStifTFwIfProt& aMsg )
- {
-
- CSlaveInfo* slave = iTestCombiner->GetSlave( aMsg.SrcId() );
- if( slave == NULL )
- {
- User::Leave( KErrNotFound );
- }
- if( aMsg.iResult != KErrNone )
- {
- __TRACE( KError, (_L("Response with error %d"), aMsg.iResult ));
- User::Leave( aMsg.iResult );
- }
-
- return ETrue;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ParseOptArgL
-
- Description: Parses optional argument
-
- Parameters: const TDesC& aOptArg: in:
- argument-value pair (format arg=value)
- TPtrC& aArg: out: parsed argument
- TPtrC& aVal: out: parsed value
-
- Return Values: None
-
- Errors/Exceptions: Leaves if parsing fails.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::ParseOptArgL( const TDesC& aOptArg, TPtrC& aArg, TPtrC& aVal)
- {
- _LIT( KErrMsgUnknownOrIllegalKeyword, "Unknown or illegal argument %S" );
- _LIT( KErrMsgValueNotDefined, "Value of optional argument %S is not defined" );
- TInt length = aOptArg.Length();
- for( TInt i=0; i < length; i++)
- {
- // find the '=' sign
- if( aOptArg[i] == '=' )
- {
- if( i+1 >= length )
- {
- __TRACE( KError,
- (_L("Illegal optional argument(%S), no value"),
- &aOptArg ));
- TPtrC tmp = aOptArg.Left( i );
- iRunErrorMessage.Format( KErrMsgValueNotDefined, &tmp );
- User::Leave( KErrArgument );
- }
- aArg.Set( aOptArg.Left( i ) );
- aVal.Set( aOptArg.Mid( i+1 ) );
- __TRACE( KMessage, ( _L( "arg '%S', val '%S'" ),
- &aArg, &aVal ));
- return;
- }
- }
- __TRACE( KError, (_L("Illegal optional argument(%S)"), &aOptArg ));
- iRunErrorMessage.Format( KErrMsgUnknownOrIllegalKeyword, &aOptArg );
- User::Leave( KErrArgument );
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: CancelTestCases
-
- Description: Cancels all running testcases
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::CancelTestCases()
- {
- __TRACEFUNC();
-
- TInt count = iTestCombiner->iTestCases.Count();
- for( TInt i=0; i < count; i++ )
- {
- if( iTestCombiner->iTestCases[i]->State() ==
- CTCTestCase::ETestCaseRunning )
- {
- iTestCombiner->iTestCases[i]->Cancel();
- }
- }
-
- if( ( iTestCombiner->iRunningTests == 0 ) &&
- iTestCombiner->iSchedulerActive )
- {
- // Stop execution
- CActiveScheduler::Current()->Stop();
- iTestCombiner->iSchedulerActive = EFalse;
- return;
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: SetRunnerActive
-
- Description: Set CTestRunner active and complete.
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::SetRunnerActive()
- {
- __TRACEFUNC();
-
- if( IsActive() )
- {
- __TRACE( KError, ( _L("Runner already active %d"), iState ));
- User::Panic( KTestRunner, KErrInUse );
- }
-
- // Update state
- iState = ERunnerRunning;
-
- iStatus = KRequestPending;
- TRequestStatus* rs = &iStatus;
- SetActive();
- User::RequestComplete( rs, KErrNone );
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: CheckUnsetEvent
-
- Description: Check unset event.
-
- Parameters: None
-
- Return Values: ETrue: Unset event completed
- EFalse: No unset event pending
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::CheckUnsetEvent()
- {
- if( iEvent.Name().Length() == 0 )
- {
- return EFalse;
- }
-
- __TRACE( KMessage, (_L("Unset event completed") ));
- // Check if some testmodule below has still event request pending
- if( iTestCombiner->UnsetEvent( iEvent, iStatus ) == EFalse )
- {
- // No event request pending
- // then check other testmodules (may block)
- TInt res = iTestCombiner->TestModuleIf().Event( iEvent );
- if( res != KErrNone )
- {
- iTestCombiner->iResult = res;
- }
-
- __TRACE( KPrint, (_L("Unset: Complete") ) );
- iEvent.SetName( _L("") );
- // Proceed testcase section execution
- SetRunnerActive();
- }
- else
- {
- iState = ERunnerWaitUnset;
- // Wait for unset to complete
- SetActive();
- }
-
- return ETrue;
- }
-
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteLoopL
-
- Description: Handle the loop keyword operations.
-
- Parameters: CStifItemParser* aItem: in: Pointer to parsed item object.
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestRunner::ExecuteLoopL( CStifItemParser* aItem )
- {
- _LIT( KErrMsgLoopNestedLoop, "Loop: Nested loops are not supported " );
- _LIT( KErrMsgLoopInvalidLoopCountParam, "Loop: No loop count value given for loop or value has invalid format" );
- _LIT( KErrMsgLoopUnknownUnexpectedOption, "Loop: Unknown or unexpected loop option");
- _LIT( KErrMsgLoopPasslimitInvalidValue, "Loop: No passlimit value given for loop or value has invalid format" );
- _LIT( KErrMsgLoopPasslimitNotInRange, "Loop: Passlimit value is lower than 0 or higher than loop count" );
- __TRACEFUNC();
-
- if( iLoopTimes != 0 )
- {
- __TRACE( KError, (_L("ExecuteLoopL: Nested loop are not supported")));
- iRunErrorMessage = KErrMsgLoopNestedLoop;
- User::Leave( KErrNotSupported );
- }
-
- iLoopTimes = 0;
- iLoopCounter = 0;
- iPasslimitEnabled = EFalse;
- iTimedLoop = EFalse;
-
- if( aItem->GetNextInt( iLoopTimes ) != KErrNone )
- {
- __TRACE( KError, (_L("ExecuteLoopL: No loop count value given for loop")));
- iRunErrorMessage = KErrMsgLoopInvalidLoopCountParam;
- User::Leave( KErrArgument );
- }
- __TRACE( KMessage, (_L("ExecuteLoopL: Loop for %d times" ), iLoopTimes ) );
-
- //Check loop options
- TPtrC option;
- TInt ret = aItem->GetNextString(option);
- if(ret == KErrNone)
- {
- if(option.Compare(_L("msec")) == 0) //time loop option
- {
- iTimedLoop = ETrue;
- iStartTime.HomeTime();
- iExpectedLoopTime = TInt64(iLoopTimes) * TInt64(1000); //convert to micro seconds
- __TRACE(KMessage, (_L("ExecuteLoopL: Timed loop for %d msec" ), iLoopTimes));
-
- ret = aItem->GetNextString(option); //Get next option
- }
- }
-
- if(ret == KErrNone)
- {
- if(option.Compare(_L("passlimit")) == 0) //passlimit option
- {
- iPasslimit = 0;
- if( aItem->GetNextInt( iPasslimit ) != KErrNone )
- {
- __TRACE( KError, ( _L( "ExecuteLoopL: No passlimit value given for loop." ) ) );
- iRunErrorMessage = KErrMsgLoopPasslimitInvalidValue;
- User::Leave( KErrArgument );
- }
- __TRACE( KMessage, ( _L( "ExecuteLoopL: Passlimit set on %d" ), iPasslimit ) );
- //Check if passlimit has valid value
- if(iPasslimit < 0 || (iPasslimit > iLoopTimes && !iTimedLoop))
- {
- __TRACE( KError, ( _L( "ExecuteLoopL: Passlimit value is lower than 0 or higher than loop count." ) ) );
- iRunErrorMessage = KErrMsgLoopPasslimitNotInRange;
- User::Leave( KErrArgument );
- }
- iPasslimitEnabled = ETrue;
-
- ret = aItem->GetNextString(option); //Get next option
- }
- }
-
- if(ret == KErrNone)
- {
- __TRACE( KError, ( _L( "ExecuteLoopL: Unknown or unexpected loop option [%S]" ), &option ) );
- iRunErrorMessage = KErrMsgLoopUnknownUnexpectedOption;
- User::Leave( KErrNotSupported );
- }
-
- iPassedIterationCnt = 0;
-
- iLoopStartPos = iTestCombiner->iSectionParser->GetPosition();
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CTestRunner
-
- Method: ExecuteEndLoopL
-
- Description: Handle the endloop keyword operations.
-
- Parameters: None.
-
- Return Values: TBool: Boolean value for indicate can testing continue.
-
- Errors/Exceptions: None.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TBool CTestRunner::ExecuteEndLoopL()
- {
- __TRACEFUNC();
-
- // Fail test case if there was no loop started
- if(iTestCombiner->iLoopIsUsed == EFalse)
- {
- __TRACE(KError, (_L("Encountered \'endloop\' without \'loop\'. Aborting test case.")));
- iTestCombiner->iResult = KErrGeneral;
- iState = ERunnerError;
- CancelTestCases();
- return ETrue; // Test case file parsing can be continue
- }
-
- TBool iterationFailed = EFalse; //Has last iteration failed (at least one of test cases has failed)
-
- // First we check is all test cases that is set to run inside the loop
- // completed. If not completed we wait until test case completes.
- // Is some loop executions fails that is not allowed then loop execution
- // will be stopped and error result is given to TestCombiner
-
- for( TInt s = 0; s < iTestCombiner->iTestCases.Count(); s++ )
- {
- CTestCase* testCase = (CTestCase*)iTestCombiner->iTestCases[s];
- if( testCase == NULL )
- {
- __TRACE( KError, (_L("ExecuteEndLoopL: CTestCase object not found") ) );
- return ETrue;
- }
- // Check that testCase object is allocated inside the loop
- TBool isLoopTestCase( EFalse );
- for( TInt p = 0; p < iTestCombiner->iLoopAllocationArray.Count(); p++ )
- {
- if( iTestCombiner->iLoopAllocationArray[p] == testCase )
- {
- isLoopTestCase = ETrue;
- break;
- }
- }
- // testCase object is allocated inside loop
- if( isLoopTestCase )
- {
- // Test case is completed
- //if( testCase->State() == CTCTestCase::ETestCaseCompleted )
- if(testCase->IsCompletelyFinished())
- {
- // Check normal test result
- if( testCase->iExpectedResultCategory == TFullTestResult:: ECaseExecuted )
- {
- // Normal completion, check result
- if( testCase->iResult.iTestResult.iResult != testCase->iExpectedResult )
- {
- __TRACE( KPrint, ( _L( "Test failed, expect(%d) != result(%d)"),
- testCase->iExpectedResult,
- testCase->iResult.iTestResult.iResult ));
- //If no passlimit is provided behave in old way
- if( !iPasslimitEnabled )
- {
- // We return the first error result as aResult
- if( testCase->iResult.iTestResult.iResult != KErrNone )
- {
- iTestCombiner->iScriptFailed = testCase->iResult.iCaseExecutionResultCode;
- iTestCombiner->iScriptFailedDescription.Copy(testCase->iResult.iTestResult.iResultDes);
- }
- else
- {
- iTestCombiner->iScriptFailed = testCase->iResult.iCaseExecutionResultCode;
- iTestCombiner->iScriptFailedDescription.Copy(_L("Test case has not finished with expected result (in loop)."));
- }
-
- iState = ERunnerError;
- CancelTestCases();
- return ETrue; // Test case file parsing can be continue
- }
- else
- {
- // Set flag that one of test cases has failed, so whole iteration is failed
- iterationFailed = ETrue;
- }
- }
- }
- // Abnormal completion, i.e. panic, leave, exception or timeout
- else
- {
- if( testCase->iResult.iCaseExecutionResultCode != testCase->iExpectedResult )
- {
- __TRACE( KPrint, ( _L( "Test failed, expect errorcode(%d) != result(%d)"),
- testCase->iExpectedResult,
- testCase->iResult.iCaseExecutionResultCode ) );
- //If no passlimit is provided behave in old way
- if( !iPasslimitEnabled )
- {
- // We return the first error result as aResult
- iTestCombiner->iScriptFailed = testCase->iResult.iCaseExecutionResultCode;
- iTestCombiner->iScriptFailedDescription.Copy(_L("Test case has not finished with expected execution error (in loop)."));
-
- iState = ERunnerError;
- // Return error from here
- CancelTestCases();
- return ETrue; // Test case file parsing can be continue
- }
- else
- {
- // Set flag that one of test cases has failed, so whole iteration is failed
- iterationFailed = ETrue;
- }
- }
-
- // Requested testcase is completed already,
- // proceed testcase execution
- __TRACE( KMessage, (_L("Already completed")));
- }
- } // End "Test case is completed"
- // Test case is running state, set to wait the test case complete
- else if( testCase->State() == CTCTestCase::ETestCaseRunning )
- {
- // Wait testcase to complete. If no id there should generate
- // id that test case complete will be handled correctly
- if( testCase->TestId().Length() == 0 )
- {
- TPtrC generatedTestId( _L( "stif" ) );
- delete testCase->iTestId;
- testCase->iTestId = generatedTestId.Alloc();
- }
- iTestCombiner->iWaitTestCase.Copy( testCase->TestId() );
- // Stop testcase execution until testcase completed
- iState = ERunnerWaitTestCase;
- // Go to beginning of the endloop
- User::LeaveIfError(
- iTestCombiner->iSectionParser->SetPosition( iEndLoopStartPos ));
-
- // Testing is ongoing, test case file parsing cannot
- // be continue. Next line will be run when some AO
- // will be complete and allow parsing to continue
- return EFalse;
- }
- else if(testCase->State() == CTCTestCase::ETestCaseCompleted)
- {
- // Go to beginning of the endloop
- User::LeaveIfError(iTestCombiner->iSectionParser->SetPosition(iEndLoopStartPos));
-
- // Testing is ongoing, test case file parsing cannot
- // be continue. Next line will be run when some AO
- // will be complete and allow parsing to continue
- return ETrue;
- }
- else
- {
- // This should newer happen
- __TRACE( KError, (_L("ExecuteEndLoopL: Illegal branch") ) );
- }
- }
- } // end for-loop
-
- iLoopCounter++;
- __TRACE( KMessage, (_L("ExecuteLineL: Loop executed for %d times" ),
- iLoopCounter ) );
-
- //If passlimit (endurance) is enabled, we must check if any of test case in this iteration has failed
- if( iPasslimitEnabled && !iterationFailed )
- {
- iPassedIterationCnt++;
- }
-
- TTime currTime;
- currTime.HomeTime();
- //if( iLoopCounter < iLoopTimes )
- if(((!iTimedLoop) && (iLoopCounter < iLoopTimes)) //Normal loop
- ||
- iTimedLoop && (currTime.MicroSecondsFrom(iStartTime) < iExpectedLoopTime)) //Timed loop
- {
- // Go to beginning of the loop
- User::LeaveIfError(
- iTestCombiner->iSectionParser->SetPosition( iLoopStartPos ));
- }
- else
- {
- // End looping
- if( iPasslimitEnabled )
- {
- __TRACE(KMessage, (_L("ExecuteLoopL: Loop executed. Iterations: %d, passed: %d, expected: %d"), iLoopCounter, iPassedIterationCnt, iPasslimit));
- }
-
- iLoopCounter = 0;
- iLoopTimes = 0;
- iLoopStartPos = 0;
- // Loop related initializations
- iTestCombiner->iLoopIsUsed = EFalse;
- //--LOOPBUG-- Do not zero counter because there could be some test cases run before the loop (Stif-83)
- //--LOOPBUG-- iTestCombiner->iRunningTests = 0;
-
- //If passlimit was given and number of passed test is less then expected, stop execution of combiner's test case
- if( iPasslimitEnabled && iPassedIterationCnt < iPasslimit )
- {
- __TRACE( KMessage, ( _L( "ExecuteLoopL: Loop has failed (passlimit). Finishing with KErrCompletion." ) ) );
- iTestCombiner->iScriptFailed = KErrCompletion;
- iTestCombiner->iScriptFailedDescription = _L("Loop has not reached passlimit requirement.");
- iState = ERunnerError;
- CancelTestCases();
- return ETrue; // Test case file parsing can be continue
- }
- else if( iPasslimitEnabled && iPassedIterationCnt >= iPasslimit )
- {
- __TRACE( KMessage, ( _L( "ExecuteLoopL: Loop has passed (passlimit)" ) ) );
- }
- iPassedIterationCnt = 0;
- iPasslimit = 0;
- iPasslimitEnabled = EFalse;
- }
-
- // Loop time is executed, free allocations that is allocated during loop
- TInt a( 0 );
- TInt b( 0 );
-
- for( b = 0; b < iTestCombiner->iLoopAllocationArray.Count(); b++ )
- {
- //for( a = 0; a < iTestCombiner->iLoopAllocationArray.Count(); a++ )
- for( a = 0; a < iTestCombiner->iTestCases.Count(); a++ )
- {
- if( a < iTestCombiner->iTestCases.Count() && iTestCombiner->iTestCases[a] == iTestCombiner->iLoopAllocationArray[b] )
- {
- delete iTestCombiner->iTestCases[a];
- iTestCombiner->iTestCases.Remove( a );
- }
- }
- }
-
- for( b = 0; b < iTestCombiner->iLoopAllocationArray.Count(); b++ )
- {
- //for( a = 0; a < iTestCombiner->iLoopAllocationArray.Count(); a++ )
- for( a = 0; a < iTestCombiner->iTestModules.Count(); a++ )
- {
- if( a < iTestCombiner->iTestModules.Count() && iTestCombiner->iTestModules[a] == iTestCombiner->iLoopAllocationArray[b] )
- {
- delete iTestCombiner->iTestModules[a];
- iTestCombiner->iTestModules.Remove( a );
- }
- }
- }
-
- for( b = 0; b < iTestCombiner->iLoopAllocationArray.Count(); b++ )
- {
- //for( a = 0; a < iTestCombiner->iLoopAllocationArray.Count(); a++ )
- for( a = 0; a < iTestCombiner->iEventArray.Count(); a++ )
- {
- if( a < iTestCombiner->iEventArray.Count() && iTestCombiner->iEventArray[a] == iTestCombiner->iLoopAllocationArray[b] )
- {
- delete iTestCombiner->iEventArray[a];
- iTestCombiner->iEventArray.Remove( a );
- }
- }
- }
- for( b = 0; b < iTestCombiner->iLoopAllocationArray.Count(); b++ )
- {
- //for( a = 0; a < iTestCombiner->iLoopAllocationArray.Count(); a++ )
- for( a = 0; a < iTestCombiner->iSlaveArray.Count(); a++ )
- {
- if( a < iTestCombiner->iSlaveArray.Count() && iTestCombiner->iSlaveArray[a] == iTestCombiner->iLoopAllocationArray[b] )
- {
- delete iTestCombiner->iSlaveArray[a];
- iTestCombiner->iSlaveArray.Remove( a );
- }
- }
- }
- for( b = 0; b < iTestCombiner->iLoopAllocationArray.Count(); b++ )
- {
- //for( a = 0; a < iTestCombiner->iLoopAllocationArray.Count(); a++ )
- for( a = 0; a < iTestCombiner->iSendReceive.Count(); a++ )
- {
- if( a < iTestCombiner->iSendReceive.Count() && iTestCombiner->iSendReceive[a] == iTestCombiner->iLoopAllocationArray[b] )
- {
- delete iTestCombiner->iSendReceive[a];
- iTestCombiner->iSendReceive.Remove( a );
- }
- }
- }
-
- // Test operation can be continued
- return ETrue; // Test case file parsing can be continue
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- DESCRIPTION
-
- This module contains the implementation of CRemoteTimer class
- member functions.
-
--------------------------------------------------------------------------------
-*/
-// MACROS
-#ifdef LOGGER
-#undef LOGGER
-#endif
-#define LOGGER iTestRunner->iTestCombiner->iLog
-
-// ================= MEMBER FUNCTIONS =========================================
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteTimer
-
- Method: CRemoteTimer
-
- Description: Default constructor
-
- C++ default constructor can NOT contain any code, that
- might leave.
-
- Parameters: CTestRunner* aTestRunner: in: Backpointer to CTestRunner
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CRemoteTimer::CRemoteTimer( CTestCombiner* aTestCombiner ):
- CActive( CActive::EPriorityLow ), // Executed with lowest priority
- iState( ETimerIdle ),
- iTestCombiner( aTestCombiner )
- {
- CActiveScheduler::Add( this );
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteTimer
-
- Method: ConstructL
-
- Description: Symbian OS second phase constructor
-
- Symbian OS default constructor can leave.
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CRemoteTimer::ConstructL()
- {
-
- iTimer.CreateLocal();
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteTimer
-
- Method: NewL
-
- Description: Two-phased constructor.
-
- Parameters: CTestCombiner* aTestCombiner: in: Backpointer to CTestCombiner
-
- Return Values: CRemoteTimer*: new object
-
- Errors/Exceptions: Leaves if new or ConstructL leaves
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-
-CRemoteTimer* CRemoteTimer::NewL( CTestCombiner* aTestCombiner )
- {
-
- CRemoteTimer* self = new (ELeave) CRemoteTimer( aTestCombiner );
-
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop();
-
- return self;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteTimer
-
- Method: ~CRemoteTimer
-
- Description: Destructor
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-
-CRemoteTimer::~CRemoteTimer()
- {
-
- Cancel();
-
- iTimer.Close();
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteTimer
-
- Method: RunL
-
- Description: Derived from CActive, handles testcase execution.
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CRemoteTimer::RunL()
- {
-
- if( iState != ETimerPending )
- {
- User::Panic( KRemoteTimer, KErrGeneral );
- }
-
- if( iStatus.Int() != KErrNone )
- {
- User::Panic( KRemoteTimer, KErrDied );
- }
-
- iState = ETimerIdle;
-
- iTestCombiner->RemoteTimeout();
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteTimer
-
- Method: DoCancel
-
- Description: Derived from CActive handles the Cancel
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-void CRemoteTimer::DoCancel()
- {
- iTimer.Cancel();
- iState = ETimerIdle;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteTimer
-
- Method: SetTimerActive
-
- Description: Starts timer
-
- Parameters: TTimeIntervalMicroSeconds32 anInterval: in: Timeout
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Draft
-
--------------------------------------------------------------------------------
-*/
-void CRemoteTimer::SetTimerActive( TTimeIntervalMicroSeconds32 anInterval )
- {
- if( iState != ETimerIdle )
- {
- User::Panic( KRemoteTimer, KErrGeneral );
- }
-
- iState = ETimerPending;
-
- iTimer.After( iStatus, anInterval );
- SetActive();
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- DESCRIPTION
-
- This module contains the implementation of CRemoteReceiver class
- member functions.
-
--------------------------------------------------------------------------------
-*/
-// MACROS
-#ifdef LOGGER
-#undef LOGGER
-#endif
-#define LOGGER iTestCombiner->iLog
-
-// ================= MEMBER FUNCTIONS =========================================
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteReceiver
-
- Method: CRemoteReceiver
-
- Description: Default constructor
-
- C++ default constructor can NOT contain any code, that
- might leave.
-
- Parameters: CTestCombiner* aTestCombiner: in: Backpointer to CTestCombiner
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CRemoteReceiver::CRemoteReceiver( CTestCombiner* aTestCombiner ):
- CActive( CActive::EPriorityStandard ),
- iState( EReceiverIdle ),
- iTestCombiner( aTestCombiner )
- {
- CActiveScheduler::Add( this );
- __TRACEFUNC();
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteReceiver
-
- Method: ConstructL
-
- Description: Symbian OS second phase constructor
-
- Symbian OS default constructor can leave.
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CRemoteReceiver::ConstructL()
- {
-
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteReceiver
-
- Method: NewL
-
- Description: Two-phased constructor.
-
- Parameters: CTestCombiner* aTestCombiner: in: Backpointer to CTestCombiner
-
- Return Values: CRemoteReceiver*: new object
-
- Errors/Exceptions: Leaves if new or ConstructL leaves
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-
-CRemoteReceiver* CRemoteReceiver::NewL( CTestCombiner* aTestCombiner )
- {
- CRemoteReceiver* self = new (ELeave) CRemoteReceiver( aTestCombiner );
-
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop();
-
- return self;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteReceiver
-
- Method: ~CRemoteReceiver
-
- Description: Destructor
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-
-CRemoteReceiver::~CRemoteReceiver()
- {
- __TRACEFUNC();
- Cancel();
-
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteReceiver
-
- Method: StartL
-
- Description: Activates receiving.
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CRemoteReceiver::Start()
- {
- __TRACEFUNC();
- __ASSERT_ALWAYS( iState == EReceiverIdle,
- User::Panic( KRemoteReceiver, KErrGeneral ) );
- iState = EReceiverPending;
-
- iTestCombiner->TestModuleIf().RemoteReceive( iRemoteMsg, iStatus );
- SetActive();
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteReceiver
-
- Method: RunL
-
- Description: Derived from CActive, handles testcase execution.
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: Leaves on error situations.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CRemoteReceiver::RunL()
- {
- __TRACEFUNC();
-
- __ASSERT_ALWAYS( iState == EReceiverPending,
- User::Panic( KRemoteReceiver, KErrGeneral ) );
- iState = EReceiverIdle;
-
- iTestCombiner->ReceiveResponse( iRemoteMsg );
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CRemoteReceiver
-
- Method: DoCancel
-
- Description: Derived from CActive handles the Cancel
-
- Parameters: None.
-
- Return Values: None.
-
- Errors/Exceptions: None.
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CRemoteReceiver::DoCancel()
- {
- __TRACEFUNC();
-
- iTestCombiner->TestModuleIf().RemoteReceiveCancel();
-
- }
-
-// ================= OTHER EXPORTED FUNCTIONS =================================
-
-/*
--------------------------------------------------------------------------------
-
- Function: LibEntryL
-
- Description: Polymorphic Dll Entry Point
-
- Parameters: None.
-
- Return Values: CTestCombiner*: pointer to new CTestCombiner
-
- Errors/Exceptions: Leaves if NewL leaves.
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-
-EXPORT_C CTestCombiner* LibEntryL()
- {
- return CTestCombiner::NewL();
- }
-
-// End of File