--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptomgmtlibs/securitytestfw/test/testhandler2/t_testsetup.cpp Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,474 @@
+/*
+* Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 "t_testsetup.h"
+#include "t_testactionspec.h"
+#include "t_input.h"
+#include "t_certstoreactionmemfail.h"
+#include "tcancel.h"
+#include "t_message.h"
+#include "tScriptSetup.h"
+#include "Thardcodedsetup.h"
+#include "t_testhandler.h"
+#include "t_output.h"
+#include "tTestSpec.h"
+#include "ttesthandlersettings.h"
+#include "testexecuteinterface.h"
+#include "t_logger.h"
+#include "t_testrunner.h"
+#include "t_dummyconsole.h"
+
+EXPORT_C HBufC* CTestSetup::GetArgument(TInt nPos)
+ {
+ // Get command line
+ HBufC *argv = HBufC::NewLC(User::CommandLineLength());
+ TPtr cmd(argv->Des());
+ User::CommandLine(cmd);
+
+ TLex arguments(cmd);
+ TPtrC token;
+ token.Set(KNullDesC);
+
+ // finds nth parameter that doesnt have a -
+ while(nPos >= 0 && !arguments.Eos())
+ {
+ token.Set(arguments.NextToken());
+ if(token.Length() > 0 && token[0] != '-')
+ nPos--;
+ }
+
+ HBufC* result = token.AllocL();
+
+ CleanupStack::PopAndDestroy(argv);
+
+ return result;
+ }
+
+void CTestSetup::InitFileserverSessionLC(RFs& aFs)
+ {
+ User::LeaveIfError(aFs.Connect());
+ CleanupClosePushL(aFs);
+
+ // enable tests to pass file handles between processes
+ aFs.ShareProtected();
+
+ // Create the private directory, to fix failures in tests that write to
+ // relative paths that were broken when the default path was changed to the
+ // private path in build 03429
+ TFileName privatePath;
+ User::LeaveIfError(aFs.PrivatePath(privatePath));
+ TInt err = aFs.MkDir(privatePath);
+ if (err != KErrNone && err != KErrAlreadyExists)
+ {
+ User::Leave(err);
+ }
+ }
+
+EXPORT_C void CTestSetup::CreateAndRunTestsL(TScriptTests theTestTypes[],
+ const TDesC& aScript, const TDesC& aLogFile, TBool aUseCommandLine,
+ CConsoleBase* aConsole, TBool* aResult)
+{
+ LOG(_L("-- Test handler starting"));
+
+ RFs fs;
+
+ InitFileserverSessionLC(fs);
+
+ CScriptSetup* testSetup = CScriptSetup::NewLC(aConsole);
+ CTestHandlerSettings* commandLineArgs = CTestHandlerSettings::NewLC();
+ CTestSpec* testSpec = CTestSpec::NewL();
+ CleanupStack::PushL(testSpec);
+
+ TTestSummary summary;
+ if(testSetup->InitialiseL(fs, aScript, aLogFile, aUseCommandLine))
+ {
+
+ // Store the state of the heap and RFs resource count before the tests
+
+ TInt initAllocCount = User::CountAllocCells();
+ TInt initRFsCount = fs.ResourceCount();
+
+ // Store the initial count of process and thread handles
+ TInt initThreadHandleCount;
+ TInt initProcessHandleCount;
+ RThread().HandleCount(initProcessHandleCount, initThreadHandleCount);
+
+
+ testSetup->LogFile().write(_L("State of the system before the tests:\n"));
+ testSetup->LogFile().write(_L("\tRFs resource count: %d\n"), initRFsCount);
+ testSetup->LogFile().write(_L("\tProcess handle count: %d\n"), initProcessHandleCount);
+ testSetup->LogFile().write(_L("\tThread handle count: %d\n"), initThreadHandleCount);
+
+ TRAPD(error, testSetup->SetupTestsL(fs, *testSpec, theTestTypes, *commandLineArgs))
+
+ if(error==KErrNone)
+ {
+ CTestHandler* handler = CTestHandler::NewLC(fs, *testSpec, *commandLineArgs,
+ &testSetup->Console(),
+ &testSetup->LogFile());
+ handler->RunTestsL();
+ summary = handler->Summary();
+ testSpec->FreeAllTests();
+ CleanupStack::PopAndDestroy(handler);
+
+ // Do heap, RFs resource, process and thread handle balance checks
+
+ TInt finalRFsCount = fs.ResourceCount();
+
+ testSetup->LogFile().write(_L("State of the system after the tests:\n"));
+ testSetup->LogFile().write(_L("\tRFs resource count: %d\n"), finalRFsCount);
+
+ if (initRFsCount == finalRFsCount)
+ {
+ testSetup->LogFile().write(_L("\nRFs resource count ok: %d final\n\n"),
+ finalRFsCount);
+ }
+ else
+ {
+ testSetup->LogFile().write(_L("\nRFs resource count inbalance: %d final\n\n"),
+ finalRFsCount);
+ ++summary.iTestsFailed;
+ }
+
+
+ TInt finalAllocCount = User::CountAllocCells();
+ if (initAllocCount == finalAllocCount)
+ {
+ testSetup->LogFile().write(_L("\nHeap alloc count ok: %d final vs %d initial\n\n"),
+ finalAllocCount, initAllocCount);
+ }
+ else
+ {
+ testSetup->LogFile().write(_L("\nHeap alloc count inbalance: %d final vs %d initial\n\n"),
+ finalAllocCount, initAllocCount);
+ ++summary.iTestsFailed;
+ }
+
+ TInt finalThreadHandleCount;
+ TInt finalProcessHandleCount;
+ RThread().HandleCount(finalProcessHandleCount, finalThreadHandleCount);
+
+ if (initProcessHandleCount == finalProcessHandleCount)
+ {
+ testSetup->LogFile().write(_L("\nProcess handle count ok: %d final vs %d initial\n\n"),
+ finalProcessHandleCount, initProcessHandleCount);
+ }
+ else
+ {
+ testSetup->LogFile().write(_L("\nProcess handle count imbalance: %d final vs %d initial\n\n"),
+ finalProcessHandleCount, initProcessHandleCount);
+ ++summary.iTestsFailed;
+ }
+
+ if (initThreadHandleCount == finalThreadHandleCount)
+ {
+ testSetup->LogFile().write(_L("\nThread handle count ok: %d final vs %d initial\n\n"),
+ finalThreadHandleCount, initThreadHandleCount);
+ }
+ else
+ {
+ testSetup->LogFile().write(_L("\nThread handle count imbalance: %d final vs %d initial\n\n"),
+ finalThreadHandleCount, initThreadHandleCount);
+ ++summary.iTestsFailed;
+ }
+ ++summary.iTestsRun;
+ }
+
+ // Set the result if required by caller
+ if (aResult)
+ {
+ *aResult = summary.AllTestsPassed();
+ }
+
+ summary.PrintL(testSetup->LogFile());
+
+ // pauses runtime if command line requests it i.e. -w
+ if(commandLineArgs->iWaitForKeyPressAtEnd)
+ {
+ testSetup->Console().Printf(_L("\nPress a key to quit"));
+ testSetup->Console().Getch();
+ }
+
+ }
+
+ CleanupStack::PopAndDestroy(4, &fs); // fs, testsetup, commandLineArgs and testspec
+ // this MUST be the last thing to do incase objects being destructed on cleanup
+ // have debug info
+ //if (bTestSuccess)
+ // RDebug::RawPrint(_L("RTEST: SUCCESS : testhandler\n"));
+}
+
+EXPORT_C void CTestSetup::CreateAndRunTestsL(THardcodedTests theTestTypes[], const TDesC& aDefaultLog)
+{
+ LOG(_L("-- Test handler starting"));
+
+ RFs fs;
+
+ InitFileserverSessionLC(fs);
+
+ InitFileserverSessionLC(fs);
+
+ CHardcodedSetup* testSetup = CHardcodedSetup::NewLC();
+ CTestHandlerSettings* commandLineArgs = CTestHandlerSettings::NewLC();
+ CTestSpec* testSpec = CTestSpec::NewL();
+ CleanupStack::PushL(testSpec);
+
+ TTestSummary summary;
+ if(testSetup->InitialiseL(fs, aDefaultLog))
+ {
+
+ // Store the state of the heap and RFs resource count before the tests
+
+ TInt initAllocCount = User::CountAllocCells();
+ TInt initRFsCount = fs.ResourceCount();
+
+ TRAPD(error, testSetup->SetupTestsL(fs, *testSpec, theTestTypes, *commandLineArgs));
+
+ if(error==KErrNone)
+ {
+ CTestHandler* handler = CTestHandler::NewLC(fs, *testSpec, *commandLineArgs,
+ &testSetup->Console(),
+ &testSetup->LogFile());
+ handler->RunTestsL();
+ summary = handler->Summary();
+ testSpec->FreeAllTests();
+ CleanupStack::PopAndDestroy(handler);
+
+ // Do heap and RFs resource balance checks
+
+ TInt finalRFsCount = fs.ResourceCount();
+
+ testSetup->LogFile().write(_L("State of the system after the tests:\n"));
+ testSetup->LogFile().write(_L("\tRFs resource count: %d\n"), finalRFsCount);
+
+ if (initRFsCount == finalRFsCount)
+ {
+ testSetup->LogFile().write(_L("\nRFs resource count ok: %d final\n\n"),
+ finalRFsCount);
+ }
+ else
+ {
+ testSetup->LogFile().write(_L("\nRFs resource count inbalance: %d final\n\n"),
+ finalRFsCount);
+ ++summary.iTestsFailed;
+ }
+
+ TInt finalAllocCount = User::CountAllocCells();
+ if (initAllocCount == finalAllocCount)
+ {
+ testSetup->LogFile().write(_L("\nHeap alloc count ok: %d final vs %d initial\n\n"),
+ finalAllocCount, initAllocCount);
+ }
+ else
+ {
+ testSetup->LogFile().write(_L("\nHeap alloc count inbalance: %d final vs %d initial\n\n"),
+ finalAllocCount, initAllocCount);
+ ++summary.iTestsFailed;
+ }
+ ++summary.iTestsRun;
+ }
+
+ summary.PrintL(testSetup->LogFile());
+
+ // pauses runtime if command line requests it i.e. -w
+ if(commandLineArgs->iWaitForKeyPressAtEnd)
+ {
+ testSetup->Console().Printf(_L("\nPress a key to quit"));
+ testSetup->Console().Getch();
+ }
+ }
+
+ CleanupStack::PopAndDestroy(4, &fs); // fs, testsetup, commandLineArgs and testspec
+
+ //if (bTestSuccess)
+ // RDebug::RawPrint(_L("RTEST: SUCCESS : testhandler\n"));
+}
+
+//Check all flags is provided for understanability - Each grouping function called calls the next function
+// if it has succeeded
+TBool CTestSetup::CheckAllFlags(const CTestHandlerSettings& aCommandLineSettings, TInt& aScriptGroupings)
+ {
+ return CheckExhaustiveandSmoke(aCommandLineSettings,aScriptGroupings);
+ }
+
+TBool CTestSetup::CheckExhaustiveandSmoke(const CTestHandlerSettings& aCommandLineSettings, TInt& aScriptGroupings)
+ {
+
+ if (aCommandLineSettings.iExhaust || (aScriptGroupings & SMOKE))
+ {
+ //Do other flags
+ return CheckSkipped(aCommandLineSettings, aScriptGroupings);
+ }
+ else
+
+ return EFalse;
+ }
+
+
+TBool CTestSetup::CheckSkipped(const CTestHandlerSettings& aCommandLineSettings,
+ TInt& aScriptGroupings)
+ {
+ if (aCommandLineSettings.iSkip || !(aScriptGroupings & SKIP))
+ {
+ //Do other flags
+ return CheckInteractive(aCommandLineSettings, aScriptGroupings);
+ }
+ else
+ return EFalse;
+ }
+
+TBool CTestSetup::CheckInteractive(const CTestHandlerSettings& aCommandLineSettings,
+ TInt& aScriptGroupings)
+ {
+ if (aCommandLineSettings.iInt || !(aScriptGroupings & INTER))
+ {
+ //Do other flags
+ return CheckOOMandCancel(aCommandLineSettings, aScriptGroupings);
+ }
+ else
+ return EFalse;
+ }
+
+TBool CTestSetup::CheckOOMandCancel(const CTestHandlerSettings& aCommandLineSettings,
+ TInt& aScriptGroupings)
+ {
+
+ if ((aScriptGroupings & (EXOOM | INOOM)) == (EXOOM | INOOM))
+ User::Panic(_L("Test is both Included and Excluded from OOM"), 1);
+
+ if ((aScriptGroupings & (EXCANCEL | INCANCEL)) == (EXCANCEL | INCANCEL))
+ User::Panic(_L("Test is both Included and Excluded from Cancel"), 1);
+
+ if ((aScriptGroupings & (INOOM | INCANCEL)) == (INOOM | INCANCEL))
+ User::Panic(_L("Test is in both OOM and Cancel groups"), 1);
+
+ // Check to see whether -o set
+ if (aCommandLineSettings.iOOM)
+ {
+ //Is the test in OOM group?
+ if (aScriptGroupings & INOOM)
+ return ETrue;
+ else
+ //Is the test excluded from OOM?
+ if (aScriptGroupings & EXOOM)
+ return EFalse;
+ }
+ else
+ if (aScriptGroupings & INOOM)
+ return EFalse;
+
+ // Check to see whether -c set
+ if (aCommandLineSettings.iCancel)
+ {
+ //Is the test in CANCEL group?
+ if (aScriptGroupings & INCANCEL)
+ return ETrue;
+ else
+ //Is the test excluded from CANCEL?
+ if (aScriptGroupings & EXCANCEL)
+ return EFalse;
+ }
+ else
+ if (aScriptGroupings & INCANCEL)
+ return EFalse;
+
+
+ return ETrue;
+ }
+
+
+CTestSetup::~CTestSetup()
+ {
+ delete iLogFile;
+ delete iTestConsole;
+ if (iConsoleOwned)
+ {
+ // Note that the heap count when this is deleted must be the same as
+ // when the console was allocated, otherwise a panic will occur. This
+ // is due to the techview implementation of the console doing a heap
+ // mark in its destructor.
+ delete iConsole;
+ }
+ }
+
+CTestSetup::CTestSetup(CConsoleBase* aConsole)
+ : iConsole(aConsole), iConsoleOwned(aConsole == NULL)
+ {
+ }
+
+void CTestSetup::ConstructL()
+ {
+ if (iConsoleOwned)
+ {
+ iConsole = Console::NewL(_L("Test code"), TSize(KDefaultConsWidth, KDefaultConsHeight));
+ }
+
+ // Currently the console passed to the test actions discards all output -
+ // this is an attempt to make hardware tests run faster. All information
+ // should be written to the log file anyway, and I'd like to remove use of a
+ // console as well as the log file. -- jc
+ iTestConsole = new (ELeave) CDummyConsole();
+ }
+
+void CTestSetup::OpenLogFileL(RFs &aFs, TInt nPos, const TDesC &aLogFile, TBool aUseCommandline)
+ {
+ HBufC* logFileName = NULL;
+
+ if (aUseCommandline)
+ {
+ logFileName = GetArgument(nPos);
+ CleanupStack::PushL(logFileName);
+
+ // check if logfile was specified on command line
+ if(logFileName->Length()==0)
+ {
+ // empty so remove it
+ CleanupStack::PopAndDestroy(logFileName);
+ logFileName = NULL;
+ }
+ }
+
+ if(logFileName == NULL)
+ {
+ if(aLogFile.Length()==0)
+ {
+ PRINTANDLOG(_L("No log file specified on command line and no default given"));
+ User::Leave(KErrArgument);
+ }
+ else
+ {
+ // there is a default copy that
+ logFileName = aLogFile.AllocL();
+ CleanupStack::PushL(logFileName);
+ }
+ }
+
+ PRINTANDLOG1(_L("Log file: %S"), logFileName);
+
+ RFile logFile;
+
+ // attempts to create directories incase they dont exist
+ aFs.MkDirAll(*logFileName); // ignore errors
+
+ // write over any existing log
+ User::LeaveIfError(logFile.Replace(aFs, *logFileName, EFileWrite));
+
+ // output goes only to the log file
+ iLogFile = new(ELeave) FileOutput(logFile);
+ CleanupStack::PopAndDestroy(logFileName);
+ };