messagingappbase/obexmtms/TObexMTM/SRC/T_main.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/obexmtms/TObexMTM/SRC/T_main.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,361 @@
+// 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:
+// $Workfile: t_main.cpp $
+// $Author: Stevep $
+// $Revision: 6 $
+// $Date: 27/03/02 11:13 $
+// 
+//
+
+
+#include <e32std.h>
+#include <c32comm.h>
+#include <bacline.h>
+
+#include "obextestutils.h"
+#include "harness.h"
+#include "parsers.h"
+#include "obexparsers.h"
+
+
+// Name of test harness.
+_LIT(KObexTestName, "OBEX Mtm Tests");
+_LIT(KObexTestExeName, "T_OBEXMTM");
+
+//Name of the main script file.
+_LIT(KScriptFileName, "c:\\msgtest\\obexsmoke\\scripts\\script.txt");
+
+// Where the test harness places the log file.
+_LIT(KMsvMsgLogsSrcPath, "c:\\MsgLogs\\");
+
+// Device drivers.
+#if defined (__WINS__)
+#define PDD_NAME _L("ECDRV")
+#define LDD_NAME _L("ECOMM")
+#else  // __GCC32__
+#define PDD_NAME _L("EUART2")
+#define LDD_NAME _L("ECOMM")
+#define FIR_PDD_NAME _L("DIFIR")	// Brutus FIR PDD
+#define FIR_LDD_NAME _L("EFIR")		// Brutus FIR LDD
+#endif
+
+
+void AppendVariantName(TDes& aFileName)
+	{
+#if defined(__WINS__) && defined(__WINSCW__)
+	aFileName.Append(_L(".WINSCW."));
+#elif(__WINS__)
+	aFileName.Append(_L(".WINS."));
+#endif
+#if (defined(__THUMB__) || defined(__MARM_THUMB__))
+	aFileName.Append(_L(".THUMB."));
+#endif
+#if (defined(__ARMI__) || defined(__MARM_ARMI__))
+	aFileName.Append(_L(".ARMI."));
+#endif
+#if (defined(__ARM4__) || defined(__MISA__) || defined(__MARM_ARM4__))
+	aFileName.Append(_L(".ARM4."));
+#endif
+
+#if defined(_DEBUG)
+	aFileName.Append(_L("DEB."));
+#else
+	aFileName.Append(_L("REL."));
+#endif
+
+	aFileName.Append(_L("LOG"));
+	}
+
+
+void MoveLogsL(RFs& aRfs, const TDesC& aTestScript)
+	{
+	//	Move the test log directory and file.
+	//
+	//	For example: test script "c:\msgtest\mmssmoke\scripts\MTM_Registering_Script.txt",
+	//	under a WINS UDEB build, test harness name T_OBEXMTM.
+	//
+	//	dir src = c:\MsgLogs\T_OBEXMTM
+	//	dir dst = c:\MsgLogs\T_OBEXMTM_MTM_Registering_Script
+	//
+	//	file src = c:\MsgLogs\T_OBEXMTM.WINS.DEB.LOG
+	//	file dst = c:\MsgLogs\T_OBEXMTM_MTM_Registering_Script.WINS.DEB.LOG
+
+	CFileMan*	fileMan = CFileMan::NewL(aRfs);
+	CleanupStack::PushL(fileMan);
+
+	//
+	// Determine dir name for src.
+	TFileName	msgLogsSrc;
+
+	msgLogsSrc.Append(KMsvMsgLogsSrcPath);	// Add "c:\MsgLogs\".
+	msgLogsSrc.Append(KObexTestExeName);	// Add "T_OBEXMTM".
+
+	//
+	// Determine dir name for dst.
+	TFileName	msgLogsDst;
+	TInt		fileErr;
+	TInt		loc;
+	TInt		len;
+
+	msgLogsDst = msgLogsSrc;	// Add "c:\MsgLogs\T_OBEXMTM".
+	msgLogsDst.Append('_');		// Add "_".
+
+	// Add test name.
+	len = aTestScript.Length();
+	loc = aTestScript.LocateReverse('\\');
+	msgLogsDst.Append(aTestScript.Right(len - loc - 1));
+
+	// Remove the ".ext".
+	msgLogsDst = msgLogsDst.Left(msgLogsDst.Locate('.'));
+
+	//
+	// Move the dir.
+	fileErr = fileMan->Move(msgLogsSrc, msgLogsDst);
+
+	// Move will not delete existing directories, so we have to do it ourself.
+	// The documentation says it will delete directories !!!!
+	if (fileErr == KErrAlreadyExists)
+		{
+		msgLogsDst.Append('\\');								// To ensure we delete the correct directory.
+		fileErr = fileMan->RmDir(msgLogsDst);
+		msgLogsDst = msgLogsDst.Left(msgLogsDst.Length() - 1);	// Remove '\' again.
+		if (fileErr == KErrNone)
+			fileErr = fileMan->Move(msgLogsSrc, msgLogsDst);
+		}
+
+	//
+	// Now move the file. Append ".WINS.DEB.LOG" to src and dst.
+	AppendVariantName(msgLogsSrc);
+	AppendVariantName(msgLogsDst);
+
+	fileErr = fileMan->Move(msgLogsSrc, msgLogsDst);
+
+	CleanupStack::PopAndDestroy(fileMan);
+	}
+
+
+TInt RunTestL(RFs& aRfs, RTest& aTest, const TDesC& aTestScript)
+	{
+	TInt err = KErrNone;
+
+	// Create the test script object, which will use the test script
+	CTestScript* script = CTestScript::NewL(aRfs);
+	CleanupStack::PushL(script);
+
+	script->LoadFileL(aTestScript);
+
+	// Create the main test harness, to which all test states will
+	// be appended.
+	CMainTestHarness* mainTest = CMainTestHarness::NewL(aTest);
+	CleanupStack::PushL(mainTest);
+	
+	TTestDebugInfo debugInfo(*script, 0, 0);
+	
+	mainTest->SetDebugInfo(debugInfo);
+
+	// Create a new section parser.
+	CObexMainSectionParser* mainSectionParser = CObexMainSectionParser::NewL(*mainTest, *script);
+	CleanupStack::PushL(mainSectionParser);
+
+	// Attempt to parse the script
+	TRAP(err, mainSectionParser->ParseL());
+	if (err == KErrNone)
+		{
+		// If we've parsed the script OK, attempt to run the test.
+		// The "waiter" object is provided just in case we don't
+		// want to start and stop the active scheduler.
+		CTestActive* waiter = new (ELeave) CTestActive;
+		CleanupStack::PushL(waiter);
+
+		waiter->StartL();
+		mainTest->StartL(waiter->iStatus);
+		CActiveScheduler::Start();
+		err = waiter->iStatus.Int();
+		
+		CleanupStack::PopAndDestroy(waiter);
+		}
+
+	CleanupStack::PopAndDestroy(mainSectionParser);
+	CleanupStack::PopAndDestroy(mainTest);
+	CleanupStack::PopAndDestroy(script);
+
+	return err;
+	}
+
+
+TInt doMainL()
+	{
+	TInt err = KErrNone;
+
+	// Create the test object which we'll use for output etc.
+	RTest test(KObexTestName);
+	CleanupClosePushL(test);
+
+	// Load Device drivers ... may have to move this...
+
+#ifdef __EPOC32__
+	StartC32();
+#endif
+	User::LoadPhysicalDevice(PDD_NAME);
+    User::LoadLogicalDevice(LDD_NAME);
+#ifdef __EPOC32__
+	User::LoadPhysicalDevice(FIR_PDD_NAME);
+	User::LoadLogicalDevice(FIR_LDD_NAME);
+#endif	
+
+	// Start the file system.
+	RFs rfs;
+	User::LeaveIfError(rfs.Connect());
+	CleanupClosePushL(rfs);
+
+	// Start a new active scheduler.
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+	CActiveScheduler::Install(scheduler);
+	CleanupStack::PushL(scheduler);
+	
+	// Name of the actual script being executed.
+	HBufC*	scriptFileName = HBufC::NewLC(KMaxFileName);
+	TPtr	strPtr = scriptFileName->Des();
+
+	_LIT(KInputScriptParameterId, "-i");
+	_LIT(KScriptNotFoundErr, "%S not found!\n\n");
+
+	// Handle command line arguments
+	CCommandLineArguments*	args = CCommandLineArguments::NewLC();
+	TInt					argCount = args->Count();
+	TInt					currArg = 0;
+
+	// Search for "-i" parameter.
+	while ((currArg < argCount) && args->Arg(currArg).Compare(KInputScriptParameterId))
+		{
+		currArg++;
+		}
+	
+	// Input script filename argument NOT present
+	//
+	// Run multiple test scripts, held in KScriptFileName.
+	if ((currArg == argCount) || (currArg == (argCount - 1)))
+		{
+		CleanupStack::PopAndDestroy(args); // Done with arguments.
+		
+		// Load the main script file, used to determine which actual test scripts are run.
+		CTestScript*	mainScript = CTestScript::NewL(rfs);
+		CleanupStack::PushL(mainScript);
+
+		if (mainScript->LoadFileL(KScriptFileName))
+			{
+			CTestScript::TTestScriptString		line;
+			TBool								lineGot = false;
+			TInt								linePos = 0;
+
+
+			// For each valid line in the main script file, run the test.
+			lineGot = mainScript->GetLineL(line, linePos);
+			while (lineGot)
+				{
+				if (line.Length() > 0)
+					{
+					TInt	fileErr;
+					TBool	dummy = TRUE;
+
+
+					// Determine the test script file name and path.
+					strPtr.Copy(line);
+					strPtr.Insert(0, KScriptFileName().Left(KScriptFileName().LocateReverse('\\') + 1)); // inserts path
+
+					// Ensure file exsits.
+					fileErr = rfs.IsFileOpen(scriptFileName->Des(), dummy);
+					if (fileErr == KErrNone)
+						{
+						// Start the test.
+						err = RunTestL(rfs, test, scriptFileName->Des());
+
+						// Move the output log.
+						MoveLogsL(rfs, scriptFileName->Des());
+						}
+					}
+
+				else
+					{
+					test.Printf(KScriptNotFoundErr, scriptFileName);
+					}
+
+				linePos += line.Length() + 2;	// 2 for cr/lf pair.
+				lineGot = mainScript->GetLineL(line, linePos);
+				}
+			}
+
+		else
+			{
+			test.Printf(KScriptNotFoundErr, &KScriptFileName);
+			User::After(5000000);
+			}
+	
+		CleanupStack::PopAndDestroy(mainScript);
+		}
+	
+	// Run single test script.
+	else
+		{
+		TInt	fileErr;
+		TBool	dummy = TRUE;
+
+		// Determine the test script file name and path.
+		strPtr.Copy(args->Arg(currArg + 1));
+		strPtr.Insert(0, KScriptFileName().Left(KScriptFileName().LocateReverse('\\') + 1)); // inserts path
+		
+		CleanupStack::PopAndDestroy(args);	// Done with arguments.
+		
+		// Ensure file exsits.
+		fileErr = rfs.IsFileOpen(scriptFileName->Des(), dummy);
+		if (fileErr == KErrNone)
+			{
+			// Start the test.
+			err = RunTestL(rfs, test, scriptFileName->Des());
+
+			// Move the output log.
+			MoveLogsL(rfs, scriptFileName->Des());
+			}
+		else
+			{
+			test.Printf(KScriptNotFoundErr, scriptFileName);
+			User::After(5000000);
+			}
+		}
+
+	CleanupStack::PopAndDestroy(scriptFileName);
+	CleanupStack::PopAndDestroy(scheduler);
+	CleanupStack::PopAndDestroy();	// rfs
+	CleanupStack::PopAndDestroy();	// test
+
+	return err;
+	}
+
+
+LOCAL_D CTrapCleanup* theCleanup;
+
+GLDEF_C TInt E32Main()
+	{	
+	__UHEAP_MARK;
+	theCleanup=CTrapCleanup::New();
+
+	TInt status = KErrNone;
+
+	TRAPD(ret, status = doMainL());		
+
+	delete theCleanup;	
+	__UHEAP_MARKEND;
+	User::Heap().Check();
+	return status;
+	}