cryptoservices/certificateandkeymgmt/tasn1/testbase.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/tasn1/testbase.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,269 @@
+/*
+* 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 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: 
+* Defines methods common to all test classes
+*
+*/
+
+
+#include <e32cons.h>
+#include "testbase.h"
+#include "t_input.h"
+
+_LIT(KParametersStart, "<parameters>");
+_LIT(KValuesStart, "<values>");
+_LIT(KRandomStart, "<random>");
+const TInt KMaxValuesSize = 1024;
+
+
+CTestBase::CTestBase(CASN1NormalTest &aASN1Action)
+: iASN1Action(aASN1Action)
+	{
+	}
+
+CTestBase::~CTestBase()
+	{
+	iParameters->Close();
+	delete iParameters;
+	iValues->ResetAndDestroy();
+	delete iValues;
+	};
+
+CTestAction::TScriptError CTestBase::ConstructL(const TTestActionSpec& aTestActionSpec)
+	{
+	CTestAction::TScriptError syntaxError;
+	iParameters = new (ELeave)RArray<CTestParameter::TType>;
+	iValues = new (ELeave)RPointerArray<CTestParameter>;
+	FillParameterArray();
+
+	HBufC* aBody = HBufC::NewLC(aTestActionSpec.iActionBody.Length());
+	
+	aBody->Des().Copy(aTestActionSpec.iActionBody);
+	TPtrC parameters(Input::ParseElement(*aBody, KParametersStart));
+
+	syntaxError = CheckValueParametersL(parameters);
+	if(syntaxError==CTestAction::ENone)
+		syntaxError = CheckRandomParametersL(parameters);
+
+	CleanupStack::PopAndDestroy();
+	return(syntaxError);
+	}
+
+
+CTestAction::TScriptError CTestBase::CheckValueParametersL(const TDesC& aParameters)
+	{
+	TInt dummyPos = 0, valuePos = 0, lastDummy = 0;
+	TBuf<KMaxValueSize> singleValue;
+	CTestParameter *testParameter=0;
+	TBuf<KMaxValuesSize> values;
+
+	// finds values to run test with
+	do
+		{
+		lastDummy = dummyPos;
+		values = Input::ParseElement(aParameters, KValuesStart, dummyPos);
+
+		// finds the next group of value
+		if(lastDummy != dummyPos)
+			{
+			// parses each value in group with its expeced type
+			for(TInt parameter = 0; parameter < iParameters->Count(); parameter++)
+				{
+				testParameter = NULL;
+				// checks if its last parameter
+				if(parameter < iParameters->Count() - 1)
+					{
+					// finds it position
+					valuePos = values.Find((_L(",")));
+					if(valuePos > 0)
+						{
+						// fills singleValue with value
+						if(valuePos > KMaxValueSize)
+							{
+							iSyntaxErrorDescription.Copy(_L("value too long"));
+							return(CTestAction::ESyntax);
+							}
+						singleValue.Copy(values.Left(valuePos));
+						values = values.Mid(valuePos + 1);
+						}
+					else
+						{
+						// couldnt find it there is a problem
+						iSyntaxErrorDescription.Copy(_L("Invalid number of parameters"));
+						return(CTestAction::ESyntax);
+						};
+					}
+				else
+					{
+					// its the last value fill singleValue with it
+					if(values.Length() > KMaxValueSize)
+						{
+						iSyntaxErrorDescription.Copy(_L("value too long"));
+						return(CTestAction::ESyntax);
+						}
+					singleValue.Copy(values);
+					};
+
+				// trims any white space
+				singleValue.Trim();
+				// checks what type its supposed to be
+				switch((*iParameters)[parameter])
+					{
+					case CTestParameter::EInt:
+						{
+							// its an int, check to see if its a range
+							if(singleValue.Find(_L("..")) == KErrNotFound)
+								testParameter = CIntTestParameter::NewL(singleValue);
+							else
+								testParameter = CIntRangeTestParameter::NewL(singleValue);
+							break;
+						}
+					case CTestParameter::EString:
+						{
+							// its a string
+							testParameter = CStringTestParameter::NewL(singleValue);
+							break;
+						}
+					case CTestParameter::EIntRange:
+					case CTestParameter::ERandom:
+						break;	//	Nothing to do
+					};
+				// if testparamer is found add it to the list
+				if(testParameter)
+					{	
+					if(testParameter->iValid)
+						iValues->Append(testParameter);
+					else
+						{
+						delete testParameter;
+						iSyntaxErrorDescription.Copy(_L("Invalid value "));
+						iSyntaxErrorDescription.Append(singleValue);
+						return(CTestAction::ESyntax);
+						}
+					}
+				};
+			}
+		}
+	while(lastDummy != dummyPos);
+
+	return(CTestAction::ENone);
+	};
+
+CTestAction::TScriptError CTestBase::CheckRandomParametersL(const TDesC& aParameters)
+	{
+	TInt dummyPos = 0, lastDummy = 0;
+	TBuf<KMaxValueSize> singleValue;
+	CTestParameter *testParameter=0;
+	TBuf<KMaxValuesSize> values;
+
+	// finds any random tests
+	do
+		{
+		lastDummy = dummyPos;
+		values = Input::ParseElement(aParameters, KRandomStart, dummyPos);
+
+		if(lastDummy != dummyPos)
+			{
+			if(values.Length() > KMaxValueSize)
+				{
+				iSyntaxErrorDescription.Copy(_L("value too long"));
+				return(CTestAction::ESyntax);
+				}
+			singleValue.Copy(values);
+			// found one create a random parameter with its interators
+			testParameter = CRandomTestParameter::NewL(singleValue);
+			// adds it to list
+			if(testParameter)
+				{	
+				if(testParameter->iValid)
+					iValues->Append(testParameter);
+				else
+					{
+					delete testParameter;
+					iSyntaxErrorDescription.Copy(_L("Invalid value "));
+					iSyntaxErrorDescription.Append(singleValue);
+					return(CTestAction::ESyntax);
+					}
+				}
+			}
+		}
+	while(lastDummy != dummyPos);
+
+	return(CTestAction::ENone);
+	};
+
+void CTestBase::OutputEncodingL(CConsoleBase& aConsole, TDesC8& aData)
+	{
+	aConsole.Printf(_L("Encoding: Length = "));
+	TBuf<20> bits;
+	bits.AppendNum(aData.Length());
+	bits.Append(_L(", data = "));
+	aConsole.Printf(bits);
+	
+	TInt size = aData.Length();
+	for (TInt i = 0; i < size; ++i)
+		{
+		TBuf<10> tbuf;
+		tbuf.AppendNumFixedWidth(aData[i], EHex, 2);
+		aConsole.Printf(tbuf);
+		}
+
+	aConsole.Printf(_L("\n"));
+	}
+
+TBool CTestBase::CountTests(TInt &totalTests)
+	{
+	CTestParameter* test;
+	TInt totalRandomTests = 0;
+	TInt totalParameters = 0;
+	TInt totalRangeTests = 0;
+
+	totalTests=0;
+
+	// counts number of tests to do for type
+	for(TInt pos = 0; pos < iValues->Count(); pos++)
+		{
+		test = (*iValues)[pos];
+		switch(test->GetType())
+			{
+			case CTestParameter::EInt :
+			case CTestParameter::EString :
+				{
+				totalTests++;
+				totalParameters++;
+				break;
+				}
+			case CTestParameter::EIntRange :
+				{
+				CIntRangeTestParameter *rangeInt = REINTERPRET_CAST(CIntRangeTestParameter*, test);
+				totalRangeTests += rangeInt->Range();
+				totalParameters++;
+				break;
+				}
+			case CTestParameter::ERandom :
+				{
+				CRandomTestParameter *randomInt = REINTERPRET_CAST(CRandomTestParameter*, test);
+				
+				totalRandomTests+= randomInt->Interations();
+				break;
+				}
+			};
+		};
+
+	// only count each test once, remember each test can only have one parameter field of 
+	// range or random
+	totalTests = totalRandomTests + totalRangeTests + (totalParameters / iParameters->Count());
+	// checks if tests correct number of parameters for type
+	return((totalParameters %  iParameters->Count()) == 0);
+	};