--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmdw/tef/tef/scriptengine/inc/scriptengine.h Wed Aug 25 15:52:14 2010 +0300
@@ -0,0 +1,478 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+
+
+/**
+ @file ScriptEngine.h
+*/
+
+#if !(defined __SCRIPT_ENGINE_H__)
+#define __SCRIPT_ENGINE_H__
+
+#include <e32base.h>
+#include <f32file.h>
+#include "testexecutestepbase.h"
+#include <e32cons.h>
+#if !(defined TEF_LITE)
+#include <w32std.h>
+#endif
+#include <iniparser.h>
+#include <test/tefshareddata.h>
+#include <test/testshareddata.h>
+#include "tefconst.h"
+#include "blockitems.h"
+
+#define SUB_PROC_TYPE RProcess
+
+/**
+ * Define flogger based class that can also be used to log to console
+ */
+class RConsoleLogger
+ {
+public:
+ RConsoleLogger(CConsoleBase& aConsole) : iConsole(aConsole) {};
+ inline CConsoleBase& Console() const;
+private:
+ CConsoleBase& iConsole;
+ };
+
+class CActiveBase;
+class MChildCompletion
+ {
+public:
+ virtual void ChildCompletion(TInt aError) = 0;
+ };
+
+class RScriptTestServ : public RTestServ
+ {
+friend class RScriptTestSession;
+public:
+ inline RScriptTestServ();
+ TInt Connect(const TDesC& aServerName,TBool aSharedData = EFalse);
+ inline TBool SharedData() const;
+ inline TInt SessionCount() const;
+private:
+ inline void AddSession();
+ inline void RemoveSession();
+private:
+ TBool iSharedData;
+ TBool iSessionCount;
+ };
+
+class RScriptTestSession : public RTestSession
+ {
+public:
+ TInt Open(RScriptTestServ& aServ, const TBool aIsTestStep, const TDesC& aStepName = KNull );
+ inline void Close();
+protected:
+ RScriptTestServ* iServ;
+private:
+ };
+
+class CActiveBase : public CActive
+ {
+public:
+ inline void Kick();
+ inline virtual ~CActiveBase();
+protected:
+ inline void Prime();
+ inline void Complete(TInt aErr);
+ inline CActiveBase();
+ };
+
+class CScriptActive : public CActiveBase, public MChildCompletion
+ {
+public:
+ inline virtual ~CScriptActive();
+ inline virtual void ChildCompletion(TInt aErr);
+protected:
+ inline CScriptActive();
+ };
+
+
+class MTaskCompletion
+ {
+public:
+ virtual void TaskCompletion(TInt aErr, const TDesC& aPanicString, TInt aScriptLineNumber,const TDesC& aCommand,TBool aTaskCanComplete,TTEFItemArray* aItemArray=NULL) = 0;
+ };
+
+class TRange
+ {
+public :
+ enum EState
+ {
+ EStateNotUsed,
+ EStateInUse,
+ EStateUsed,
+ };
+
+ TRange(TPtrC aStartTestCase,TPtrC aEndTestCase ):
+ iStartTestCase (aStartTestCase),
+ iEndTestCase (aEndTestCase ),
+ iState (EStateNotUsed)
+ {};
+
+ //some utility methods
+ static TBool CompareTRangeEnd(const TRange& aRng1, const TRange& aRng2) ;
+ static TBool CompareTRangeStartCase(const TRange& aRng1, const TRange& aRng2) ;
+ static TInt CompareTRangeStartOrder(const TRange& aRng1, const TRange& aRng2) ;
+
+public :
+ TPtrC iStartTestCase ;
+ TPtrC iEndTestCase ;
+ EState iState ;
+
+ };
+
+enum ESelectiveTesting
+ {
+ iInclusive =0 ,
+ iExclusive
+ };
+
+class TSelectiveTestingOptions
+ {
+public :
+ TSelectiveTestingOptions(RArray<TRange>& aSelectiveCaseRange,ESelectiveTesting& aSelectiveTestingType )
+ :iSelectiveCaseRange(aSelectiveCaseRange),
+ iSelectiveTestingType(aSelectiveTestingType)
+ {};
+
+ //some utility methods...
+ static TBool CompareTPtrC(const TPtrC& aPtrC1, const TPtrC& aPtrC2);
+ static TInt CompareTPtrCOrder(const TPtrC& aPtrC1, const TPtrC& aPtrC2) ;
+
+ TSelectiveTestingOptions::~TSelectiveTestingOptions()
+ {iSelectiveCaseRange.Close();};
+
+
+public :
+ RArray<TRange> iSelectiveCaseRange;
+ ESelectiveTesting iSelectiveTestingType;
+ };
+
+class CScriptMaster : public CScriptActive
+ {
+public:
+ CScriptMaster(const TDesC& aScriptFilePath, CTestExecuteLogger& aLogger, RConsoleLogger& aConsoleLogger, const TDriveName& aSysDrive, const TDriveName& aTestSysDrive, TSelectiveTestingOptions* aSelTestingOptions = NULL );
+ virtual ~CScriptMaster();
+ void RunL();
+ inline void DoCancel();
+private:
+ inline CTestExecuteLogger& Logger() const;
+ inline RConsoleLogger& ConsoleLogger() const;
+private:
+ enum TState{EInit,ERunning};
+ TState iState;
+ TPtrC iScriptFilePath;
+ CTestExecuteLogger& iLogger;
+ RConsoleLogger& iConsoleLogger;
+ TBool iLoop;
+ TBool iStartLooping;
+ TDriveName iDefaultSysDrive;
+ TDriveName iTestSysDrive;
+ TSelectiveTestingOptions* iSelTestingOptions;
+ };
+
+class CSyncControl;
+class CScriptControl : public CScriptActive, public MTaskCompletion
+ {
+public:
+ CScriptControl(MChildCompletion& aCompletion,const TDesC& aScriptFilePath,CTestExecuteLogger& aLogger,RConsoleLogger& aConsoleLogger,TBool aStartLooping,TBool aLoop, const TDriveName& aSysDrive, const TDriveName& aTestSysDrive, TSelectiveTestingOptions* aSelTestingOptions = NULL);
+ virtual ~CScriptControl();
+ virtual void TaskCompletion(TInt aErr, const TDesC& aPanicString, TInt aScriptLineNumber, const TDesC& aCommand, TBool aTaskCanComplete, TTEFItemArray* aItemArray = NULL);
+ void RunL();
+ inline void DoCancel();
+private:
+ void PrintFromScriptLine() const;
+ void LogTestCaseMarkerL();
+ TVerdict HasTestCasePassedL(TPtrC TestCaseMarker);
+ void PrintCurrentScriptLine() const;
+ void SetPrefix();
+ TBool GetNextScriptLine(TPtrC& aScriptLine);
+ TBool GetLoopScriptLine(TPtrC& aScriptLine);
+ void CreateScriptDataFromScriptFileL();
+ void CreateServerFromScriptLineL();
+ TBool GetServerIndexFromScriptLine(TInt& aIndex);
+ void RunUtilsFromScriptLineL() const;
+ void GetScriptFileFromScriptLine();
+ void RunCedFromScriptLineL();
+ void StartTimerFromScriptLine();
+ void LogResult(TVerdict aResult, const TDesC& aPanicString, TInt aScriptLineNumber, const TDesC& aCommand);
+ inline CTestExecuteLogger& Logger() const;
+ inline RConsoleLogger& ConsoleLogger() const;
+ void PrintScriptEngineError(TInt aErr) const;
+ TBool CheckValidScriptLine() const;
+ TBool CheckCommentedCommands() const;
+ void FindValueL(CIniData* aConfigData, TPtrC aConfigSection, TPtrC aSharedData, TInt& aSharedDataNum);
+ void FindValueL(CIniData* aConfigData, TPtrC aConfigSection, TPtrC aSharedData, TPtrC& aSharedDataName);
+ void CreateSharedObjectsFromScriptLineL();
+ void ParseTestBlockL( TTEFItemArray& aItemArray );
+ void MakeAbsoluteFilePathsL(TPtrC16& aScriptLineString);
+ void ConvertRelativeToAbsoluteL(TDes& aCommandString);
+ TInt RunError(TInt aError);
+ void ExpandVariables(TDes& aCommandString);
+ TBool ProceedTestCase() ;
+ void ProcessEndCase();
+ // Fix defect 118337
+ TBool ParseTestBlockHeader();
+ // End defect 118337
+private:
+ enum TState{
+ EInit,
+ ERunning,
+ EClosing,
+ ERunCedPending,
+ ERunCed,
+ ERunScriptPending,
+ ERunScript,
+ EDelayPending,
+ EPausePending,
+ EPause,
+ EEndTestCasePending,
+ ERunEndTestCase,
+ ERunStartSyncTestCase,
+ EPrefixPending,
+ ERunPrefix,
+ EDelay,
+ EIdling,
+ EWaitCompletions,
+ ETestCaseIgnore
+ };
+ TPtrC iScriptFile;
+ RTimer iTimer;
+ TState iState;
+ HBufC* iScriptData;
+ TLex iScriptLex;
+ MChildCompletion& iParent;
+ TPtrC iCurrentScriptLine;
+ TBuf<KMaxTestExecuteCommandLength> iScriptLinePrefix;
+ TBuf<KMaxTestExecuteCommandLength> iPrefixedCurrentScriptLine;
+ TBool iConcurrent;
+ TBool iCanComplete;
+ TBool iBreakOnError;
+ TInt iAsyncTasksOutstanding;
+ RPointerArray<RScriptTestServ> iServers;
+ TInt iCurrentScriptLineNumber;
+ CTestExecuteLogger& iLogger;
+ RConsoleLogger& iConsoleLogger;
+ TPtrC iChildScriptFile;
+ RFs iFS;
+ RFile iResultFile;
+ TBool iScriptLinePrefixSet;
+ TLex iTempStoreLoop;
+ TLex iStoreLoop;
+ TBool iStartLooping;
+ TInt iLoopCounter;
+ TBool iCheckVar;
+ TInt iRepeatParam;
+ TBool iLoop;
+ CTEFSharedData<CTestSharedData>* iSharedDataArray[KTEFMaxSharedArraySize];
+ TInt iSharedDataNum;
+ TBool iIsSharedData;
+ CSyncControl* iSyncControl;
+ // Fix defect 119337. Change static TBool value to TInt value
+ // This value shows the nested count when call RUN_SCRIPT in loop
+ static TInt iNestedNumRunScriptInLoop;
+ // End defect 119337
+ TBuf<KMaxTestExecuteCommandLength> iTestCaseID;
+ TBuf<KTEFMaxScriptLineLength> iAlteredScriptLine;
+ TDriveName iDefaultSysDrive;
+ TDriveName iTestSysDrive;
+ TSelectiveTestingOptions* iSelTestingOptions;
+ TBool iSelectOne;
+ TInt iRangeRefCounter;
+ TInt iTestCaseCounter;
+ TPtrC iTestCaseIDToIgnore ;
+public:
+ static TInt commentedCommandsCount;
+ static TInt iRunScriptFailCount;
+ };
+
+class MTaskTimerCompletion
+ {
+public:
+ virtual void TaskTimerCompletion() =0;
+ };
+
+class CTaskTimer : public CTimer
+ {
+public:
+ static CTaskTimer* NewL(MTaskTimerCompletion& aCompletion);
+ ~CTaskTimer();
+ void RunL();
+ void Timeout(TInt aSeconds);
+private:
+ CTaskTimer(MTaskTimerCompletion& aCompletion);
+ void RunTimeout();
+ inline void ConstructL();
+private:
+ MTaskTimerCompletion& iParent;
+ TInt iTimesAfter;
+ TInt iSecondsRemaining;
+ };
+
+const TInt KDefaultTimeoutSeconds = 120;
+const TInt KDefaultDelayMilliseconds = 5000;
+const TInt KTEFStatusDelay = 2000;
+
+
+class CTaskControlBase : public CActiveBase , public MTaskTimerCompletion
+ {
+public:
+ inline void SetTaskComplete(TBool aTaskCanComplete);
+protected:
+ CTaskControlBase(const TDesC& aCommand, MTaskCompletion& aCompletion,TInt aScriptLineNumber, CTestExecuteLogger& aLogger);
+ virtual ~CTaskControlBase();
+ inline const CTestExecuteLogger& Logger() const;
+private:
+protected:
+ TBuf<KTEFMaxScriptLineLength> iCommandLine;
+ MTaskCompletion& iParent;
+ TInt iScriptLineNumber;
+ CTestExecuteLogger& iLogger;
+ CTaskTimer* iTaskTimer;
+ TInt iTaskTimeout;
+ TBuf<KTEFMaxTaskExitCategory> iTaskExitCategory;
+ TBool iTaskCanComplete;
+private:
+ };
+
+class CClientControl : public CTaskControlBase
+ {
+public:
+ CClientControl( RScriptTestServ& aTestServ,
+ const TDesC& aStepCommand,
+ MTaskCompletion& aCompletion,
+ TInt aScriptLineNumber,
+ CTestExecuteLogger& aLogger,
+ TInt aLoopIndex,
+ const TDesC& aTestCaseID,
+ TPtrC& aScriptFilePath,
+ const TDriveName& aSysDrive,
+ const TDriveName& aTestSysDrive);
+
+ static CClientControl* NewL( RScriptTestServ& aTestServ,
+ const TDesC& aCommand,
+ MTaskCompletion& aCompletion,
+ TInt aScriptLineNumber,
+ CTestExecuteLogger& aLogger,
+ TInt aLoopIndex,
+ const TDesC& aTestCaseID,
+ const TDesC& aEndBlockCommand,
+ TPtrC& aScriptFilePath,
+ const TTEFItemArray& aBlockArray,
+ const TDriveName& aSysDrive,
+ const TDriveName& aTestSysDrive);
+
+ virtual void TaskTimerCompletion();
+ virtual ~CClientControl();
+ void RunL();
+ inline void DoCancel();
+private:
+ void GetStepParamsFromStepCommand();
+ void ConstructL( const TDesC& aEndBlockCommand, const TTEFItemArray& aBlockArray );
+ TTEFItemArray* CreateBlockArrayLC();
+ TInt RunError(TInt aError);
+ void TestStepComplete();
+
+private:
+ enum TState
+ {
+ EInit = 0,
+ ERunning,
+ EServerRetry
+ };
+
+ TPtrC iEndBlockCommand;
+ TState iState;
+ RScriptTestServ& iServ;
+ TBuf<KMaxTestExecuteCommandLength> iStepArgs;
+ TPtrC iStepName;
+ RScriptTestSession iSession;
+ RTimer iTimer;
+ TInt iRetryCount;
+ TPtrC iTaskHeapSize;
+ TBool iOOMRequestSet;
+ TBuf<KMaxTestExecuteCommandLength> iSetUpParamValue;
+ TInt iLoopIndex;
+ TBuf<KMaxTestExecuteCommandLength> iTestCaseID;
+ HBufC8* iBlockArrayPkg;
+ TPtr8 iBlockArrayPtr;
+ TPtrC iScriptFilePath;
+ TDriveName iDefaultSysDrive;
+ TDriveName iTestSysDrive;
+ };
+
+class CProgramControl : public CTaskControlBase
+ {
+public:
+ virtual void TaskTimerCompletion();
+ CProgramControl(const TDesC& aCommand,MTaskCompletion& aCompletion,TInt aScriptLineNumber, CTestExecuteLogger& aLogger, TBool aWSProgRun=EFalse);
+ ~CProgramControl();
+ void RunL();
+ inline void DoCancel();
+private:
+ void GetProgramArgsFromCommand();
+ void RunProgramL();
+ #if !defined TEF_LITE
+ bool IsWindowServerAvailable(void) const;
+ #endif
+private:
+ SUB_PROC_TYPE iProgram;
+ TPtrC iProgramArgs;
+ TBool iProgRenamed;
+ enum TState{EInit,ERunning};
+ TState iState;
+ TBool iWSProgRun;
+ #if !defined TEF_LITE
+ // Delete dependence of MW apparc.lib.
+ // apparc.lib is moved from OS layer to MW layer.
+ // TEF will delete this dependece because TEF is built on OS layer.
+ SUB_PROC_TYPE iProgramWS;
+ RWsSession iWs;
+ #endif
+ };
+
+#if !defined TEF_LITE
+inline bool CProgramControl::IsWindowServerAvailable(void) const
+{
+ return (0 != iWs.WsHandle());
+}
+#endif
+class CSyncControl : public CBase
+ {
+public:
+ CSyncControl();
+ ~CSyncControl();
+
+ static CSyncControl* NewL();
+ static CSyncControl* NewLC();
+
+ void SetResultL( TVerdict aError );
+ TBool TestCaseContinueL();
+
+private:
+ void ConstructL();
+
+ CTEFSharedData<CTestSharedData>* iSharedTEFStatus;
+ CTEFSharedData<CTestSharedData>* iSharedTEFResult;
+ };
+
+#include "scriptengine.inl"
+#endif