mmtestenv/mmtestfw/Source/TestFrameworkClient/TestSuite.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmtestenv/mmtestfw/Source/TestFrameworkClient/TestSuite.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,492 @@
+// 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:
+// This contains CTestSuite which is the base class for all the TestSuite DLLs
+// 
+//
+
+// EPOC includes
+#include <e32base.h>
+
+// Test system includes
+#include <testframework.h>
+
+// do not export if Unit Testing
+#if defined (__TSU_TESTFRAMEWORK__)
+#undef EXPORT_C
+#define EXPORT_C
+#endif
+
+/**
+ *
+ * Default test suite version string
+ *
+ * @xxxx 
+ *
+ */
+_LIT(KTxtVersion,"?.?");
+
+/**
+ *
+ * Test suite destructor
+ * This destroys all the test steps contained in this class and
+ * in classes derived from it
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C CTestSuite::~CTestSuite()
+	{
+	// free all test steps
+	if (iArrayTestSteps)
+		iArrayTestSteps->ResetAndDestroy();
+
+	// free the dynamic array used for test steps
+	delete iArrayTestSteps;
+
+	}
+
+/**
+ *
+ * Test suite constructor (second phase)
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::ConstructL()
+	{
+	// create a new Array to store the test steps in
+	iArrayTestSteps = new(ELeave) CArrayPtrFlat<RTestStep>(1);
+
+	// default severity
+	SetSeverity(ESevrAll);
+	iLogger = NULL;
+
+	// initialise the derived test suites
+	InitialiseL();
+	}
+
+/**
+ *
+ * Get test suite version.
+ *
+ * NOTE : this function is not pure virtual i.e. a test suite
+ * does not have to provide a version string - however this
+ * may change. It is strongly recommended that a test suite DLL
+ * overrides this method.
+ *
+ * @return	"TPtrC"
+ *			The version string.
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C TPtrC CTestSuite::GetVersion() const
+	{
+	return KTxtVersion();
+	}
+
+/**
+ *
+ * Add a test step into the suite
+ *
+ * @param	"RTestStep* aTestStep"
+ *			The test step to add.
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::AddTestStepL(RTestStep* aTestStep)
+	{
+	__ASSERT_ALWAYS(aTestStep, User::Panic(_L("CTestSuite::AddTestStepL"), KErrArgument));
+	// test steps contain a pointer back to the suite which owns them
+	aTestStep->SetSuite(this);
+	// add the step; order is not important, so add it at position 1
+	iArrayTestSteps->AppendL(aTestStep, 1);
+	}
+
+
+/**
+ *
+ * Perform a test step.
+ *
+ * @param	"const TDesC& aStep"
+ *			The test step to run.
+ *
+ * @param	"const TDesC& aConfig"
+ *			The configuration file name.
+ *
+ * @return	"TVerdict"
+ *			Result of the test.
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C TVerdict CTestSuite::DoTestStep(const TDesC& aStep, const TDesC& aConfig, const TDesC& aParamSet)
+	{
+	// This function traps leaves in the test steps, so should never leave
+
+	//	get the number of tests available in this suite
+	TInt noOfTests = iArrayTestSteps->Count();
+
+	// search the available test steps for the required one
+	for (TInt i = 0; i < noOfTests; i++)
+	{
+		RTestStep* theStep = iArrayTestSteps->At(i);
+		if (theStep->StepName().MatchF(aStep) != KErrNotFound)
+			{
+
+			// found required test so initialise to PASS
+			theStep->SetResult(EPass);
+			
+			// set the param set to use
+			theStep->SetDefaultParamSet(aParamSet);
+
+			// pass the config file info into the test step
+			theStep->LoadConfig(aConfig);
+
+			// assume it's going to work
+			TVerdict result = EPass;
+
+			// set step status
+			iStepStatus = EStepStatusStart;
+
+			// execute pre-preamble (cleanup stack growth)
+			TRAPD(rPreOpen, theStep->PreOpenL());
+
+			if (rPreOpen != KErrNone)
+				{
+				WARN_PRINTF4(_L("Warning: Test step:%S PreOpenL in suite:%S left, error %d"), &aStep, &iSuiteName, rPreOpen);
+				result = EInconclusive;
+				}
+			else
+				{
+				// execute test step preamble (if any) inside a trap
+				TRAPD(rPreAmble, result = theStep->OpenL());
+
+				if (result != EPass)
+					{
+					WARN_PRINTF3(_L("Warning: Test step:%S preamble in suite:%S failed"), &aStep, &iSuiteName);
+					// here : call to virtual cleanup function in test step, if it exists...
+					theStep->CleanupAfterOpenFail();
+					result = EInconclusive;
+					}
+				else if (rPreAmble != KErrNone)
+					{
+					WARN_PRINTF4(_L("Warning: Test step:%S preamble in suite:%S left, error %d"), &aStep, &iSuiteName, rPreAmble);
+					// here : call to virtual cleanup function in test step, if it exists...
+					theStep->CleanupAfterOpenFail();
+					result = EInconclusive;
+					}
+				}
+
+			// only continue if the preamble passed
+			if (result == EPass)
+				{
+
+				// set step status
+				iStepStatus = EStepStatusPreamble;
+
+				// now execute test step inside a trap
+				TRAPD(r, result = theStep->DoTestStepL());
+
+				if (r!= KErrNone)
+					{
+					WARN_PRINTF4(_L("Warning: Test step:%S in suite:%S left, error %d"), &aStep, &iSuiteName, r);
+					result = EFail;
+					}
+
+				// set step status
+				iStepStatus = EStepStatusTest;
+
+				// execute test step postamble
+				// NB - postamble does not leave, but may panic
+				theStep->Close();
+
+				// set step status
+				iStepStatus = EStepStatusFinished;
+				}
+
+			// *** TO DO - check if there are problems when the preamble leaves.
+			// In this case the postamble is not called - there may be memory leaks.
+			// (Preambles may allocate memory, call __UHEAP_MARK, etc.)
+			// If so, move Close() to this point, and check again.
+
+			// clean up Config data object
+			theStep->UnloadConfig();
+
+			return result;
+
+			}
+		}
+
+	// suite has been searched but test step not found, so error.
+ 	ERR_PRINTF3(_L("Failed to find test step:%S in suite:%S"), &aStep, &iSuiteName);
+
+	return ETestSuiteError;
+
+	}
+
+/**
+ *
+ * Gets a step's heap and stack size.
+ *
+ * @param	"const TDesC& aStep"
+ *			The step name
+ * @param	"TInt* aHeapSize"
+ *			Returns the step's heap size
+ * @param	"TInt* aStackSize"
+ *			Returns the step's stack size
+ *
+ * @xxxx
+ *
+ */
+EXPORT_C void CTestSuite::GetHeapAndStackSize(const TDesC& aStep, TInt* aHeapSize, TInt* aStackSize)
+	{
+	//get the number of tests available in this suite
+	TInt noOfTests = iArrayTestSteps->Count();
+
+	// search the available test steps for the required one
+	for (TInt i = 0; i < noOfTests; i++)
+		{
+		RTestStep* theStep = iArrayTestSteps->At(i);
+		if (theStep->StepName().MatchF(aStep) != KErrNotFound)
+			{
+
+			// found required test, so get the stack and heap size
+			*aHeapSize = theStep->HeapSize();
+			*aStackSize = theStep->StackSize();
+			}
+		}
+	}
+
+/**
+ *
+ * General logging function for test suites.
+ *
+ * @param	"TRefByValue<const TDesC16> aFmt"
+ *			Printf-style format.
+ *
+ * @param	"..."
+ *			Variable print parameters
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::Log(TRefByValue<const TDesC16> aFmt, ...)
+	{
+
+	VA_LIST aList;
+	VA_START(aList, aFmt);
+
+	if(iLogger) 
+		iLogger->Log(aFmt, aList);
+
+	VA_END(aList);
+	}
+
+/**
+ *
+ * General logging function for test suites, with severity.
+ *
+ * @param	"TInt aSeverity"
+ *			Severity level required to log
+ *
+ * @param	"TRefByValue<const TDesC16> aFmt"
+ *			Printf-style format.
+ *
+ * @param	"..."
+ *			Variable print parameters
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::Log(TInt aSeverity, TRefByValue<const TDesC16> aFmt, ...)
+	{
+	VA_LIST aList;
+	VA_START(aList, aFmt);
+
+	if(LogSeverity::IsActive(aSeverity, Severity()))
+		{
+		if(iLogger) 
+			iLogger->Log(aFmt, aList);
+		}
+
+	VA_END(aList);
+	}
+
+/**
+ *
+ * Traceable logging function for test suites.
+ *
+ * @param	"const TText8* aFile"
+ *			Source code file name
+ *
+ * @param	"TInt aLine"
+ *			Source code line
+ *
+ * @param	"TInt aSeverity"
+ *			Severity level required to log
+ *
+ * @param	"TRefByValue<const TDesC16> aFmt"
+ *			Printf-style format.
+ *
+ * @param	"..."
+ *			Variable print parameters
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::LogExtra(const TText8* aFile, TInt aLine, TInt aSeverity,
+		TRefByValue<const TDesC16> aFmt,...)
+	{
+	VA_LIST aList;
+	VA_START(aList, aFmt);
+
+	if(LogSeverity::IsActive(aSeverity, Severity()))
+		{
+		if(iLogger)
+			{
+			iLogger->LogExtra(aFile, aLine, aSeverity, aFmt, aList);
+			}
+		}
+
+	VA_END(aList);
+	}
+
+
+/**
+ *
+ * Traceable Boolean condition tester.
+ *
+ * @param	"TBool aCondition"
+ *			Condition to be checked
+ *
+ * @param	"const TText8* aFile"
+ *			Source code file name
+ *
+ * @param	"TInt aLine"
+ *			Source code line
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::TestBooleanTrueL(TBool aCondition, const TText8* aFile, TInt aLine)
+	{
+
+	// check condition
+	if (aCondition)
+		return;
+
+	// convert filename for log
+	TBuf<KMaxLogFilenameLength> fileName;
+	TPtrC8 fileName8(aFile);
+	fileName.Copy(fileName8);  // TText8->TBuf16
+
+	// display a log message
+ 	ERR_PRINTF3(_L("Test Failed in file:%S line:%d"), &fileName, aLine);
+
+	// leave with error code
+	User::Leave(KTestErrorCode);
+
+	}
+
+/**
+ *
+ * Set log severity.
+ *
+ * @param	"TInt aSeverity"
+ *			The required severity
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::SetSeverity(TInt aSeverity)
+	{
+	iSeverity = aSeverity;
+	}
+
+/**
+ *
+ * Get log severity.
+ *
+ * @return	"TInt"
+ *			The current severity
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C TInt CTestSuite::Severity() const
+	{
+	return iSeverity;
+	}
+
+/**
+ *
+ * Set logging system.
+ *
+ * @param	"CLog *aLogger"
+ *			The log to use.
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::SetLogSystem(CLog* aLogger)
+	{
+	iLogger = aLogger;
+	}
+
+/**
+ *
+ * Get logging system.
+ *
+ * @return	"CLog*"
+ *			The log the test suite is currently using.
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C CLog* CTestSuite::LogSystem() const
+	{
+	return iLogger;
+	}
+
+/**
+ *
+ * Set step status.
+ *
+ * @param	"TTestStepStatus aStatus"
+ *			The status to set.
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C void CTestSuite::SetStepStatus(TTestStepStatus aStatus)
+	{
+	iStepStatus = aStatus;
+	}
+
+/**
+ *
+ * Get step status.
+ *
+ * @return "TTestStepStatus"
+ *			The step status.
+ *
+ * @xxxx 
+ *
+ */
+EXPORT_C TTestStepStatus CTestSuite::StepStatus() const
+	{
+	return iStepStatus;
+	}