stif/ATSInterface/src/ATSInterface.cpp
branchRCL_3
changeset 19 07b41fa8d1dd
parent 18 3406c99bc375
child 20 ca8a1b6995f6
--- a/stif/ATSInterface/src/ATSInterface.cpp	Thu Jul 15 20:25:38 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1109 +0,0 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-* 
-* Description: CATSInterface: This object executes test cases from 
-* STIF Test Framework.
-*
-*/
-
-// INCLUDE FILES
-#include <e32base.h>
-#include <e32cons.h>
-#include <e32svr.h>
-#include "ATSInterface.h"
-#include "ATSInterfaceRunner.h"
-
-#include "StifTestInterface.h"
-
-
-// EXTERNAL DATA STRUCTURES
-// None
-
-// EXTERNAL FUNCTION PROTOTYPES  
-// None
-
-// CONSTANTS
-// None
-
-// MACROS
-// None
-
-// LOCAL CONSTANTS AND MACROS
-// None
-
-// MODULE DATA STRUCTURES
-// None
-
-// LOCAL FUNCTION PROTOTYPES
-// None
-
-// FORWARD DECLARATIONS
-// None
-
-// ==================== LOCAL FUNCTIONS ======================================= 
-// None
-
-// ================= MEMBER FUNCTIONS ========================================= 
-
-
-// ================= MEMBER FUNCTIONS =========================================
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: CATSInterface
-
-    Description: Default constructor
-
-    C++ default constructor can NOT contain any code, that
-    might leave.
-    
-    Parameters: None
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-CATSInterface::CATSInterface()
-    {
-    // Initialize buffers to zero
-    iEngineIniFile.Zero();
-    iModuleIniFile.Zero();
-    iConfigFile.Zero();
-    iTestModule.Zero();
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: ConstructL
-
-    Description: Symbian OS second phase constructor
-
-    Symbian OS default constructor can leave.
-    
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if some of called leaving functions leaves
-                       Leaves each time the LogErrorAndLeaveL is called
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CATSInterface::ConstructL()
-    {
-    RDebug::Print(_L("Creating module list object"));
-    TRAPD(err, iModuleList = CTestModuleList::NewL(NULL));
-    if(err != KErrNone)
-        {
-        LogErrorAndLeaveL(_L("CATSInterface::ConstructL"), _L("CTestModuleList::NewL"), err);
-        return;
-        }
-    if(!iModuleList)
-        {
-        LogErrorAndLeaveL(_L("CATSInterface::ConstructL"), _L("CTestModuleList::NewL - iModuleList is NULL"), KErrGeneral);
-        return;
-        }
-
-    // Read command line
-    ParseCommandLineL();
-
-    // Add to module list info about module taken from command line
-    RDebug::Print(_L("Adding command line module to list"));
-    TName moduleName;
-    moduleName.Copy(iTestModule);
-    moduleName.LowerCase();
-    err = iModuleList->AddTestModule(moduleName);
-    if(err != KErrNone && err != KErrAlreadyExists)
-        {
-        LogErrorAndLeaveL(_L("CATSInterface::ConstructL"), _L("CTestModuleList::AddTestModule - Could not add module to list of modules"), err);
-        return;
-        }
-
-    //Get added module
-    CTestModuleInfo* moduleInfo = iModuleList->GetModule(moduleName);
-    if(!moduleInfo)
-        {
-        LogErrorAndLeaveL(_L("CATSInterface::ConstructL"), _L("CTestModuleList::GetModule - Could not add get module info from list"), KErrGeneral);
-        return;
-        }
-
-    //Add ini file if given
-    if(iModuleIniFile.Length() > 0)
-        {
-        TFileName filename;
-        filename.Copy(iModuleIniFile);
-        filename.LowerCase();
-        moduleInfo->SetIniFile(filename);
-        }
-
-    //Add config file if given
-    if(iConfigFile.Length() > 0)
-        {
-        TFileName filename;
-        filename.Copy(iConfigFile);
-        filename.LowerCase();
-        moduleInfo->AddCfgFile(filename);
-        }
-
-    //Now check all config files if there are included modules
-    _LIT(KIncludeModuleStart, "[New_Include_Module]");
-    _LIT(KIncludeModuleEnd, "[End_Include_Module]");
-
-    RDebug::Print(_L("Start parsing included modules"));
-    CTestCaseFileInfo* finfo = iModuleList->GetUncheckedCfgFile();
-    while(finfo)
-        {
-        TFileName fname;
-        finfo->GetCfgFileName(fname);
-
-        RDebug::Print(_L("Checking file: '%S'"), &fname);
-        finfo->SetChecked();
-
-        CStifParser* parser = NULL;
-
-        TRAP(err, parser = CStifParser::NewL(_L(""), fname));
-        if(err != KErrNone)
-            {
-            LogErrorAndLeaveL(_L("CATSInterface::ConstructL"), _L("CStifParser::NewL - Could not create parser"), err);
-            return;
-            }
-        CleanupStack::PushL(parser);
-
-        ParseTestModulesL(parser, iModuleList, KIncludeModuleStart, KIncludeModuleEnd);
-
-        CleanupStack::PopAndDestroy(parser);
-        finfo = iModuleList->GetUncheckedCfgFile();
-        }
-    RDebug::Print(_L("End parsing included modules"));
-
-    // Create Test Engine
-    RDebug::Print(_L("Creating test engine"));
-    TInt ret = iTestEngineServ.Connect();
-    if ( ret != KErrNone )
-        {
-        // Log error
-        LogErrorAndLeaveL( _L("CATSInterface::ConstructL"), _L("iTestEngineServ.Connect"), ret );
-        return;
-        }
-
-    ret = iTestEngine.Open( iTestEngineServ, iEngineIniFile );
-    if ( ret != KErrNone )
-        {
-        // Log error
-        LogErrorAndLeaveL( _L("CATSInterface::ConstructL"), _L("iTestEngine.Open"), ret );
-        return;
-        }
-
-/*
-    // Add test module
-    ret = iTestEngine.AddTestModule( iTestModule, iModuleIniFile );
-    if ( ret != KErrNone && ret != KErrAlreadyExists )
-        {
-        // Log error
-        LogErrorAndLeaveL( _L("CATSInterface::ConstructL"), _L("iTestEngine.AddTestModule"), ret );
-        return;
-        }
-*/
-    // Add all test modules and config files
-    RDebug::Print(_L("Start creating test modules"));
-    moduleInfo = NULL;
-    TInt i;
-    TInt modCnt = iModuleList->Count();
-
-    for(i = 0; i < modCnt; i++)
-        {
-        RDebug::Print(_L("Processing module"));
-        // Get module
-        moduleInfo = iModuleList->GetModule(i);
-        if(!moduleInfo)
-            {
-            RDebug::Print(_L("Could not get module info at index %d"), i);
-            continue;
-            }
-
-        // Get module name
-        TName moduleName;
-        moduleInfo->GetModuleName(moduleName);
-        RDebug::Print(_L("module name: '%S'"), &moduleName);
-
-        // Get ini file, if exists
-        TFileName ini;
-        moduleInfo->GetIniFileName(ini);
-        if(ini.Length() == 0)
-            {
-            RDebug::Print(_L("ini file not found"));
-            }
-        else
-            {
-            RDebug::Print(_L("ini file: '%S'"), &ini);
-            }
-
-        // Create test module
-        RDebug::Print(_L("Adding module to test engine"));
-        ret = iTestEngine.AddTestModule(moduleName, ini);
-        if(ret != KErrNone && ret != KErrAlreadyExists)
-            {
-            LogErrorAndLeaveL(_L("CATSInterface::ConstructL"), _L("iTestEngine.AddTestModule"), ret);
-            return;
-            }
-
-        //Add test case files
-        TInt cfgCnt = moduleInfo->CountCfgFiles();
-        TInt j;
-        TFileName cfgFile;
-        for(j = 0; j < cfgCnt; j++)
-            {
-            moduleInfo->GetCfgFileName(j, cfgFile);
-            if(cfgFile.Length() > 0)
-                {
-                RDebug::Print(_L("config file: '%S'"), &cfgFile);
-
-                ret = iTestEngine.AddConfigFile(moduleName, cfgFile);
-                if(ret != KErrNone && ret != KErrAlreadyExists)
-                    {
-                    // Log error
-                    LogErrorAndLeaveL(_L("CATSInterface::ConstructL"), _L("RTestEngine::AddConfigFile"), ret);
-                    return;
-                    }
-                }
-            else
-                {
-                RDebug::Print(_L("Got empty cfg file"));
-                }
-            }
-        if(cfgCnt == 0)
-            {
-            RDebug::Print(_L("cfg file not found"));
-            }
-
-        RDebug::Print(_L("Module '%S' processed correctly"), &moduleName);
-        }
-
-    RDebug::Print(_L("End creating test modules"));
-
-    // Create console screen
-    iConsole = Console::NewL(
-        iTestModule, TSize( KConsFullScreen, KConsFullScreen ) );
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: NewL
-
-    Description: Two-phased constructor.
-
-    Parameters: None
-
-    Return Values: CATSInterface* : pointer to created CATSInterface object
-
-    Errors/Exceptions: Leaves if memory allocation for CATSInterface fails
-                       Leaves if ConstructL leaves
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-CATSInterface* CATSInterface::NewL()
-    {
-    // Create CATSInterface and return it
-    CATSInterface* self =  new ( ELeave ) CATSInterface();
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-    return self;
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: ~CATSInterface
-
-    Description: Destructor
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CATSInterface::~CATSInterface()
-    {
-    // Close Test Engine
-    iTestEngine.Close();
-    iTestEngineServ.Close();
-
-    delete iModuleList;
-    delete iConsole;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: ParseTestModulesL
-
-    Description: Parse and search for module info and fill list of modules.
-
-    Parameters: CStifParser*     aParser:       in: CStifParser object
-                CTestModuleList* aModuleList:   in: list of modules
-                TPtrC&           aSectionStart: in: descriptor with start of section string
-                TPTrC&           aSectionEnd:   in: descriptor with end of section string
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if some of called leaving methods leaves
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CATSInterface::ParseTestModulesL(CStifParser* aParser, CTestModuleList* aModuleList, const TDesC& aSectionStart, const TDesC& aSectionEnd)
-    {
-    //First let's find all modules given in Stif's ini file and store that info in CTestModuleList object
-    CStifSectionParser* sectionParser = NULL;
-    CStifItemParser* item = NULL;
-
-    sectionParser = aParser->SectionL(aSectionStart, aSectionEnd);
-
-    while(sectionParser)
-        {
-        RDebug::Print(_L("Found '%S' and '%S' sections"), &aSectionStart, &aSectionEnd);
-        CleanupStack::PushL(sectionParser);
-        RDebug::Print(_L("Starting to read module information"));
-
-        // Get name of module
-        _LIT(KModuleName, "ModuleName=");
-        item = sectionParser->GetItemLineL(KModuleName);
-        CleanupStack::PushL(item);
-        if(!item)
-            {
-            CleanupStack::PopAndDestroy(item);
-            LogErrorAndLeaveL(_L("CATSInterface::ParseTestModulesL"), _L("CStifItemParser::GetItemLineL - line not found from module section"), KErrNotFound);
-            return;
-            }
-        else
-            {
-            RDebug::Print(_L("'%S' found"), &KModuleName);
-            }
-
-        TPtrC name;
-        TName moduleName;
-        TInt ret(KErrNone);
-        ret = item->GetString(KModuleName, name);
-        if(ret != KErrNone)
-            {
-            CleanupStack::PopAndDestroy(item);
-            LogErrorAndLeaveL(_L("CATSInterface::ParseTestModulesL"), _L("CStifItemParser::GetString - Module name parsing left with error"), ret);
-            return;
-            }
-        else
-            {
-            RDebug::Print(_L("Module '%S' found from ini-file"), &name);
-            moduleName.Copy(name);
-            moduleName.LowerCase();
-            ret = aModuleList->AddTestModule(moduleName);
-            if(ret != KErrNone && ret != KErrAlreadyExists)
-                {
-                LogErrorAndLeaveL(_L("CATSInterface::ParseTestModulesL"), _L("CTestModuleList::AddTestModule - Could not add module to list of modules"), ret);
-                return;
-                }
-            }
-        CleanupStack::PopAndDestroy(item);
-
-        //Get pointer to added module
-        CTestModuleInfo* moduleInfo = aModuleList->GetModule(moduleName);
-        if(!moduleInfo)
-            {
-                LogErrorAndLeaveL(_L("CATSInterface::ParseTestModulesL"), _L("CTestModuleList::GetModule - Could not add get module info from list"), KErrNotFound);
-                return;
-            }
-
-        // Get ini file, if it exists
-        RDebug::Print(_L("Start parsing ini file"));
-        _LIT(KIniFile, "IniFile=");
-        item = sectionParser->GetItemLineL(KIniFile);
-        if(item)
-            {
-            RDebug::Print(_L("'%S' found"), &KIniFile);
-            CleanupStack::PushL(item);
-            TPtrC iniFile;
-            ret = item->GetString(KIniFile, iniFile);
-            if(ret == KErrNone)
-                {
-                RDebug::Print(_L("Initialization file '%S' found, file can be empty"), &iniFile);
-                TFileName filename;
-                filename.Copy(iniFile);
-                filename.LowerCase();
-                TStifUtil::CorrectFilePathL( filename );
-                moduleInfo->SetIniFile(filename);
-                }
-            else
-                {
-                RDebug::Print(_L("Initialization file not found"));
-                }
-            CleanupStack::PopAndDestroy(item);
-            }
-        else
-            {
-            RDebug::Print(_L("'%S' not found"), &KIniFile);
-            }
-
-        // Get config (testcase) file
-        RDebug::Print(_L("Start parsing cfg files"));
-        TPtrC cfgTag;
-        for(TInt i = 0; i < 2; i++)
-            {
-            //Set tag for config files
-            if(i == 0)
-                {
-                cfgTag.Set(_L("ConfigFile="));
-                }
-                else
-                {
-                cfgTag.Set(_L("TestCaseFile="));
-                }
-            //Read data
-            item = sectionParser->GetItemLineL(cfgTag);
-            while(item)
-                {
-                CleanupStack::PushL(item);
-                RDebug::Print(_L("Item '%S' found"), &cfgTag);
-                TPtrC cfgFile;
-                ret = item->GetString(cfgTag, cfgFile);
-                if(ret == KErrNone)
-                    {
-                    TFileName ifile;
-                    ifile.Copy(cfgFile);
-                    ifile.LowerCase();
-                    TStifUtil::CorrectFilePathL( ifile );
-                    RDebug::Print(_L("Configuration file '%S' found"), &ifile);
-                    moduleInfo->AddCfgFile(ifile);
-                    }
-                else
-                    {
-                    RDebug::Print(_L("Configuration file not found"));
-                    }
-                CleanupStack::PopAndDestroy(item);
-                item = sectionParser->GetNextItemLineL(cfgTag);
-                }
-            }
-
-        RDebug::Print(_L("Module '%S' information read correctly"), &moduleName);
-
-        // Get next section
-        CleanupStack::PopAndDestroy(sectionParser);
-        sectionParser = aParser->NextSectionL(aSectionStart, aSectionEnd);
-        }
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: ParseCommandLineL
-
-    Description: Parse command line parameters
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if module name not found from command line
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-void CATSInterface::ParseCommandLineL()
-    {
-    // Command line params
-    _LIT( KTestModule, "-testmodule" );
-    _LIT( KConfigFile, "-config" );
-    _LIT( KEngineIniFile, "-engineini" );
-    _LIT( KModuleIniFile, "-moduleini" );
-
-	const TInt length = User::CommandLineLength();
-
-    HBufC* cmdLine = HBufC::NewLC( length );
-    TPtr ptr = cmdLine->Des();
-
-	User::CommandLine( ptr );
-
-    TBool moduleFound( EFalse );
-    TLex lex( ptr );
-    // Parse the command line
-    while ( !lex.Eos() )
-        {
-        TPtrC tmpPtr = lex.NextToken();
-        // Check the test module name
-        if ( tmpPtr == KTestModule )
-            {
-            TPtrC module = lex.NextToken();
-            if ( module.Ptr() )
-                {
-                iTestModule.Copy( module );
-                moduleFound = ETrue;
-                }
-            }
-        // Check the module's config file
-        else if ( tmpPtr == KConfigFile )
-            {
-            TPtrC config = lex.NextToken();
-            if ( config.Ptr() )
-                {
-                iConfigFile.Copy( config );
-                TStifUtil::CorrectFilePathL( iConfigFile );
-                }
-            }
-        // Check the engine's ini file
-        else if ( tmpPtr == KEngineIniFile )
-            {
-            TPtrC iniFile = lex.NextToken();
-            if ( iniFile.Ptr() )
-                {
-                iEngineIniFile.Copy( iniFile );
-                TStifUtil::CorrectFilePathL( iEngineIniFile );
-                }
-            }
-        // Check the module's ini file
-        else if ( tmpPtr == KModuleIniFile )
-            {
-            TPtrC iniFile = lex.NextToken();
-            if ( iniFile.Ptr() )
-                {
-                iModuleIniFile.Copy( iniFile );
-                TStifUtil::CorrectFilePathL( iModuleIniFile );
-                }
-            }
-        else
-            {
-            // Skip unknown commands
-            }
-        } // while
-
-    // Destroy command line buffer
-    CleanupStack::PopAndDestroy( cmdLine );
-
-    // Module name has to exists
-    if ( !moduleFound )
-        {
-        User::Leave( KErrArgument );
-        }
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: RunTestsL
-
-    Description: Starts testing
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if RunAllTestCasesL leaves
-                       Leaves if RemoveTestModule returns error
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-void CATSInterface::RunTestsL()
-    {
-    // Run all test cases
-    RunAllTestCasesL();
-
-    /*
-    // Remove test module
-    User::LeaveIfError( iTestEngine.RemoveTestModule( iTestModule ) );
-    */
-    RDebug::Print(_L("Start removing test modules"));
-    CTestModuleInfo* moduleInfo = NULL;
-    TInt i;
-    TInt modCnt = iModuleList->Count();
-
-    for(i = 0; i < modCnt; i++)
-        {
-        RDebug::Print(_L("Processing module"));
-        // Get module
-        moduleInfo = iModuleList->GetModule(i);
-        if(!moduleInfo)
-            {
-            RDebug::Print(_L("Could not get module info at index %d"), i);
-            continue;
-            }
-
-        // Get module name
-        TName moduleName;
-        moduleInfo->GetModuleName(moduleName);
-        RDebug::Print(_L("module name: '%S'"), &moduleName);
-
-        // Remove test module
-        User::LeaveIfError(iTestEngine.RemoveTestModule(moduleName));
-        RDebug::Print(_L("Module '%S' removed"), &moduleName);
-        }
-
-    RDebug::Print(_L("End removing test modules"));
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: RunAllTestCasesL
-
-    Description: Run all test cases from test module.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if some of called leaving methods leaves
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CATSInterface::RunAllTestCasesL()
-    {
-    TInt ret( KErrNone );
-
-    /*
-    // Add given config file to test module
-    if ( iConfigFile.Length() > 0 )
-        {
-        ret = iTestEngine.AddConfigFile( iTestModule, iConfigFile );
-        if ( ret != KErrNone && ret != KErrAlreadyExists )
-            {
-            // Log error
-            LogErrorAndLeaveL( _L("CATSInterface::RunAllTestCasesL"), _L("iTestEngine.AddConfigFile"), ret );
-            return;
-            }
-        }
-    */
-
-    // Enumerate test cases
-    TCaseCount caseCount;
-    TRequestStatus status;
-    iTestEngine.EnumerateTestCases( caseCount, status );
-    User::WaitForRequest( status );
-
-    // Check that enumerate succeeded
-    if ( status != KErrNone )
-        {
-        // Log error 
-        LogErrorAndLeaveL( _L("CATSInterface::RunAllTestCasesL"), _L("iTestEngine.EnumerateTestCases"), status.Int() );
-        return;
-        }
-
-    // Get test cases to buffer
-    CFixedFlatArray<TTestInfo>* testCases = 
-        CFixedFlatArray<TTestInfo>::NewL( caseCount() );
-    CleanupStack::PushL( testCases );
-
-    ret = iTestEngine.GetTestCases( *testCases );
-    if ( ret != KErrNone )
-        {
-        // Log error 
-        LogErrorAndLeaveL( _L("CATSInterface::RunAllTestCasesL"), _L("iTestEngine.GetTestCases"), status.Int() );
-        return;
-        }
-
-    //variables used to get version of STIF
-    TInt majorV;
-    TInt minorV;
-    TInt buildV;
-    TBuf<30> relDate;
-    TStifUtil::STIFVersion(majorV, minorV, buildV, relDate);
-    
-    TBuf<50> version;
-    version.Format(_L("STIF v%d.%d.%d - "), majorV, minorV, buildV);
-    version.Append(relDate);
-    version.Append(_L("\n"));
-    
-    iConsole->Printf(version);	//printing STIF version information (version and release date)
-    iConsole->Printf( _L("Test case count: [%d]\n\n"), testCases->Count() );
-
-    // Loop through all test cases in buffer and run them
-    const TInt count = testCases->Count();
-    for ( TInt i = 0; i < count; i++ )
-        {
-#ifdef _DEBUG
-        RDebug::Print( ( *testCases)[i].iTestCaseInfo.iTitle );
-#endif
-        iConsole->Printf( _L("Now running test case: [%d] [%S] "), i+1,
-            &( *testCases )[i].iTestCaseInfo.iTitle );
-
-        // Run test case
-        RunTestCaseL( ( *testCases )[i] );
-        }
-
-    // End test set
-    CleanupStack::PopAndDestroy( testCases );
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: RunTestCaseL
-
-    Description: Run test case
-
-    Parameters: TTestInfo& aTestInfo: in: TTestInfo: Test info
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if some of called leaving methods leaves
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CATSInterface::RunTestCaseL( TTestInfo& aTestInfo )
-    {
-    TInt testResult( KErrNone );
-    CATSInterfaceRunner* runner;
-
-    // Trap to catch errors from test case executing
-    TRAPD( trapError,
-        runner = CATSInterfaceRunner::NewL( this, aTestInfo );
-        CleanupStack::PushL( runner );
-
-        testResult = RunATestCaseL( runner );
-
-        CleanupStack::PopAndDestroy( runner );
-        );
-
-    if ( trapError != KErrNone )
-        {
-        testResult = trapError;
-        }
-
-    if ( testResult != KErrNone ) // Test case is FAILED
-        {
-        // Test case failed, print out the error
-        iConsole->Printf( _L("\nTest case FAILED! err=[%d]\n"), testResult );
-        }
-
-    else // Test case is PASSED
-        {
-        iConsole->Printf( _L("\nTest case PASSED!\n") );
-        testResult = KErrNone;
-        }
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: RunATestCaseL
-
-    Description: Run a test case
-
-    Parameters: CATSInterfaceRunner* aTestCase: in: Pointer to test case runner
-
-    Return Values: TInt KErrNone: Test case passed
-                   other error code: Test case failed or cannot be executed
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CATSInterface::RunATestCaseL( CATSInterfaceRunner* aTestCase )
-    {
-    iTestCompletedError = KErrNone;
-
-    // Create timer
-    CActiveTimer* timer = CActiveTimer::NewL( iConsole );
-    CleanupStack::PushL( timer );
-
-    // Start test case and timer
-    aTestCase->StartTestL();
-    timer->StartL();
-
-    // Wait for test case completed
-    CActiveScheduler::Start();
-
-    timer->Cancel();
-    CleanupStack::PopAndDestroy( timer );
-
-    // test completion error is set in TestCompleted method
-    return iTestCompletedError;
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: TestEngineServer
-
-    Description: Return handle to Test Engine Server.
-
-    Parameters: None
-    
-    Return Values: RTestEngineServer&: Reference to RTestEngineServer handle
-
-    Errors/Exceptions: None
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-RTestEngineServer& CATSInterface::TestEngineServer()
-    {
-    return iTestEngineServ;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: TestEngine
-
-    Description: Return handle to Test Engine.
-
-    Parameters: None
-    
-    Return Values: RTestEngine&: reference to RTestEngine handle
-
-    Errors/Exceptions: None
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-RTestEngine& CATSInterface::TestEngine()
-    {
-    return iTestEngine;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: TestCompleted
-
-    Description: Test case completed
-
-    This method is called when test case is completed or error occurred
-    during the test.
-
-    Parameters: TInt aError: in: Symbian OS error: Test result
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-void CATSInterface::TestCompleted( TInt aError )
-    {
-    // Store completion error
-    iTestCompletedError = aError;
-
-    // Stop the scheduler
-    CActiveScheduler::Stop();
-
-    }
-    
-/*
--------------------------------------------------------------------------------
-
-    Class: CATSInterface
-
-    Method: LogErrorAndLeaveL
-
-    Description: Write error Logger and leave.
-
-    This function is called if some function returns error and the error cannot
-    be logged another way Logger, e.g. RTestEngineServer and
-    RTestEngine methods.
-
-    Parameters: const TDesC& aFunction: in: any string: Function where the error
-                 occurred
-                const TDesC& aDescription: in: any string: Description for error
-                const TInt aError: in: Symbian OS error: Test result
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CATSInterface::LogErrorAndLeaveL( const TDesC& aFunction, 
-                                      const TDesC& aDescription, 
-                                      const TInt aError )
-    {
-
-    RDebug::Print( _L("%S: %S [%d]"), &aFunction, &aDescription, aError );
-    User::Leave( aError );
-
-    }
-
-// ================= OTHER EXPORTED FUNCTIONS ================================= 
-
-/*
--------------------------------------------------------------------------------
-   
-    Function: E32Main
-
-    Description: Main function called by E32.
-
-    Parameters: None
-
-    Return Values: TInt: KErrNone :No errors occurred
-                   TInt: Other Symbian OS Error :Error catch by TRAP
-
-    Errors/Exceptions: TRAP is used to catch errors from leaving methods.
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-GLDEF_C TInt E32Main()
-    {
- 
-    TInt processHandleCountBefore;
-    TInt threadHandleCountBefore;
-    RThread().HandleCount( processHandleCountBefore, threadHandleCountBefore );
-    TInt reqsBefore = RThread().RequestCount();
-
-    TInt processHandleCountAfter;
-    TInt threadHandleCountAfter;
-    TInt reqsAfter;
-
-    __UHEAP_MARK;
-
-    CTrapCleanup* cleanup = CTrapCleanup::New();
-    if ( cleanup == NULL )
-        {
-        __UHEAP_MARKEND;
-        return KErrNoMemory;
-        }
-
-    CActiveScheduler* activeScheduler = new CActiveScheduler;
-    if ( activeScheduler == NULL )
-        {
-        delete cleanup;
-        __UHEAP_MARKEND;
-        return KErrNoMemory;
-        }
-    CActiveScheduler::Install( activeScheduler );
-
-    // Construct the test client
-    CATSInterface* test = NULL;
-    TRAPD( err, test = CATSInterface::NewL() );
-    if ( err != KErrNone )
-        {
-#ifdef _DEBUG
-        RDebug::Print(_L("ATSInterface construction failed %d: "), err );
-#endif
-        delete cleanup;
-        delete activeScheduler;
-        __UHEAP_MARKEND;
-        return err;
-        }
-
-    // Run tests
-    TRAP( err, test->RunTestsL() );
-    if ( err != KErrNone )
-        {
-#ifdef _DEBUG
-        RDebug::Print(_L("RunTestsL left with %d: "), err );
-#endif
-        }
-
-
-    // Deallocate resources
-    delete test;
-    delete activeScheduler;
-    delete cleanup;
-
-    reqsAfter = RThread().RequestCount();
-    RThread().HandleCount( processHandleCountAfter, threadHandleCountAfter );
-
-    if ( reqsAfter != reqsBefore )
-        {
-#ifdef _DEBUG
-        RDebug::Print(_L("Request count not matching! %d vs. %d: "),
-            reqsBefore, reqsAfter );
-#endif
-        }
-    if ( threadHandleCountAfter != threadHandleCountBefore )
-        {
-#ifdef _DEBUG
-        RDebug::Print(_L("Handle count not matching! %d vs. %d: "),
-            threadHandleCountBefore, threadHandleCountAfter );
-#endif
-        }
-
-    __UHEAP_MARKEND;
-
-    return err;
-    }
-
-// End of File