cbsref/csyrefplugins/csy27010/test/unit_test_base/unitTestBase.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:23:08 +0300
branchRCL_3
changeset 65 630d2f34d719
permissions -rw-r--r--
Revision: 201035 Kit: 201035

//
// * Copyright 2004 Neusoft America Inc.
// * All rights reserved.
// * This component and the accompanying materials are made available
// * under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available
// * at the URL "http://www.eclipse.org/legal/epl-v10.html".
// *
// * Contributors:
// * Keith Collins (Neusoft America Inc.)  original software development and additional code and modifications.
// * Thomas Gahagen (Neusoft America Inc.)  additional code and modifications.
// * Zhen Yuan (Neusoft America Inc.)  additional code and modifications.
// *
// * Description:  This file contains the defintion for the base class from 
// *               which all unit test classes are derived.
//

// UnitTestBase.h

/** @file UnitTestBase.h
 *
 */

#ifndef UNITTESTBASE_H__
#define UNITTESTBASE_H__

#include <e32base.h>
#include <e32test.h>
#include <c32comm.h>
#include "f32file.h"
//#include "inifile.h"

#include <etel.h>
#include <etelmm.h>

//#include "Constants.h"

//comment out this line if both passed & failed tests
//are to be logged in the test log file, reftsyTest.txt
//#define LOG_FAILED_TESTS_ONLY

#define TEST(AAA) {TInt XXX = (AAA); if (XXX) return (__LINE__);}

//_LIT(KCsyName, "ECUART.CSY");
_LIT(KCsyName, "GSM0710.CSY");
//_LIT(KTsyName,    "phonetsy");
_LIT(KTsyName,    "GSM0707");

_LIT(KTestSessionPath, "c:\\Logs\\Tests\\");
_LIT(KUnitTestSpec, "UTS;");
_LIT(KAccTestSpec, "ATS;");
_LIT(KAutoTestMarker, "AUTO;");
_LIT(KPassed, "PASSED;");
_LIT(KFailed, "FAILED;");
_LIT(KZeroPadding, "0");
_LIT(KHyphen,"-");
_LIT(KSemiColon,";");
_LIT(KColon, ":");
_LIT(KNewLine, "\r\n");

const TUint KTsyTesterSetupTime = 3000000;
const TUint KTsyTestCompleteTime = 3000000;
const TUint KBufSize1 = 1;
const TUint KBufSize4 = 4;
const TUint KBufSize25 = 25;
const TUint KBufSize10 = 10;
const TUint KBufSize100 = 100;
const TUint KZeroPadValue = 10;
const TUint KMaxTestTelNumberSize = 20;

// BttTest.Ini constants
_LIT(KIniFile, "CommPTest.INI");
_LIT(KIniSection, "PhoneNumberList");
_LIT(KIniSection2, "Sms");
_LIT(KIniSection3, "GeneralSettings");
_LIT(KIniTelNumConnect1, "TelNumConnect1");
_LIT(KIniTelNumConnect2, "TelNumConnect2");
_LIT(KIniTelNumConnect3, "TelNumConnect3");
_LIT(KIniTelNumConnect4, "TelNumConnect4");
_LIT(KIniTelNumConnect5, "TelNumConnect5");
_LIT(KIniTelNumConnect6, "TelNumConnect6");
_LIT(KIniTelNumConnect7, "TelNumConnect7");
_LIT(KIniTelNumDataConnect, "TelNumDataConnect");
_LIT(KIniTelNumNeverConnect, "TelNumNeverConnect");
_LIT(KIniTelNumRejectCall, "TelNumRejectCall");
_LIT(KIniTelNumRemoteEndHangUp, "TelNumRemoteEndHangUp");
_LIT(KIniTelNumIncorrect1, "TelNumIncorrect1");
_LIT(KIniTelNumIncorrect2, "TelNumIncorrect2");
_LIT(KIniTelNumMobile1, "TelNumMobile1");
_LIT(KIniTelNumDTMFTest, "TelNumDTMFTest");
_LIT(KIniTelNumCallback, "TelNumCallbackService");
_LIT(KIniTelNumDataServer1, "TelNumDataServer1");
_LIT(KIniTelNumDataServer2, "TelNumDataServer2");
_LIT(KIniTelNumDataServer3, "TelNumDataServer3");
_LIT(KIniTelNumDataServer4, "TelNumDataServer4");
_LIT(KIniSmsDestNumber, "SmsDestNumber");
_LIT(KIniTelNumberInMadCow, "SimTelNumberInMadCow");
_LIT(KIniSmsNetworkName, "SmsNetworkName");
_LIT(KIniTypeOfTest, "TypeOfTest");
_LIT(KIniKeepPhoneOpen, "KeepPhoneOpen");
_LIT(KIniAutoRepeatFailedTests, "AutoRepeatFailedTests");
_LIT(KIniTypeOfNumber1, "DestNumberIs44Format");
_LIT(KIniTypeOfNumber2, "MadCowNumberIs44Format");

