mmtestenv/mmtestfw/Source/TestFramework/parseline.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:56:55 +0200
changeset 0 40261b775718
permissions -rw-r--r--
Revision: 201003 Kit: 201005

// Copyright (c) 2002-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:
//

#ifndef __PARSELINE_H__
#define __PARSELINE_H__

/**
 *
 * Max len of string buffers
 *
 * @xxxx
 *
 */
const TInt KMaxLenStepData = 256;
const TInt KMaxLenScriptLine = 2000;

/**
 *
 * Guard timer default
 *
 * @xxxx
 *
 */
const TInt KNoGuardTimer = -1L;

/**
 * constant that indicates that the panic reason should be ignored
 */
const TInt KNoPanicReason = -1;

/**
 *
 * This class is used for storing information on 
 * test suite DLLs currently loaded
 *
 * @xxxx
 *
 */
class CSuiteDll : public CBase
	{
public:

	static CSuiteDll* NewL(const TDesC& aName, CLog* aLog);
	void ConstructL(const TDesC& aName, CLog* aLog);
	~CSuiteDll();

	// accessors
	CTestSuite* Suite() const;
	TPtrC Name() const;

private:
	CLog*						iLog;
	RLibrary					iLibrary;		// DLL Library 
	CTestSuite*					iTestSuite;		// pointer to Test suite object
	TBuf<KMaxLenTestSuiteName>	iName;		// name of the test suite
	};

/**
 *
 * CStepData class used for passing test step data to the step thread
 * JW 03-01-03 : rewritten from TStepData to use heap - avoiding stack overflow
 *
 * @xxxx
 *
 */
class CStepData
	{
public:
	// constructor
	static CStepData* NewL(const TDesC& aStep, const TDesC& aConfig, CSuiteDll* aSuite);
	static CStepData* NewL(const TDesC& aStep, const TDesC& aConfig, const TDesC& aParamSet, CSuiteDll* aSuite);
	~CStepData();
	CStepData();
	void ConstructL(const TDesC& aStep, const TDesC& aConfig, const TDesC& aParamSet, CSuiteDll* aSuite);

	// accessors
	TPtrC Step() const;
	TPtrC Config() const;
	const TDesC& ParamSet() const;
	CSuiteDll* SuiteDll() const;
private:
	TBuf<KMaxLenStepData> iStep; 
	TBuf<KMaxLenStepData> iConfig;
	TBuf<KMaxLenStepData> iParamSet;
	CSuiteDll*			  iSuite;
	};

/**
 *
 * CParseLine - the main test script interpreter
 *
 * @xxxx
 *
 */
class CParseLine : public CBase
	{
public:
	static CParseLine* NewL(CScript* aScript, CTestUtils* aTestUtils, CLog* aLog, TInt64 aGuardTimer, const TDesC& aMatchString);
	~CParseLine();	
	CParseLine(const TDesC& aMatchString);
	void ConstructL(CScript* aScript, CTestUtils* aTestUtils, CLog* aLog, TInt64 aGuardTimer);

	void ProcessLineL(const TDesC8& aNarrowline, TInt aLineNo);	// process a line of script

	// accessors
	TPtrC CurrentSuiteName() const;
	TPtrC CurrentStepName() const;

private:

	// thread functions
	static TInt ThreadFunctionL (TAny* aPtr);
	static TInt ThreadTrapFunctionL (TAny* aPtr);

	// script keyword commands
	void ScriptPrint(const TDesC& aText);
	void RunScriptL(const TDesC& aText);
	void RunTestStep(const TDesC& aText);
	void RunPanicTestStep(const TDesC& aText);
	void RunTerminationTestStep(const TDesC& aText);
	void RunUtil(const TDesC& aText);
	void LoadSuiteL(const TDesC& aText);
	void Reboot();
	TVerdict DoTestNewThread(const TDesC& aSuite, const TDesC& aStep, 
				TInt64 aGuardTimerValue, const TDesC& aConfig, const TDesC& aParamSet);
	TVerdict DoPanicTest(const TDesC& aSuite, const TDesC& aStep, TInt64 aGuardTimerValue, const TExitCategoryName aExitCategory, TInt aExitReason, const TDesC& aConfig, const TDesC& aParamSet);
	TVerdict DoTerminationTest(const TDesC& aSuite, const TDesC& aStep, TInt64 aGuardTimerValue, TInt aExitReason, const TDesC& aConfig);
	void GetHeapAndStackSize(const CStepData* aStepData, TInt* aHeapSize, TInt* aStackSize);
	void Unload();
	void HeapMark();
	void HeapCheck();
	void RequestMark();
	void RequestCheck();
	void HandlesMark();
	void HandlesCheck();
	void RunProgram(const TDesC& aText);
	void TestComplete(const TDesC& aText);
	void Delay(const TDesC& aText);
	void SetSeverity(const TDesC& aText);
	void LogSettings(const TDesC& aText);
	// logger - use only with macros
	void LogExtra(const TText8* aFile, TInt aLine, TInt aSeverity,
		TRefByValue<const TDesC16> aFmt, ...);
	void CreateUniqueTestThreadL(const TDesC& aBaseName, TDes& aThreadName, RThread& aTestThread, TThreadFunction aFunction, TInt aStackSize, TInt aHeapMinSize, TInt aHeapMaxSize, TAny *aPtr);
private:
	// record of the current test suite / step name
	TBuf<KMaxLenTestSuiteName>	iCurrentSuiteName;
	TBuf<KMaxLenTestStepName>	iCurrentStepName;

	// data members
	TPath	iTheTestPath;								// test path
	TInt	iReqsAtStart;
	TInt	iProcessHandleCountBefore;
	TInt	iThreadHandleCountBefore;

	// the current test result
	TVerdict iTestVerdict;
	// owner script
	CScript* iScript;
	// test utils
	CTestUtils* iTestUtils;
	// log
	CLog* iLog;
	// default guard timer, if any
	TInt64 iGuardTimer;
	// severity level
	TInt iSeverity;
	
	const TDesC& iMatchString;
	TBool iSkip;

	// array of CSuiteDll objects which contain 
	// information on the current loaded test suite DLLs
	CArrayPtr<CSuiteDll>*	iArrayLoadedSuiteDll;

	// Flag to indicate that there has been an error
	// and the user has selected to skip the rest of the script until a
	// test result statement is found in the log
	TBool   iBreakOnError;
	};

#endif // __PARSELINE_H__