networkingtestandutils/networkingintegrationtest/IntegrationTestUtils/TestStep.cpp
changeset 0 af10295192d8
--- /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 <e32base.h>
+
+// 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<const TDesC16> 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 <MAX_LOG_LINE_LENGTH> 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<const TDesC16> 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 <MAX_LOG_LINE_LENGTH> 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<const TDesC> 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 <MAX_LOG_LINE_LENGTH> 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<MAX_LOG_FILENAME_LENGTH> 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<MAX_LOG_FILENAME_LENGTH> 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<MAX_LOG_FILENAME_LENGTH> 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<MAX_LOG_FILENAME_LENGTH> 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 <MAX_LOG_LINE_LENGTH> 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;	
+	}