os/security/cryptoservices/certificateandkeymgmt/tasn1/testbase.cpp
changeset 0 bde4ae8d615e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/os/security/cryptoservices/certificateandkeymgmt/tasn1/testbase.cpp	Fri Jun 15 03:10:57 2012 +0200
     1.3 @@ -0,0 +1,270 @@
     1.4 +/*
     1.5 +* Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
     1.6 +* All rights reserved.
     1.7 +* This component and the accompanying materials are made available
     1.8 +* under the terms of the License "Eclipse Public License v1.0"
     1.9 +* which accompanies this distribution, and is available
    1.10 +* at the URL "http://www.eclipse.org/legal/epl-v10.html".
    1.11 +*
    1.12 +* Initial Contributors:
    1.13 +* Nokia Corporation - initial contribution.
    1.14 +*
    1.15 +* Contributors:
    1.16 +*
    1.17 +* Description: 
    1.18 +* Defines methods common to all test classes
    1.19 +*
    1.20 +*/
    1.21 +
    1.22 +
    1.23 +#include <e32cons.h>
    1.24 +#include "testbase.h"
    1.25 +#include "t_input.h"
    1.26 +
    1.27 +_LIT(KParametersStart, "<parameters>");
    1.28 +_LIT(KValuesStart, "<values>");
    1.29 +_LIT(KRandomStart, "<random>");
    1.30 +const TInt KMaxValuesSize = 1024;
    1.31 +
    1.32 +
    1.33 +CTestBase::CTestBase(CASN1NormalTest &aASN1Action)
    1.34 +: iASN1Action(aASN1Action)
    1.35 +	{
    1.36 +	}
    1.37 +
    1.38 +CTestBase::~CTestBase()
    1.39 +	{
    1.40 +	iParameters->Close();
    1.41 +	delete iParameters;
    1.42 +	iValues->ResetAndDestroy();
    1.43 +	delete iValues;
    1.44 +	};
    1.45 +
    1.46 +CTestAction::TScriptError CTestBase::ConstructL(const TTestActionSpec& aTestActionSpec)
    1.47 +	{
    1.48 +	CTestAction::TScriptError syntaxError;
    1.49 +	iParameters = new (ELeave)RArray<CTestParameter::TType>;
    1.50 +	iValues = new (ELeave)RPointerArray<CTestParameter>;
    1.51 +	FillParameterArray();
    1.52 +
    1.53 +	HBufC* aBody = HBufC::NewLC(aTestActionSpec.iActionBody.Length());
    1.54 +	
    1.55 +	aBody->Des().Copy(aTestActionSpec.iActionBody);
    1.56 +	TPtrC parameters(Input::ParseElement(*aBody, KParametersStart));
    1.57 +
    1.58 +	syntaxError = CheckValueParametersL(parameters);
    1.59 +	if(syntaxError==CTestAction::ENone)
    1.60 +		syntaxError = CheckRandomParametersL(parameters);
    1.61 +
    1.62 +	CleanupStack::PopAndDestroy();
    1.63 +	return(syntaxError);
    1.64 +	}
    1.65 +
    1.66 +
    1.67 +CTestAction::TScriptError CTestBase::CheckValueParametersL(const TDesC& aParameters)
    1.68 +	{
    1.69 +	TInt dummyPos = 0, valuePos = 0, lastDummy = 0;
    1.70 +	TBuf<KMaxValueSize> singleValue;
    1.71 +	CTestParameter *testParameter=0;
    1.72 +	TBuf<KMaxValuesSize> values;
    1.73 +
    1.74 +	// finds values to run test with
    1.75 +	do
    1.76 +		{
    1.77 +		lastDummy = dummyPos;
    1.78 +		values = Input::ParseElement(aParameters, KValuesStart, dummyPos);
    1.79 +
    1.80 +		// finds the next group of value
    1.81 +		if(lastDummy != dummyPos)
    1.82 +			{
    1.83 +			// parses each value in group with its expeced type
    1.84 +			for(TInt parameter = 0; parameter < iParameters->Count(); parameter++)
    1.85 +				{
    1.86 +				testParameter = NULL;
    1.87 +				// checks if its last parameter
    1.88 +				if(parameter < iParameters->Count() - 1)
    1.89 +					{
    1.90 +					// finds it position
    1.91 +					valuePos = values.Find((_L(",")));
    1.92 +					if(valuePos > 0)
    1.93 +						{
    1.94 +						// fills singleValue with value
    1.95 +						if(valuePos > KMaxValueSize)
    1.96 +							{
    1.97 +							iSyntaxErrorDescription.Copy(_L("value too long"));
    1.98 +							return(CTestAction::ESyntax);
    1.99 +							}
   1.100 +						singleValue.Copy(values.Left(valuePos));
   1.101 +						values = values.Mid(valuePos + 1);
   1.102 +						}
   1.103 +					else
   1.104 +						{
   1.105 +						// couldnt find it there is a problem
   1.106 +						iSyntaxErrorDescription.Copy(_L("Invalid number of parameters"));
   1.107 +						return(CTestAction::ESyntax);
   1.108 +						};
   1.109 +					}
   1.110 +				else
   1.111 +					{
   1.112 +					// its the last value fill singleValue with it
   1.113 +					if(values.Length() > KMaxValueSize)
   1.114 +						{
   1.115 +						iSyntaxErrorDescription.Copy(_L("value too long"));
   1.116 +						return(CTestAction::ESyntax);
   1.117 +						}
   1.118 +					singleValue.Copy(values);
   1.119 +					};
   1.120 +
   1.121 +				// trims any white space
   1.122 +				singleValue.Trim();
   1.123 +				// checks what type its supposed to be
   1.124 +				switch((*iParameters)[parameter])
   1.125 +					{
   1.126 +					case CTestParameter::EInt:
   1.127 +						{
   1.128 +							// its an int, check to see if its a range
   1.129 +							if(singleValue.Find(_L("..")) == KErrNotFound)
   1.130 +								testParameter = CIntTestParameter::NewL(singleValue);
   1.131 +							else
   1.132 +								testParameter = CIntRangeTestParameter::NewL(singleValue);
   1.133 +							break;
   1.134 +						}
   1.135 +					case CTestParameter::EString:
   1.136 +						{
   1.137 +							// its a string
   1.138 +							testParameter = CStringTestParameter::NewL(singleValue);
   1.139 +							break;
   1.140 +						}
   1.141 +					case CTestParameter::EIntRange:
   1.142 +					case CTestParameter::ERandom:
   1.143 +						break;	//	Nothing to do
   1.144 +					};
   1.145 +				// if testparamer is found add it to the list
   1.146 +				if(testParameter)
   1.147 +					{	
   1.148 +					if(testParameter->iValid)
   1.149 +						iValues->Append(testParameter);
   1.150 +					else
   1.151 +						{
   1.152 +						delete testParameter;
   1.153 +						iSyntaxErrorDescription.Copy(_L("Invalid value "));
   1.154 +						iSyntaxErrorDescription.Append(singleValue);
   1.155 +						return(CTestAction::ESyntax);
   1.156 +						}
   1.157 +					}
   1.158 +				};
   1.159 +			}
   1.160 +		}
   1.161 +	while(lastDummy != dummyPos);
   1.162 +
   1.163 +	return(CTestAction::ENone);
   1.164 +	};
   1.165 +
   1.166 +CTestAction::TScriptError CTestBase::CheckRandomParametersL(const TDesC& aParameters)
   1.167 +	{
   1.168 +	TInt dummyPos = 0, lastDummy = 0;
   1.169 +	TBuf<KMaxValueSize> singleValue;
   1.170 +	CTestParameter *testParameter=0;
   1.171 +	TBuf<KMaxValuesSize> values;
   1.172 +
   1.173 +	// finds any random tests
   1.174 +	do
   1.175 +		{
   1.176 +		lastDummy = dummyPos;
   1.177 +		values = Input::ParseElement(aParameters, KRandomStart, dummyPos);
   1.178 +
   1.179 +		if(lastDummy != dummyPos)
   1.180 +			{
   1.181 +			if(values.Length() > KMaxValueSize)
   1.182 +				{
   1.183 +				iSyntaxErrorDescription.Copy(_L("value too long"));
   1.184 +				return(CTestAction::ESyntax);
   1.185 +				}
   1.186 +			singleValue.Copy(values);
   1.187 +			// found one create a random parameter with its interators
   1.188 +			testParameter = CRandomTestParameter::NewL(singleValue);
   1.189 +			// adds it to list
   1.190 +			if(testParameter)
   1.191 +				{	
   1.192 +				if(testParameter->iValid)
   1.193 +					iValues->Append(testParameter);
   1.194 +				else
   1.195 +					{
   1.196 +					delete testParameter;
   1.197 +					iSyntaxErrorDescription.Copy(_L("Invalid value "));
   1.198 +					iSyntaxErrorDescription.Append(singleValue);
   1.199 +					return(CTestAction::ESyntax);
   1.200 +					}
   1.201 +				}
   1.202 +			}
   1.203 +		}
   1.204 +	while(lastDummy != dummyPos);
   1.205 +
   1.206 +	return(CTestAction::ENone);
   1.207 +	};
   1.208 +
   1.209 +void CTestBase::OutputEncodingL(CConsoleBase& aConsole, TDesC8& aData)
   1.210 +	{
   1.211 +	aConsole.Printf(_L("Encoding: Length = "));
   1.212 +	TBuf<20> bits;
   1.213 +	bits.AppendNum(aData.Length());
   1.214 +	bits.Append(_L(", data = "));
   1.215 +	aConsole.Printf(bits);
   1.216 +	
   1.217 +	TInt size = aData.Length();
   1.218 +	for (TInt i = 0; i < size; ++i)
   1.219 +		{
   1.220 +		TBuf<10> tbuf;
   1.221 +		tbuf.AppendNumFixedWidth(aData[i], EHex, 2);
   1.222 +		aConsole.Printf(tbuf);
   1.223 +		}
   1.224 +
   1.225 +	aConsole.Printf(_L("\n"));
   1.226 +	}
   1.227 +
   1.228 +TBool CTestBase::CountTests(TInt &totalTests)
   1.229 +	{
   1.230 +	CTestParameter* test;
   1.231 +	TInt totalRandomTests = 0;
   1.232 +	TInt totalParameters = 0;
   1.233 +	TInt totalRangeTests = 0;
   1.234 +
   1.235 +	totalTests=0;
   1.236 +
   1.237 +	// counts number of tests to do for type
   1.238 +	for(TInt pos = 0; pos < iValues->Count(); pos++)
   1.239 +		{
   1.240 +		test = (*iValues)[pos];
   1.241 +		switch(test->GetType())
   1.242 +			{
   1.243 +			case CTestParameter::EInt :
   1.244 +			case CTestParameter::EString :
   1.245 +				{
   1.246 +				totalTests++;
   1.247 +				totalParameters++;
   1.248 +				break;
   1.249 +				}
   1.250 +			case CTestParameter::EIntRange :
   1.251 +				{
   1.252 +				CIntRangeTestParameter *rangeInt = REINTERPRET_CAST(CIntRangeTestParameter*, test);
   1.253 +				totalRangeTests += rangeInt->Range();
   1.254 +				totalParameters++;
   1.255 +				break;
   1.256 +				}
   1.257 +			case CTestParameter::ERandom :
   1.258 +				{
   1.259 +				CRandomTestParameter *randomInt = REINTERPRET_CAST(CRandomTestParameter*, test);
   1.260 +				
   1.261 +				totalRandomTests+= randomInt->Interations();
   1.262 +				break;
   1.263 +				}
   1.264 +			};
   1.265 +		};
   1.266 +
   1.267 +	// only count each test once, remember each test can only have one parameter field of 
   1.268 +	// range or random
   1.269 +	totalTests = totalRandomTests + totalRangeTests + (totalParameters / iParameters->Count());
   1.270 +	// checks if tests correct number of parameters for type
   1.271 +	return((totalParameters %  iParameters->Count()) == 0);
   1.272 +	};
   1.273 +