diff -r 000000000000 -r af10295192d8 networkingtestandutils/networkingintegrationtest/scheduleTest/script.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkingtestandutils/networkingintegrationtest/scheduleTest/script.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,416 @@ +// 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 module contains CScript class +// +// + +/** + @file Script.cpp +*/ + +// system includes +#include +#include +#include "f32file.h" + +// test system includes +#include "../inc/Log.h" +#include "../inc/TestUtils.h" +#include "../inc/TestStep.h" +#include "../inc/TestSuite.h" +#include "script.h" +#include "parseline.h" + +/** +Script files can reference other script files +MAX_DEPTH limits the number of references +This is to catch accidental circular references in script files +which would otherwise cause the system to continue until all +memory had be used making more CScript objects +the maximum number of script files +@internalComponent +*/ +#define MAX_DEPTH 100 + +/** +Holds press any key string constant +@internalComponent +*/ +_LIT(KTxtPressAnyKey,"[press any key to continue]\n"); + +/** +Holds string constant that displys error message +@internalComponent +*/ +_LIT(KTxtBreakOnError,"The test has failed, press X to terminate this test\n [press any other key to continue]\n"); + +/** +Global data +count of how deep in script files parser is +this is to check against infinite recursion +@internalComponent +*/ +GLDEF_D static TInt ScriptDepth = 0; + + + +CScript::CScript() +/** +constructor +*/ +{} + +void CScript::ConstructL( void ) +/** +second phase constructor +*/ + { + iParse = CParseLine::NewL(this); + + iParseLineOwner = ETrue; + iPauseAtEnd = EFalse; + } + +CScript* CScript::NewL( void ) +/** +NewL constructor +*/ + { + CScript * self = new(ELeave) CScript; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +void CScript::ConstructL( CParseLine * aParse ) +/** +Standard Symbian format second phase constructor. +*/ + { + iParse = aParse; + + iPauseAtEnd = EFalse; + + } + +CScript* CScript::NewL( CParseLine * aParse ) +/** +Standard Symbian format constructor. + +@param aParse A parse line object to be used for decoding the script. +@returns A pointer to the new CScript object. +*/ + { + CScript * self = new(ELeave) CScript; + CleanupStack::PushL(self); + self->ConstructL(aParse); + CleanupStack::Pop(); + return self; + } + + +CScript::~CScript( ) +/** +destructor deletes the script buffer. +*/ + { + // delete scriptbuffer + delete ipScriptBuffer; + + if (iParseLineOwner) delete iParse; + } + + +bool CScript::OpenScriptFile(const TFileName &aScriptFileName) +/** +Read in the test script file. + +@param aScriptFileName The script file name. If no extension is supplied .script will +be appended. +@return ETrue the script was read ok, EFalse the script file could not be found. +*/ + { + // get the full pathname default drive name and extension + _LIT(Kdefault,"C:\\xx.script"); + TParse ScriptFileName; + TInt returnCode = ScriptFileName.Set( aScriptFileName, &Kdefault, NULL ); + if (returnCode!=KErrNone) + { + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr, + _L("Failed to open script file: %S"),&ScriptFileName.FullName()); + Pause(); + return false; + } + + TFileName scriptFileName = aScriptFileName; + + if ( ScriptDepth++ > MAX_DEPTH ) + { + // prevent the parser from recursing forever + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr, + _L("script paser aborting depth:%d"), ScriptDepth ); + return false; + } + + // connect to the fileserver + returnCode=iTheFs.Connect(); + if (returnCode!=KErrNone) + { + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr, + _L("Error trying to connect to the file server") ); + return false; + } + + // open the script file + RFile listfile; + returnCode=listfile.Open(iTheFs,ScriptFileName.FullName(),EFileRead|EFileShareAny); + + // check if open fails + if (returnCode!=KErrNone) + { + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr, + _L("Failed to open script file: %S"),&ScriptFileName.FullName()); + Pause(); + return false; + } + + // display the file being processed + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr, + _L("reading script %S"),&ScriptFileName.FullName()); + + // get the script file size + TInt listfilesize; + returnCode=listfile.Size(listfilesize); + if (returnCode!=KErrNone) + { + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr, + _L("Failed read script file: %S size "),&scriptFileName); + return false; + } + + // get a buffer to read the file into + ipScriptBuffer=HBufC8::New(listfilesize); + if (!ipScriptBuffer) + { + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr, + _L("Failed to allocate memory for script file %S "),&scriptFileName); + return false; + } + + // get a pointer to the buffer + TPtr8 ptr=ipScriptBuffer->Des(); + + // read the file into the buffer + returnCode=listfile.Read(ptr); + if (returnCode!=KErrNone) + { + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr, + _L("Failed to read script file %S "),&scriptFileName); + return false; + } + + // close the file + listfile.Close(); + + // close the file system + iTheFs.Close(); + + return true; + +} + +enum TVerdict CScript::ExecuteScriptL() +/** +The script file has been read into pScriptBuffer. +Now parse it for commands and excute them. + +@return TVerdict The current test result +*/ + { + // use TLex to decode the script + TLex8 llex( *ipScriptBuffer); + + // keep a count of the line number + TInt8 lineNo = 1; + + // loop though processing the rest a line at a time + while(!llex.Eos()) + { + // skip any spaces + while ( llex.Peek()==' ' ) + llex.Inc(); + + // mark the start of the line + llex.Mark(); + + // move to the next + while(!llex.Eos() && llex.Peek()!='\n') + llex.Inc(); + + // step over \n + if ( llex.Peek()=='\n' ) + llex.Inc(); + + // get the line + TPtrC8 pline=llex.MarkedToken(); + if (pline.Length()!=0) + { + // and then process + ProcessLineL( pline, lineNo ); + } + + // on to the next line + lineNo ++; + } + + /* script processing complete, now return the script verdict */ + /* Note: the script verdicts are just for the log */ + /* if no tests failed then return pass for the script */ + /* this covers scripts which do not test anything */ + return (iFail == 0 ? EPass : EFail ); + } + +void CScript::ProcessLineL(const TPtrC8 &narrowline, TInt8 lineNo) +/** +process a line from the script file + +@param narrowline The line of script file to be processed. +@param lineNo The current line number. +*/ + { + // call parse to process line + iParse->ProcessLineL(narrowline, lineNo); + } + + +void CScript::DisplayResults(void) +/** +Display the accumulated results +*/ + { + pLogSystem->LogBlankLine(); + + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("Test Results Summary ") ); + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("-------------------- ") ); + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("Passed :%d"), iPass); + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("Failed :%d"), iFail); + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("Inconclusive :%d"), iInconclusive); + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("Test suite errors :%d"), iTestSuiteError); + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("Aborted :%d"), iAbort); + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("Total :%d"), iTotal); + + if( iPauseAtEnd ) + { + // A pause at the end has been requested + Pause(); + } + + } + +void CScript::Pause( void ) +/** +Implements the Pause command. +*/ + { + if(!automatedMode) + { + console->Printf(KTxtPressAnyKey); + console->Getch(); // get and ignore character + } + } + +TBool CScript::BreakOnError( void ) +/** +Implements the BreakOnError command. +@return ETrue if the user enters "x" or EFalse +*/ + { + if(automatedMode) + { + pLogSystem->LogExtra(((TText8*)(__FILE__)), (__LINE__), ESevrErr,_L("BREAK_ON_ERROR suppressed; terminating current test") ); + return ETrue; + } + else + { + // display prompt + console->Printf(KTxtBreakOnError); + + // get a character from the keyboard + TChar ch = console->Getch(); + + if ( ch == 'x' ) + return ETrue; + else + return EFalse; + } + } + +void CScript::AddResult(enum TVerdict aTestVerdict ) +/** +The end of the test has been reached. +Add the result to the current totals. + +@param aTestVerdict The latest result. +*/ + { + // another test complete, so increment total + iTotal++; + + // add in the current result + switch (aTestVerdict) + { + case EPass: + iPass++; + break; + case EFail: + iFail++; + break; + case EInconclusive: + iInconclusive++; + break; + case ETestSuiteError: + iTestSuiteError++; + break; + case EAbort: + iAbort++; + break; + } + + // display the result + pLogSystem->LogResult(aTestVerdict, _L("Test Result for %S is %s "), + &(iParse->iCurrentStepName), + pLogSystem->TestResultText( aTestVerdict ) ); + + // add a blank line + pLogSystem->LogBlankLine(); + + } + +void CScript::AddResult(CScript * subScript ) +/** +The end of a sub script has been reached. +Add the result to the totals + +@param subScript Pointer to the sript object containing the results +*/ + { + + iPass+= subScript->iPass; + iFail+= subScript->iFail; + iInconclusive += subScript->iInconclusive; + iTestSuiteError+= subScript->iTestSuiteError; + iAbort+= subScript->iAbort; + iTotal+=subScript->iTotal; + }