diff -r 7fdc9a71d314 -r 8ad140f3dd41 stif/DemoModule/src/Demomodulecases.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stif/DemoModule/src/Demomodulecases.cpp Wed Oct 13 16:17:58 2010 +0300 @@ -0,0 +1,495 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: This module contains the implementation of +* CTestModuleDemo class member functions that does the actual +* tests. +* +*/ + +// INCLUDE FILES +#include +#include "DemoModule.h" + +// EXTERNAL DATA STRUCTURES +// None + +// EXTERNAL FUNCTION PROTOTYPES +// None + +// CONSTANTS +// None + +// MACROS +// None + +// LOCAL CONSTANTS AND MACROS +// None + +// MODULE DATA STRUCTURES +// None + +// LOCAL FUNCTION PROTOTYPES +// None + +// FORWARD DECLARATIONS +// None + +// ==================== LOCAL FUNCTIONS ======================================= + +// ============================ MEMBER FUNCTIONS =============================== + +/* +------------------------------------------------------------------------------- + + Class: CDemoModule + + Method: Case + + Description: Returns a test case by number. + + This function contains an array of all available test cases + i.e pair of case name and test function. If case specified by parameter + aCaseNumber is found from array, then that item is returned. + + The reason for this rather complicated function is to specify all the + test cases only in one place. It is not necessary to understand how + function pointers to class member functions works when adding new test + cases. See function body for instructions how to add new test case. + + Parameters: const TInt aCaseNumber :in: Test case number + + Return Values: const TCaseInfo Struct containing case name & function + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +const TCaseInfo CDemoModule::Case ( + const TInt aCaseNumber ) const + { + + /* + * To add new test cases, implement new test case function and add new + * line to KCases array specify the name of the case and the function + * doing the test case + * In practice, do following + * + * 1) Make copy of existing test case function and change its name + * and functionality. Note that the function must be added to + * OOMHard.cpp file and to OOMHard.h + * header file. + * + * 2) Add entry to following KCases array either by using: + * + * 2.1: FUNCENTRY or ENTRY macro + * ENTRY macro takes two parameters: test case name and test case + * function name. + * + * FUNCENTRY macro takes only test case function name as a parameter and + * uses that as a test case name and test case function name. + * + * Or + * + * 2.2: OOM_FUNCENTRY or OOM_ENTRY macro. Note that these macros are used + * only with OOM (Out-Of-Memory) testing! + * + * OOM_ENTRY macro takes five parameters: test case name, test case + * function name, TBool which specifies is method supposed to be run using + * OOM conditions, TInt value for first heap memory allocation failure and + * TInt value for last heap memory allocation failure. + * + * OOM_FUNCENTRY macro takes test case function name as a parameter and uses + * that as a test case name, TBool which specifies is method supposed to be + * run using OOM conditions, TInt value for first heap memory allocation + * failure and TInt value for last heap memory allocation failure. + */ + + static TCaseInfoInternal const KCases[] = + { + // To add new test cases, add new items to this array + + // NOTE: When compiled to GCCE, there must be Classname:: + // declaration in front of the method name, e.g. + // CDemoModule::PrintTest. Otherwise the compiler + // gives errors. + + ENTRY( "Loop test", CDemoModule::LoopTest ), + ENTRY( "Simple math test", CDemoModule::SimpleMathTest ), + ENTRY( "Math test", CDemoModule::MathTest ), + ENTRY( "Print test", CDemoModule::PrintTest ), + // Example how to use OOM functionality + OOM_ENTRY( "Heap memory allocation with OOM (aborts)", CDemoModule::HeapMemoryAllocation, ETrue, 1, 2 ), + ENTRY( "Heap memory allocation (passes)", CDemoModule::HeapMemoryAllocation ) + }; + + // Verify that case number is valid + if( (TUint) aCaseNumber >= sizeof( KCases ) / + sizeof( TCaseInfoInternal ) ) + { + + // Invalid case, construct empty object + TCaseInfo null( (const TText*) L"" ); + null.iMethod = NULL; + null.iIsOOMTest = EFalse; + null.iFirstMemoryAllocation = 0; + null.iLastMemoryAllocation = 0; + return null; + + } + + // Construct TCaseInfo object and return it + TCaseInfo tmp ( KCases[ aCaseNumber ].iCaseName ); + tmp.iMethod = KCases[ aCaseNumber ].iMethod; + tmp.iIsOOMTest = KCases[ aCaseNumber ].iIsOOMTest; + tmp.iFirstMemoryAllocation = KCases[ aCaseNumber ].iFirstMemoryAllocation; + tmp.iLastMemoryAllocation = KCases[ aCaseNumber ].iLastMemoryAllocation; + return tmp; + + } + +/* +------------------------------------------------------------------------------- + + Class: CDemoModule + + Method: SimpleMathTest + + Description: Simple Math testing. + + Parameters: TTestResult& aErrorDescription: out: + Test result and on error case a short description of error + + Return Values: TInt: Always KErrNone to indicate that test was valid + + Errors/Exceptions: None + + Status: Approved + +------------------------------------------------------------------------------- +*/ +TInt CDemoModule::SimpleMathTest( TTestResult& aResult ) + { + /* Test with mathematic calculations and printing */ + _LIT( KDefinion , "RunTestCase"); + _LIT( KData , "Simple Math calculations"); + TestModuleIf().Printf( 0, KDefinion, KData ); + + // Random number. + TReal num = Math::Random(); + // Intermediate result + TReal sqrt = 0; + // Result + TReal result = 0; + + // Take square root of the number + TInt ret = Math::Sqrt( sqrt, num ); + if( ret != KErrNone ) + { + // Return error if Sqrt failed + _LIT( KResult ,"Math::Sqrt failed"); + aResult.iResultDes.Copy( KResult ); + aResult.iResult = KErrGeneral; + + // Case was executed but failed + return KErrNone; + } + + // Take power of two from the previous result + ret = Math::Pow( result, sqrt, 2 ); + if( ret != KErrNone ) + { + // Return error if Pow failed + _LIT( KResult ,"Math::Pow failed"); + aResult.iResultDes.Copy( KResult ); + aResult.iResult = KErrGeneral; + + // Case was executed but failed + return KErrNone; + } + + // Compare final result to the original value, + // rounded values should usually be same. + TInt32 a1; + TInt32 a2; + TInt r = Math::Int(a1, result); + + if (r != KErrNone ) + { + _LIT( KResult ,"1st conversion failed"); + aResult.iResultDes.Copy( KResult ); + aResult.iResult = r; + return KErrNone; + } + + r = Math::Int(a2, num); + if (r != KErrNone ) + { + _LIT( KResult ,"2nd conversion failed"); + aResult.iResultDes.Copy( KResult ); + aResult.iResult = r; + return KErrNone; + } + + if( a1 != a2 ) + { + _LIT( KResult ,"Calculation doesn't match"); + // Return error if comparison failed + aResult.iResultDes.Copy( KResult ); + aResult.iResult = KErrGeneral; + // Case was executed but failed + return KErrNone; + } + + + // Test case passed + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KDescription , "Test case passed"); + aResult.SetResult( KErrNone, KDescription ); + //aResult.iResult = KErrNone; + //aResult.iResultDes = KDescription; + + // Case was executed + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CDemoModule + + Method: MathTest + + Description: Print loop test. Actually does not test anything, just + demonstrate how to print. Test is always pased. + + Parameters: TTestResult& aErrorDescription: out: + Test result and on error case a short description of error + + Return Values: TInt: Always KErrNone to indicate that test was valid + + Errors/Exceptions: None + + Status: Approved + +------------------------------------------------------------------------------- +*/ +TInt CDemoModule::LoopTest( TTestResult& aResult ) + { + + /* Simple print and wait loop */ + _LIT( KDefinion ,"State"); + _LIT( KData ,"Looping"); + TestModuleIf().Printf( 0, KDefinion, KData ); + for( TInt i=0; i<10; i++) + { + _LIT( KRunning ,"Running"); + _LIT( KLoop ,"%d"); + TestModuleIf().Printf( 0, KRunning, KLoop, i); + User::After( 1000000 ); + } + _LIT( KData2 ,"Finished"); + TestModuleIf().Printf( 0, KDefinion, KData2 ); + + // Test case passed + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KDescription , "Test case passed"); + aResult.SetResult( KErrNone, KDescription ); + //aResult.iResult = KErrNone; + //aResult.iResultDes = KDescription; + + // Case was executed + return KErrNone; + } + +/* +------------------------------------------------------------------------------- + + Class: CDemoModule + + Method: MathTest + + Description: Math testing. + + Parameters: TTestResult& aErrorDescription: out: + Test result and on error case a short description of error + + Return Values: TInt: Always KErrNone to indicate that test was valid + + Errors/Exceptions: None + + Status: Approved + +------------------------------------------------------------------------------- +*/ +TInt CDemoModule::MathTest( TTestResult& aResult ) + { + /* Test with mathematic calculations and printing */ + _LIT( KDefinion ,"RunTestCase"); + _LIT( KData ,"Math calculations"); + TestModuleIf().Printf( 0, KDefinion, KData ); + // Result + TRealX res; + // Random numbers + TInt rand[6]; + TRealX coef[5]; + TInt i; + TInt j; + for( i=0; i<10; i++ ) + { + for(j=0; j<6; j++) + rand[j] = Math::Random(); + for(j=0; j<5; j++) + coef[j] = rand[j]; + Math::PolyX(res, rand[5], 5, coef ); + + _LIT( KResult ,"Result %d"); + TestModuleIf().Printf( 0, KDefinion, KResult, ( TInt )res); + } + + // Test case passed + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KDescription , "Test case passed"); + aResult.SetResult( KErrNone, KDescription ); + //aResult.iResult = KErrNone; + //aResult.iResultDes = KDescription; + + // Case was executed + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CDemoModule + + Method: PrintTest + + Description: Printing testing. + + Parameters: TTestResult& aErrorDescription: out: + Test result and on error case a short description of error + + Return Values: TInt: Always KErrNone to indicate that test was valid + + Errors/Exceptions: None + + Status: Approved + +------------------------------------------------------------------------------- +*/ +TInt CDemoModule::PrintTest( TTestResult& aResult ) + { + /* Tests printing with high intencity and different priority */ + _LIT( KDefinion ,"CTestModuleDemo::RunTestCase"); + _LIT( KData ,"Heavy print looping"); + TestModuleIf().Printf( 0, KDefinion, KData ); + TInt j; + for( TInt i=0; i<10; i++) + { + + for(j=0; j<2; j++) + { + _LIT( KTmp ,"RunTestCase"); + TBuf<15> tmp; + tmp.Copy( KTmp ); + tmp.AppendNum( j ); + _LIT( KNewData ,"p"); + TestModuleIf().Printf(3, tmp, KNewData ); + } + + for(j=0; j<500; j++) + { + _LIT( KNewDefinion ,"RunTestCase"); + _LIT( KNewData ,"%c"); + TestModuleIf().Printf(1+(Math::Random() % 12), + KNewDefinion, + KNewData, 'a'+(j%('z'-'a')) ); + } + + _LIT( KNewDefinion ,"RunTestCase"); + _LIT( KNewData ,"Running %d"); + TestModuleIf().Printf( 2, KNewDefinion,KNewData, i); + User::After( 1000000 ); + } + + // Test case passed + + // Sets test case result and description(Maximum size is KStifMaxResultDes) + _LIT( KDescription , "Test case passed"); + aResult.SetResult( KErrNone, KDescription ); + //aResult.iResult = KErrNone; + //aResult.iResultDes = KDescription; + + // Case was executed + return KErrNone; + + } + +/* +------------------------------------------------------------------------------- + + Class: CDemoModule + + Method: HeapMemoryAllocation + + Description: Allocates heap descriptor. + + Parameters: TTestResult& aError + + Return Values: TInt + + Errors/Exceptions: Leaves with KErrNoMemory if heap allocation fails + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +TInt CDemoModule::HeapMemoryAllocation( TTestResult& aResult ) + { + _LIT( KLogInfo , "CDemoModule::HeapMemoryAllocation" ); + iLog->Log( KLogInfo ); + + // Allocate heap descriptor + HBufC * buffer = HBufC::New( 10 ); + if( buffer == NULL ) + { + // Allocation failed + _LIT( KNewLogInfo , "buffer was NULL"); + iLog->Log( KNewLogInfo ); + User::Leave( KErrNoMemory ); + } + else + { + // Descriptor creation was ok + _LIT( KNewLogInfo ,"buffer was allocated properly" ); + iLog->Log( KNewLogInfo ); + } + + delete buffer; + + _LIT( KDescription , "Test case passed"); + aResult.SetResult( KErrNone, KDescription ); + return KErrNone; + } + +// ================= OTHER EXPORTED FUNCTIONS ================================= + +// End of File