mmtestenv/mmtestfw/Source/TestFramework/TestFrameworkMain.cpp
changeset 0 40261b775718
child 38 4269ca484c7b
--- /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.script> [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<arg> 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);
+	}