diff -r 000000000000 -r 40261b775718 mmtestenv/mmtestfw/Source/TestFramework/TestFrameworkMain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmtestenv/mmtestfw/Source/TestFramework/TestFrameworkMain.cpp Tue Feb 02 01:56:55 2010 +0200 @@ -0,0 +1,397 @@ +// 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: +// + +#include "TestFrameworkMain.h" +#include "../../recog/TestFrameworkRecog.h" +#include "script.h" +#include "parseline.h" +#include "Filename.h" +#include "config.h" + +// Hurricane emulator only - start all services which we require to run tests. +// Future enhancement :- add these startups to TestUtils +#if defined(__WINS__) +IMPORT_C TInt FbsStartup(); +#endif + +/** + * + * Literals : program information and usage + * + * @xxxx + * + */ +_LIT(KTxtFrameworkStarting, "%S %S %S starting...."); +//_LIT(KTxtUseExample,"Usage:\nTESTFRAMEWORK [-C] [-F] [file.ini]"); // EABI warning removal + +/** + * + * Compiler switches + * + * @xxxx + * + */ +#ifdef _WIN32 +_LIT(KTxtTarget,"WINS"); +#else +#ifdef __MARM_THUMB__ +_LIT(KTxtTarget,"THUMB"); +#else +_LIT(KTxtTarget,"ARM4"); +#endif +#endif + +#ifdef _DEBUG +_LIT(KTxtBuild,"udeb"); +#else +_LIT(KTxtBuild,"urel"); +#endif + + +//A temporary fix: 20 seconds delay for Techview to get completely loaded. +const TInt KTechViewLoadDelay = 20000000; + +/** + * + * max length of command line + * + * @xxxx + * + */ +const TInt KMaxLenCmdLine = 256; + +/** + * + * Test Framework startup function. + * Creates an active scheduler for input if required, reads + * the command line, starts the main test loop. + * + * @xxxx + * + */ +void StartupL() + { + CActiveScheduler* pA=new(ELeave) CActiveScheduler; + CleanupStack::PushL(pA); + CActiveScheduler::Install(pA); + +// Hurricane emulator only - start all services which we require to run tests. +// Future enhancement :- add these startups to TestUtils +#if defined(__WINS__) + #ifndef EXCLUDE_FOR_UNITTEST + FbsStartup(); + #endif // EXCLUDE_FOR_UNITTEST +#endif + + // read the command line into cmd + TPtr16 cmd(REINTERPRET_CAST(TUint16*,User::AllocLC(KMaxLenCmdLine*2)), 0, KMaxLenCmdLine); + cmd.Fill('\0', KMaxLenCmdLine); + + User::CommandLine(cmd); + cmd.UpperCase(); + + CTestFrameworkMain* tester = CTestFrameworkMain::NewLC(); + tester->StartTestingL(cmd); + + // NOTE. Currently there is no need to start the active scheduler, as the input console is + // now at the server. This will however change when AOs are implemented to replace + // the main client loop. + + // CActiveScheduler::Start(); + + CleanupStack::PopAndDestroy(3); //tester, pA, cmd + } + + +GLDEF_C TInt E32Main() + { + + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); // get clean-up stack + + // start scheduler + TRAPD(error, StartupL()); + __ASSERT_ALWAYS(!error, User::Panic(_L("TestFramework"), error)); + + delete cleanup; // destroy clean-up stack + __UHEAP_MARKEND; + return KErrNone; + } + +// Instructions for Console Display +// Please add new entries to the right hand column, +// Precede number and text with "\t " +// Leave \n\ at end of each line except the last line +//_LIT(KTxtMainInstructions, "Welcome to TestFramework. Press Q to quit "); // EABI warning removal + + +/** + * + * CTestFrameworkMain static constructor. + * + * @xxxx + * + */ +CTestFrameworkMain* CTestFrameworkMain::NewLC() + { + CTestFrameworkMain* s = new(ELeave) CTestFrameworkMain; + CleanupStack::PushL(s); + s->ConstructL(); + return s; + } + +/** + * + * CTestFrameworkMain first-phase constructor. + * + * @xxxx + * + */ +CTestFrameworkMain::CTestFrameworkMain() + { + } + +/** + * + * CTestFrameworkMain second-phase constructor. + * Loads log client and test utils. + * + * @xxxx + * + */ +void CTestFrameworkMain::ConstructL() + { + iLogClient = CLog::NewL(); + iLogMode = ELogToConsole | ELogToFile; + iTestUtils = CTestUtils::NewL(iLogClient); + iGuardTimer = KNoGuardTimer; // default value + } + +/** + * + * CTestFrameworkMain destructor. + * + * @xxxx + * + */ +CTestFrameworkMain::~CTestFrameworkMain() + { + delete iTestUtils; + delete iLogClient; + } + +/** + * + * CTestFrameworkMain - start testing. + * Calls main test loop. + * + * @param "const TDesC& aCmdLine" + * The command line + * + * @xxxx + * + */ +void CTestFrameworkMain::StartTestingL(const TDesC& aCmdLine) + { + RunTestScriptL(aCmdLine); + + RSemaphore sem; + TInt err = sem.OpenGlobal(KRecogSemaphoreName); + if (err==KErrNone) + { + // Tell the recognizer thread that we're finished + sem.Signal(); + sem.Close(); + } + } + +/** + * + * Accessor : log client + * + * @return "CLog*" + * The log client + * + * @xxxx + * + */ +CLog* CTestFrameworkMain::LogClient() const + { + return iLogClient; + } + +/** + * + * Main testing loop. + * Read a script file, parse it and execute each test step in turn. + * + * @param "const TDesC& aCmdLine" + * The command line + * + * @xxxx + * + */ +void CTestFrameworkMain::RunTestScriptL(const TDesC& aCmdLine) + { + // use TLex to decode the cmd line + TLex lex(aCmdLine); + TPtrC token=lex.NextToken(); + + // Default is to have 20 second startup delay + TBool delayRequired = ETrue; + + // if there is no input filename on the cmd line, panic + if (token.Length() == 0) + UsageL(); + else + { + // Process any options + while(token.Length() > 1 && token[0] == '-') + { + switch(token[1]) + { + case 'C': + case 'c': + // log to console ONLY + iLogMode = ELogToConsole; + break; + case 'A': + case 'a': + iLogMode |= ELogConsoleFull; + break; + case 'F': + case 'f': + // log to file ONLY + iLogMode = ELogToFile; + break; + case 'P': + case 'p': + // log to port AS WELL AS to console / file + iLogMode |= ELogToPort; + break; + //This stops the emulator from thowing int 3 if a panic occurs in debug builds + case 'T': + case 't': + User::SetJustInTime(EFalse); + // -S flag removed - was for old Unit Test mode only + // -A 'automated mode' removed - it's always automated + break; + case 'G': + case 'g': + { + // ** guard timer override - get numeric value that follows + TPtrC val = &token[2]; + TLex lexTimeOut(val); + if (lexTimeOut.Val(iGuardTimer) != KErrNone) + UsageL(); + } + break; + case 'm': + case 'M': + { + if (token.Length()<=2) + { + // only -m found. must be -m with no space + UsageL(); + } + TPtrC restOfLine = &token[2]; // this will be rest of command line + TLex argument(restOfLine); + TPtrC matchString = argument.NextToken(); // will be the argument itself + ASSERT(matchString.Length()>1); + iTestMatchString = matchString; + } + break; + case 'Q': + case 'q': + + { + // Remove the default 20 second delay on startup + delayRequired = EFalse; + } + break; + default: + UsageL(); + return; + } + + token.Set(lex.NextToken()); + } + + if(delayRequired) + { + User::After(KTechViewLoadDelay); + } + + // save the input filename + CFileName* scriptFileName = CFileName::NewLC(); + *scriptFileName = token; + + // make the log file name from the script file name + CFileName* logFileName = CFileName::NewLC(); + *logFileName = token; + RDebug::Print(_L("TestFrameWorkMain.cpp: RunTestScriptL 1")); + // open the log file + iLogClient->OpenLogFileL(logFileName->FileName(), iLogMode); + RDebug::Print(_L("TestFrameWorkMain.cpp: RunTestScriptL 2")); + iLogClient->LogExtra(__FILE8__, __LINE__, ESevrInfo, + KTxtFrameworkStarting, &KTxtVersion(), &KTxtTarget(), &KTxtBuild()); + RDebug::Print(_L("TestFrameWorkMain.cpp: RunTestScriptL 3")); + // create a ParseScript object + CScript* parseScript = CScript::NewLC(iTestUtils, + iLogClient, + iGuardTimer, + iTestMatchString); + RDebug::Print(_L("TestFrameWorkMain.cpp: RunTestScriptL 4")); + // parse all scripts + do + { + // get the next file + *scriptFileName = token; + + // read in the script file + if ( parseScript->OpenScriptFile(scriptFileName)) + { + // process it + parseScript->ExecuteScriptL(); + // display results summary + parseScript->DisplayResults(); + } + // get the next + token.Set(lex.NextToken()); + } while ( token.Length()!=0 ); + RDebug::Print(_L("TestFrameWorkMain.cpp: RunTestScriptL 5")); + CleanupStack::PopAndDestroy(parseScript); + + // close the logging system + iLogClient->CloseLogFile(); + + CleanupStack::PopAndDestroy(logFileName); + CleanupStack::PopAndDestroy(scriptFileName); + } + } + +/** + * + * Display command line format. + * + * @xxxx + * + */ +void CTestFrameworkMain::UsageL() + { + // If command line is erroneous, raise a panic. + // At this point, there may be no log outputs at all. + User::Panic(_L("TestFramework"), 2); + }