pkiutilities/ocsp/test/main.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkiutilities/ocsp/test/main.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,557 @@
+// Copyright (c) 2001-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:
+// Top-level test control implementation
+// 
+//
+
+#include "main.h"
+#include "comms.h"
+#include "script.h"
+#include "logger.h"
+#include "result.h"
+#include "panic.h"
+#include "tcertutils.h"
+#include "bautils.h" 
+
+
+_LIT(KRunStep, "RUN_TEST_STEP");
+
+// Optional 3rd argument to turn on OOM tests
+_LIT(KOOMArgument, "OOM");
+
+// First script test to run
+#ifdef _DEBUG
+const TInt KMinTransaction = 1;
+#endif
+
+// First heap fail point to try
+const TInt KMinHeapFailPoint = 1;
+
+// Number of allocations to test for before bailing out
+const TInt KMaxHeapFailPoint = 100000;
+
+// Number of consecutive successful completions before we belive we've finished
+// an OOM test
+const TInt KCompletions = 5;
+
+// Where to find file cert store files
+
+_LIT(KCertStoreCertsFilePath, "\\private\\101f72a6\\cacerts.dat");
+_LIT(KCertStoreClientsFilePath, "\\private\\101f72a6\\certapps.dat");
+
+
+CTOCSPMain* CTOCSPMain::NewLC(const TDesC& aScriptFile, const TDesC& aLogFile)
+	{
+	CTOCSPMain* self = new (ELeave) CTOCSPMain(aScriptFile);
+	CleanupStack::PushL(self);
+	self->ConstructL(aLogFile);
+	return self;
+	}
+
+CTOCSPMain::CTOCSPMain(const TDesC& aScriptFile) :
+	CActive(EPriorityNormal),
+	iScriptFile(aScriptFile)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CTOCSPMain::ConstructL(const TDesC& aLogFile)
+	{	
+	iLog = CTOCSPLogger::NewL(aLogFile);
+	User::LeaveIfError(iFs.Connect());
+
+	// this is the name of the test file we will write to from the script
+	iTocspTestFile.Copy(_L("\\system\\tocsp\\tocsptestfile.txt"));
+
+	if (BaflUtils::FolderExists(iFs, iTocspTestFile))
+		{		
+		if (BaflUtils::FileExists( iFs, iTocspTestFile ))
+			{
+			// delete the test file if it exists before starting the tests
+			iFs.Delete(iTocspTestFile);	
+			}
+		}
+	}
+
+CTOCSPMain::~CTOCSPMain()
+	{
+	Cancel();
+	delete iLog;
+	delete iTest;
+	delete iResult;
+	if (BaflUtils::FolderExists(iFs, iTocspTestFile))
+			{		
+			if (BaflUtils::FileExists( iFs, iTocspTestFile ))
+				{
+				// delete the test file if it exists at the end of the tests
+				iFs.Delete(iTocspTestFile);
+				}
+			}
+	iFs.Close();
+	}
+
+void CTOCSPMain::RunNormalTestsL()
+	{
+	iLog->LogL(_L("<html><body><pre>\r\n"), ETrue);
+	TPtrC scriptcontents;
+	TPtrC inicontents;
+	TPtrC runTestStep;
+	TPtrC iniFileName;
+	TPtrC iniSectionName;
+	TBuf<512> iniFilePath;
+	
+	TInt err = KErrNone;
+	TInt pos = 0;
+	
+	iLog->LogL(_L("Starting normal OCSP tests...\n"), ETrue);
+
+    iError = KErrNone;
+
+	ResetTestL();
+
+	__UHEAP_MARK;
+
+//	TBool runStep = EFalse;
+	
+//	To check if the input file is .script file
+//	IF a script file
+//	Reads in the contents of the script file and loads it on 'scriptcontents'
+//	Extracs RUN_TEST_STEP line onto 'runTestStep'
+//	Extracts .ini file name and the appropriate .ini section name
+//	Generates the .ini file path
+//	Reads in the contents of the ini file and loads it on 'inicontents'
+//	Extracts the approritate section part and sets iSectionData
+	
+	iScriptFlag = TEFparser::FileType(iScriptFile);
+	
+	if(iScriptFlag)
+		{
+		do
+			// get the run test step lines from the script file
+			{
+			err = TEFparser::ReadFileLC(iFs, iScriptFile, scriptcontents);
+			runTestStep.Set(TEFparser::GetRunTestStep(scriptcontents, KRunStep, pos, err));
+			if(err == KErrNone)
+				{
+				// get the ini file info for the current test step
+				err = TEFparser::GetIniFileInfo(runTestStep, iniFileName, iniSectionName);
+				if (err == KErrNone)
+					{
+					// get the path to the ini file for the current test step
+					err = TEFparser::GetiniPath(iniFileName, iScriptFile, iniFilePath);
+					if (err == KErrNone)
+						{
+						// get the data in section for of the ini file for the current test step and write it into the
+						// test file
+						err = TEFparser::GetSectionData(iniFilePath, iniSectionName, iTocspTestFile, iFs);
+						if (err != KErrNone)
+							{
+							ReportErrorL();
+							}
+						CleanupStack::PopAndDestroy();
+						}	
+						else
+						{
+							ReportErrorL();
+						}
+					}
+					else
+					{
+						ReportErrorL();
+					}
+				}
+			else
+				{
+				CleanupStack::PopAndDestroy();
+				}
+			}while(err == KErrNone);
+		// execute the tests for the complete test file with all the ini file section data in
+		iResult = CTOCSPResult::NewL();
+		iTest = CTOCSPScript::NewL(*iLog, *iResult, iTocspTestFile);
+		iTest->SetVerbose(ETrue);
+		iState = ERunningNormalTest;
+		iTest->RunTestL(iStatus);
+		SetActive();
+		CActiveScheduler::Start();
+		}
+	else
+		{
+		iResult = CTOCSPResult::NewL();
+		iTest = CTOCSPScript::NewL(*iLog, *iResult, iScriptFile);
+		iTest->SetVerbose(ETrue);
+		iState = ERunningNormalTest;
+		iTest->RunTestL(iStatus);
+		SetActive();
+		CActiveScheduler::Start();
+		}
+		
+	
+	}
+
+void CTOCSPMain::RunOOMTestsL()
+	{
+#ifdef _DEBUG
+	iLog->LogL(_L("\nStarting OCSP OOM tests from script...\n"), ETrue);
+
+    iError = KErrNone;
+
+	iTransaction = KMinTransaction;
+	iFailPoint = KMinHeapFailPoint;
+	iCompletions = 0;
+	ResetTestL();
+	StartNextOOMTestL();
+
+    // Run async code
+	CActiveScheduler::Start();
+
+	ReportErrorL();
+#else
+	iLog->LogL(_L("No OOM tests run on release build.\n"), ETrue);
+	// reports a single test run to satisfy corebuilder log parsing requirements
+	iLog->LogL(_L("0 tests failed out of 1\n"));
+#endif
+	}
+
+// Report any error and raise it to the client
+void CTOCSPMain::ReportErrorL()
+	{
+	if (iError != KErrNone)
+		{	
+		iLog->LogL(_L("Exiting with leave code: "));
+		iLog->LogL(iError);
+		iLog->NewLineL();
+		iLog->LogL(_L("1 tests failed out of 1 (unknown)\n"));
+		}
+	}
+
+TInt CTOCSPMain::RunError(TInt aError)
+	{
+	if (iState == ERunningNormalTest || iState == ERunningOOMTest)
+		{
+		// attempt to clean up after ourselves
+		delete iTest;
+		iTest = NULL;
+
+		delete iResult;
+		iResult = NULL;
+
+		__UHEAP_MARKEND;
+		}
+
+	iError = aError;
+	CActiveScheduler::Stop();	
+	return KErrNone;
+	}
+
+void CTOCSPMain::DoCancel()
+	{
+	switch (iState)
+		{
+		case ERunningNormalTest:
+		case ERunningOOMTest:
+			iTest->Cancel();
+			break;
+
+		default:
+			Panic(KErrCorrupt);
+		}
+	}
+
+void CTOCSPMain::RunL()
+	{
+	switch (iState)
+		{
+		case ERunningNormalTest:
+			FinishedNormalTestL();
+			break;
+
+		case ERunningOOMTest:
+			FinishedOOMTestL();
+			break;
+
+		default:
+			Panic(KErrCorrupt);
+		}
+	}
+
+void CTOCSPMain::FinishedNormalTestL()
+	{
+	delete iTest;
+	iTest = NULL;
+	
+	iLog->NewLineL();
+	if (iStatus == KErrNone)
+		{
+		iLog->LogL(_L("Tests completed OK"), ETrue);
+		iLog->NewLineL();
+		}
+	else
+		{
+		iLog->NewLineL();
+		iLog->LogL(_L("ERROR: Leave code = "), ETrue);
+		iLog->LogL(iStatus.Int());
+		iLog->NewLineL();
+		User::Leave(iStatus.Int());
+		}
+	
+	iResult->LogSummaryL(*iLog);
+
+	delete iResult;
+	iResult = NULL;
+	
+	__UHEAP_MARKEND;
+
+	CActiveScheduler::Stop();
+	}
+
+void CTOCSPMain::StartNextOOMTestL()
+	{
+	if (iFailPoint == 1)
+		{
+		iLog->LogL(_L("*** Testing transaction "), ETrue);
+		iLog->LogL(iTransaction, ETrue);
+		iLog->LogL(_L("\n"), ETrue);
+		}
+
+	iLog->LogL(_L("\n"));
+	iLog->LogL(iFailPoint);
+	iLog->LogL(_L(" "));
+
+	__UHEAP_MARK;
+
+	iResult = CTOCSPResult::NewL();
+	iTest = CTOCSPScript::NewL(*iLog, *iResult, iTocspTestFile, iTransaction);
+
+	iTest->SetVerbose(EFalse);
+	iTest->RunTestL(iStatus);
+	iState = ERunningOOMTest;
+	SetActive();
+
+	__UHEAP_SETFAIL(RHeap::EFailNext, iFailPoint);
+	}
+
+void CTOCSPMain::FinishedOOMTestL()
+	{
+	__UHEAP_SETFAIL(RHeap::ENone, 0);
+
+	TBool more = ETrue;
+
+	if (iTest)
+		{
+		more = CheckOOMTestResultL();
+		}
+
+	delete iTest;
+	iTest = NULL;
+	delete iResult;
+	iResult = NULL;
+
+	__UHEAP_MARKEND;
+
+	if (more)
+		{
+		ResetTestL();
+		StartNextOOMTestL();
+		}
+	else
+		{
+		CActiveScheduler::Stop();
+		}
+	}
+
+TBool CTOCSPMain::CheckOOMTestResultL()
+	{
+	if (iStatus != KErrNone &&
+		iStatus != KErrNoMemory  &&
+		iStatus != KErrDiskFull)
+		{
+		// error, report and exit
+		iLog->LogL(_L("\nHeap fail test (fail at "), ETrue);
+		iLog->LogL(iFailPoint);
+		iLog->LogL(_L(") exited with unexpected return code "));
+		iLog->LogL(iStatus.Int());
+		iLog->LogL(_L("\n"));
+		iLog->LogL(_L("1 tests failed out of 1\n"));
+		User::Leave(iStatus.Int());
+		}
+
+	// Count number of successive successful completions
+	if (iStatus == KErrNone)
+		{
+		++iCompletions;
+		}
+	else
+		{
+		iCompletions = 0;
+		}
+	
+	if (iCompletions == KCompletions)
+		{
+		// finished a round of testing
+		if (iTransaction < iTest->TransactionCount())
+			{
+			// more transactions
+			iFailPoint = KMinHeapFailPoint;
+			++iTransaction;
+			iCompletions = 0;
+			iLog->NewLineL();
+			}
+		else
+			{
+			// we're finished
+			iLog->LogL(_L("0 tests failed out of 1\n"));
+			return EFalse;
+			}
+		}
+	else
+		{
+		// go round again
+		++iFailPoint;
+		if (iFailPoint > KMaxHeapFailPoint)
+			{
+			iLog->LogL(_L("\nHeap fail test exceeded "), ETrue);
+			iLog->LogL(KMaxHeapFailPoint);
+			iLog->LogL(_L(" allocations\n"));
+			iLog->LogL(_L("1 tests failed out of 1\n"));
+			User::Leave(KErrGeneral);		  
+			}
+		}
+
+	return ETrue;
+	}
+
+void CTOCSPMain::ResetTestL()
+	{
+	User::After(5 * 1000 * 1000);
+	// We could use CCertUtils to remove the certs, but it's a lot faster just
+	// to delete the files
+	TDriveUnit sysDrive (RFs::GetSystemDrive());
+	TDriveName driveName(sysDrive.Name());
+	//file cert store files
+	TBuf<128> certStoreFilePath (driveName);
+	certStoreFilePath.Append(KCertStoreCertsFilePath);
+	
+	TInt error;
+	error = iFs.Delete(certStoreFilePath);
+	if (error != KErrNone && error != KErrNotFound && error != KErrPathNotFound)
+	{
+		// Handle a KErrInUse error. We try to delete up to 10 times, 
+		// and wait 1 sec between two attemps
+		if( KErrInUse == error) 
+		{
+			TInt tryCount = 10;
+			do 
+			{
+				User::After(1000000);	
+				error = iFs.Delete(certStoreFilePath);
+				
+			} while(0 != tryCount-- && error != KErrNone);
+			
+			if( 0 == tryCount ) 
+			{
+				User::Leave(error);
+			}
+			
+		}
+		else 
+		{
+			User::Leave(error);	
+		}
+	
+	}
+
+	//file cert store files
+	certStoreFilePath.Copy(driveName);
+	certStoreFilePath.Append(KCertStoreClientsFilePath);
+	
+	error = iFs.Delete(certStoreFilePath);
+	if (error != KErrNone && error != KErrNotFound && error != KErrPathNotFound)
+		{
+		User::Leave(error);
+		}
+	}
+
+LOCAL_C void RunScriptTestL()
+    {
+	// Start comms stuff - only necessary on WINS where this is an executable
+#ifdef __WINS__
+	InitCommsL();
+#endif
+
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+	CleanupStack::PushL(scheduler);
+	CActiveScheduler::Install(scheduler);
+
+	// Get command line
+	HBufC* argv = HBufC::NewLC(User::CommandLineLength());
+	TPtr cmd(argv->Des());
+	User::CommandLine(cmd);
+
+	// Validate command line
+	TLex argumentsValidation(cmd);	
+	TInt argc = 0;
+	while (argumentsValidation.NextToken().Length()) argc++;
+
+	if (argc < 2 || argc > 3)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	// Command line had 2 args - OK
+	TLex arguments(cmd);
+	TPtrC inputFile(arguments.NextToken());
+	TPtrC logFile(arguments.NextToken());
+
+	CTOCSPMain *main = CTOCSPMain::NewLC(inputFile, logFile);
+
+	TBool memoryTests = EFalse;
+
+	if (argc == 3)
+		{
+		TPtrC memArg(arguments.NextToken());
+		if (memArg != KOOMArgument)
+			{
+			User::Leave(KErrArgument);
+			}
+		memoryTests = ETrue;
+		}
+
+	if (memoryTests)
+		{
+		main->RunOOMTestsL();
+		}
+	else
+		{
+		main->RunNormalTestsL();
+		}
+
+	CleanupStack::PopAndDestroy(main);
+
+	CleanupStack::PopAndDestroy(argv);
+	CleanupStack::PopAndDestroy(scheduler);
+    }
+
+// Entry point
+GLDEF_C TInt E32Main()
+    {
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+
+	TRAPD(error,RunScriptTestL()); 
+	__ASSERT_ALWAYS(!error, User::Panic(_L("OCSP TEST ERROR"), error));
+
+	delete cleanup;
+	__UHEAP_MARKEND;
+	return 0;
+    }