--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/advancedaudiocontroller/tsrc/advancedaudiocontrollertestmodule/ActiveScheduledTestModule/src/ActiveScheduledTestModuleBase.cpp Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,604 @@
+/*
+* Copyright (c) 2007 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: Active Scheduler Test Module
+*
+*/
+
+
+// INCLUDE FILES
+#include <StifTestInterface.h>
+#include "ActiveScheduledTestModuleBase.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
+
+
+/*-------------------------------------------------------------------------------
+
+ DESCRIPTION
+
+ This module contains the implementation of ActiveScheduledTestModuleBase class
+ member functions.
+
+-------------------------------------------------------------------------------*/
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*-------------------------------------------------------------------------------
+
+ Class: CActiveScheduledTestModuleBase
+
+ Method: CActiveScheduledTestModuleBase
+
+ Description: Default constructor
+
+ C++ default constructor can NOT contain any code, that might leave.
+
+ Parameters: None
+ Return Values: None
+ Errors/Exceptions: None
+ Status: Draft
+
+------------------------------------------------------------------------------- */
+CActiveScheduledTestModuleBase::CActiveScheduledTestModuleBase(TInt aMinTestCaseId, TInt aMaxTestCaseId, const TDesC &aTitleFormat)
+ : iTitleFormat(aTitleFormat) ,
+ iOutputPrinter(0, iLogger, KDefaultConsoleTraceDescription, KDefaultTracePrefix) ,
+ iMaxTestCaseId(aMaxTestCaseId) ,
+ iMinTestCaseId(aMinTestCaseId)
+ {}
+
+CActiveScheduledTestModuleBase::CActiveScheduledTestModuleBase
+ (
+ TInt aMinTestCaseId,
+ TInt aMaxTestCaseId,
+ const TDesC &aTitleFormat,
+ const TDesC &aConsoleTraceDescription,
+ const TDesC &aTracePrefix, TInt aPrintPriority
+ )
+ : iTitleFormat(aTitleFormat) ,
+ iOutputPrinter(0, iLogger, aConsoleTraceDescription, aTracePrefix, aPrintPriority) ,
+ iMaxTestCaseId(aMaxTestCaseId) ,
+ iMinTestCaseId(aMinTestCaseId)
+ {}
+
+ /* -------------------------------------------------------------------------------
+ Class: CActiveScheduledTestModuleBase
+ Method: ~CActiveScheduledTestModuleBase
+ Description: Destructor
+ Parameters: None
+ Return Values: None
+ Errors/Exceptions: None
+ Status: Draft
+------------------------------------------------------------------------------- */
+CActiveScheduledTestModuleBase::~CActiveScheduledTestModuleBase()
+ {
+ delete iScheduler;
+ delete iLogger;
+ }
+
+/* -------------------------------------------------------------------------------
+ Class: CActiveScheduledTestModuleBase
+ Method: ConstructL
+ Description: Symbian OS second phase constructor
+ Symbian OS default constructor can leave.
+ Parameters: None
+ Return Values: None
+ Errors/Exceptions: <description how errors and exceptions are handled>
+ Status: Draft
+------------------------------------------------------------------------------- */
+void CActiveScheduledTestModuleBase::ConstructL()
+ {
+ iOutputPrinter.SetTestModule(this);
+ if ( ! iScheduler)
+ {
+ iScheduler = new (ELeave) CActiveScheduler;
+ CActiveScheduler::Install(iScheduler); // install as active scheduler
+ }
+ }
+
+/*-------------------------------------------------------------------------------
+
+ Class: CActiveScheduledTestModuleBase
+
+ Method: InitL
+ Description: Initialization function.
+ Init is used to initialize the Test Module.
+ Parameters: TName& aIniFile: in: Filename:
+ Configuration file for the test module
+
+ Return Values: KErrNone: No error
+ <value_1: Description
+ value_n: Description line 1
+ description line 2>
+
+ Errors/Exceptions: None
+ Status: Draft
+
+------------------------------------------------------------------------------- */
+TInt CActiveScheduledTestModuleBase::InitL( TFileName& aIniFile , TBool /*aFirstTime*/ )
+ {
+ CStifParser *parser=0;
+
+ TParsePtrC fp(aIniFile);
+ TRAPD(parserError, parser = CStifParser::NewL(fp.DriveAndPath() , fp.NameAndExt() ) );
+ if (!parserError && parser)
+ {
+ CleanupStack::PushL(parser);
+
+ if (parser)
+ {
+ CStifSectionParser *section;
+
+ section = parser->SectionL(KSectionStart, KSectionEnd);
+ CleanupStack::PushL(section);
+ if (section)
+ {
+ TPtrC logFileName;
+ TPtrC logPath;
+
+ if ( (section->GetLine(KLogFileTag, logFileName, ENoTag) == KErrNone) && (section->GetLine(KLogPathTag, logPath, ENoTag) == KErrNone) )
+ {
+ InitLoggerL(logPath, logFileName);
+ }
+ }
+ if (!iLogger)
+ {
+ InitLoggerL();
+ }
+ iOutputPrinter.Printf(KLoggerStarted, &aIniFile);
+ CleanupStack::PopAndDestroy(section);
+ }
+
+ CleanupStack::PopAndDestroy(parser);
+ }
+ else
+ {
+ iLogger = 0;
+ }
+ iOutputPrinter.SetLogger(iLogger);
+
+ TInt error = iLogger ? KErrNone : KErrNotFound;
+ return error;
+ }
+
+/* -------------------------------------------------------------------------------
+
+ Class: CActiveScheduledTestModuleBase
+ Method: InitLoggerL
+ Description: Initialize the logger for this test module
+ Parameters: File name where to append data
+ Return Values: Error value
+ Errors/Exceptions: <description how errors and exceptions are handled>
+ Status: Draft
+
+------------------------------------------------------------------------------- */
+void CActiveScheduledTestModuleBase::InitLoggerL( const TFileName& aLogPath , const TFileName& aLogFile)
+ {
+ //iLogger = CStifLogger::NewL(aLogPath, aLogFile, ETxt, EFile, EFalse); //, ETrue, ETrue, ETrue, ETrue, EFalse);
+ iLogger = CStifLogger::NewL(aLogPath, aLogFile, CStifLogger::ETxt, CStifLogger::EFile, EFalse) ;
+ if ( ! iLogger )
+ {
+ InitLoggerL();
+ }
+ }
+
+void CActiveScheduledTestModuleBase::InitLoggerL()
+ {
+ iLogger = CStifLogger::NewL(KDefLogPath, KDefLogFile, CStifLogger::ETxt, CStifLogger::EFile, EFalse);
+ }
+
+
+/* -------------------------------------------------------------------------------
+ Class: CActiveScheduledTestModuleBase
+ Method: GetTestCasesL
+ Description: Get test cases.
+ GetTestCases is used to inquire test cases from the Test Module. Test
+ cases are stored to array of test cases. The Test Framework will be
+ the owner of the data in the RPointerArray after GetTestCases return
+ and it does the memory deallocation.
+
+ Parameters: const TFileName& aConfig: in: Test case file (optional)
+ RPointerArray<RTestEngine::TTestCaseInfo>& aTestCases: out:
+ Array of TestCases
+
+ Return Values: KErrNone: No error
+ <value_1: Description
+ value_n: Description line 1
+ description line 2>
+ Errors/Exceptions: None
+------------------------------------------------------------------------------- */
+TInt CActiveScheduledTestModuleBase::GetTestCasesL( const TFileName& aConfig , RPointerArray<TTestCaseInfo>& aTestCases )
+ {
+
+ //Get a parser for the config file
+ iOutputPrinter.Printf(KOpeningConfig, &aConfig);
+
+ if (! aConfig.Length() ) {
+ iOutputPrinter.Printf(KConfigRequired() );
+ return KErrConfigInvalid;
+ }
+
+ TParsePtrC fp(aConfig);
+ CStifParser *parser = CStifParser::NewL(fp.DriveAndPath() , fp.NameAndExt() );
+ CleanupStack::PushL(parser);
+
+ if (!parser)
+ {
+ iOutputPrinter.Printf(KConfigRequired() );
+ return KErrPathNotFound;
+ }
+
+ //Get a section parser
+ CStifSectionParser *section;
+ TInt x = 0;
+
+ //Read all cases in config file
+ while ( (section = parser->NextSectionL(KTestCaseConfigStart , KTestCaseConfigEnd) ),section ) // use comma to avoid warning
+ {
+ CleanupStack::PushL(section);
+ TInt id = -1;
+ TPtrC TestCaseTitle;
+ TInt ErrorResult = KErrNone;
+
+ CStifItemParser *item;
+ item = section->GetItemLineL(KTagId);
+ if (item)
+ {
+ CleanupStack::PushL(item);
+
+ if (!item->GetInt(KTagId, id))
+ {
+ ErrorResult = section->GetLine(KTagTitle, TestCaseTitle, ENoTag);
+ if (!ErrorResult) {iOutputPrinter.Printf( _L("Adding case: (%d) %S") , id, &TestCaseTitle ); }
+ }
+ else
+ {
+ id = -1;
+ }
+ CleanupStack::PopAndDestroy(item);
+ }
+
+ //Read test case id
+ //Read test case title
+ //if id is valid then add the test case
+ if (iMinTestCaseId<=id && id<=iMaxTestCaseId)
+ {
+ TTestCaseInfo* testCase = new ( ELeave ) TTestCaseInfo();
+ CleanupStack::PushL( testCase );
+ testCase->iCaseNumber = x++;
+
+ testCase->iTitle.Format(iTitleFormat, id, &TestCaseTitle); //testCase->iTitle.Copy( KTestCaseTitleFormat() );
+
+ User::LeaveIfError( aTestCases.Append( testCase ) );
+
+ CleanupStack::Pop( testCase );
+ }
+ else
+ {
+ iOutputPrinter.Printf(_L("Skipping test with Id (%d)") , id);
+ }
+
+ CleanupStack::PopAndDestroy(section);
+ }
+
+ CleanupStack::PopAndDestroy(parser);
+
+ return KErrNone;
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CActiveScheduledTestModuleBase
+
+ Method: RunTestCaseL
+
+ Description: Run a specified testcase.
+
+ RunTestCaseL is used to run an individual test case specified
+ by aTestCase. Test cases that can be run may be requested from
+ Test Module by GetTestCases method before calling RunTestCase.
+
+ Parameters: const TInt aCaseNumber: in: case number
+ const TFileName& aConfig: in: Test case file (optional)
+ TTestResult& aResult: out: Test case result
+
+ Return Values: KErrNone: Test case is started
+ KErrNotFound: Test case not available
+ <value_1: Description
+ value_n: Description line 1
+ description line 2>
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CActiveScheduledTestModuleBase::RunTestCaseL( const TInt aCaseNumber , const TFileName& aConfig , TTestResult& aResult )
+ {
+ TInt id=-1;
+
+ //Get a parser for the config file
+ iOutputPrinter.Printf(KOpeningConfig, &aConfig);
+
+ if (! aConfig.Length() ) {
+ iOutputPrinter.Printf(KConfigRequired() );
+ aResult.iResultDes.Copy(KConfigRequired());
+ aResult.iResult = KErrNotExecuted;
+ return KErrConfigInvalid;
+ }
+
+ TParsePtrC fp(aConfig);
+ iOutputPrinter.Printf(_L("Opening configuration file [%S], case #%d"), &aConfig, aCaseNumber);
+ CStifParser *parser = CStifParser::NewL(fp.DriveAndPath() , fp.NameAndExt() );
+ CleanupStack::PushL(parser);
+
+ //Get a section parser
+ TInt retVal=0;
+ CStifSectionParser *section=0;
+ CStifItemParser *item=0;
+ section = parser->NextSectionL(KTestCaseConfigStart , KTestCaseConfigEnd, aCaseNumber+1);
+
+ if (section) {
+ CleanupStack::PushL(section);
+ item = section->GetItemLineL(KTagId);
+
+ if (item) {
+ CleanupStack::PushL(item);
+
+ if (!item->GetInt(KTagId, id)) {
+ TPtrC TestCaseTitle;
+
+ TInt TitleErrorResult = section->GetLine(KTagTitle, TestCaseTitle, ENoTag);
+ if (TitleErrorResult) { iOutputPrinter.Printf( _L("Executing test case (%d)") , id ); }
+ else { iOutputPrinter.Printf( _L("Executing test case (%d) %S") , id, &TestCaseTitle ); }
+
+ //Call Funtion to perform test
+ __UHEAP_MARK;
+ TRAPD(error, retVal = RunTestCaseFunctionL(id, section, aResult););
+ __UHEAP_MARKEND;
+
+ iOutputPrinter.Printf( _L("Finished Executing test case (%d), LeaveError=(%d)\r\n") , id, error);
+
+ if (error)
+ {
+ retVal = KErrLeft;
+ aResult.iResult=error;
+ aResult.iResultDes.Copy( KTestCaseResultLeft() );
+ }
+ } else {
+ id=-1;
+ }
+ CleanupStack::PopAndDestroy(item);
+ }
+ CleanupStack::PopAndDestroy(section);
+ }
+ CleanupStack::PopAndDestroy(parser);
+
+ if (-1!=id)
+ {
+ return retVal;
+ }
+ iOutputPrinter.Printf(KConfigInvalid() );
+ aResult.iResultDes.Copy(KConfigInvalid());
+ aResult.iResult = KErrNotFound;
+ return KErrNotFound;
+ }
+
+TTimeIntervalMicroSeconds CActiveScheduledTestModuleBase::GetTimeIntervalL(CStifSectionParser *aSection, const TDesC &aTag, TBool &aUsingDefaults, const TTimeIntervalMicroSeconds &aDefaultInterval, TBool aContinue)
+ {
+ TInt TempInterval1=0 , TempInterval2=0;
+ TInt64 tmp=0;
+ TInt ParseError=KErrNotFound;
+ TTimeIntervalMicroSeconds ReturnValue = aDefaultInterval;
+ aUsingDefaults = ETrue;
+
+ CStifItemParser *item;
+ if (aContinue)
+ {
+ item = aSection->GetNextItemLineL(aTag);
+ }
+ else
+ {
+ item = aSection->GetItemLineL(aTag);
+ }
+ if (item)
+ {
+ CleanupStack::PushL(item);
+ ParseError = item->GetInt(aTag, TempInterval1) ;
+ if (!ParseError)
+ {
+ //First delay found.
+ aUsingDefaults = EFalse;
+ //tmp = TempInterval1*1000000; //convert from seconds to microseconds
+ tmp = TempInterval1;
+ tmp*= 1000000;
+
+ if ( ! item->GetNextInt(TempInterval2) )
+ {
+ //tmp += TempInterval2*1000; //add miliseconds
+ TInt64 tmp2 = TempInterval2;
+ tmp2 *= 1000;
+ tmp += tmp2;
+
+ if ( ! item->GetNextInt(TempInterval2) )
+ {
+ tmp += TempInterval2;
+ }
+ }
+ ReturnValue = tmp;
+ }
+ CleanupStack::PopAndDestroy(item);
+ }
+ if (ParseError) {iOutputPrinter.Printf(_L("Error retrieving interval"));}
+ iOutputPrinter.Printf(_L("Interval retrieved: (%d)") , ReturnValue);
+ return ReturnValue;
+ }
+
+TTimeIntervalMicroSeconds32 CActiveScheduledTestModuleBase::GetTimeIntervalL(CStifSectionParser *aSection, const TDesC &aTag, TBool &aUsingDefault, const TTimeIntervalMicroSeconds32 &aDefaultDelay, TBool aContinue)
+ {
+ TInt ParseError=KErrNotFound;
+ TInt TempDelay=0;
+ TTimeIntervalMicroSeconds32 ReturnValue=aDefaultDelay;
+ CStifItemParser *item;
+ if (aContinue)
+ {
+ item = aSection->GetNextItemLineL(aTag);
+ }
+ else
+ {
+ item = aSection->GetItemLineL(aTag);
+ }
+ if (item)
+ {
+ CleanupStack::PushL(item);
+ ParseError = item->GetInt(aTag, TempDelay) ;
+ if (ParseError)
+ { //Delay not found, using defaults
+ aUsingDefault=ETrue;
+ }
+ else
+ { //Delay found.
+ aUsingDefault=EFalse;
+ ReturnValue=TempDelay;
+ }
+ CleanupStack::PopAndDestroy(item);
+ }
+ if (ParseError) {iOutputPrinter.Printf(_L("Error retrieving report delay"));}
+ return ReturnValue;
+ }
+
+HBufC8 *CActiveScheduledTestModuleBase::GetDescriptor8LC(const TFileName &aFileName)
+ {
+ TInt FileError, SoundSize=0;
+ RFile file;
+ RFs FsSession;
+ HBufC8 *SoundFile;
+
+ iOutputPrinter.Printf(_L("Reading descriptor from file [%S]") , &aFileName );
+ iOutputPrinter.Printf(_L("Connecting to File Server Session") );
+ FileError = FsSession.Connect();
+ if (FileError)
+ {
+ iOutputPrinter.Printf(_L("File error (%d)") , FileError);
+ User::LeaveIfError(FileError);
+ }
+
+ iOutputPrinter.Printf(_L("Opening file to get size") );
+ FileError = file.Open(FsSession, aFileName, EFileStream);
+ if (FileError)
+ {
+ iOutputPrinter.Printf(_L("File error (%d)") , FileError);
+ User::LeaveIfError(FileError);
+ }
+ FileError = file.Size(SoundSize);
+ iOutputPrinter.Printf(_L("File Size (%d)") , SoundSize);
+ if (FileError)
+ {
+ iOutputPrinter.Printf(_L("Error getting size") );
+ User::LeaveIfError(FileError);
+ }
+
+ SoundFile = HBufC8::NewLC(SoundSize);
+ TPtr8 helper = SoundFile->Des();
+ FileError = file.Read( helper );
+
+ iOutputPrinter.Printf(_L("Descriptor length [%d]") , SoundFile->Size() );
+ file.Close();
+ FsSession.Close();
+ return SoundFile;
+ }
+
+TInt CActiveScheduledTestModuleBase::GetIntL(CStifSectionParser *aSection, const TDesC &aTag, TBool &aUsingDefault, const TInt &aDefaultInt, TBool aContinue)
+ {
+ TInt ParseError=KErrNotFound;
+ TInt TempDelay=0;
+ TInt ReturnValue=aDefaultInt;
+
+ CStifItemParser *item;
+ if (aContinue)
+ {
+ item = aSection->GetNextItemLineL(aTag);
+ }
+ else
+ {
+ item = aSection->GetItemLineL(aTag);
+ }
+ if (item)
+ {
+ CleanupStack::PushL(item);
+ ParseError = item->GetInt(aTag, TempDelay) ;
+ CleanupStack::PopAndDestroy(item);
+ }
+
+ if (ParseError)
+ { //Integer not found, using defaults
+ aUsingDefault=ETrue;
+ }
+ else
+ { //Integer found.
+ aUsingDefault=EFalse;
+ ReturnValue=TempDelay;
+ }
+
+ if (ParseError) {iOutputPrinter.Printf(_L("Error retrieving integer, [%S] not found"), &aTag);}
+ iOutputPrinter.Printf(_L("Integer read, value (%d)") , ReturnValue);
+ return ReturnValue;
+ }
+
+TBool CActiveScheduledTestModuleBase::IsDurationInRange
+ ( TInt aRepeatTimes, TTimeIntervalMicroSeconds aToneDuration, TTimeIntervalMicroSeconds aRepeatSilence,
+ TTimeIntervalMicroSeconds aErrorRange , TTime aStartTime , TTime aEndTime )
+ {
+ TInt64 tmp=aToneDuration.Int64();
+ TInt64 tmp2=aRepeatSilence.Int64();
+
+ tmp*=(aRepeatTimes+1); tmp2*=(aRepeatTimes+1);
+ TTimeIntervalMicroSeconds ExpectedDuration = tmp+tmp2;
+
+ TTime EndTimeRange1 = aStartTime;
+ EndTimeRange1+= ExpectedDuration;
+ TTime EndTimeRange2 = EndTimeRange1;
+ EndTimeRange1-=aErrorRange;
+ EndTimeRange2+=aErrorRange;
+
+ iOutputPrinter.Printf(_L("Play duration (%d)") , aEndTime.MicroSecondsFrom(aStartTime) );
+ iOutputPrinter.Printf(_L("Expected duration (%d)") , ExpectedDuration);
+ return (EndTimeRange1<aEndTime && aEndTime<EndTimeRange2) ;
+ }