stif/TestScripter/src/TestScripter.cpp
branchRCL_3
changeset 59 8ad140f3dd41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/TestScripter/src/TestScripter.cpp	Wed Oct 13 16:17:58 2010 +0300
@@ -0,0 +1,5169 @@
+/*
+* 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 file contains TestScripter implementation.
+*
+*/
+
+// INCLUDE FILES
+#include <StifTestEventInterface.h>
+#include <StifLogger.h>
+#include "TestScripter.h"
+#include "TestKeywords.h"
+#include "Logging.h"
+#include "TestEngineClient.h"
+#include "SettingServerClient.h"
+
+#include <stifinternal/UiEnvProxy.h>
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES  
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+#ifdef LOGGER
+#undef LOGGER
+#endif
+#define LOGGER iLog
+
+// LOCAL CONSTANTS AND MACROS
+// None
+ 
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ==================== LOCAL FUNCTIONS =======================================
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: -
+
+     Method: CallBack
+
+     Description: (Function pointer) Called from CScriptBase class. Generic
+                  method for call back operations from Test Script Class to
+                  TestScripter.
+  
+     Parameters: CTestScripter* aTestScripter: in: Pointer to TestScripter
+                 TStifTSCallBackType aCallType: in: Call back type
+                 const TDesC& aLine: in Script line
+                    
+     Return Values: TInt: Symbian error code
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TInt CallBack( CTestScripter* aTestScripter,
+                TStifTSCallBackType aCallType,
+                const TDesC& aLine )
+    {
+    TInt ret( 0 );
+    switch( aCallType )
+        {
+        case EStifTSCallClass:
+            {
+            ret = aTestScripter->CallTestClass( aLine );
+            break;
+            }
+        case EStifTSGetObject:
+            {
+            ret = aTestScripter->GetTestScriptObject( aLine );
+            break;
+            }
+        default:
+            {
+            ret = KErrArgument;
+            break;
+            }
+        }
+
+    return ret;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This module contains the implementation of CTestScripter class 
+    member functions.
+
+-------------------------------------------------------------------------------
+*/
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: CTestScripter
+
+     Description: Default constructor
+
+     C++ default constructor can NOT contain any code, that
+     might leave.
+     
+     Parameters:    None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CTestScripter::CTestScripter()
+    {
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: ConstructL
+
+     Description: Symbian OS second phase constructor
+
+     Symbian OS default constructor can leave.
+
+     Parameters:    None
+
+     Return Values: None
+
+     Errors/Exceptions: None.
+
+     Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CTestScripter::ConstructL()
+    {
+    __TRACE( KPrint, ( _L("New TestScripter") ) );
+    iStdLog = CStifLogger::NewL( KTestScripterLogDir,
+                                KTestScripterLogFile );
+    iLog = iStdLog;
+
+    iOOMIgnoreFailure = EFalse; // OFF for default
+
+    iCheckHeapBalance = EFalse; // No checking heap balance by default
+
+    //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);
+        } 
+    // Close Setting server session
+    settingServer.Close();
+    iAddTestCaseTitleToLogName = loggerSettings.iAddTestCaseTitle;
+    
+    // Initialize parser variables
+    iCurrentParser = NULL;
+    iCurrentParserReadFirstLine = EFalse;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: NewL
+
+     Description: Two-phased constructor.
+          
+     Parameters:    None
+
+     Return Values: CTestScripter*: new object
+
+     Errors/Exceptions: Leaves if new or ConstructL leaves.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CTestScripter* CTestScripter::NewL()
+    {
+     
+    CTestScripter* self = new (ELeave) CTestScripter();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+     
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: ~CTestScripter
+
+     Description: Destructor
+     
+     Parameters:    None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CTestScripter::~CTestScripter()
+    {
+    iTestObjects.ResetAndDestroy();
+    iTestModules.ResetAndDestroy();
+    iDefinedIni.ResetAndDestroy();
+    iDefinedRuntime.ResetAndDestroy();
+    iDefinedLocal.ResetAndDestroy();
+    iParserStack.ResetAndDestroy();
+    iTestObjects.Close();
+    iTestModules.Close();
+    iDefinedIni.Close();
+    iDefinedRuntime.Close();
+    iDefinedLocal.Close();
+    iParserStack.Close();
+
+    iCurrentParser = NULL;
+    delete iSectionParser;
+    delete iTestRunner;
+
+    iLog = NULL;
+    delete iStdLog;
+    iStdLog = NULL;
+    delete iTCLog;
+    iTCLog = NULL;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     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 CTestScripter::InitL( TFileName& aIniFile, 
+                           TBool /*aFirstTime*/ )
+    {
+ 
+    __TRACEFUNC();
+ 
+    if( aIniFile.Length() > 0 )
+        {
+        // Read initialization from test case file
+        ReadInitializationL( aIniFile, iDefinedIni );
+        }
+        
+    return KErrNone;
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: GetTestCases
+
+     Description: GetTestCases is used to inquired test cases
+
+     Parameters:    const TFileName& aConfigFile: in: Test case file
+                    RPointerArray<RTestEngine::TTestCaseInfo>& aTestCases: out: 
+                          Array of TestCases 
+     
+     Return Values: KErrNone: Success
+                    Symbian OS error code
+
+     Errors/Exceptions: Leaves if CStifParser::SectionL leaves
+                        Leaves if CStifParser::NextSectionL leaves
+                        Leaves if memory allocation fails
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/        
+TInt CTestScripter::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; 
+    
+    // Open test case file
+    TRAPD( err, 
+        parser = CStifParser::NewL( _L(""), 
+                                    aConfigFile, 
+                                    CStifParser::ECStyleComments ) );
+    if( err != KErrNone )
+        {
+        __TRACE( KError, (_L("Given test case script file [%S] not found"),
+            &aConfigFile ) );
+        __RDEBUG( (_L("Given test case script file [%S] not found"),
+            &aConfigFile ) );
+        return err;
+        }
+        
+    CleanupStack::PushL( parser );
+    CStifSectionParser* section;
+    TPtrC tmp;
+    TInt index = 0;
+    TInt ret = KErrNone;
+
+    // Find first section
+    section = parser->SectionL( KTestStartTag, KTestEndTag );
+    if( section == NULL )
+        {
+        ret = KErrNotFound;
+        }
+    else
+        {    
+        // Parse all sections
+        while( section )
+            {
+            CleanupStack::PushL( section );
+             
+            // Get title line
+            if( section->GetLine( TTestKeywords::Keyword( TTestKeywords::ETitle ),
+                tmp, ENoTag ) != KErrNone )
+                {
+                __TRACE( KError, (_L("Title not given for test case")));
+                User::Leave( KErrNotFound );
+                }
+            else
+                {
+                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;
+                 
+                 // Get timeout if defined
+                CStifItemParser* item = section->GetItemLineL(  
+                   TTestKeywords::Keyword( TTestKeywords::ETimeout ) );
+                if( item )
+                    {
+                    TInt timeout; // In milliseconds
+                    ret = item->GetInt( 
+                        TTestKeywords::Keyword( TTestKeywords::ETimeout ), 
+                        timeout ); 
+                    if( ret != KErrNone )
+                        {
+                        __TRACE( KError, (_L("Illegal timeout")));
+                        User::Leave( ret ); 
+                        }
+                        
+                    // Type cast timeout to TInt64    
+                    tc->iTimeout = TInt64( timeout ) * 1000;
+                    __TRACE( KMessage, (_L("Timeout: %i"), tc->iTimeout.Int64() ));
+                    }
+                    
+                 // Get priority if defined
+                item = section->GetItemLineL(  
+                   TTestKeywords::Keyword( TTestKeywords::EPriority ) );
+                if( item )
+                    {
+                    // First try to interpret as integer
+                    ret = item->GetInt( 
+                        TTestKeywords::Keyword( TTestKeywords::EPriority ), 
+                        tc->iPriority ); 
+                    if( ret != KErrNone )
+                        {
+                        TPtrC priority;
+                        // If priority was not given as integer, it must be 
+                        // one of the predefined values
+                        ret = item->GetString( 
+                            TTestKeywords::Keyword( TTestKeywords::EPriority ),
+                            priority );
+                        if( ret != KErrNone )
+                            {
+                            __TRACE( KError, (_L("Illegal priority")));
+                            User::Leave( ret ); 
+                            }
+                        switch( TTestKeywords::Parse( priority, 
+                                                       TTestKeywords::Priority ) )
+                            {
+                            case TTestKeywords::EPriHigh:
+                                tc->iPriority = TTestCaseInfo::EPriorityHigh;
+                                break;
+                            case TTestKeywords::EPriNormal:
+                                tc->iPriority = TTestCaseInfo::EPriorityNormal;
+                                break;
+                            case TTestKeywords::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: CTestScripter
+
+     Method: GetConstantValue
+
+     Description: Internal fuction to get const value defined in 
+                  [Define]...[Enddefine] section of script file
+
+     GetConstantValue gets const value defined in [Define]...[Enddefine] 
+     section of script file
+
+     Parameters:    const TDesC& aName: in: constant name 
+                    TDes& avalue: out: constant value
+
+     Return Values: KErrNone: Value is returned succesfully.
+                    KErrNotFound: Constant was not found
+                    Any other SymbianOS error
+                    
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CTestScripter::GetConstantValue( const TDesC& aName, TDes& aValue )
+	{
+	
+	__TRACEFUNC();
+
+    TInt count = iDefinedLocal.Count();
+    for(TInt i = 0; i < count; i++)
+        {
+        if(iDefinedLocal[i]->Name() == aName)
+            {
+            aValue.Copy(iDefinedLocal[i]->Value());
+            return KErrNone;
+            }
+        }	
+
+	  count = iDefinedIni.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        if( iDefinedIni[i]->Name() == aName )
+            {
+            aValue.Copy( iDefinedIni[i]->Value() );
+            return KErrNone;
+            }
+        }	
+	
+    count = iDefinedRuntime.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        if( iDefinedRuntime[i]->Name() == aName )
+            {
+            aValue.Copy( iDefinedRuntime[i]->Value() );
+            return KErrNone;
+            }
+        }	
+    return KErrNotFound;
+	}
+
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: RunTestCaseL
+
+     Description: Run a specified testcase.
+
+     RunTestCaseL is used to run an individual test case. 
+  
+     Parameters:    const TInt aCaseNumber: in: Testcase number 
+                    const TFileName& aConfig: in: Test case file
+                    TTestResult& aResult: out: test case result
+
+     Return Values: KErrNone: Test case started succesfully.
+                    KErrNotFound: Testcase not found
+                    KErrUnknown: Unknown TestScripter error
+                    Any other SymbianOS error
+
+     Errors/Exceptions: Leaves if GetTestCaseL leaves
+                        Leaves if RunTestL leaves
+                        Leaves if memory allocation fails
+     
+     Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CTestScripter::RunTestCaseL( const TInt aCaseNumber,
+                                  const TFileName& aConfig,
+                                  TTestResult& aResult )
+    {
+
+    // Heap is checked by test server
+    //__UHEAP_MARK;
+
+    __TRACEFUNC();
+
+    //Open new log file with test case title in file name
+    if(iAddTestCaseTitleToLogName)
+        {
+        //Delete test case logger if exists
+        if(iTCLog)
+            {
+            delete iTCLog;
+            iTCLog = NULL;
+            }
+            
+        TFileName logFileName;
+        TName title;
+        TestModuleIf().GetTestCaseTitleL(title);
+        
+        logFileName.Format(KTestScripterLogFileWithTitle, &title);
+        iTCLog = CStifLogger::NewL(KTestScripterLogDir, logFileName);
+        iLog = iTCLog;
+        }
+
+    __TRACE( KMessage, (_L("\n\n***Testcase started***")));
+
+    // Remove locally defined variables 
+    iDefinedLocal.ResetAndDestroy();
+    // Remove existing function parsers (there shouldn't be any)
+    iParserStack.ResetAndDestroy();
+    
+    // Keep file name of config file
+    iConfig = aConfig;
+
+    // Read initialization from test case file
+    ReadInitializationL( aConfig, iDefinedRuntime );
+
+    // Get case from test case file
+    iSectionParser = GetTestCaseL( aCaseNumber, aConfig );
+    iCurrentParser = iSectionParser;
+    iCurrentParserReadFirstLine = EFalse;
+
+    // Check parsing result
+    if( iSectionParser == NULL )
+        {
+        __TRACE( KError, (_L("***Parsing testcase failed***\n\n")));
+        // Delete runtime defines
+        iDefinedRuntime.ResetAndDestroy();
+        //__UHEAP_MARKEND;
+        return KErrNotFound;
+        }
+
+    // When option is set in cfg file, on EKA2 env memory leaking is enabled
+	TInt memCellsBef = 0; //memory in current thread allocated before the test case is run
+	TInt memCellsAft = 0; //memory in current thread allocated after the test case has run
+
+   	memCellsBef = User::Heap().Count();
+	__TRACE(KMessage, (_L("Allocated memory cells before the test case: %d"), memCellsBef));
+
+    CActiveScheduler* activeScheduler =
+        new ( ELeave ) CActiveScheduler();
+    CleanupStack::PushL( activeScheduler );
+     
+    if ( CActiveScheduler::Current() == NULL )
+    	{
+    	CActiveScheduler::Install( activeScheduler );
+    	}
+
+    // Run the given testcase described in iSectionParser section
+    RunTestL();
+
+    iTestObjects.ResetAndDestroy();
+    iTestModules.ResetAndDestroy();
+
+    // TestScripter must stop Active Scheduler after test
+    // object is destroyed. Otherwise if unexpected error occurs
+    // handling is erronous.
+    CleanupStack::PopAndDestroy( activeScheduler );
+
+	// Check for memory leak.
+	// It is reported in log always, but result of test case is changed only
+	// when option in cfg file is enabled.
+	memCellsAft = User::Heap().Count();
+	__TRACE(KMessage, (_L("Allocated memory cells after the test case: %d"), memCellsAft));
+
+	// if there is a difference report memory leak
+	if(memCellsAft != memCellsBef)
+		{
+		__TRACE(KError, (_L("Memory leak, %d cell(s) is missing"), memCellsAft - memCellsBef));
+		if(iCheckHeapBalance)
+			{
+			// Memory leaks detection is disabled for UI components testing
+			if ( !( TestModuleIf().UITesting() ) )
+				{
+				UpdateTestCaseResult(KErrGeneral, _L("Memory leak has occured"));
+				}
+			}
+		}
+
+    // Delete parser and set current parser to NULL
+    iCurrentParser = NULL;
+    delete iSectionParser;
+    iSectionParser = NULL;  
+    
+    // Erase config file name
+    iConfig = KNullDesC; 
+    
+    // Return result 
+    aResult = iResult;
+    
+    if( iResult.iResult == KErrNone )
+        {
+        __TRACE( KPrint, (_L("***Testcase PASSED***\n\n")));
+        TestModuleIf().Printf( KPrintPriNorm, _L("TestScripter"), 
+            _L("***Testcase PASSED***\n\n"));
+        }
+    else
+        {        
+        __TRACE( KPrint, (_L("***Testcase FAILED***\n\n")));
+        TestModuleIf().Printf( KPrintPriNorm, _L("TestScripter"), 
+            _L("***Testcase FAILED***\n\n"));
+        }
+    User::After(300000);
+    // Delete runtime defines
+    iDefinedRuntime.ResetAndDestroy();
+    
+    //__UHEAP_MARKEND;
+             
+    //If log was replaced then restore it
+    if(iAddTestCaseTitleToLogName)
+        {
+        iLog = iStdLog;
+        delete iTCLog;
+        iTCLog = NULL;
+        }
+    
+    return KErrNone;
+     
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     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 CTestScripter::ReadInitializationL(
+    const TDesC& aIniFile,
+    RPointerArray<CDefinedValue>& aDefines )
+    {
+
+    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 ) );
+
+        CStifSectionParser* 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 = aDefines.Count();
+                TInt i = 0;
+                for( ; i < count; i++ )
+                    {
+                    if( aDefines[i]->Name() == name )
+                        {
+                        // Update existing
+                        aDefines[i]->SetValueL( value );
+                        __TRACE(KMessage, (_L("Update define [%S]: [%S]"), &name, &value));
+                        break;
+                        }
+                    }
+                if( i == count)
+                    {
+                    // New define, store it
+                    CDefinedValue* define = CDefinedValue::NewL( name, value );
+                    CleanupStack::PushL( define );
+                    User::LeaveIfError( aDefines.Append( define ) );
+                    CleanupStack::Pop( define );
+                    }
+
+                CleanupStack::PopAndDestroy( item );
+                item = section->GetNextItemLineL();
+                }
+            CleanupStack::PopAndDestroy( section );
+            section = parser->NextSectionL(KDefineStartTag, KDefineEndTag);
+            }
+
+		//Read StifSettings section and find value for CheckHeapBalance.
+		//(In cfg file in settings section User may also set CapsModifier
+		// option. This is handled in TestServerClient.cpp in 
+		// RTestServer::GetCapsModifier method).
+		section = parser->SectionL(KStifSettingsStartTag, KStifSettingsEndTag);
+
+		if(section)
+			{
+			CleanupStack::PushL(section);
+			__TRACE(KMessage, (_L("Read stif settings")));
+
+			TPtrC value;
+			CStifItemParser* item = section->GetItemLineL(_L(""));
+			while(item)
+				{
+				CleanupStack::PushL(item);
+				__TRACE( KMessage, (_L("Got settings line")));
+
+				if(item->GetString(_L("CheckHeapBalance="), value) == KErrNone)
+					{
+					__TRACE(KMessage, (_L("Got CheckHeapBalance item, value=%S"), &value));
+					if(value.Compare(_L("off")) == 0)
+		       			{
+		       			iCheckHeapBalance = EFalse;
+		       			}
+					else if(value.Compare(_L("on")) == 0)
+						{
+						iCheckHeapBalance = ETrue;
+		       			}
+					else
+						{
+						__TRACE(KError, (_L("Value '%S' for CheckHeapBalance setting is not supported. Aborting"), &value));
+						User::Leave(KErrNotSupported);
+						}
+					}
+				CleanupStack::PopAndDestroy(item);
+				item = section->GetNextItemLineL();
+				}
+			CleanupStack::PopAndDestroy(section);
+			}
+
+        CleanupStack::PopAndDestroy( parser );
+        }
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     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: CStifSectionParser*: pointer to test case section
+
+     Errors/Exceptions: Leaves if CStifParser::NewL leaves
+                        Leaves if CStifParser::SectionL leaves
+                        Leaves if memory allocation fails
+                                
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CStifSectionParser* CTestScripter::GetTestCaseL( const TInt aCaseNumber, 
+                                             const TFileName& aConfig )
+    {
+    __TRACEFUNC();
+    CStifParser* parser = NULL;
+    
+    TRAPD( err, 
+        parser = CStifParser::NewL( _L(""), 
+                                    aConfig, 
+                                    CStifParser::ECStyleComments ); );
+    if( err != KErrNone )
+        {
+        __TRACE( KError, (_L("Test case file [%S] not found"), &aConfig ));
+        User::Leave( err );
+        }
+    CleanupStack::PushL( parser );
+
+    CStifSectionParser* section = NULL;
+    TRAP( err, 
+        section =parser->SectionL( KTestStartTag, KTestEndTag, aCaseNumber ););
+    if( err != KErrNone )
+        {
+        __TRACE( KError, 
+            (_L("Section [%S/%d] not found"), &aConfig, aCaseNumber ));
+        User::Leave( err );
+        }
+
+    CleanupStack::PopAndDestroy( parser );
+    return section;
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: GetSubL
+
+     Description: Get specified function (sub) from stored config file.
+
+     Parameters:    const TDesC& aSubName: in: function name 
+     
+     Return Values: CStifSectionParser*: pointer to test function section
+
+     Errors/Exceptions: Leaves if CStifParser::NewL leaves
+                        Leaves if CStifParser::SectionL leaves
+                        Leaves if memory allocation fails
+                                
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CStifSectionParser* CTestScripter::GetSubL(const TDesC& aSubName)
+    {
+    __TRACE(KMessage, (_L("Searching sub [%S]."), &aSubName));
+    // Check if config file is set
+    if(iConfig.Length() == 0)
+        {
+        __TRACE(KError, (_L("Searching sub [%S]. Config file is not set."), &aSubName));
+        User::Leave(KErrBadName);
+        }
+        
+    // Create parser
+    CStifParser* parser = NULL;
+    CStifSectionParser* section = NULL;
+        
+    TRAPD(err, 
+          parser = CStifParser::NewL(_L(""), iConfig, CStifParser::ECStyleComments);
+         );
+    if(err != KErrNone)
+        {
+        __TRACE(KError, (_L("Searching sub [%S]. Error [%d] when loading config file [%S]."), &aSubName, err, &iConfig));
+        User::Leave(err);
+        }
+    CleanupStack::PushL(parser);
+
+    // Set section tags
+    _LIT(KEndSubTag, "[EndSub]");
+    TName startSubTag;
+    startSubTag.Copy(_L("[Sub "));
+    startSubTag.Append(aSubName);
+    startSubTag.Append(_L("]"));
+    
+    // Load section
+    TRAP(err, 
+         section = parser->SectionL(startSubTag, KEndSubTag, 1);
+        );
+    if(err != KErrNone)
+        {
+        __TRACE(KError, (_L("Searching sub [%S]. Searching section %S%S ended with error [%d]."), &aSubName, &startSubTag, &KEndSubTag, err));
+        User::Leave(err);
+        }
+    if(!section)
+        {
+        __TRACE(KError, (_L("Searching sub [%S]. Section %S%S not found."), &aSubName, &startSubTag, &KEndSubTag));
+        User::Leave(err);
+        }
+    else
+        {
+        __TRACE(KMessage, (_L("Searching sub [%S]. Section %S%S found."), &aSubName, &startSubTag, &KEndSubTag));
+        }
+
+    CleanupStack::PopAndDestroy(parser);
+    return section;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     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: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestScripter::RunTestL()
+    {
+    __TRACEFUNC();
+    iResult.iResult = KErrNone;
+    iResult.iResultDes.Zero();
+     
+    // "title" keyword must be in the first line
+    TPtrC title;
+    if( iCurrentParser->GetLine( 
+        TTestKeywords::Keyword( TTestKeywords::ETitle ), title, ENoTag ) 
+        != KErrNone )
+        {
+        __TRACE( KError, (_L("title not found from section")));
+        User::Leave( KErrNotFound ); 
+        }
+    iCurrentParserReadFirstLine = ETrue;
+
+    __TRACE( KMessage, (_L("RunTest: %S"), &title ));
+     
+    iTestRunner = CTestRunner::NewL( this );
+
+    TestModuleIf().Printf( KPrintPriNorm, _L("RunTest"), _L("%S"), &title );
+    
+    // Rest of the job is done by test runner
+    iTestRunner->SetRunnerActive();
+
+    // Start activeScheduler looping testcase lines
+    __TRACE( KMessage, (_L("Start CActiveScheduler")));
+    CActiveScheduler::Current()->Start();
+  
+    delete iTestRunner;
+    iTestRunner = NULL;
+    __TRACE( KMessage, ( _L("RunTestL: Done")));
+ 
+    // Destroy locally defined variables 
+    iDefinedLocal.ResetAndDestroy();
+    // Destroy function parsers (there shouldn't be any)
+    iParserStack.ResetAndDestroy();
+    }     
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     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
+     
+     Return Values: CTCTestModule*: pointer to testmodules description
+     
+     Errors/Exceptions: Leaves if CTCTestModule::NewL leaves
+                        Leaves if RPointerArray::Append fails  
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/              
+TTestModule* CTestScripter::LoadTestModuleL( TDesC& aModule )
+    {     
+    __TRACEFUNC();
+    TInt count = iTestModules.Count();
+    for( TInt i=0; i < count; i++ )
+        {
+        if( iTestModules[i]->ModuleName() == aModule )
+            {
+            // Found test module, return description
+            __TRACE( KMessage, 
+                (_L("GetTestModuleL: Use already loaded TestModule (%S)"), 
+                &aModule ));
+            return iTestModules[i];
+            }
+        }
+         
+    __TRACE( KMessage, (_L("GetTestModuleL: Load new TestModule (%S)"), 
+        &aModule ));
+    TTestModule* module = new (ELeave) TTestModule();
+    CleanupStack::PushL( module );
+    module->ModuleName() = aModule;
+    User::LeaveIfError( iTestModules.Append( module ) );
+    CleanupStack::Pop( module );
+
+    TInt ret = module->iLibrary.Load ( aModule );
+    
+    if( ret != KErrNone )
+        {
+        __TRACE( KMessage, (_L("GetTestModuleL: %S loading failed"), 
+            &aModule ));
+        TestModuleIf().Printf( KMessage, _L("Load dll"), _L("%S failed"), 
+            &aModule );
+        
+        User::Leave( ret );
+        }
+         
+    // Get pointer to first exported function    
+    module->iLibEntry = (CInterfaceFactory) module->iLibrary.Lookup(1);
+    return module;
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: CreateObjectL
+
+     Description: Load testmodule if not already loaded, otherwise return
+                  description of the loaded testmodule.
+
+     Parameters:    TDesC& aModule: in: module name
+                    TDesC& aObjectId: in: object id name
+     
+     Return Values: None
+     
+     Errors/Exceptions: Leaves on error
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestScripter::CreateObjectL( TDesC& aModule, TDesC& aObjectId )
+    {     
+    __TRACEFUNC();
+
+    // Load module and get pointer
+    TTestModule* module = LoadTestModuleL( aModule );
+    TTestObject* object = new (ELeave) TTestObject();
+    CleanupStack::PushL( object );
+    object->ObjectId() = aObjectId;
+    User::LeaveIfError( iTestObjects.Append( object ) );
+    CleanupStack::Pop( object );
+        
+    // Create object    
+    object->iScript = module->iLibEntry( TestModuleIf() );
+    //User::LeaveIfNull ( object->iScript );
+    if( object->iScript == NULL )
+        {
+        User::Leave( KErrGeneral );
+        }
+
+    // Create continue callback 
+    object->iContinue = CTestContinue::NewL( this, object );
+
+    // Create function pointer operation to possible
+    object->iScript->SetScripter( &CallBack, this );
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: CreateKernelObjectL
+
+     Description: Load testdriver if not already loaded, otherwise return
+                  description of the loaded testdriver.
+
+     Parameters:    TDesC& aDriver: in: driver name
+                    TDesC& aObjectId: in: object id name
+     
+     Return Values: None
+     
+     Errors/Exceptions: Leaves on error
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestScripter::CreateKernelObjectL( TDesC& aDriver, TDesC& aObjectId )
+    {     
+
+    __TRACEFUNC();
+    
+    if( ( aDriver.Length() > KMaxName ) ||
+        ( aObjectId.Length() > KMaxName ) )
+        {
+        __TRACE( KError, (_L("CreateKernelObjectL: Max lenght exceeded") ) );
+        User::Leave( KErrArgument );
+        }
+    TInt ret = User::LoadLogicalDevice( aDriver );
+    if( ( ret != KErrNone ) && ( ret != KErrAlreadyExists ) )
+        {
+        __TRACE( KError, 
+            (_L("CreateKernelObjectL: User::LoadLogicalDevice failed %d"), 
+                ret ) );
+        User::Leave( ret );
+        } 
+        
+    TTestObjectKernel* object = new (ELeave) TTestObjectKernel();
+    CleanupStack::PushL( object );
+    object->ObjectId() = aObjectId;
+    object->LddName().Copy( aDriver );
+    ret = object->KernelTestClass().Open( 
+                object->KernelTestClass().VersionRequired(), 
+                aDriver );
+    if( ret != KErrNone )
+        {
+        __TRACE( KError, 
+            (_L("CreateKernelObjectL: KernelTestClass().Open failed %d"), 
+                ret ) );
+        User::Leave( ret );
+        }
+        
+    User::LeaveIfError( iTestObjects.Append( object ) );
+    CleanupStack::Pop( object );
+        
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     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
+     
+     Return Values: CTCTestModule*: pointer to testmodules description
+     
+     Errors/Exceptions: Leaves if CTCTestModule::NewL leaves
+                        Leaves if RPointerArray::Append fails  
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TInt CTestScripter::DeleteObjectL( TDesC& aObjectId )
+    {     
+    __TRACEFUNC();
+
+    TInt count = iTestObjects.Count();
+    for( TInt i=0; i < count; i++ )
+        {
+        if( iTestObjects[i]->ObjectId() == aObjectId )
+            {
+            TTestObjectBase* object = iTestObjects[i];
+            iTestObjects.Remove( i );
+            delete object;
+            return KErrNone;
+            }
+        }
+     
+    return KErrNone;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     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: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TTestObjectBase* CTestScripter::GetObject( const TDesC& aObjectId )
+    {
+    __TRACEFUNC();
+    
+    TInt count = iTestObjects.Count();
+    for( TInt i=0; i < count; i++ )
+        {
+        if( iTestObjects[i]->ObjectId() == aObjectId )
+            {
+            // Found testcase with specified TestId
+            return iTestObjects[i];
+            }
+        }
+    // Object with iTestObjects not found
+    return NULL;
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: CallTestClass
+
+     Description: For sub classing operations.
+  
+     Parameters: const TDesC& aLine: in: script line
+                    
+     Return Values: TInt: Symbian error code
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TInt CTestScripter::CallTestClass( const TDesC& aLine )
+    {
+    CStifItemParser* item = CStifItemParser::NewL( aLine, 0, aLine.Length() );
+    CleanupStack::PushL( item );
+
+    TPtrC objectName;
+    TInt ret( KErrNone );
+    ret = item->GetString( _L( "" ), objectName );
+    if( ret != KErrNone )
+        {
+        CleanupStack::PopAndDestroy( item);
+        return ret;
+        }
+
+    TTestObjectBase* obj = GetObject( objectName );
+    if( obj == NULL )
+        {
+        CleanupStack::PopAndDestroy(item );
+        return KErrNotFound;
+        }
+
+    TRAPD( commandResult, commandResult = obj->RunMethodL( *item ) );
+
+    CleanupStack::PopAndDestroy(item );
+
+    return commandResult;
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: GetTestScriptObject
+
+     Description: Get object address.
+  
+     Parameters: const TDesC& aObjectName: in: object name
+                    
+     Return Values: TInt: Symbian error code
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TInt CTestScripter::GetTestScriptObject( const TDesC& aObjectName )
+    {
+
+    TTestObjectBase* objBase = GetObject( aObjectName );
+    if( ( objBase == NULL ) || 
+        ( objBase->ObjectType() != TTestObjectBase::EObjectNormal ) )
+        {
+        return KErrNotFound;
+        }
+    
+    TTestObject* object = ( TTestObject* )objBase;
+    
+    return (TInt) object->iScript;
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: UpdateTestCaseResult
+
+     Description: Updates result of test case. If there is already some
+                  description stored, it is put in the [] brackets.
+  
+     Parameters: const TInt aResult: in: error code
+                 const TDesC& aDescr: in: description
+                    
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestScripter::UpdateTestCaseResult(const TInt aResult, const TDesC& aDescr)
+    {
+    // Create buffer
+    RBuf buf;
+
+    TInt ret = buf.Create(iResult.iResultDes.Length() + aDescr.Length() + 5);
+    if(ret != KErrNone)
+        {
+        __TRACE(KError, (_L("UpdateResultDescription: descriptor creation failed [%d]"), ret));
+        return;
+        }
+    CleanupClosePushL(buf);
+
+    // Update result
+    iResult.iResult = aResult;
+    if(iResult.iResultDes.Length() > 0)
+        {
+        buf.Format(_L("%S [%S]"), &aDescr, &iResult.iResultDes);
+        }
+    else
+        {
+        buf.Copy(aDescr);
+        }
+
+    SetResultDescription(buf);
+    
+    // Close buffer
+    CleanupStack::PopAndDestroy(&buf);
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: SetResultDescription
+
+     Description: Sets result description of test case.
+  
+     Parameters: const TDesC& aDescr: in: new description
+                    
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+EXPORT_C void CTestScripter::SetResultDescription(const TDesC& aDescr)
+    {
+    if(aDescr.Length() > KStifMaxResultDes)
+        {
+        iResult.iResultDes.Copy(aDescr.Mid(0, KStifMaxResultDes));
+        }
+    else
+        {
+        iResult.iResultDes.Copy(aDescr);
+        }
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: SetLocalValue
+
+     Description: Internal fuction to set value of local variable defined in script 
+
+     Parameters:    const TDesC& aName: in: local variable name 
+                    const TDesC& avalue: in: local variable value
+
+     Return Values: KErrNone: Value is returned succesfully.
+                    KErrNotFound: Variable was not found
+                    Any other SymbianOS error
+                    
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CTestScripter::SetLocalValue(const TDesC& aName, const TDesC& aValue)
+    {	
+    __TRACEFUNC();
+
+    TInt count = iDefinedLocal.Count();
+    for(TInt i = 0; i < count; i++)
+        {
+        if(iDefinedLocal[i]->Name() == aName)
+            {
+            iDefinedLocal[i]->SetValueL(const_cast<TDesC&>(aValue));
+            return KErrNone;
+            }
+        }	
+
+    return KErrNotFound;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestScripter
+
+     Method: GetLocalValue
+
+     Description: Internal fuction to get value of local variable 
+
+     Parameters:    const TDesC& aName: in: local variable name 
+                    const TDesC& avalue: in: local variable value
+
+     Return Values: KErrNone: Value is returned succesfully.
+                    KErrNotFound: Variable was not found
+                    Any other SymbianOS error
+                    
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CTestScripter::GetLocalValue(const TDesC& aName, TDes& aValue)
+    {
+    __TRACEFUNC();
+
+    TInt count = iDefinedLocal.Count();
+    for(TInt i = 0; i < count; i++)
+        {
+        if(iDefinedLocal[i]->Name() == aName)
+            {
+            aValue.Copy(iDefinedLocal[i]->Value());
+            return KErrNone;
+            }
+        }	
+
+    return KErrNotFound;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This module contains the implementation of CTestRunner class 
+    member functions. CTestRunner is used to execute TestScripter testcase by 
+    CTestScripter.
+
+-------------------------------------------------------------------------------
+*/
+// MACROS
+#ifdef LOGGER
+#undef LOGGER
+#endif
+#define LOGGER iTestScripter->iLog
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: CTestRunner
+
+     Description: Default constructor
+
+     C++ default constructor can NOT contain any code, that
+     might leave.
+     
+     Parameters: CTestScripter* aTestScripter: in: Backpointer to CTestScripter
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CTestRunner::CTestRunner( CTestScripter* aTestScripter ): 
+    CActive(  CActive::EPriorityHigh ), // Executed with highest priority 
+    iState( ERunnerIdle ),
+    iTestScripter( aTestScripter ),
+    iRemainingTimeValue( 0 )
+    {
+    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: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::ConstructL()
+    {
+    
+    iPauseTimer.CreateLocal();
+    
+    // Initiaze all OOM related variables to default.
+    OOMHeapToNormal();
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: NewL
+
+     Description: Two-phased constructor.
+          
+     Parameters: CTestScripter* aTestScripter: in: Backpointer to CTestScripter
+
+     Return Values: CTestRunner*: new object
+
+     Errors/Exceptions: Leaves if new or ConstructL leaves
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+
+CTestRunner* CTestRunner::NewL( CTestScripter* aTestScripter )
+    {
+    CTestRunner* self = new (ELeave) CTestRunner( aTestScripter );
+     
+    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();
+
+    iPauseTimer.Close();
+    
+    delete iLine;
+    iLine = NULL;
+    
+    TInt count = iEventArray.Count();
+    TEventIf event( TEventIf::ERelEvent ); 
+    for( TInt i = 0; i < count; i++ )
+        {
+        HBufC* tmp = iEventArray[0];
+        event.SetName( iEventArray[0]->Des() );
+        iEventArray.Remove(0);
+		if( iTestScripter != NULL )
+			{
+			iTestScripter->TestModuleIf().Event( event );
+			}
+        delete tmp;
+        }
+     
+    iTestCaseResults.Reset();
+    iEventArray.ResetAndDestroy();
+    iTestCaseResults.Close();
+    iEventArray.Close();
+
+    // Reset test case allow result to CTestModuleIf side too. This is
+    // used in TAL-TA5L macro handling.
+	if( iTestScripter != NULL )
+		{
+		User::LeaveIfError( 
+			iTestScripter->TestModuleIf().ResetAllowResult() );
+		}
+		
+    // Stop all remaining interference object
+    TInt count_inter = iTestInterferenceArray.Count();
+    for( TInt a = 0; a < count_inter; a++ )
+        {
+		if( iTestInterferenceArray[a] != NULL )
+			{
+			iTestInterferenceArray[a]->iInterference->Stop();
+			}
+        }
+    iTestInterferenceArray.ResetAndDestroy();
+    iTestInterferenceArray.Close();
+    
+    // Stop all remaining measurement modules
+    const TInt count_meas = iTestMeasurementArray.Count();
+    for( TInt b = 0; b < count_meas; b++ )
+        {
+		if( iTestMeasurementArray[b] != NULL )
+			{
+			iTestMeasurementArray[b]->iMeasurement->Stop();
+			}
+        }
+    iTestMeasurementArray.ResetAndDestroy();
+    iTestMeasurementArray.Close();
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: RunL
+
+     Description: Derived from CActive, handles testcase execution.
+
+     Parameters:    None.
+
+     Return Values: None.
+
+     Errors/Exceptions: Leaves on error situations.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::RunL()
+    {
+    __TRACEFUNC();
+    __TRACE( KMessage, (_L("CTestRunner::RunL: [%d] "), iStatus.Int() ));
+     
+    // Check if we need to Pause test case again  
+    if( iStatus == KErrNone && iRemainingTimeValue > 0 )
+        {           
+        // Maximum time for one RTimer::After request                   
+        TInt maximumTime = KMaxTInt / 1000;                       
+        
+        __TRACE( KMessage, (_L("CTestRunner::RunL: Going to reissue After request ") ) );           
+        __TRACE( KMessage, (_L("CTestRunner::RunL: iRemainingTimeValue = %d"), iRemainingTimeValue ) );        
+        
+        if( iRemainingTimeValue < maximumTime )
+            {                           
+            iPauseTimer.After( iStatus, ( iRemainingTimeValue * 1000  ) );
+            iRemainingTimeValue = 0;
+            }
+        else
+            {            
+            iRemainingTimeValue -= maximumTime;
+            iPauseTimer.After( iStatus, ( maximumTime * 1000 ) );                
+            }     
+        SetActive();
+        }     
+    else    
+        {  
+        TBool continueTask = EFalse;
+
+        User::LeaveIfError( iStatus.Int() );
+
+        if( ( iTestScripter == NULL ) || 
+            ( iTestScripter->iCurrentParser == NULL ) )
+            {
+            __TRACE( KError, (_L("CTestRunner invalid arguments")));
+            User::Leave( KErrGeneral );
+            }
+           
+        iState = ERunnerIdle;
+
+        // Get next execution line from configuration section
+        TPtrC line;
+        // If current parser already has read the first line, then read next line.
+        // Otherwise read the first line.
+        if(iTestScripter->iCurrentParserReadFirstLine && iTestScripter->iCurrentParser->GetNextLine(line) == KErrNone 
+           || !iTestScripter->iCurrentParserReadFirstLine && iTestScripter->iCurrentParser->GetLine(KNullDesC, line) == KErrNone)
+            {
+            iTestScripter->iCurrentParserReadFirstLine = ETrue;
+            
+            // Got new execution line 
+            __TRACE( KMessage, (_L("Executing line [%S]"), &line));
+            
+            CStifItemParser* item = PreprocessLineL( line );
+                
+            CleanupStack::PushL( item ); 
+              
+            TPtrC keyword;
+             // Get first word from line, i.e. keyword
+            User::LeaveIfError( item->GetString( _L(""), keyword ) );
+
+            __TRACE( KMessage, (_L("CTestRunner execute %S"), &keyword ));
+
+            // Execute script line 
+            continueTask = ExecuteLineL( keyword, item );
+            __TRACE( KMessage, (_L("CTestRunner %S executed"), &keyword ));
+                         
+            if( continueTask )
+                {
+                  __TRACE( KMessage, (_L("RunL: continueTask")));
+                 // Set CTestRunner active again to perform 
+                 // next execution line
+                 // from testcase section 
+                SetRunnerActive();
+                }
+
+            CleanupStack::PopAndDestroy( item );
+            }
+        else // Stop execution if end of test case
+            {
+            __TRACE( KMessage, (_L("Executing line: no more lines from this section")));
+            // There is no more lines in current parser, but it needs to be
+            // checked if the parser is not taken for function (sub).
+            // If this is true, then we have to get back to the parser which
+            // has called the function.
+            TInt lastParserIndex = iTestScripter->iParserStack.Count() - 1;
+            if(lastParserIndex >= 0)
+                {
+                // Delete current (the last one) parser
+                delete iTestScripter->iParserStack[lastParserIndex];
+                iTestScripter->iParserStack.Remove(lastParserIndex);
+                if(lastParserIndex >= 1) //There is some other parser on the stack
+                    {
+                    iTestScripter->iCurrentParser = iTestScripter->iParserStack[lastParserIndex - 1];
+                    }
+                else //The parser stack is empty
+                    {
+                    iTestScripter->iCurrentParser = iTestScripter->iSectionParser;
+                    }
+                __TRACE(KMessage, (_L("Returning to calling parser stored on section stack")));
+                
+                // Continue with the test case
+                __TRACE(KMessage, (_L("RunL: continueTask (end of Sub reached)")));
+                SetRunnerActive();
+                return;
+                }
+            // No more execution lines in testcase section
+            __TRACE( KMessage, 
+                (_L("CTestRunner::RunL: Testcase script done") ));
+            iTestScripter->TestModuleIf().Printf( KPrintPriLow, 
+                _L("RunL"), _L("Script done"));
+            
+       
+            __TRACE( KMessage, 
+                (_L("RunL: All TestCases done, stop CActiveScheduler")));
+            CActiveScheduler::Current()->Stop();
+            // Now testcase section is executed, 
+            // so CTestRunner has done its job and stops
+            }
+        }
+    }
+     
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: DoCancel
+
+     Description: Derived from CActive handles the Cancel
+
+     Parameters:    None.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::DoCancel()
+    {
+    __TRACEFUNC();
+    __TRACE( KMessage, (_L("CTestRunner::DoCancel")));
+    iTestScripter->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), _L("DoCancel"));
+    
+    if( iState == ERunnerPaused )
+        {
+        iPauseTimer.Cancel();
+        }
+   
+    CActiveScheduler::Current()->Stop();
+         
+    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: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TInt CTestRunner::RunError( TInt aError )
+    {
+    __TRACEFUNC();
+    __TRACE( KMessage, (_L("CTestRunner::RunError %d"), aError));
+
+    if ( iRunErrorMessage.Length() != 0 )
+    	{
+	    iTestScripter->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), 
+	            _L("RunError : %S"), &iRunErrorMessage );  
+	    iRunErrorMessage = KNullDesC;
+    	}
+    else
+    	{
+	    iTestScripter->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), 
+	            _L("RunError"));        	
+    	}
+
+    iState = ERunnerError;
+    
+    // Return error from here, if none given from execution
+    if( iTestScripter->iResult.iResult == KErrNone )
+        {
+        iTestScripter->UpdateTestCaseResult(aError, _L("CTestRunner::RunError"));
+        }
+        
+    CActiveScheduler::Current()->Stop();
+        
+    return KErrNone;
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: PreprocessLineL
+
+     Description: Preprocesses script line
+  
+     Parameters:  TPtrC& line: in: script line
+                  CStifItemParser*& aItem: out: New CItemParser 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;
+    TInt ret = 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;
+    
+    HBufC* sourceLine = line.AllocL();
+    CleanupStack::PushL(sourceLine);
+    
+    //Check for local variable definitions
+    item = CStifItemParser::NewL(sourceLine->Des(), 0, sourceLine->Length());
+    CleanupStack::PushL(item);
+    
+    ret = item->GetString(KNullDesC, tmp);
+    TBool isVarDefinition = (tmp == TTestKeywords::Keyword(TTestKeywords::EVar));
+         
+    if(!isVarDefinition)
+        {
+        while( ret == KErrNone )
+            {
+            len += CheckDefinedLocals(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);        
+            ret = item->GetNextString(tmp);
+            if(ret == KErrNone)
+                {
+                // Add space only if we got new string
+                parsedLine.Append(_L(" "));        
+                }
+            }
+        CleanupStack::PopAndDestroy(item);
+        item = NULL;
+        CleanupStack::PopAndDestroy(sourceLine);
+        sourceLine = NULL;
+        
+        //Prepare data for checking for defines
+        sourceLine = parsedLine.AllocL();
+        CleanupStack::PushL(sourceLine);
+        parsedLine.Zero();
+        
+        item = CStifItemParser::NewL(sourceLine->Des(), 0, sourceLine->Length());
+        CleanupStack::PushL(item);
+    
+        ret = item->GetString(KNullDesC, tmp);
+        }
+
+    //Check for defines
+    while(ret == KErrNone)
+        {
+        if(!isVarDefinition)
+            {
+            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);        
+        ret = item->GetNextString(tmp);
+        if( ret == KErrNone )
+            {
+            // Add space only if we got new string
+            parsedLine.Append(_L(" "));        
+            }
+        }
+    
+    //Cleaning...
+    CleanupStack::PopAndDestroy(item);
+    item = NULL;
+    CleanupStack::PopAndDestroy(sourceLine);
+    sourceLine = NULL;
+
+    __TRACE(KMessage, (_L("Preprocessed line [%S]"), &parsedLine));
+    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 diference between new and old word
+     
+     Errors/Exceptions: None.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/   
+TInt CTestRunner::CheckDefined( TPtrC& aWord )
+    {
+    
+    TInt len = 0;
+    TInt i = 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;
+        }
+
+    // First, check values defined in test case file
+    TInt count = iTestScripter->iDefinedRuntime.Count();
+    for( i = 0; i < count; i++ )
+        {
+        if( iTestScripter->iDefinedRuntime[i]->Name() == aWord )
+            { 
+            len = iTestScripter->iDefinedRuntime[i]->Value().Length() - aWord.Length();
+            aWord.Set( iTestScripter->iDefinedRuntime[i]->Value() );
+            return len;
+            }
+        }
+
+    // Second, check values defined in test module initialization file
+    count = iTestScripter->iDefinedIni.Count();
+    for( i = 0; i < count; i++ )
+        {
+        if( iTestScripter->iDefinedIni[i]->Name() == aWord )
+            { 
+            len = iTestScripter->iDefinedIni[i]->Value().Length() - aWord.Length();
+            aWord.Set( iTestScripter->iDefinedIni[i]->Value() );
+            return len;
+            }
+        }
+
+    return len;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: CheckDefinedLocals
+
+     Description: Check if aWord is a local variable
+  
+     Parameters:  TPtrC& aWord: inout: Parsed word, defined or original returned
+                    
+     Return Values: TInt: length diference between new and old word
+     
+     Errors/Exceptions: None.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/   
+TInt CTestRunner::CheckDefinedLocals( TPtrC& aWord )
+    {
+    
+    TInt len = 0;
+    TInt i = 0;
+
+    TInt count = iTestScripter->iDefinedLocal.Count();
+    for(i = 0; i < count; i++)
+        {
+        if(iTestScripter->iDefinedLocal[i]->Name() == aWord)
+            { 
+            len = iTestScripter->iDefinedLocal[i]->Value().Length() - aWord.Length();
+            aWord.Set(iTestScripter->iDefinedLocal[i]->Value());
+            return len;
+            }
+        }
+
+    return len;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: ExecuteLineL
+
+     Description: Executes script line
+  
+     Parameters:    TDesC& aKeyword: in: keyword string
+                    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::ExecuteLineL( TDesC& aKeyword,
+                                 CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgDeleteNoParam, "Delete: Name of object is not defined" );
+    _LIT( KErrMsgDeleteObjNotFound, "Delete: Can't delete object %S. Object does not exists." );
+    _LIT( KErrMsgPauseTimeoutNotDefined, "Pause: No timeout value given or value has invalid format" );
+    _LIT( KErrMsgPauseTimeoutNotPositive, "Pause: Timeout value can't be <0" );
+    _LIT( KErrMsgCreateTestModeleNotDefined, "Create: Name of test module is not defined" );
+    _LIT( KErrMsgCreateObjectIdNotDefined, "Create: Name of test module object is not defined" );
+    _LIT( KErrMsgCreateKernelDriverNotDefined, "CreateKernel: Kernel driver name is not defined" );
+    _LIT( KErrMsgCreateKernelObjectNameNotDefined, "CreateKernel: Kernel driver object name is not defined" );
+    _LIT( KErrMsgCreateKernelFailed, "CreateKernel: Can't creeate kernel driver %S" );
+    _LIT( KErrMsgWaitTestClassNameNotDefined, "WaitTestClass: Test class object name is not defined" );
+    _LIT( KErrMsgWaitTestClassObjNotFound, "WaitTestClass: Test class object %S does not exists" );
+    _LIT( KErrMsgLoopNested, "Loop: Nested loop are not supported" );
+    _LIT( KErrMsgLoopNoParam, "Loop: No loop iterations count given or value has invalid format" );
+    _LIT( KErrMsgLoopInvalidParam, "Loop: Loop count must be >0" );
+    _LIT( KErrMsgLoopUnknownUnexpectedOption, "Loop: Unknown or unexpected loop option");
+    _LIT( KErrMsgEndLoopNotOpened, "Endloop: Can't execute endloop. No opened loop exists" );
+    _LIT( KErrMsgBringToForegroundNotSupported, "BringToForeground: BringToForeground is not supported in non s60 environment" );
+    _LIT( KErrMsgSendToBackgroundNotSupported, "SendToBackground: SendToBackground is not supported in non s60 environment" );    
+    _LIT( KErrMsgPressKeyNotSupported, "PressKey: PressKey is not supported in non s60 environment. Check if .cfg file name contains ui_ prefix and UITestingSupport= YES entry is defined in TestFrameworkd.ini" );
+    _LIT( KErrMsgTypeTextNotSupported, "TypeText: TypeText is not supported in non s60 environment. Check if .cfg file name contains ui_ prefix and UITestingSupport= YES entry is defined in TestFrameworkd.ini" );
+    _LIT( KErrMsgSendPointerEventNotSupported, "SendPointerEvent: SendPointerEvent is not supported in non s60 environment. Check if .cfg file name contains ui_ prefix and UITestingSupport= YES entry is defined in TestFrameworkd.ini" );
+    _LIT( KErrVarNameError, "Variable: Could not get variable name");
+    _LIT( KErrVarValueError, "Variable: Value too long");
+    _LIT( KErrSubNameError, "Sub: Could not get name of Sub to be called");
+    _LIT( KErrSubGetError, "Sub: Could not get Sub section");
+    
+    iRunErrorMessage = KNullDesC;    
+    TBool continueTask = ETrue;
+    
+    TInt key = TTestKeywords::Parse( aKeyword, TTestKeywords::Keyword );
+
+    switch( key )
+        {
+        // Test case execution control cases
+        case TTestKeywords::ECreate:
+        case TTestKeywords::ECreateX:
+            {
+            TPtrC tmp;
+            TName module;
+
+            // Testmodule name
+            TInt ret = aItem->GetNextString( tmp );
+            if ( ret != KErrNone )
+            	{
+            	iRunErrorMessage = KErrMsgCreateTestModeleNotDefined;
+            	User::Leave( KErrArgument );
+            	}
+            TParse p;
+            p.Set( tmp, NULL, NULL );
+            // Check if exists in module name
+            if( p.ExtPresent() )
+                {
+                module.Copy( tmp );
+                }
+            else 
+                {
+                // No extension in module name, add it here
+                _LIT( KDllExtension, ".dll");
+                module.Copy( tmp );
+                module.Append( KDllExtension );
+                }
+
+            // objectid
+            ret = aItem->GetNextString( tmp );
+            if ( ret != KErrNone )
+            	{
+            	iRunErrorMessage = KErrMsgCreateObjectIdNotDefined;
+            	User::Leave( KErrArgument );
+            	}        
+
+            __TRACE( KMessage, (_L("%S %S"), &aKeyword, &tmp));
+            iTestScripter->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), 
+                _L("%S %S"), &aKeyword, &tmp);
+
+            iTestScripter->CreateObjectL( module, tmp );
+            }
+            break;
+        case TTestKeywords::ECreateKernel:
+            {
+            TPtrC obj;
+            TPtrC driver;
+
+            // Testdriver name
+            TInt ret = aItem->GetNextString( driver );
+            if ( ret != KErrNone )
+            	{
+            	iRunErrorMessage = KErrMsgCreateKernelDriverNotDefined;
+            	User::Leave( ret );
+            	}
+
+            // objectid            
+            ret = aItem->GetNextString( obj );
+            if ( ret != KErrNone )
+            	{
+            	iRunErrorMessage = KErrMsgCreateKernelObjectNameNotDefined;
+            	User::Leave( ret );
+            	}
+
+            __TRACE( KMessage, (_L("%S %S"), &aKeyword, &obj));
+            iTestScripter->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), 
+                _L("%S %S"), &aKeyword, &obj);
+            TInt leaveErr = KErrNone;
+            TRAP( leaveErr, iTestScripter->CreateKernelObjectL( driver, obj ));
+            if ( leaveErr != KErrNone )
+            	{
+            	iRunErrorMessage.Format( KErrMsgCreateKernelFailed, &driver );
+                User::Leave( leaveErr );
+            	}
+            }
+            break;
+        case TTestKeywords::EDelete:
+            {
+            TPtrC tmp;
+            // objectid
+            TInt ret = aItem->GetNextString( tmp );
+            if ( ret != KErrNone )
+            	{
+                iRunErrorMessage = KErrMsgDeleteNoParam;
+            	User::Leave( ret );
+            	}
+
+            __TRACE( KMessage, (_L("%S %S"), &aKeyword, &tmp));
+            iTestScripter->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), 
+                _L("%S %S"), &aKeyword, &tmp);
+
+            ret = iTestScripter->DeleteObjectL( tmp );
+            if ( ret != KErrNone )
+            	{
+            	iRunErrorMessage.Format( KErrMsgDeleteObjNotFound, &tmp );
+            	User::Leave( ret );
+            	}
+            }
+            break;
+        case TTestKeywords::ERequest:
+        case TTestKeywords::EWait:
+        case TTestKeywords::ERelease:
+        case TTestKeywords::ESet:
+        case TTestKeywords::EUnset:
+            continueTask = ExecuteEventL( aKeyword, aItem );
+            break;
+        case TTestKeywords::EPrint:
+            {
+            __TRACE( KMessage, (_L("%S"), &aKeyword));
+            iTestScripter->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), 
+                _L("%S"), &aKeyword );
+
+            RBuf buf;
+            buf.CreateL(1024);
+            CleanupClosePushL(buf);
+            
+            TPtrC tmp;
+
+            while( aItem->GetNextString( tmp ) == KErrNone )
+                {
+                if( buf.Length() + tmp.Length() >= buf.MaxLength() )
+                    {
+                    buf.ReAllocL(buf.MaxLength() + tmp.Length() * 10);
+                    }
+                buf.Append( tmp );
+                buf.Append( _L(" ") );
+                }
+            
+            iTestScripter->TestModuleIf().Printf( KPrintPriNorm, 
+                _L("Test"), 
+                _L("%S"), &buf);
+            RDebug::Print( _L("Print : Test : %S"), &buf );
+            CleanupStack::PopAndDestroy(&buf);
+            }
+            break;
+        case TTestKeywords::EAllowNextResult:
+            {
+            AddTestCaseResultL( aItem );
+            }
+            break;
+        case TTestKeywords::EWaitTestClass:
+            {
+            // Just stop script running, continue event is signaled 
+            // from test class with specified object name
+            TPtrC objectName;
+            // Get Object name
+            TInt ret = aItem->GetNextString( objectName );
+            if ( ret != KErrNone )
+            	{
+               	iRunErrorMessage = KErrMsgWaitTestClassNameNotDefined;
+            	User::Leave( ret );
+            	}
+            TTestObjectBase* obj = iTestScripter->GetObject ( objectName );
+            //User::LeaveIfNull( obj );
+            if( obj == NULL )
+                {
+               	iRunErrorMessage.Format( KErrMsgWaitTestClassObjNotFound, &objectName );
+                User::Leave( KErrGeneral );
+                }
+            continueTask = obj->Wait();
+            
+            if( continueTask )
+                {
+                // If OOM testing is ongoing ignore result check(given by user)
+                if( !iTestScripter->iOOMIgnoreFailure )
+                    {
+                    if( iTestCaseResults.Count() == 0 )
+                        {
+                        // KErrNone is the default result expected 
+                        // if nothing else is given 
+                        User::LeaveIfError( iTestCaseResults.Append( 
+                                                                KErrNone ) );
+                        }
+                    
+                    if( iTestCaseResults.Find( obj->iAsyncResult ) < 0 ) 
+                        {
+                        __TRACE( KError, ( _L("Command for [%S] failed (%d)"), 
+                                &objectName, obj->iAsyncResult ));
+                        iTestScripter->UpdateTestCaseResult(obj->iAsyncResult, _L("CTestRunner::ExecuteLineL: asynchronous method returned error"));
+                        // Stops execution from CTestRunner::RunError
+                        User::Leave( KErrGeneral );
+                        }
+                    }
+                else
+                    {
+                    __TRACE( KMessage, ( 
+                        _L( "OOM test: 'oomignorefailure' is ON, test case result will reset" ) ) );
+                    }
+
+                iTestCaseResults.Reset();
+                // Reset test case allow result to CTestModuleIf side too. This is
+                // used in TAL-TA5L macro handling.
+                User::LeaveIfError( 
+                    iTestScripter->TestModuleIf().ResetAllowResult() );
+                }
+
+            }
+            break;
+        case TTestKeywords::EPause:
+            {
+            // Maximum time for one RTimer::After request
+            TInt maximumTime = KMaxTInt / 1000;
+            // Set iRemainingTimeValue to zero
+            iRemainingTimeValue = 0;
+
+            TInt timeout;
+            // Read valid results to timeout
+            if( aItem->GetNextInt( timeout ) != KErrNone )
+                {
+                __TRACE( KError, (_L("CTestRunner::ExecuteLineL: No timeout value given for pause")));
+                iRunErrorMessage = KErrMsgPauseTimeoutNotDefined;
+                User::Leave( KErrArgument );
+                }
+
+            // Test case file parsing was success
+
+            __TRACE( KMessage, (_L("CTestRunner::ExecuteLineL: Pause for %d milliseconds"), timeout));
+
+            if( timeout < 0 )
+                {
+                __TRACE( KError, (_L("CTestRunner::ExecuteLineL: Given pause value < 0")));
+                iRunErrorMessage = KErrMsgPauseTimeoutNotPositive;
+                User::Leave( KErrArgument );
+                }
+            else
+                {
+                // Check is pause value suitable for RTimer::After
+                if( timeout < maximumTime )
+                    {
+                    iPauseTimer.After( iStatus, ( timeout * 1000  ) );
+                    }
+                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
+
+                    iRemainingTimeValue =  timeout - maximumTime;
+                    iPauseTimer.After( iStatus, maximumTime * 1000 );
+                    }
+
+                SetActive();
+
+                // Stop execution after paused for given timeout
+                continueTask = EFalse;
+                }
+            }
+            break;
+        case TTestKeywords::ELoop:
+            {
+            if( iLoopTimes > 0 )
+                {
+                __TRACE( KError, (_L("ExecuteLineL: Nested loop are not supported")));
+                iRunErrorMessage = KErrMsgLoopNested;
+                User::Leave( KErrNotSupported );
+                }
+            iLoopTimes = 0;
+            iLoopCounter = 0;
+            iTimedLoop = EFalse;
+            if( aItem->GetNextInt( iLoopTimes ) != KErrNone )
+                {
+                __TRACE( KError, (_L("ExecuteLineL: No loop count value given for loop")));
+                iRunErrorMessage = KErrMsgLoopNoParam;
+                User::Leave( KErrArgument );
+                }
+            if( iLoopTimes < 1 )
+            	{
+                __TRACE( KError, (_L("ExecuteLineL: Loop count must be >0")));
+                iRunErrorMessage = KErrMsgLoopInvalidParam;
+                User::Leave( KErrArgument );
+            	}
+            __TRACE( KMessage, (_L("ExecuteLineL: 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("ExecuteLineL: Timed loop for %d msec" ), iLoopTimes));
+                    
+                    ret = aItem->GetNextString(option); //Get next option
+                    }
+                }
+                
+            if(ret == KErrNone)
+                {
+                __TRACE( KError, (_L("ExecuteLineL: Unknown or unexpected loop option [%S]"), &option));
+                iRunErrorMessage = KErrMsgLoopUnknownUnexpectedOption;
+                User::Leave( KErrNotSupported );
+                }
+            
+            iLoopStartPos = iTestScripter->iCurrentParser->GetPosition();
+            }
+            break;
+        case TTestKeywords::EEndLoop:
+            {
+            if( iLoopTimes == 0 )
+            	{
+            	__TRACE( KError, (_L("ExecuteLineL: Can't execute endloop. No opened loop exists")));
+            	iRunErrorMessage = KErrMsgEndLoopNotOpened;
+            	User::Leave( KErrNotFound );
+            	}
+            iLoopCounter++;
+            __TRACE( KMessage, 
+                (_L("ExecuteLineL: Loop executed for %d times" ), 
+                    iLoopCounter ) );
+
+            TTime currTime;
+            currTime.HomeTime();
+            if(((!iTimedLoop) && (iLoopCounter < iLoopTimes)) //Normal loop
+               ||
+               iTimedLoop && (currTime.MicroSecondsFrom(iStartTime) < iExpectedLoopTime)) //Timed loop
+                {
+                // Go to beginning of the loop
+                User::LeaveIfError(
+                    iTestScripter->iCurrentParser->SetPosition( iLoopStartPos ));
+                }
+            else
+                {            
+                // End looping
+                iLoopCounter = 0;
+                iLoopTimes = 0;
+                iLoopStartPos = 0;
+                }
+            }
+            break;
+        case TTestKeywords::ETimeout:
+        case TTestKeywords::EPriority:
+            // not used here
+            break;
+        case TTestKeywords::EOOMIgnoreFailure:
+            {
+            OOMIgnoreFailureL( aItem );  // Handle parsing
+            break;
+            }
+        case TTestKeywords::EOOMHeapFailNext:
+            {
+            OOMHeapFailNextL( aItem );   // Handle parsing
+            break;
+            }
+        case TTestKeywords::EOOMHeapSetFail:
+            {
+            OOMHeapSetFailL( aItem );    // Handle parsing
+            break;
+            }
+       case TTestKeywords::EOOMHeapToNormal:
+            {
+            // Initialize all OOM related variables back to default.
+            OOMHeapToNormal();
+            __TRACE( KMessage, (
+                _L( "'oomheaptonormal' called, OOM initialization or ending OOM test") ) );
+            break;
+            }
+       case TTestKeywords::ETestInterference:
+            {
+            TestInterferenceL( aItem );  // Handle parsing
+            break;
+            }
+       case TTestKeywords::EMeasurement:
+            {
+            MeasurementL( aItem );      // Handle parsing
+            break;
+            }
+       case TTestKeywords::EAllowErrorCodes:
+            {
+            // Check is KErrNone already appended to iTestCaseResults array.
+            if( iTestCaseResults.Find( KErrNone ) < 0 )
+                {
+                // 'allowerrorcodes' keyword sets KErrNone as a default
+                User::LeaveIfError( iTestCaseResults.Append( KErrNone ) );
+                // Set test case allow result to CTestModuleIf side too. This
+                // is used in TAL-TA5L macro handling.
+                User::LeaveIfError( 
+                    iTestScripter->TestModuleIf().SetAllowResult( KErrNone ) );
+                }
+
+            // Set user given specific error code to be allowed.
+            AddTestCaseResultL( aItem );
+            }
+            break;
+
+       case TTestKeywords::EBringToForeground:
+    	   {
+    	   if ( iTestScripter->TestModuleIf().UITesting() == true )
+    		   {
+    		   iTestScripter->TestModuleIf().GetUiEnvProxy()->BringToForeground();
+    		   }
+    	   else
+    		   {
+	           	__TRACE( KError, (_L("ExecuteLineL: Can't execute bringtoforeground in non s60 environment. Check if .cfg file name contains ui_ prefix and UITestingSupport= YES entry is defined in TestFrameworkd.ini")));
+	        	iRunErrorMessage = KErrMsgBringToForegroundNotSupported;
+	        	User::Leave( KErrNotSupported );    		   
+    		   }
+    	   }
+       		break;
+       case TTestKeywords::ESendToBackground:
+    	   {
+    	   if ( iTestScripter->TestModuleIf().UITesting() == true )
+    		   {
+    		   iTestScripter->TestModuleIf().GetUiEnvProxy()->SendToBackground();
+    		   }
+    	   else
+    		   {
+	           	__TRACE( KError, (_L("ExecuteLineL: Can't execute sendtobackground in non s60 environment. Check if .cfg file name contains ui_ prefix and UITestingSupport= YES entry is defined in TestFrameworkd.ini")));
+	        	iRunErrorMessage = KErrMsgSendToBackgroundNotSupported;
+	        	User::Leave( KErrNotSupported );    		   
+    		   }
+    	   }
+       		break;
+       case TTestKeywords::EPressKey:
+    	   {
+    	   if ( iTestScripter->TestModuleIf().UITesting() == true )
+    		   {
+    		   continueTask = PressKeyL( aItem );
+    		   }
+    	   else
+    		   {
+    		   __TRACE( KError, (_L("ExecuteLineL: Can't execute presskey in non s60 environment. Check if .cfg file name contains ui_ prefix and UITestingSupport= YES entry is defined in TestFrameworkd.ini")));
+    		   iRunErrorMessage = KErrMsgPressKeyNotSupported;
+    		   User::Leave( KErrNotSupported );    		   
+    		   }	
+
+    	   // Check if it was global or local presskey
+    	   if ( !continueTask )
+    		   {
+	           // Stop execution after key is pressed and wait until it is handled
+	           SetActive();
+    		   }           
+    	   }
+       		break;
+       case TTestKeywords::ETypeText:
+    	   {
+    	   if ( iTestScripter->TestModuleIf().UITesting() == true )
+    		   {
+    		   continueTask = TypeTextL( aItem );
+    		   }
+    	   else
+    		   {
+    		   __TRACE( KError, (_L("ExecuteLineL: Can't execute typetext in non s60 environment. Check if .cfg file name contains ui_ prefix and UITestingSupport= YES entry is defined in TestFrameworkd.ini")));
+    		   iRunErrorMessage = KErrMsgTypeTextNotSupported;
+    		   User::Leave( KErrNotSupported );    		   
+    		   }
+
+    	   // Check if it was global or local typetext
+    	   if ( !continueTask )
+    		   {
+	           // Stop execution after key is pressed and wait until it is handled
+	           SetActive();
+    		   }           
+    	   }
+       		break;
+        case TTestKeywords::EVar:
+            {
+            TName name;
+            TName buf;
+            TPtrC tmp;
+            
+            //Get variable name
+            if(aItem->GetNextString(tmp) == KErrNone)
+                {
+                name.Copy(tmp);
+                }
+            else
+                {
+                //Error when getting variable name
+                __TRACE(KError, (_L("ExecuteLineL: Could not read variable name")));
+                iRunErrorMessage = KErrVarNameError;
+                User::Leave(KErrArgument);                
+                }
+
+            //Get value for variable
+            while(aItem->GetNextString(tmp) == KErrNone)
+                {
+                if(buf.Length() + tmp.Length() >= buf.MaxLength())
+                    {
+                    //Error when getting variable name
+                    __TRACE(KError, (_L("ExecuteLineL: Variable value too long")));
+                    iRunErrorMessage = KErrVarValueError;
+                    User::Leave(KErrArgument);                
+                    }
+                buf.Append(tmp);
+                buf.Append(_L(" "));
+                }
+            //Remove last space
+            if(buf.Length() > 0)
+                {
+                buf.SetLength(buf.Length() - 1);
+                }
+                
+            //Store local variable
+            TInt count = iTestScripter->iDefinedLocal.Count();
+            TInt i;
+            for(i = 0; i < count; i++)
+                {
+                if(iTestScripter->iDefinedLocal[i]->Name() == name)
+                    {
+                    // Update existing
+                    iTestScripter->iDefinedLocal[i]->SetValueL(buf);
+                    __TRACE(KMessage, (_L("Update local variable [%S]: [%S]"), &name, &buf));
+                    break;
+                    }
+                }
+            if(i == count)
+                {
+                // New define, store it
+                CDefinedValue* define = CDefinedValue::NewL(name, buf);
+                CleanupStack::PushL(define);
+                User::LeaveIfError(iTestScripter->iDefinedLocal.Append(define));
+                CleanupStack::Pop(define);
+                __TRACE(KMessage, (_L("Add local variable [%S]: [%S]"), &name, &buf));
+                }
+            }
+            break;
+        case TTestKeywords::ECallSub:
+            {
+            // Get sub name
+            TPtrC subName;
+            
+            //Get sub name
+            TInt err = aItem->GetNextString(subName);
+            if(err != KErrNone)
+                {
+                //Error when getting sub name
+                __TRACE(KError, (_L("ExecuteLineL: Could not read sub name [%d]"), err));
+                iRunErrorMessage = KErrSubNameError;
+                User::Leave(KErrArgument);                
+                }
+            
+            // Load section
+            CStifSectionParser* subSection = NULL;
+            TRAP(err, 
+                 subSection = iTestScripter->GetSubL(subName);
+                );
+            if((err != KErrNone) || (!subSection))
+                {
+                //Error when getting sub name
+                if(err == KErrNone)
+                    {
+                    err = KErrArgument;
+                    }
+                __TRACE(KError, (_L("ExecuteLineL: Could not get section for sub [%d]"), err));
+                iRunErrorMessage = KErrSubGetError;
+                User::Leave(err);                
+                }
+            
+            // Handle new section parser
+            CleanupStack::PushL(subSection);
+            iTestScripter->iParserStack.AppendL(subSection);
+            __TRACE(KMessage, (_L("ExecuteLineL: Section for sub [%S] appended to section stack"), &subName));
+            CleanupStack::Pop(subSection);
+            iTestScripter->iCurrentParser = subSection;
+            iTestScripter->iCurrentParserReadFirstLine = EFalse; //Change it to false, becaue subSection is a new parser and it has nothing read
+            }
+            break;
+        case TTestKeywords::ESetResultDescription:
+            {
+            __TRACE(KMessage, (_L("%S"), &aKeyword));
+            iTestScripter->TestModuleIf().Printf(KPrintPriLow, _L("Runner"), _L("%S"), &aKeyword);
+
+            TName buf;
+            TPtrC tmp;
+
+            while(aItem->GetNextString(tmp) == KErrNone)
+                {
+                if(buf.Length() + tmp.Length() >= buf.MaxLength())
+                    {
+                    break;
+                    }
+                if(buf.Length() > 0)
+                    {
+                    buf.Append(_L(" "));
+                    }
+                buf.Append(tmp);
+                }
+            
+            iTestScripter->SetResultDescription(buf);
+            RDebug::Print( _L("SetDescription to [%S]"), &buf );
+            }
+            break;
+        case TTestKeywords::ESendPointerEvent:
+     	   {
+     	   if ( iTestScripter->TestModuleIf().UITesting() == true )
+     		   {
+     		   continueTask = SendPointerEventL( aItem );
+     		   }
+     	   else
+     		   {
+     		   __TRACE( KError, (_L("ExecuteLineL: Can't execute sendpointerevent in non s60 environment. Check if .cfg file name contains ui_ prefix and UITestingSupport= YES entry is defined in TestFrameworkd.ini")));
+     		   iRunErrorMessage = KErrMsgSendPointerEventNotSupported;
+     		   User::Leave( KErrNotSupported );    		   
+     		   }
+
+     	   // Check if it was global or local sendpointerevent
+     	   if ( !continueTask )
+     		   {
+ 	           // Stop execution after pointer event is send and wait until it is handled
+ 	           SetActive();
+     		   }           
+     	   }
+     	   break;
+        default:
+            {
+            continueTask = ExecuteCommandL( aKeyword, aItem );
+            }
+            break;
+        }
+
+    __TRACE( KMessage, (_L("ExecuteLineL: TestCase line executed")));
+
+    return continueTask;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: PressKeyL
+
+     Description: Send key press event to AppUi
+  
+     Parameters:    CStifItemParser* aItem: in: script line
+     
+     Return Values: None
+
+     Errors/Exceptions: Leaves on error situations.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TBool CTestRunner::PressKeyL( CStifItemParser* aItem )
+	{
+    _LIT( KErrMsgSendKeyEventInvalidParameterValue, "PressKey: Invalid parameter %s value " );
+    _LIT( KErrMsgSendKeyEventInvalidParameter, "PressKey: Invalid parameter %s" );    
+    
+    _LIT( KKeyCodeParameter, "keycode=" );
+    _LIT( KKeyScanCodeParameter, "keyscancode=" );
+    _LIT( KModifierParameter, "modifier=" );
+    _LIT( KRepeatsParameter, "repeats=" );
+    
+    _LIT( KModeGlobal, "global" );
+    _LIT( KModeLocal, "local" );
+    
+    TBool globalMode = EFalse;
+	TUint keyCode = 0; 
+	TInt keyScanCode = 0; 
+	TUint keyModifiers = 0; 
+	TInt keyRepeats = 0;
+		
+	TPtrC parameter;
+		
+	CUiEnvProxy* uiEnvProxy = iTestScripter->TestModuleIf().GetUiEnvProxy();
+	
+	while( aItem->GetNextString( parameter ) == KErrNone )
+		{
+		if ( parameter.Find( KKeyCodeParameter ) == 0 )
+			{
+			TPtrC parameterValue = parameter.Right( parameter.Length() - KKeyCodeParameter().Length() );
+			TLex parameterValueParser( parameterValue );
+			if ( parameterValueParser.Val( keyCode ) != KErrNone )
+				{
+					if ( uiEnvProxy->ParseKeyCode( parameterValue, keyCode ) != KErrNone )
+						{
+						__TRACE( KError, (_L("SendKeyEvent: Invalid parameter value")));
+						TBuf<128> errMsg;
+						errMsg.Format( KErrMsgSendKeyEventInvalidParameterValue, &KKeyCodeParameter() );
+						iRunErrorMessage = errMsg;
+						User::Leave( KErrArgument );    		   				
+						}
+				}
+			}
+		else if ( parameter.Find( KKeyScanCodeParameter ) == 0 )
+			{
+			TPtrC parameterValue = parameter.Right( parameter.Length() - KKeyScanCodeParameter().Length() );
+			TLex parameterValueParser( parameterValue );
+			if ( parameterValueParser.Val( keyScanCode ) != KErrNone )
+				{
+				if ( uiEnvProxy->ParseKeyScanCode( parameterValue, keyScanCode ) != KErrNone )
+					{
+					__TRACE( KError, (_L("SendKeyEvent: Invalid parameter value")));
+					TBuf<128> errMsg;
+					errMsg.Format( KErrMsgSendKeyEventInvalidParameterValue, &KKeyCodeParameter() );
+					iRunErrorMessage = errMsg;
+					User::Leave( KErrArgument );    		   				
+					}
+				}
+			}
+		else if ( parameter.Find( KModifierParameter ) == 0 )
+			{
+			TPtrC parameterValue = parameter.Right( parameter.Length() - KModifierParameter().Length() );
+			TLex parameterValueParser( parameterValue );
+			if ( parameterValueParser.Val( keyModifiers ) != KErrNone )
+				{
+				if ( uiEnvProxy->ParseModifier( parameterValue, keyModifiers ) != KErrNone )
+					{
+					__TRACE( KError, (_L("SendKeyEvent: Invalid parameter value")));
+					TBuf<128> errMsg;
+					errMsg.Format( KErrMsgSendKeyEventInvalidParameterValue, &KModifierParameter() );
+					iRunErrorMessage = errMsg;
+					User::Leave( KErrArgument );    		   				
+					}
+				}
+			}
+		else if ( parameter.Find( KRepeatsParameter ) == 0 )
+			{
+			TPtrC parameterValue = parameter.Right( parameter.Length() - KRepeatsParameter().Length() );
+			TLex parameterValueParser( parameterValue );
+			if ( parameterValueParser.Val( keyRepeats ) != KErrNone )
+				{
+				__TRACE( KError, (_L("SendKeyEvent: Invalid parameter value")));
+				TBuf<128> errMsg;
+				errMsg.Format( KErrMsgSendKeyEventInvalidParameterValue, &KRepeatsParameter() );
+				iRunErrorMessage = errMsg;
+				User::Leave( KErrArgument );    		   				
+				}
+			}
+		else if ( parameter == KModeGlobal )
+			{
+			globalMode = ETrue;
+			}
+		else if ( parameter == KModeLocal )
+			{
+			globalMode = EFalse;
+			}
+		else if ( uiEnvProxy->ParseKeyCode( parameter, keyCode ) == KErrNone ) 
+			{			
+			}			
+		else if ( parameter.Length() == 1 )
+			{
+			keyCode = parameter[ 0 ];
+			}
+		else
+			{
+			__TRACE( KError, (_L("PressKey: Invalid parameter")));
+			TBuf<128> errMsg;
+			errMsg.Format( KErrMsgSendKeyEventInvalidParameter, &parameter );
+			iRunErrorMessage = errMsg;
+			User::Leave( KErrArgument );   			
+			}
+		}
+	
+	if ( globalMode )
+		{
+		uiEnvProxy->PressKeyL( keyCode, keyScanCode, keyModifiers, keyRepeats );			
+		}
+	else
+		{
+		uiEnvProxy->PressKeyL( &iStatus, keyCode, keyScanCode, keyModifiers, keyRepeats );
+		}
+		
+	return globalMode;
+	}
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: TypeTextL
+
+     Description: Sends text to AppUi
+  
+     Parameters:    CStifItemParser* aItem: in: script line
+     
+     Return Values: None
+
+     Errors/Exceptions: Leaves on error situations.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TBool CTestRunner::TypeTextL( CStifItemParser* aItem )
+	{
+	_LIT( KErrMsgTypeTextInvalidParameter, "TypeText: Invalid parameter %S" );
+	_LIT( KErrMsgTypeTextNotEnoughParameters, "TypeText: Not enough parameters" );
+	
+	TBool globalMode = EFalse;
+	
+	TPtrC command;
+	TPtrC text;
+	aItem->SetParsingType( CStifItemParser::EQuoteStyleParsing );
+	
+	// Read first parameter
+	TInt ret = aItem->GetNextString( command );
+	
+	if ( ret != KErrNone )
+		{
+		__TRACE( KError, (_L("TypeText: Not enough parameters")));
+		iRunErrorMessage = KErrMsgTypeTextNotEnoughParameters;
+		User::Leave( ret );
+		}
+	
+	// Read second parameter
+	ret = aItem->GetNextString( text );
+	
+	// Check if second can be read. if yes then check if first parameters is
+	// 'global' parameter
+	if ( ret != KErrNone )
+		{
+		// normal type text
+		text.Set( command );
+		iTestScripter->TestModuleIf().GetUiEnvProxy()->TypeTextL( &iStatus, text );
+		globalMode = EFalse;
+		}
+	else if ( command == _L("global") )
+		{
+		iTestScripter->TestModuleIf().GetUiEnvProxy()->TypeTextL( text );
+		globalMode = ETrue;
+		}
+	else
+		{
+		__TRACE( KError, (_L("TypeText: Invalid parameter")));
+		TBuf<128> errMsg;
+		errMsg.Format( KErrMsgTypeTextInvalidParameter, &command );
+		iRunErrorMessage = errMsg;
+		User::Leave( KErrNotSupported );
+		}
+		
+	return globalMode;
+	}
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: SendPointerEventL
+
+     Description: Send key press event to AppUi
+  
+     Parameters:    CStifItemParser* aItem: in: script line
+     
+     Return Values: None
+
+     Errors/Exceptions: Leaves on error situations.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TBool CTestRunner::SendPointerEventL( CStifItemParser* aItem )
+	{
+	// Error messages
+    _LIT( KErrMsgNotEnoughParameters, "SendPointerEvent: Not enough parameters" );
+    _LIT( KErrMsgPointerEventTypeNotDefined, "SendPointerEvent: Pointer event type not defined" );
+    _LIT( KErrMsgInvalidUnknownPointerEventType, "SendPointerEvent: Invalid/Unknown pointer event type %S" );
+    _LIT( KErrMsgPositionXNotDefined, "SendPointerEvent: x co-ordinate is not defined" );
+    _LIT( KErrMsgPositionYNotDefined, "SendPointerEvent: y co-ordinate is not defined" );
+    _LIT( KErrMsgPositionXInvalidValue, "SendPointerEvent: Invalid value of x co-ordinate" );
+    _LIT( KErrMsgPositionYInvalidValue, "SendPointerEvent: Invalid value of y co-ordinate" );
+
+    // Parameters keywords
+    _LIT( KModeGlobal, "global" );
+    _LIT( KModeLocal, "local" );
+    
+    TBool globalMode = EFalse;
+	TUint eventType = 0; 
+	TPoint position( 0, 0 );
+	TPoint parentPosition( 0, 0 );
+		
+	TPtrC parameter;
+
+	CUiEnvProxy* uiEnvProxy = iTestScripter->TestModuleIf().GetUiEnvProxy();
+
+	// Get first parameter
+	if ( aItem->GetNextString( parameter ) != KErrNone )
+		{
+		__TRACE( KError, (_L("SendPointerEvent: Not enough parameters")));
+		iRunErrorMessage = KErrMsgNotEnoughParameters;
+		User::Leave( KErrArgument );   			
+		}
+	else
+		{
+		TBool modeSelected = EFalse;
+		// Check if global/local mode is defined
+		if ( parameter == KModeLocal )
+			{
+			globalMode = false;
+			modeSelected = ETrue;
+			}
+		else if ( parameter == KModeGlobal )
+			{
+			globalMode = true;
+			modeSelected = ETrue;
+			}
+		
+		if ( modeSelected )
+			{
+			// First parameter was mode so we need get next parameter which should 
+			// contain event type
+			if ( aItem->GetNextString( parameter ) != KErrNone )
+				{
+				__TRACE( KError, (_L("SendPointerEvent: Pointer event type not defined")));
+				iRunErrorMessage = KErrMsgPointerEventTypeNotDefined;
+				User::Leave( KErrArgument );   			
+				}
+			}
+		}
+	
+	// Parse event type
+	if ( uiEnvProxy->ParsePointerEventType( parameter, eventType ) != KErrNone )
+		{
+		__TRACE( KError, (_L("PressKey: Invalid/Unknown pointer event type %S"), &parameter ));
+		iRunErrorMessage.Format( KErrMsgInvalidUnknownPointerEventType, &parameter );
+		User::Leave( KErrArgument );   			
+		}
+	
+	if ( aItem->GetNextString( parameter ) != KErrNone )
+		{
+		__TRACE( KError, (_L("SendPointerEvent: x co-ordinate is not defined")));
+		iRunErrorMessage = KErrMsgPositionXNotDefined;
+		User::Leave( KErrArgument );   			
+		}
+
+	TLex parameterParser( parameter );
+	if ( parameterParser.Val( position.iX ) != KErrNone )
+		{
+		__TRACE( KError, (_L("SendPointerEvent: Invalid value of x co-ordinate")));
+		iRunErrorMessage = KErrMsgPositionXInvalidValue;
+		User::Leave( KErrArgument );   			
+		}
+
+	if ( aItem->GetNextString( parameter ) != KErrNone )
+		{
+		__TRACE( KError, (_L("SendPointerEvent: y co-ordinate is not defined")));
+		iRunErrorMessage = KErrMsgPositionYNotDefined;
+		User::Leave( KErrArgument );   			
+		}
+
+	parameterParser.Assign( parameter );
+	if ( parameterParser.Val( position.iY ) != KErrNone )
+		{
+		__TRACE( KError, (_L("SendPointerEvent: Invalid value of y co-ordinate")));
+		iRunErrorMessage = KErrMsgPositionYInvalidValue;
+		User::Leave( KErrArgument );   			
+		}		
+		
+	// Send pointer event
+	if ( globalMode )
+		{
+		uiEnvProxy->SendPointerEventL( eventType, position );			
+		}
+	else
+		{
+		uiEnvProxy->SendPointerEventL( &iStatus, eventType, position );
+		}
+
+	return globalMode;
+	}
+
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: ExecuteEventL
+
+     Description: Executes event command script line
+  
+     Parameters:    TDesC& aKeyword: in: keyword string
+                    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::ExecuteEventL( TDesC& aKeyword,
+                                  CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgEventNameNotDefined, "%S : Event name not defined" );
+    _LIT( KErrMsgUnknowKeyword, "Unknow keyword %S" );
+    
+    TInt ret = KErrNone;
+    TInt key = TTestKeywords::Parse( aKeyword, TTestKeywords::Keyword );
+    TBool continueTask = ETrue;
+     
+    TPtrC eventName;
+    // read eventname
+    ret = aItem->GetNextString( eventName );
+    if ( ret != KErrNone )
+    	{
+    	iRunErrorMessage.Format( KErrMsgEventNameNotDefined, &aKeyword );
+    	User::Leave( ret );
+    	}
+    
+    TEventIf event;
+    event.SetName( eventName );
+    
+    __TRACE( KMessage, (_L("%S %S"), &aKeyword, &eventName));
+    iTestScripter->TestModuleIf().Printf( KPrintPriLow, _L("Event"), 
+        _L("%S %S"), &aKeyword, &eventName);
+
+    switch( key )
+        {
+        case TTestKeywords::ERequest:
+            {
+            HBufC* eName = eventName.AllocLC();
+            User::LeaveIfError( iEventArray.Append( eName ) );
+            CleanupStack::Pop( eName );
+            event.SetType( TEventIf::EReqEvent );
+            ret = iTestScripter->TestModuleIf().Event( event );
+            }
+            break;
+        case TTestKeywords::EWait:
+            {
+            event.SetType( TEventIf::EWaitEvent );
+            iTestScripter->TestModuleIf().Event( event, iStatus );
+            SetActive();
+            continueTask = EFalse;
+            }
+            break;
+        case TTestKeywords::ERelease:
+            {
+            event.SetType( TEventIf::ERelEvent );
+            ret = iTestScripter->TestModuleIf().Event( event );
+            if( ret == KErrNone )
+                {
+                TPtrC eName;
+                TInt count = iEventArray.Count();
+                for( TInt i = 0; i < count; i++ )
+                    {
+                    eName.Set( iEventArray[i]->Des() );
+                    if( eName == eventName )
+                        {
+                        HBufC* tmp = iEventArray[i];
+                        iEventArray.Remove(i);
+                        delete tmp;
+                        break;
+                        }
+                    }
+                }
+            }
+            break;
+        case TTestKeywords::ESet:
+            {
+            event.SetType( TEventIf::ESetEvent );
+            
+            TPtrC tmp;
+            // Get optional set argument
+            if( aItem->GetNextString( tmp ) == KErrNone )
+                {                      
+                // Parse optional set argument
+                if( tmp == _L("state") )
+                    {
+                    __TRACE( KMessage, (_L("State event")));
+                    event.SetEventType( TEventIf::EState );
+                    }
+                else
+                    {
+                    __TRACE( KError, 
+                        (_L("Unknown argument for set %S"), 
+                        &tmp));
+                    }
+                }      
+            
+            ret = iTestScripter->TestModuleIf().Event( event );
+            }
+            break;
+        case TTestKeywords::EUnset:
+            {
+            event.SetType( TEventIf::EUnsetEvent );
+            event.SetEventType( TEventIf::EState );
+            ret = iTestScripter->TestModuleIf().Event( event );
+            }
+            break;
+        default:
+            __TRACE( KError, (_L("Unknown keyword %S"), &aKeyword));
+            iRunErrorMessage.Format( KErrMsgUnknowKeyword, &aKeyword );
+            User::Leave( KErrGeneral );
+            break;
+        }
+    if( ret != KErrNone )
+        {
+        TName resultDescr;
+        resultDescr.Format(_L("Event %S returned error: %d"), &aKeyword, ret);
+        iTestScripter->UpdateTestCaseResult(ret, resultDescr);
+        // Stops execution from CTestRunner::RunError
+        User::Leave( KErrGeneral );
+        }
+
+    return continueTask;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: ExecuteCommandL
+
+     Description: Executes script line
+
+     Parameters:    TDesC& aObject: in: object name 
+                    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::ExecuteCommandL( TDesC& aObject, CStifItemParser* aItem)
+    {
+    _LIT( KErrMsgUnknownObjOrKeyword, "Unknow keyword/object %S" );
+    
+    TTestObjectBase* obj = iTestScripter->GetObject ( aObject );    
+    if( obj == NULL )
+        {
+        iRunErrorMessage.Format( KErrMsgUnknownObjOrKeyword, &aObject );
+        User::Leave( KErrGeneral );
+        }
+
+    if( iTestCaseResults.Count() == 0 )
+        {
+        // KErrNone is the default result expected if nothing else is given 
+        User::LeaveIfError( iTestCaseResults.Append( KErrNone ) );
+        }
+
+    // OOM heap testing with FAILNEXT
+    if( iHeapFailNext > 0 )
+        {
+        __TRACE( KPrint, ( 
+            _L( "OOM FAILNEXT is used with count value: %d " ),
+            iHeapFailNext) );
+        User::__DbgSetAllocFail( RHeap::EUser, RHeap::EFailNext, iHeapFailNext  );
+        }
+    // OOM heap testing with SETFAIL
+    if( iHeapSetFailValue > 0 )
+        {
+        __TRACE( KPrint, (
+            _L("OOM SETFAIL is used with type:[%d] and value(rate):[%d]"),
+            iHeapSetFailType, iHeapSetFailValue ) );
+        User::__DbgSetAllocFail( RHeap::EUser, iHeapSetFailType, iHeapSetFailValue );
+        }
+
+    TInt commandResult = KErrNone;
+    TRAP( commandResult, commandResult = obj->RunMethodL( *aItem ) );
+
+    
+    // Reset OOM macro immediately(Otherwise other allocations
+    // will be blocked)
+    User::__DbgSetAllocFail( RHeap::EUser, RHeap::ENone, 1 );
+
+    // OOM test class's build block handling
+    if( iTestScripter->iOOMIgnoreFailure )
+        {
+        __TRACE( KPrint, ( 
+            _L( "----------< OOM related test information >----------" ) ) );
+        if( iHeapFailNext > 0 )
+            {
+            __TRACE( KPrint, ( 
+                _L( "'oomignorefailure' is:[ON] and 'failnextvalue' count is:[%d]" ),
+                iHeapFailNext ) );
+            }
+        if( iHeapSetFailValue > 0 )
+            {
+            __TRACE( KPrint, ( 
+                _L( "'oomignorefailure' is:[ON], 'setfailtype' type is:[%d] and value is:[%d]" ),
+                iHeapSetFailType, iHeapSetFailValue ) );
+            }
+        __TRACE( KPrint, ( 
+            _L( "Test class build block execution with result:[%d]" ),
+            commandResult ) );
+        __TRACE( KPrint, ( 
+            _L( "----------------------------------------------------" ) ) );
+
+        // Continue testing, despite the memory error situations
+        iTestCaseResults.Reset();
+        return ETrue; // Continue script executions
+        }
+
+    // Normal test class's build block handling
+    if( iTestCaseResults.Find( commandResult ) < 0 ) 
+        {
+        __TRACE( KError, ( _L("Command for [%S] failed (%d)"), 
+                &aObject, commandResult ));
+
+        // Added more logging for this special case
+        if( commandResult == KErrNone )
+            {
+            __TRACE( KError, (_L("Test fails with result KErrGeneral, because execution result was KErrNone and expected results given with 'allownextresult' were Symbian's error codes (<0)")));    
+            }
+           
+        iTestScripter->UpdateTestCaseResult(commandResult, _L("CTestRunner::ExecuteCommandL returned error"));
+
+        // Stops execution from CTestRunner::RunError
+        User::Leave( KErrGeneral );
+        }
+        
+    iTestCaseResults.Reset();
+    // Reset test case allow result to CTestModuleIf side too. This is
+    // used in TAL-TA5L macro handling.
+    User::LeaveIfError( 
+        iTestScripter->TestModuleIf().ResetAllowResult() );
+        
+    return ETrue;
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: SetRunnerActive
+
+     Description: Set CTestRunner active and complete.
+
+     Parameters:    None.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::SetRunnerActive()
+     {
+     __TRACEFUNC();
+     // Update state
+     iState = ERunnerRunning;
+
+     iStatus = KRequestPending;
+     TRequestStatus* rs = &iStatus;
+     SetActive();
+     User::RequestComplete( rs, KErrNone );
+
+     }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: OOMIgnoreFailure
+
+     Description: Handles 'oomignorefailure' keyword parsing.
+  
+     Parameters: CStifItemParser* aItem: in: Item object for parsing.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Proposal
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::OOMIgnoreFailureL( CStifItemParser* aItem )
+    {
+    _LIT( KerrMsgOOMIgnoreFailureUnknownArgument, "OOMIgnoreFailure : Invalid argument %S" );
+    _LIT( KerrMsgOOMIgnoreFailureNoArgument, "OOMIgnoreFailure : Parameter not defined" );
+    
+    __TRACEFUNC();
+
+    TPtrC tmp;
+    // Get result
+    if( aItem->GetNextString( tmp ) == KErrNone )
+        {                      
+        if( tmp == _L("ON") || tmp == _L("on") )
+            {
+            __TRACE( KMessage, (_L("OOM related 'oomignorefailure': ON")));
+            iTestScripter->iOOMIgnoreFailure = ETrue;
+            }
+        else if( tmp == _L("OFF") || tmp == _L("off") )
+            {
+            __TRACE( KMessage, (_L("OOM related 'oomignorefailure': OFF")));
+            iTestScripter->iOOMIgnoreFailure = EFalse;
+            }
+        else
+            {
+            __TRACE( KError, 
+                (_L("Unknown argument for 'oomignorefailure': [%S]"), 
+                &tmp));
+            iRunErrorMessage.Format( KerrMsgOOMIgnoreFailureUnknownArgument, &tmp );
+            User::Leave( KErrArgument );
+            }
+        }
+    else
+        {
+        __TRACE( KError, ( _L( "Unknown argument for 'oomignorefailure'" ) ) );
+        iRunErrorMessage = KerrMsgOOMIgnoreFailureNoArgument;
+        User::Leave( KErrArgument );
+        }
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: OOMHeapFailNext
+
+     Description: Handles 'oomheapfailnext' keyword parsing.
+  
+     Parameters: CStifItemParser* aItem: in: Item object for parsing.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Proposal
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::OOMHeapFailNextL( CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgHeapFailNextNoArgument, "HeapFailNext : Parameters is not defined or has invalid value" );
+    _LIT( KErrMsgHeapFailNextInvalidValue, "HeapFailNext : Argument value can't be <0" );
+    __TRACEFUNC();
+
+    TInt heapfailNext( 0 );
+    // If LOOP_COUNTER is used the GetNextInt returns a correct
+    // value(Because of the LOOP_COUNTER implementation).
+    if( aItem->GetNextInt( heapfailNext ) == KErrNone )
+        {
+        if( heapfailNext < 0 )
+        	{
+        	__TRACE( KError, ( _L( "Argument value must be >0" ) ) );
+            iRunErrorMessage = KErrMsgHeapFailNextInvalidValue;
+            User::Leave( KErrArgument );        	
+        	}
+        // OOM heap's FAILNEXT range is from 1 to n
+        iHeapFailNext = heapfailNext + 1;
+        __TRACE( KMessage, ( _L( "'oomheapfailnext' count value(rate): %d" ),
+            iHeapFailNext ) );
+        }
+    else
+        {
+        __TRACE( KError, ( _L( "Unknown argument for 'oomheapfailnext'" ) ) );
+        iRunErrorMessage = KErrMsgHeapFailNextNoArgument;
+        User::Leave( KErrArgument );
+        }
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: OOMHeapSetFail
+
+     Description: Handles 'oomheapsetfail' keyword parsing.
+  
+     Parameters: CStifItemParser* aItem: in: Item object for parsing.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Proposal
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::OOMHeapSetFailL( CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgOOMHeapSetFailTypeNotDefined, "OOMHeapSetFail : Parameter type is not defined" );
+    _LIT( KErrMsgOOMHeapSetFailRateNotDefined, "OOMHeapSetFail : Parameter rate is not defined" );
+    _LIT( KErrMsgOOMHeapSetFailTypeInvalidValue, "OOMHeapSetFail : Parameter type has invalid value" );
+    _LIT( KErrMsgOOMHeapSetFailRateInvalidValue, "OOMHeapSetFail : Parameter rate can't be <0" );
+    __TRACEFUNC();
+
+    TPtrC type;
+    TInt value( 0 );
+
+    // NOTE: If error in type or value parsing => return without changing
+    //       iHeapSetFailType or iHeapSetFailValue valiables.
+
+    // Get type
+    if( aItem->GetNextString( type ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'oomheapsetfail' type" ) ) );
+        iRunErrorMessage = KErrMsgOOMHeapSetFailTypeNotDefined;
+        User::Leave( KErrArgument );
+        }
+    // Get value(rate)
+    if( aItem->GetNextInt( value ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'oomheapsetfail' value(rate)" ) ) );
+        iRunErrorMessage = KErrMsgOOMHeapSetFailRateNotDefined;
+        User::Leave( KErrArgument );
+        }    
+    
+    // All parsing operations are passed, get type and value
+
+    // Get type
+    if( type == _L("random") )
+        {
+        __TRACE( KMessage, (_L("'oomheapsetfail' type: random")));
+        iHeapSetFailType = RHeap::ERandom;
+        }
+    else if( type == _L("truerandom") )
+        {
+        __TRACE( KMessage, (_L("'oomheapsetfail' type: truerandom")));
+        iHeapSetFailType = RHeap::ETrueRandom;
+        }
+    else if( type == _L("deterministic") )
+        {
+        __TRACE( KMessage, (_L("'oomheapsetfail' type: deterministic")));
+        iHeapSetFailType = RHeap::EDeterministic;
+        }
+    else if( type == _L("none") )
+        {
+        __TRACE( KMessage, (_L("'oomheapsetfail' type: none")));
+        iHeapSetFailType = RHeap::ENone;
+        }
+    else if( type == _L("failnext") )
+        {
+        __TRACE( KMessage, (_L("'oomheapsetfail' type: failnext")));
+        iHeapSetFailType = RHeap::EFailNext;
+        }
+    else
+        {
+        __TRACE( KError, 
+            ( _L( "Unknown argument for 'oomheapsetfail' type: [%S]" ),
+            &type ) );
+        iRunErrorMessage = KErrMsgOOMHeapSetFailTypeInvalidValue;
+        User::Leave( KErrArgument );
+        }
+
+    if( value < 0 )
+    	{
+        __TRACE( KError, _L( "'oomheapsetfail' value(rate) can't be <0" ) );    	    	
+        iRunErrorMessage = KErrMsgOOMHeapSetFailRateInvalidValue;
+        User::Leave( KErrArgument );
+    	}
+    // Get value
+    // OOM heap's SETFAIL range is from 1 to n
+    iHeapSetFailValue = value + 1;
+    __TRACE( KMessage, ( 
+        _L( "'oomheapsetfail' value(rate): %d" ), iHeapSetFailValue ) );
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: OOMHeapToNormal
+
+     Description: Initialize all OOM related variables.
+  
+     Parameters: None.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Proposal
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::OOMHeapToNormal()
+    {
+    __TRACEFUNC();
+
+    if( iTestScripter )
+        {
+        // This should initialize also
+        iTestScripter->iOOMIgnoreFailure = EFalse;
+        }
+
+    iHeapFailNext = 0;
+    iHeapSetFailType = RHeap::ENone;
+    iHeapSetFailValue = 0;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: TestInterference
+
+     Description: Starts test interference.
+  
+     Parameters: CStifItemParser* aItem: in: Item object for parsing.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Approved
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::TestInterferenceL( CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgTestInterferenceNameNotDefined, "TestInterference : Parameter name is not defined" );
+    _LIT( KErrMsgTestInterferenceCommandNotDefined, "TestInterference : Parameter command is not defined" );
+    _LIT( KErrMsgTestInterferenceCommandInvalidValue, "TestInterference : Parameter command has invalid value" );
+    __TRACEFUNC();
+    TPtrC name;
+    TPtrC command;
+
+    // Get name
+    if( aItem->GetNextString( name ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' name" ) ) );
+        iRunErrorMessage = KErrMsgTestInterferenceNameNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+    // Get command
+    if( aItem->GetNextString( command ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' command" ) ) );
+        iRunErrorMessage = KErrMsgTestInterferenceCommandNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+
+    if( command == _L( "start" ) )
+        {
+        __TRACE( KMessage, ( _L( "'testinterference' called, starts test interference") ) );
+        StartInterferenceL( name, aItem );
+        }
+    else if( command == _L( "stop" ) )
+        {
+        __TRACE( KMessage, ( _L( "'testinterference' called, stops and releases test interference") ) );
+        StopInterferenceL( name );
+        }
+    else
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown command for 'testinterference'[%S]" ), &command ) );
+        iRunErrorMessage = KErrMsgTestInterferenceCommandInvalidValue;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: StartInterference
+
+     Description: 
+  
+     Parameters: CStifItemParser* aItem: in: Item object for parsing.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Approved
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::StartInterferenceL( TDesC& aName, CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgStartInterferenceCategoryNotDefined, "TestInterference : Parameter category is not defined" );
+    _LIT( KErrMsgStartInterferenceCategoryInvalidValue, "TestInterference : Parameter category has invalid value" );
+    _LIT( KErrMsgStartInterferenceTypeNotDefined, "TestInterference : Parameter type is not defined" );
+    _LIT( KErrMsgStartInterferenceTypeInvalidValue, "TestInterference : Parameter type has invalid value" );
+    _LIT( KErrMsgStartInterferenceIdleNotDefined, "TestInterference : Parameter idle is not defined or has invalid value" );
+    _LIT( KErrMsgStartInterferenceIdleInvalidValue, "TestInterference : Parameter idle has invalid value" );
+    _LIT( KErrMsgStartInterferenceActiveNotDefined, "TestInterference : Parameter active is not defined or has invalid value" );
+    _LIT( KErrMsgStartInterferenceActiveInvalidValue, "TestInterference : Parameter active has invalid value" );
+    
+    __TRACEFUNC();
+    TPtrC category;
+    TPtrC type;
+    TInt idle( 0 );
+    TInt active( 0 );
+    TInt priority( 0 );
+
+    // Get category
+    if( aItem->GetNextString( category ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' category" ) ) );
+        iRunErrorMessage = KErrMsgStartInterferenceCategoryNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+    // Get type
+    if( aItem->GetNextString( type ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' type" ) ) );
+        iRunErrorMessage = KErrMsgStartInterferenceTypeNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+
+    TPtrC timeStr;
+    TReal time;
+    // Get idle time
+    if( aItem->GetNextString( timeStr ) != KErrNone )
+        {        
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' idle" ) ) );
+        iRunErrorMessage = KErrMsgStartInterferenceIdleNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+    if ( TLex( timeStr ).Val( time, '.' ) != KErrNone )
+    	{
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' idle" ) ) );
+        iRunErrorMessage = KErrMsgStartInterferenceIdleNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave    	
+    	}
+    // Convert idle time from milli to micro seconds
+   	idle = static_cast<TInt>( time * 1000.0);
+
+    if( idle < 0 )
+    	{
+        __TRACE( KError, ( 
+                _L( "Argument 'testinterference' idle can't be <0" ) ) );
+    	iRunErrorMessage = KErrMsgStartInterferenceIdleInvalidValue;
+    	User::Leave( KErrArgument );
+    	}
+   // Get active time
+    if( aItem->GetNextString( timeStr ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' active" ) ) );
+        iRunErrorMessage = KErrMsgStartInterferenceActiveNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+    if ( TLex( timeStr ).Val( time, '.' ) != KErrNone )
+    	{
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' idle" ) ) );
+        iRunErrorMessage = KErrMsgStartInterferenceIdleNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave    	
+    	}
+    
+    // Convert active time from milli to micro seconds
+   	active = static_cast<TInt>( time * 1000.0 );
+   	
+    if( active < 0 )
+    	{
+        __TRACE( KError, ( 
+                _L( "Argument 'testinterference' active can't be <0" ) ) );
+    	iRunErrorMessage = KErrMsgStartInterferenceActiveInvalidValue;
+    	User::Leave( KErrArgument );
+    	}
+    
+   // Get priority
+    if( aItem->GetNextInt( priority ) != KErrNone )
+        {
+        // Log information only do not return. Priority value is optional.
+        __TRACE( KInit, ( 
+            _L( "Unknown argument for 'testinterference' priority or value not given, default priority will be used" ) ) );
+        }    
+
+    MSTIFTestInterference* interference = NULL;
+
+    // Get category
+    if( category == _L("activeobject") )
+        {
+        interference = MSTIFTestInterference::NewL( iTestScripter,
+                            MSTIFTestInterference::EActiveObject );
+        }
+    else if( category == _L("thread") )
+        {
+        interference = MSTIFTestInterference::NewL( iTestScripter,
+                            MSTIFTestInterference::EThread );
+        }
+    else
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' category[%S]" ), &category ) );
+        iRunErrorMessage = KErrMsgStartInterferenceCategoryInvalidValue;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+
+    // Create object that include test interference information and append this
+    // to array.
+    TTestInterference* object = new (ELeave) TTestInterference();
+    object->iName = aName;
+    object->iInterference = interference;
+
+    // Array for handling test interference between different objects
+    TInt ret = iTestInterferenceArray.Append( object );
+    if( ret != KErrNone )
+        {
+        delete object;
+        __TRACE( KError, ( 
+            _L( "CTestRunner::StartInterference: iTestInterferenceArray.Append fails:[%d]" ), ret ) );
+        User::Leave( ret );
+        }
+
+    // Set priority if user given
+    if( priority != 0 )
+        {
+        interference->SetPriority( priority );
+        }
+
+    // Get type
+    if( type == _L("cpuload") )
+        {
+        interference->StartL( MSTIFTestInterference::ECpuLoadMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemreadc") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemReadCMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemreadd") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemReadDMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemreade") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemReadEMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemreadz") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemReadZMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemwritec") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemWriteCMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemwrited") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemWriteDMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemwritee") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemWriteEMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemfillandemptyc") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemFillAndEmptyCMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemfillandemptyd") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemFillAndEmptyDMicroSeconds, idle , active );
+        }
+    else if( type == _L("filesystemfillandemptye") )
+        {
+        interference->StartL( MSTIFTestInterference::EFileSystemFillAndEmptyEMicroSeconds, idle , active );
+        }
+    else
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'testinterference' type[%S]" ), &type ) );
+        iRunErrorMessage = KErrMsgStartInterferenceTypeInvalidValue;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: StopInterference
+
+     Description: Stops test interference.
+  
+     Parameters: TDesC& aName: in: Indicates right test interference object.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Approved
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::StopInterferenceL( TDesC& aName )
+    {    
+    _LIT( KErrMsgStopInterference, "TestInterference : testinterference %S was not start" );
+    __TRACEFUNC();
+    
+    TInt count = iTestInterferenceArray.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        if( iTestInterferenceArray[i]->iName == aName )
+            {
+            // Found test module, return description
+            iTestInterferenceArray[i]->iInterference->Stop();
+            // Delete data
+            delete iTestInterferenceArray[i];
+            // Remove pointer to deleted data(Append())
+            iTestInterferenceArray.Remove( i );
+            // iTestMeasurementArray can contain only one type of measurement
+            // so we can break when type is removed.
+            return;
+            }
+        }
+    __TRACE( KError, ( 
+            _L( "'testinterference' type[%S] was not start" ), &aName ) );
+    iRunErrorMessage.Format( KErrMsgStopInterference, &aName );
+    User::Leave( KErrArgument ); // Error in parsing => Leave
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: MeasurementL
+
+     Description: Starts test measurement.
+  
+     Parameters: CStifItemParser* aItem: in: Item object for parsing.
+
+     Return Values: None.
+
+     Errors/Exceptions: Leaves if StartBappeaMeasurementL() fails.
+                        Leaves if StopBappeaMeasurementL() fails.
+
+     Status: Approved
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::MeasurementL( CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgMeasurementCommandNotDefined, "TestMeasurement : Parameter command is not defined" );
+    _LIT( KErrMsgMeasurementTypeNotDefined, "TestMeasurement : Parameter type is not defined" );
+    _LIT( KErrMsgMeasurementUnknownType, "TestMeasurement : Unknown measurement type %S" );
+    _LIT( KErrMsgMeasurementUnknownCommand, "TestMeasurement : Unknown command %S" );
+    __TRACEFUNC();
+    TPtrC type;
+    TPtrC command;
+
+    // Get command
+    if( aItem->GetNextString( command ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'measurement' command" ) ) );
+        iRunErrorMessage = KErrMsgMeasurementCommandNotDefined;
+        User::Leave( KErrArgument ); // Error in parsing => Leave
+        }
+    // Get name
+    if( aItem->GetNextString( type ) != KErrNone )
+        {
+        __TRACE( KError, ( 
+            _L( "Unknown argument for 'measurement' type" ) ) );
+        iRunErrorMessage = KErrMsgMeasurementTypeNotDefined;
+        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 ) );
+        iRunErrorMessage.Format( KErrMsgMeasurementUnknownType, &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 ) );
+        iRunErrorMessage.Format( KErrMsgMeasurementUnknownCommand, &command );
+        User::Leave( KErrArgument ); // Error in commands => Leave
+        }
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: StartMeasurementL
+
+     Description: Start measurement
+  
+     Parameters: const TDesC& aType: in: Plugin type.
+                 CStifItemParser* aItem: in: Item object for parsing.
+
+     Return Values: None.
+
+     Errors/Exceptions: Leaves is measurement operation fails.
+
+     Status: Approved
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::StartMeasurementL( const TDesC& aType,
+                                           CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgMeasurementUnknownPlugin, "Measurement : Unknown measurement plugin %S" );
+    _LIT( KErrMsgMeasurementStartFail, "Measurement : Measurement start fails" );
+    __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( 
+                    iTestScripter, 
+                    CSTIFTestMeasurement::KStifMeasurementPlugin01,
+                    configurationInfo );
+        }
+    else if( aType == KParamMeasurement02 )
+        {
+        testMeasurement = CSTIFTestMeasurement::NewL( 
+                    iTestScripter, 
+                    CSTIFTestMeasurement::KStifMeasurementPlugin02,
+                    configurationInfo );
+        }
+    else if( aType == KParamMeasurement03 )
+        {
+        testMeasurement = CSTIFTestMeasurement::NewL( 
+                    iTestScripter, 
+                    CSTIFTestMeasurement::KStifMeasurementPlugin03,
+                    configurationInfo );
+        }
+    else if( aType == KParamMeasurement04 )
+        {
+        testMeasurement = CSTIFTestMeasurement::NewL( 
+                    iTestScripter, 
+                    CSTIFTestMeasurement::KStifMeasurementPlugin04,
+                    configurationInfo );
+        }
+    else if( aType == KParamMeasurement05 )
+        {
+        testMeasurement = CSTIFTestMeasurement::NewL( 
+                    iTestScripter, 
+                    CSTIFTestMeasurement::KStifMeasurementPlugin05,
+                    configurationInfo );
+        }
+    else if( aType == KParamMeasurementBappea )
+        {
+        testMeasurement = CSTIFTestMeasurement::NewL( 
+                    iTestScripter, 
+                    CSTIFTestMeasurement::KStifMeasurementBappeaProfiler,
+                    configurationInfo );
+        }
+    else
+        {
+        __TRACE( KError, ( _L( "Unknown plugin[%S] for 'measurement'" ), &aType ) );
+        iRunErrorMessage.Format( KErrMsgMeasurementUnknownPlugin, &aType );        
+        User::Leave( KErrArgument );
+        }
+
+    // Start test measurement
+    TInt start_ret( KErrNone );
+    start_ret = testMeasurement->Start();
+    if( start_ret != KErrNone )
+        {
+        delete testMeasurement;
+        //CleanupStack::PopAndDestroy( setting_buf );
+        __TRACE( KError, ( 
+            _L( "CTestRunner::StartMeasurementL(): Measurement Start() fails:[%d]" ), start_ret ) );
+        iRunErrorMessage = KErrMsgMeasurementStartFail;
+        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( "CTestRunner::StartMeasurementL(): iTestMeasurementArray.Append fails:[%d]" ), ret ) );
+        User::Leave( ret );
+        }
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: StopMeasurementL
+
+     Description: Stops test measurement.
+  
+     Parameters: None.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Approved
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::StopMeasurementL( const TDesC& aType )
+    {
+    _LIT( KErrMsgMeasurementNotStarted, "Measurement : Measurement %S was not start" );
+    __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.
+            return;
+            }
+        }
+
+    __TRACE( KError, ( 
+            _L( "CTestRunner::StopMeasurementL(): Measurement %S was not start" ), &aType ) );
+    iRunErrorMessage.Format( KErrMsgMeasurementNotStarted, &aType  );
+    User::Leave( KErrArgument );
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestRunner
+
+     Method: AddTestCaseResultL
+
+     Description: Adds new test case result. Used with 'allownextresult'
+                  and 'allowerrorcodes' keywords.
+  
+     Parameters: CStifItemParser* aItem: in: Item object for parsing.
+
+     Return Values: None.
+
+     Errors/Exceptions: Leaves if iTestCaseResults.Append fails.
+                        Leaves if aItem->GetNextInt() fails.
+
+     Status: Approved
+    
+-------------------------------------------------------------------------------
+*/
+void CTestRunner::AddTestCaseResultL( CStifItemParser* aItem )
+    {
+    _LIT( KErrMsgAllowNextResultInvalidValue, "No expected result value given or value has invalid format" );
+    TInt result;
+
+    TPtrC codeBuf;
+    TBool found = EFalse;
+    while( aItem->GetNextString( codeBuf ) == KErrNone )
+    	{
+    	TLex codeParser( codeBuf );
+    	if ( codeParser.Val( result ) != KErrNone )
+    		{
+            __TRACE( KError, (_L("ExecuteLineL: No expected result value given")));
+            iRunErrorMessage = KErrMsgAllowNextResultInvalidValue;
+            User::Leave( KErrArgument );    		
+    		}
+    	else
+    		{
+    	    User::LeaveIfError( iTestCaseResults.Append( result ) );
+    	    // Set test case allow result to CTestModuleIf side too. This is
+    	    // used in TAL-TA5L macro handling.
+    	    User::LeaveIfError( 
+    	        iTestScripter->TestModuleIf().SetAllowResult( result ) );
+    	    found = ETrue;
+    		}
+    	}
+
+    if ( !found )
+    	{
+        __TRACE( KError, (_L("ExecuteLineL: No expected result value given")));
+        iRunErrorMessage = KErrMsgAllowNextResultInvalidValue;
+        User::Leave( KErrArgument );
+    	}    
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This module contains the implementation of CTestContinue class
+    member functions. CTestContinue handles ContinueScript calls from 
+    TestScripter.
+
+-------------------------------------------------------------------------------
+*/
+// MACROS
+#ifdef LOGGER
+#undef LOGGER
+#endif
+#define LOGGER iTestScripter->iLog
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestContinue
+
+     Method: CTestContinue
+
+     Description: Default constructor
+
+     Parameters: CTestRunner* aTestRunner: in: Backpointer to CTestRunner
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CTestContinue::CTestContinue( CTestScripter* aTestScripter,
+                              TTestObject* aObject ): 
+    // Executed with lowest priority, must be lower than CTesRunner priority 
+    CActive(  CActive::EPriorityLow ),
+    iTestScripter( aTestScripter ),
+    iObject( aObject )
+    {
+    CActiveScheduler::Add( this );
+    __TRACEFUNC();
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestContinue
+
+     Method: ConstructL
+
+     Description: Symbian OS second phase constructor
+
+     Parameters:    None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestContinue::ConstructL()
+    {
+    
+    iObject->iScript->EnableSignal( iStatus );
+    SetActive();
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestContinue
+
+     Method: NewL
+
+     Description: Two-phased constructor.
+          
+     Parameters: CTestRunner* aTestRunner: in: Backpointer to CTestRunner
+
+     Return Values: CTestContinue*: new object
+
+     Errors/Exceptions: Leaves if new or ConstructL leaves
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+
+CTestContinue* CTestContinue::NewL( CTestScripter* aTestScripter,
+                                    TTestObject* aObject )
+    {
+    CTestContinue* self = 
+        new (ELeave) CTestContinue( aTestScripter, aObject );
+     
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestContinue
+
+     Method: ~CTestContinue
+
+     Description: Destructor
+     
+     Parameters:    None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/     
+
+CTestContinue::~CTestContinue()
+    {
+    __TRACEFUNC();
+    Cancel();
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestContinue
+
+     Method: RunL
+
+     Description: Derived from CActive, handles testcase execution.
+
+     Parameters:    None.
+
+     Return Values: None.
+
+     Errors/Exceptions: Leaves on error situations.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestContinue::RunL()
+    {
+
+    __TRACEFUNC();
+    __TRACE( KMessage, (_L("CTestContinue::RunL: [%d] "), iStatus.Int() ));
+
+    if( iObject->Signal() ) 
+        {
+        // If OOM testing is ongoing ignore result check(given by user).
+        if( !iTestScripter->iOOMIgnoreFailure )
+            {
+            // Erronous case RunError will called and test handling continue 
+            // from there.
+            if( iTestScripter->TestRunner().TestCaseResults().Count() == 0 )
+                {
+                // KErrNone is the default result expected 
+                // if nothing else is given 
+                User::LeaveIfError( iTestScripter->TestRunner().
+                    TestCaseResults().Append( KErrNone ) );
+                }
+            
+            if( iTestScripter->TestRunner().TestCaseResults().
+                    Find( iStatus.Int() ) < 0 ) 
+                {
+                __TRACE( KError, ( _L("Command for [%S] failed (%d)"), 
+                    &iObject->ObjectId(), iStatus.Int() ));
+
+
+                if( iStatus.Int() == KErrNone )
+                    {
+                    User::Leave( KErrGeneral );
+                    }
+                else
+                    {
+                    User::Leave( iStatus.Int() );
+                    }
+                }
+            }
+        else
+            {
+            __TRACE( KMessage, ( 
+                _L( "OOM test: 'oomignorefailure' is ON, signal result[%d] ignored" ),
+                iStatus.Int() ));
+            }
+
+        iTestScripter->TestRunner().TestCaseResults().Reset();
+        
+         __TRACE( KMessage, (_L("CTestContinue::RunL: Set runner active ")));
+        iTestScripter->iTestRunner->SetRunnerActive();   
+        }
+    else
+        {
+        // Signal called from test side but 'waittestclass' not yet processed
+        iObject->iAsyncResult = iStatus.Int();
+        }        
+        
+    iObject->iScript->EnableSignal( iStatus );
+    SetActive();
+    
+    }
+     
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestContinue
+
+     Method: DoCancel
+
+     Description: Derived from CActive handles the Cancel
+
+     Parameters:    None.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CTestContinue::DoCancel()
+    {
+
+    __TRACEFUNC();
+    __TRACE( KMessage, (_L("CTestContinue::DoCancel")));
+
+    iObject->iScript->CancelSignal();
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CTestContinue
+
+     Method: RunError
+
+     Description: Derived from CActive handles the Cancel
+
+     Parameters:    None.
+
+     Return Values: None.
+
+     Errors/Exceptions: None.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TInt CTestContinue::RunError( TInt aError )
+    {
+
+    // Return error from here, if none given from execution
+    if( iTestScripter->iResult.iResult == KErrNone )
+        {
+        iTestScripter->UpdateTestCaseResult(aError, _L("CTestContinue::RunError"));
+        }
+    CActiveScheduler::Current()->Stop();
+     
+    return KErrNone;
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This module contains the implementation of CDefinedValue class
+    member functions. 
+-------------------------------------------------------------------------------
+*/
+
+// ================= MEMBER FUNCTIONS =========================================
+/*
+-------------------------------------------------------------------------------
+
+     Class: CDefinedValue
+
+     Method: CDefinedValue
+
+     Description: Default constructor
+
+     C++ default constructor can NOT contain any code, that
+     might leave.
+     
+     Parameters: None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CDefinedValue::CDefinedValue()
+    {
+    }
+     
+/*
+-------------------------------------------------------------------------------
+
+     Class: CDefinedValue
+
+     Method: ConstructL
+
+     Description: Symbian OS second phase constructor
+
+     Symbian OS default constructor can leave.
+
+     Parameters:    TDesC& aName: in: Define name
+                    TDesC& aValue: in: Define value
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CDefinedValue::ConstructL( TDesC& aName, TDesC& aValue )
+    {    
+
+    iNameBuf = aName.AllocLC();
+    iName.Set( iNameBuf->Des() );
+    iValueBuf = aValue.AllocLC();
+    iValue.Set( iValueBuf->Des() );
+    CleanupStack::Pop( iValueBuf );
+    CleanupStack::Pop( iNameBuf );
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: CDefinedValue
+
+     Method: NewL
+
+     Description: Two-phased constructor.
+          
+     Parameters:    TDesC& aName: in: Define name
+                    TDesC& aValue: in: Define value
+
+     Return Values: CDefinedValue*: new object
+
+     Errors/Exceptions: Leaves if new or ConstructL leaves.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+CDefinedValue* CDefinedValue::NewL( TDesC& aName, TDesC& aValue )
+    {
+
+    CDefinedValue* self = new (ELeave) CDefinedValue();
+     
+    CleanupStack::PushL( self );
+    self->ConstructL( aName, aValue );
+    CleanupStack::Pop();
+
+    return self;
+
+    }    
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CDefinedValue
+
+     Method: ~CDefinedValue
+
+     Description: Destructor
+     
+     Parameters:    None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/     
+CDefinedValue::~CDefinedValue()
+    {
+    
+    delete iValueBuf;
+    delete iNameBuf;
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CDefinedValue
+
+     Method: SetValueL
+
+     Description: Set new define value
+
+     Parameters:    TDesC& aValue: in: Define value
+
+     Return Values: None
+
+     Errors/Exceptions: Leaves on error.
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+void CDefinedValue::SetValueL( TDesC& aValue )
+    {
+    delete iValueBuf;
+    iValueBuf = 0;
+    iValueBuf = aValue.AllocLC();
+    iValue.Set( iValueBuf->Des() );
+    CleanupStack::Pop( iValueBuf );
+    
+    }
+
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: CDefinedValue
+
+     Method: Name
+
+     Description: Returns define name.
+
+     Parameters:  None
+
+     Return Values: TDesC: Define name
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TDesC& CDefinedValue::Name()
+    { 
+    return iName; 
+    }
+        
+/*
+-------------------------------------------------------------------------------
+
+     Class: CDefinedValue
+
+     Method: Value
+
+     Description: Returns define value.
+
+     Parameters:  None
+
+     Return Values: TDesC: Define value
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TDesC& CDefinedValue::Value()
+    { 
+    return iValue; 
+    }
+    
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This module contains the implementation of TTestObjectBase class
+    member functions. 
+-------------------------------------------------------------------------------
+*/
+
+// ================= MEMBER FUNCTIONS =========================================
+/*
+-------------------------------------------------------------------------------
+
+     Class: TTestObjectBase
+
+     Method: TTestObjectBase
+
+     Description: Constructor
+
+     Parameters: None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/    
+TTestObjectBase::TTestObjectBase( TObjectType aType ) : 
+    iAsyncResult( KErrNone ),
+    iType( aType )
+    {
+    
+    RDebug::Print( _L("TTestObjectBase::TTestObjectBase") );
+    iName.Zero(); 
+    
+    }
+    
+    /*
+-------------------------------------------------------------------------------
+
+     Class: TTestObjectBase
+
+     Method: ~TTestObjectBase
+
+     Description: Destructor
+
+     Parameters: None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/    
+TTestObjectBase::~TTestObjectBase()
+    {
+    
+    RDebug::Print( _L("TTestObjectBase::~TTestObjectBase") );
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This module contains the implementation of TTestObject class
+    member functions. 
+-------------------------------------------------------------------------------
+*/
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: TTestObject
+
+     Method: TTestObject
+
+     Description: Constructor
+
+     Parameters: None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/    
+TTestObject::TTestObject() :
+    TTestObjectBase( EObjectNormal ),
+    iScript(0),
+    iContinue(0),
+    iCount(0)
+    {
+
+    RDebug::Print( _L("TTestObject::TTestObject") );
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: TTestObject
+
+     Method: ~TTestObject
+
+     Description: Destructor
+
+     Parameters: None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TTestObject::~TTestObject()
+    { 
+    
+    RDebug::Print( _L("TTestObject::~TTestObject") );
+    delete iContinue; 
+    delete iScript;
+    
+    }
+        
+/*
+-------------------------------------------------------------------------------
+
+     Class: TTestObject
+
+     Method: RunMethodL
+
+     Description: Run specified method from testclass.
+
+     Parameters: CStifItemParser* aItem: in: itemparser
+
+     Return Values: Symbian OS error code
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TInt TTestObject::RunMethodL( CStifItemParser& aItem )
+    { 
+    
+    return iScript->RunMethodL( aItem ); 
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    This module contains the implementation of TTestObjectKernel class
+    member functions. 
+-------------------------------------------------------------------------------
+*/
+// ================= MEMBER FUNCTIONS =========================================
+
+
+/*
+-------------------------------------------------------------------------------
+
+     Class: TTestObjectKernel
+
+     Method: TTestObjectKernel
+
+     Description: Constructor
+
+     Parameters: None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/    
+TTestObjectKernel::TTestObjectKernel() : 
+    TTestObjectBase( EObjectKernel )
+    {
+    
+    RDebug::Print( _L("TTestObjectKernel::TTestObjectKernel") );
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+     Class: TTestObjectKernel
+
+     Method: ~TTestObjectKernel
+
+     Description: Destructor
+
+     Parameters: None
+
+     Return Values: None
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TTestObjectKernel::~TTestObjectKernel()
+    { 
+    
+    RDebug::Print( _L("TTestObjectKernel::~TTestObjectKernel") );
+    
+    iTestClass.Close(); 
+    User::FreeLogicalDevice( iLddName );
+    
+    }
+   
+/*
+-------------------------------------------------------------------------------
+
+     Class: TTestObjectKernel
+
+     Method: RunMethodL
+
+     Description: Run specified method from kernel testclass.
+
+     Parameters: CStifItemParser& aItem: in: itemparser
+
+     Return Values: Symbian OS error code
+
+     Errors/Exceptions: None
+
+     Status: Draft
+    
+-------------------------------------------------------------------------------
+*/
+TInt TTestObjectKernel::RunMethodL( CStifItemParser& aItem )
+    { 
+    
+    TPtrC method;
+    TPtrC params;
+    
+    User::LeaveIfError( aItem.GetNextString( method ) );
+    aItem.Remainder( params );
+    
+    TInt result;
+    TMethodResultDes resultDes;
+          
+    // Need to change descriptors from 16bit to 8bit for EKA2 kernel
+    // because STIF Parser doesn't support 8bit parsing
+    HBufC8 * myBuf1 = HBufC8::NewL( method.Length() );
+    TPtr8 met8 = myBuf1->Des();   
+    met8.Copy( method );
+        
+    HBufC8 * myBuf2 = HBufC8::NewL( params.Length() );
+    TPtr8 par8 = myBuf2->Des();   
+    par8.Copy( params );
+    
+    TInt ret =  iTestClass.RunMethod( met8, par8, result, resultDes );
+
+    delete myBuf1;
+    delete myBuf2;
+    
+    if( ret != KErrNone )
+        {
+        return ret;
+        }
+    
+    return result;                             
+                                     
+    };
+    
+// ================= OTHER EXPORTED FUNCTIONS =================================
+
+/*
+-------------------------------------------------------------------------------
+    
+     Function: LibEntryL
+
+     Description: Polymorphic Dll Entry Point
+
+     Parameters:    None.
+
+     Return Values: CTestScripter*: pointer to new CTestScripter
+
+     Errors/Exceptions: Leaves if NewL leaves.
+
+     Status: Draft
+     
+-------------------------------------------------------------------------------
+*/
+
+EXPORT_C CTestScripter* LibEntryL()
+    {
+    return CTestScripter::NewL();
+    
+    }
+
+// End of File