diff -r 000000000000 -r af10295192d8 networkingtestandutils/networkingintegrationtest/IntegrationTestUtils/TestStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkingtestandutils/networkingintegrationtest/IntegrationTestUtils/TestStep.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,679 @@ +// Copyright (c) 2003-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 contains CTestCase which is the base class for all the TestCase DLLs +// +// + +/** + @file TestStep.cpp +*/ + +// EPOC includes +#include + +// Test system includes +#include "../inc/Log.h" +#include "../inc/TestStep.h" +#include "../inc/TestSuite.h" + +EXPORT_C CTestStep::CTestStep(const TDesC &aName):iTestStepName(aName),iTestStepResult(EPass) +/** +constructor +*/ +{} + +EXPORT_C CTestStep::CTestStep():iTestStepResult(EPass) +/** +constructor +*/ +{} + +EXPORT_C CTestStep::~CTestStep() +/** +destructor +*/ + { + } + +EXPORT_C void CTestStep::Log( TRefByValue format, ... ) +/** +general purpose log interface for TestSteps + +@param format "printf" format string +*/ + { + + VA_LIST aList; + VA_START( aList, format ); + + TIntegrationTestLog16Overflow iOverflow16; + + // decode formated data for display on console + TBuf LineBuf; + LineBuf.AppendFormatList( format, aList, &iOverflow16 ); + + // send the data to the log system via the suite + iSuite->Log( _L("%S"),&LineBuf ); + + VA_END( aList ); + + } + +EXPORT_C void CTestStep::Log( TInt aSeverity, TRefByValue format, ... ) +/** +Display the log data on the console. +If there is a log file open write to it. + +@param aSeverity severity level +@param format "printf" format string +*/ +{ + VA_LIST aList; + VA_START( aList, format ); + + TIntegrationTestLog16Overflow iOverflow16; + + // decode formated data for display on console + TBuf LineBuf; + LineBuf.AppendFormatList( format, aList, &iOverflow16 ); + + // send the data to the log system via the suite + if( aSeverity & iSuite->Severity()) iSuite->Log( aSeverity, _L("%S"),&LineBuf ); + + VA_END( aList ); +} + +EXPORT_C void CTestStep::LogExtra(const TText8* aFile, TInt aLine, TInt aSeverity, + TRefByValue aFmt,...) +/** +Display the log data on the console +if there is a log file open write to it. + +@param aFile source file name +@param aLine line number +@param aSeverity severity level +@param aFmt "printf" format string +*/ + { + VA_LIST aList; + VA_START( aList, aFmt ); + + TIntegrationTestLog16Overflow iOverflow16; + + // decode formated data for display on console + TBuf LineBuf; + LineBuf.AppendFormatList( aFmt, aList, &iOverflow16 ); + + // send the data to the log system via the suite + if( aSeverity & iSuite->Severity()) + { + iSuite->LogExtra(aFile, aLine, aSeverity, LineBuf ); + } + + VA_END( aList ); + } + +EXPORT_C void CTestStep::LoadConfig( TDesC &config ) +/** +If a config file is supplied, then create and load CIniData object + +@param config config file parameter +*/ + { + + // if a config file supplied then use + if ( config.Length() != 0) + { + + // get the full pathname default drive name and extension + _LIT(KRelated,"C:\\config.ini"); + TParse ConfigFileName; + TInt returnCode = ConfigFileName.Set( config, &KRelated, NULL ); + + if (returnCode != KErrNone ) + { + // error opening FileManager + ERR_PRINTF2( _L("Error opening config file %S"), &ConfigFileName.FullName()); + } + + // create and load the CIniData object + TRAPD(r,iConfigData=CIniData::NewL(ConfigFileName.FullName() )); + + // check if loaded ok + if ( r==KErrNone ) + { + // loaded ok + iConfigDataAvailable = ETrue; + } + else + { + // failed to load + iConfigDataAvailable = EFalse; + iConfigData = NULL; + + // report error + TPtrC Errortxt = CLog::EpocErrorToText(r); + ERR_PRINTF2(_L("Failed to load config data file error= %S"), &Errortxt ); + } + } + } + +EXPORT_C void CTestStep::UnLoadConfig( void ) +/** +If a config file is supplied, then clean up Config data object +*/ + { + iConfigDataAvailable = EFalse; + + // clean up Config data object + if (iConfigData) delete iConfigData; + } + +EXPORT_C TBool CTestStep::GetBoolFromConfig(const TDesC &aSectName,const TDesC &aKeyName,TBool &aResult) +/** +Read a boolean value from the configuration file. + +@param aSectName SectionName in the config file +@param aKeyName textname for bool value in the config file +@param aResult textname for bool value in the config file +@return ETrue or EFalse +*/ + { + // check file available + if ( !iConfigDataAvailable ) + { + ERR_PRINTF1(_L("No config file available")); + return EFalse; + } + + TBool ret=EFalse; + TPtrC result; + + // get the value + ret=iConfigData->FindVar( aSectName,aKeyName, result); + + // if failed to decode display error + if (!ret) + { + // display error message + ERR_PRINTF3(_L("Failed to read section:%S key:%S "), + &aSectName, &aKeyName ); + + // return fail + return EFalse; + } + + // return result as a TBool + ( aResult =(result.FindF( _L("true")) == KErrNotFound )? EFalse : ETrue ); + return ETrue; + } + +EXPORT_C TBool CTestStep::GetIntFromConfig(const TDesC &aSectName,const TDesC &aKeyName,TInt &aResult) +/** +Read a integer value from the configuration file. + +@param aSectName SectionName in the config file +@param aKeyName textname for integer value in the config file +@param aResult textname for integer value in the config file +@return ETrue or EFalse +*/ + { + // check file available + if ( !iConfigDataAvailable ) + { + ERR_PRINTF1(_L("No config file available")); + return EFalse; + } + TBool ret=EFalse; + TPtrC result; + + // get the value + ret=iConfigData->FindVar( aSectName,aKeyName, result); + + // if failed to decode display error + if (!ret) + { + // display error message + ERR_PRINTF3(_L("Failed to read section:%S key:%S "), + &aSectName, &aKeyName ); + + // return fail + return EFalse; + } + + // use Tlex to convert to a TInt + TLex lex(result); + if (lex.Val(aResult) == KErrNone ) + return ETrue; + else + return EFalse; +} + +EXPORT_C TBool CTestStep::GetStringFromConfig(const TDesC &aSectName,const TDesC &aKeyName,TPtrC &aResult) +/** +Read a string from the configuration file. + +@param aSectName SectionName in the config file +@param aKeyName textname for string value in the config file +@param aResult textname for string value in the config file +@return ETrue or EFalse +*/ + { + // check file available + if ( !iConfigDataAvailable ) + { + ERR_PRINTF1(_L("No config file available")); + return EFalse; + } + + TBool ret=EFalse; + + // get the value + //TPtrC result; + ret=iConfigData->FindVar( aSectName,aKeyName, aResult); + + // if failed to decode display error + if (!ret) + { + // display error message + ERR_PRINTF3(_L("Failed to read section:%S key:%S "), + &aSectName, &aKeyName ); + + // return fail + return EFalse; + } + + return ETrue; +} + +EXPORT_C enum TVerdict CTestStep::doTestStepPreambleL( void ) +/** +Default empty implementation of doTestStepPreambleL(). +Test steps can overide this to implement required code. +This can be used to provide common initialisation for the test steps +Preamble should only return EPass or EInconculsive. + +@return EPass if the step completed successfully +or EInconculsive, if the step did not attempt the run. +*/ + { + return EPass; + } + +EXPORT_C enum TVerdict CTestStep::doTestStepPostambleL( void ) +/** +Default empty implementation of doTestStepPostambleL(). +Test steps can overide this to implement required code. +This can be used to provide common initialisation for the test steps +Postamble should only return EPass or EInconculsive. + +@return EPass if the step completed successfully +or EInconculsive, if the step did not attempt the run. +*/ + { + return EPass; + } + +EXPORT_C void CTestStep::testBooleanTrue( TBool aCondition, char* aFile, TInt aLine ) +/** +Check the boolean expression is true. +If not record error. + +@param aCondition Expression to check. +@param aFile Current script file name. +@param aLine Current line number. + */ + { + + // check condition + if (aCondition) + return; + + // this is only relevant if the current result is pass + if ( iTestStepResult == EPass ) + iTestStepResult = EFail; + + // convert filename for log + TBuf fileName; + fileName.Copy(TPtrC8((TText8*)aFile)); + + // display a log message + ERR_PRINTF3(_L("Test Failed in file:%S line:%d"), &fileName, aLine); + + } + +EXPORT_C void CTestStep::testBooleanTrueL( TBool aCondition, char* aFile, TInt aLine ) +/** +Check the boolean expression is true. +If not record error and then leave. + +@param aCondition Expression to check. +@param aFile Current script file name. +@param aLine Current line number. +*/ + { + + // check condition + if (aCondition) + return; + + // this is only relevant if the current result is pass + if ( iTestStepResult == EPass ) + iTestStepResult = EFail; + + // convert filename for log + TBuf fileName; + fileName.Copy(TPtrC8((TText8*)aFile)); + + // display a log message + ERR_PRINTF3(_L("Test Failed in file:%S line:%d"), &fileName, aLine); + + // leave with error code + User::Leave(TEST_ERROR_CODE); + + } + +EXPORT_C void CTestStep::testBooleanTrueWithErrorCodeL( TBool aCondition, TInt errorCode , char* aFile, TInt aLine ) +/** +Check the boolean expression is true. +If not record error, error code and then leave. + +@param aCondition Expression to check. +@param errorCode Error code. +@param aFile Current script file name. +@param aLine Current line number. +*/ + { + // check condition + if (aCondition) + return; + + // this is only relevant if the current result is pass + if ( iTestStepResult == EPass ) + iTestStepResult = EFail; + + // convert filename for log + TBuf fileName; + fileName.Copy(TPtrC8((TText8*)aFile)); + + // get the error text + TPtrC Error = EpocErrorToText(errorCode); + + // display a log message + ERR_PRINTF4(_L("Test Failed with error:%S in file:%S line:%d"), + &Error, &fileName, aLine); + + // leave with error code + User::Leave( errorCode ); + + } + +EXPORT_C void CTestStep::testBooleanTrueWithErrorCode( TBool aCondition, TInt errorCode , char* aFile, TInt aLine ) +/** +Check the boolean expression is true. +If not record error and error code. + +@param aCondition Expression to check. +@param errorCode Error code. +@param aFile Current script file name. +@param aLine Current line number. +*/ + { + // check condition + if (aCondition) + return; + + // this is only relevant if the current result is pass + if ( iTestStepResult == EPass ) + iTestStepResult = EFail; + + // convert filename for log + TBuf fileName; + fileName.Copy(TPtrC8((TText8*)aFile)); + + // get the error text + TPtrC Error = EpocErrorToText(errorCode); + + // display a log message + ERR_PRINTF4(_L("Test Failed with error:%S in file:%S line:%d"), + &Error, &fileName, aLine); + } + +EXPORT_C void CTestStep::TestCheckPointCompareL(TInt aVal,TInt aExpectedVal, + const TDesC& aText, char* aFile,TInt aLine) +/** +Check the value against an expected value. +If not record error and error code. + +@param aVal Value to check. +@param aExpectedVal Expected value. +@param aText Text for log file. +@param aFile Current script file name. +@param aLine Current line number. +*/ + { + if(aVal != aExpectedVal) + { + + // decode formated data for display on console + TBuf LineBuf; + LineBuf.AppendFormat( _L("FAILED test: Val = %d Exp Val = %d %S"), + aVal, aExpectedVal, &aText); + + // send the data to the log system via the suite + iSuite->LogExtra((TText8*)aFile, aLine, ESevrErr, LineBuf ); + User::Leave(aVal); + } + } + +EXPORT_C TPtrC CTestStep::EpocErrorToText(TInt aError) +/** +Convert a Error code to text. + +@param aError error code to display as text. +@return Text describing the error. +*/ + { + switch (aError) + { + case KErrNone: + return _L("KErrNone"); + case KErrNotFound: + return _L("KErrNotFound"); + case KErrGeneral: + return _L("KErrGeneral"); + case KErrCancel: + return _L("KErrCancel"); + case KErrNoMemory: + return _L("KErrNoMemory"); + case KErrNotSupported: + return _L("KErrNotSupported"); + case KErrArgument: + return _L("KErrArgument"); + case KErrTotalLossOfPrecision: + return _L("KErrTotalLossOfPrecision"); + case KErrBadHandle: + return _L("KErrBadHandle"); + case KErrOverflow: + return _L("KErrOverflow"); + case KErrUnderflow: + return _L("KErrUnderflow"); + case KErrAlreadyExists: + return _L("KErrAlreadyExists"); + case KErrPathNotFound: + return _L("KErrPathNotFound"); + case KErrDied: + return _L("KErrDied"); + case KErrInUse: + return _L("KErrInUse"); + case KErrServerTerminated: + return _L("KErrServerTerminated"); + case KErrServerBusy: + return _L("KErrServerBusy"); + case KErrCompletion: + return _L("KErrCompletion"); + case KErrNotReady: + return _L("KErrNotReady"); + case KErrUnknown: + return _L("KErrUnknown"); + case KErrCorrupt: + return _L("KErrCorrupt"); + case KErrAccessDenied: + return _L("KErrAccessDenied"); + case KErrLocked: + return _L("KErrLocked"); + case KErrWrite: + return _L("KErrWrite"); + case KErrDisMounted: + return _L("KErrDisMounted"); + case KErrEof: + return _L("KErrEof"); + case KErrDiskFull: + return _L("KErrDiskFull"); + case KErrBadDriver: + return _L("KErrBadDriver"); + case KErrBadName: + return _L("KErrBadName"); + case KErrCommsLineFail: + return _L("KErrCommsLineFail"); + case KErrCommsFrame: + return _L("KErrCommsFrame"); + case KErrCommsOverrun: + return _L("KErrCommsOverrun"); + case KErrCommsParity: + return _L("KErrCommsParity"); + case KErrTimedOut: + return _L("KErrTimedOut"); + case KErrCouldNotConnect: + return _L("KErrCouldNotConnect"); + case KErrCouldNotDisconnect: + return _L("KErrCouldNotDisconnect"); + case KErrDisconnected: + return _L("KErrDisconnected"); + case KErrBadLibraryEntryPoint: + return _L("KErrBadLibraryEntryPoint"); + case KErrBadDescriptor: + return _L("KErrBadDescriptor"); + case KErrAbort: + return _L("KErrAbort"); + case KErrTooBig: + return _L("KErrTooBig"); + default: + iPrnBuf.Format(_L(" %d"),aError); + return iPrnBuf; + } + } + + +/** + Active controller +*/ +CActiveControl* CActiveControl::NewL(MControlNotify* aControl) + { + CActiveControl* self = new(ELeave) CActiveControl(aControl); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +void CActiveControl::ConstructL() + { + } + +CActiveControl::CActiveControl(MControlNotify* aControl) +: CActive(EPriorityStandard) +/** +constructor +*/ + { + iControl = aControl; + } + +CActiveControl::~CActiveControl() + { + } + +EXPORT_C void CActiveControl::ReStart() + { + TRequestStatus* status = &iStatus; + SetActive(); + User::RequestComplete(status, KErrNone); + } + +void CActiveControl::RunL() + { + if(iControl->CallStateMachine()) + { + SetActive(); + } + } + +void CActiveControl::DoCancel() + { + } + +EXPORT_C CTestActiveStep::CTestActiveStep(const TDesC &aName):CTestStep(aName) +/** +constructor +*/ + { + + } +EXPORT_C CTestActiveStep::CTestActiveStep() +/** +constructor +*/ + { + } +EXPORT_C CTestActiveStep::~CTestActiveStep() +/** +destructor +*/ + { + } +EXPORT_C enum TVerdict CTestActiveStep::doTestStepPreambleL( void ) + { + TVerdict retVal(EPass); + if ((retVal=CTestStep::doTestStepPreambleL())!=EPass) + { + return retVal; + } + iScheduler = new(ELeave) CActiveScheduler; + CActiveScheduler::Install(iScheduler); + iControl = CActiveControl::NewL(this); + iScheduler->Add(iControl); + iStatus = iControl->Status(); + return retVal; + } +EXPORT_C enum TVerdict CTestActiveStep::doTestStepPostambleL( void ) + { + TVerdict retVal(EPass); + if ((retVal=CTestStep::doTestStepPostambleL())!=EPass) + { + return retVal; + } + iStatus=NULL; + if (iControl) + { + delete iControl; + iControl = NULL; + } + if (iScheduler) + { + delete iScheduler; + iScheduler=NULL; + } + return retVal; + }