--- /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);
+ };