diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/tasn1/testbase.cpp --- /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 +#include "testbase.h" +#include "t_input.h" + +_LIT(KParametersStart, ""); +_LIT(KValuesStart, ""); +_LIT(KRandomStart, ""); +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; + iValues = new (ELeave)RPointerArray; + 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 singleValue; + CTestParameter *testParameter=0; + TBuf 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 singleValue; + CTestParameter *testParameter=0; + TBuf 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); + };