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