diff -r 000000000000 -r 72b543305e3a messagingappbase/obexmtms/TObexMTM/SRC/T_main.cpp --- /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 +#include +#include + +#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; + }