// Moved from phone
const TUint KDelayLong   = 10000000;
const TUint KDelayMedium = 1000000;
const TUint KDelayShort  = 100000;

//const TUint KOneSecond = 1000000;
const TUint KTwoSeconds = 2000000;
const TUint KFiveSeconds = 5000000;
const TUint KTenSeconds = 10000000;
const TUint KTwentySeconds = 20000000;

#define KEightSeconds TTimeIntervalMicroSeconds32(8000000)

#if defined (__WINS__)
#define PDD_NAME _L("ECDRV")
#define LDD_NAME _L("ECOMM")
#else  // __GCC32__
#define PDD_SIR_NAME _L("ESIR")
#define PDD_UART_NAME _L("ECUART4")
#define LDD_NAME _L("ECOMM")
#endif

const TInt KErrWrongValue=KErrGeneral;

//Network Name
//Size of text string must be less than
//12 for the  Cellnet and Vodafone test SIM
//10 for the  Orange test SIM
//8  for the  One-2-One  test SIM
//for the SMSP list storage test to pass.
const TUint KMaxSimNameLen = 12;

class CUnitTestBase : public CBase
	{
public:
	enum TTestMode
		{
		EBatch,
		EInteractive
		};

	enum TTestPhoneNumbers
		{
		ETelNumConnect1,
		ETelNumConnect2,
		ETelNumConnect3,
		ETelNumConnect4,
		ETelNumConnect5,
		ETelNumConnect6,
		ETelNumConnect7,
		ETelNumDataConnect,
		ETelNumNeverConnect,
		ETelNumRejectCall,
		ETelNumIncorrect1,
		ETelNumIncorrect2,
		ETelNumDTMFTest,
		ETelNumCallbackService,
		ETelNumDataServer1,
		ETelNumDataServer2,
		ETelNumDataServer3,
		ETelNumDataServer4,
		ESmsDestNumber,
		ETelNumberInMadCow,
		ESmsNetworkName,
		ETypeOfTest
		};

//	virtual static void CreateTestL()=0;//not allowed in C++!!
	~CUnitTestBase();

	inline RTest Test() const;

	//These functions are called within CreateTestL() which is a
	//static member function of CUnitTestBase derived classes.
	//Every derived class must implement CreateTestL() as it
	//first calls NewL() to instantiate the derived class before
	//calling SetUpTest() and RunUnitTestsL().
	//CreateTestL() is called in E32Main() which should be in the file
    //containing the CUnitTestBase derived class implementation
	//Please look at the SMS test code for an example on how to
	//code up E32main() and CreateTestL()
	virtual TInt SetUpTest();    //load drivers & start C32
	void RunUnitTestsL();

	//Helper Functions
	TInt CompareTestResult(TInt aExpectedResult,TRequestStatus aStatus);

	//For running more than one at once
	void ResizeConsoleL(const TDesC& aName, TInt aXOrg, TInt aYOrg, TInt aXSize, TInt aYSize);

	//For test result logging
	//Setters to be called by derived classes within their specific tests
	inline void SetTsIdentifier(const TName& aTsIdentifier);
	inline void SetMethodName(const TName& aMethodName);
	inline void SetFunIndex(TUint aFunIndex);
	void SetFunIndex2(TUint aFunIndex1,TUint aFunIndex2);
	void SetFunIndex3(TUint aFunIndex1,TUint aFunIndex2,
		              TUint aFunIndex3);
	void SetFunIndex4(TUint aFunIndex1,TUint aFunIndex2,
		              TUint aFunIndex3,TUint aFunIndex4);

	// These three made public for the acceptance tests
	TInt  LoadComms();
	TInt  UnloadComms();
	TBool DoSingleTestL(TInt aMethodNum, TInt aTestNum, TTestMode aTestMode);

protected:
	CUnitTestBase(const TDesC& aUnitTestName,const TDesC& aLogFileName,
				  const TDesC& aTestSpecName,const TDesC& aTestScriptName);
	void ConstructL();

	TInt GetRequestOrTimeOut(TRequestStatus& aRequestStatus,
		TTimeIntervalMicroSeconds32 aTimeOut);

	//Derived classes must implement this function
	//which is just simply a switch statement to
	//run their specific tests according to API and test numbers
	virtual void RunTestsL(TBool aEndInd,TTestMode aTestMode,
						   TInt& aErrCode, TInt& aLeaveCode,
		                   TInt aApiNumber,TInt aTestNumber)=0;
	//this function is to be called within RunTestsL() in the default case
	//of the switch statement
	void ActionNoMatch(TBool aEndInd,TTestMode aTestMode,
					   TInt aApiNumber,TInt aTestNumber);

	// overload this function if you want to show what test is what number
	virtual void PrintTestSpecIdentifiers();
	// overload this function to show detail of the tests
	virtual void PrintTestDetails(TInt aTstSpecNumber);

	// Should the base class automatically connect to the Etel server. Overload if not
	virtual TBool HasTestRangesDefined();

	void RequestIncomingCallL(RMobileCall& aCall);
	TBool DoTestsL();

protected:
	virtual TInt PostTestDelayTime();     ///< configurable delay time after each test
	inline void LeaveIfPhoneAlreadyOpenL();

private:
	void GetCompilationDate(TInt& aDay, TInt& aMonth, TInt& aYear);
	void EnsureTargetDeviceClockIsSet();  ///< prompt user for date if Assabet clock not set
	void ReadStr(TDes& aDes);

	TBool DoAutoMethodsL();
	TBool DoAutoMethodTestsL(TInt aMethodNum);
	TBool DoTestsInSpecifiedRangeL(TInt aStartMethodNum,
									TInt aStartTestNum,
									TInt aEndMethodNum,
									TInt aEndTestNum);

	//DoTestsL() calls SelectTestL(), RunTestsL() and LogTestResult()

	TBool SelectTestL(TInt& aApiNum,TInt& aTestNum,
						TInt& aEndApiNum, TInt& aEndTestNum,
						TTestMode& aTestMode, TBool& aExit);

	//These functions are called within SelectTestL()
	TInt  UserChoice(TChar aNumberKey);
	TBool UserSelectionL(TChar aMainNumber,
						TInt aNumMethods,
						TBool aRangeSpecified,
						TInt& aApiNum, TInt& aTestNum,
						TTestMode& aTestMode);




	//process command line params
	TBool CommandLineL(TInt& aApiNum, TInt& aTestNum,
						TInt& aEndApiNum, TInt& aEndTestNum);

	void LogTestResult(TInt aErrCode, TInt aLeaveCode, TBool aEndInd,
		               TInt aApiNumber,TInt aTestNumber,TTestMode aTestMode);

	TInt WriteLog(TBool aIsPassed,TUint aFunIndex,TUint aApiNum,
		          TUint aTstNum, TInt aErrorCode);
	void FormDateTimeBit(TDes8& aDateTimeField,TUint aDateTimeBit,
		                 TBool aIsDateSepa,TBool aAddSepa);

private:
	RCommServ   iCommServer;

	TBuf<KMaxTestTelNumberSize> iTelNumConnect1;
	TBuf<KMaxTestTelNumberSize> iTelNumConnect2;
	TBuf<KMaxTestTelNumberSize> iTelNumConnect3;
	TBuf<KMaxTestTelNumberSize> iTelNumConnect4;
	TBuf<KMaxTestTelNumberSize> iTelNumConnect5;
	TBuf<KMaxTestTelNumberSize> iTelNumConnect6;
	TBuf<KMaxTestTelNumberSize> iTelNumConnect7;
	TBuf<KMaxTestTelNumberSize> iTelNumMobile1;
	TBuf<KMaxTestTelNumberSize> iTelNumDataConnect;
	TBuf<KMaxTestTelNumberSize> iTelNumNeverConnect;
	TBuf<KMaxTestTelNumberSize> iTelNumRejectCall;
	TBuf<KMaxTestTelNumberSize> iTelNumRemoteEndHangUp;
	TBuf<KMaxTestTelNumberSize> iTelNumIncorrect1;
	TBuf<KMaxTestTelNumberSize> iTelNumIncorrect2;
	TBuf<KMaxTestTelNumberSize> iTelNumDTMFTest;
	TBuf<KMaxTestTelNumberSize> iTelNumCallback;
	TBuf<KMaxTestTelNumberSize> iTelNumDataServer1;
	TBuf<KMaxTestTelNumberSize> iTelNumDataServer2;
	TBuf<KMaxTestTelNumberSize> iTelNumDataServer3;
	TBuf<KMaxTestTelNumberSize> iTelNumDataServer4;
	TBuf<KMaxTestTelNumberSize> iSmsDestNumber;
	TBuf<KMaxTestTelNumberSize> iTelNumberInMadCow;
	TBuf<KMaxSimNameLen>		iSmsNetworkName;
	TInt	 iTypeOfTest;

	///< Determines whether to repeat the tests that failed at the end of a full automatic run
	TBool    iRepeatFailedTests;
	///< Do we want to keep the phone open between tests?
	TBool    iKeepPhoneOpen;

	TBool iExitAfterTestsComplete;

private:
	// Another session with Etel, to be kept permanently open. Helps to test
	// bad states building up, speeds the tests up too...

	struct TTestFailure
		{
		TTestFailure(TInt aMethodNum,TInt aTestIndex) : iMethodNum(aMethodNum), iTestIndex(aTestIndex) {}
		TInt iMethodNum;
		TInt iTestIndex;
		};
	typedef RArray<TTestFailure> RFailedTestsArray;
	RFailedTestsArray iFailedTests;

protected:
	RFs iFs;
	RFile iLogFile;
	RTest		iTest;
	const TName iUnitTestName;
	const TName iLogFileName;
	const TName iTestScriptName;
	const TName iTestSpecName;
	TName iTsIdentifier;
	TName iMethodName;
	RArray<TUint> iFunIndices;
	};

//inline functions
RTest CUnitTestBase::Test() const
	{
	return iTest;
	}

void CUnitTestBase::SetTsIdentifier(const TName& aTsIdentifier)
	{
	iTsIdentifier=aTsIdentifier;
	}

void CUnitTestBase::SetMethodName(const TName& aMethodName)
	{
	iMethodName=aMethodName;
	}

void CUnitTestBase::SetFunIndex(TUint aFunIndex)
	{
	iFunIndices.Insert(aFunIndex,0);
	}

void CUnitTestBase::LeaveIfPhoneAlreadyOpenL()
	{
	if (iKeepPhoneOpen)
		User::Leave(KErrAbort);
	}

#endif//END UNITTESTBASE_H__