camappengine/asynchfilesavequeue/tsrc/public/basic/src/StifFSQTestTop.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:23 +0100
branchRCL_3
changeset 21 27fe719c32e6
parent 0 9b3e960ffc8a
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201031 Kit: 201035

/*
* Copyright (c) 2002-2007 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:  FSQ Test DLL
*
*/


// INCLUDE FILES
#include <e32math.h>
#include "../inc/StifFSQTestTop.h"
#include "../inc/TestFramework/testsuite.h"
#include "../inc/AFSQTestTop.h"
#include "../inc/AFSQTestAsynchSave.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 =======================================

           
/*
-------------------------------------------------------------------------------

    DESCRIPTION
    
    This file (DemoModule.cpp) contains all STIF test framework related parts of
    this test module.

-------------------------------------------------------------------------------
*/
EXPORT_C TInt SetRequirements( CTestModuleParam*& aTestModuleParam, TUint32& aParameterValid )
    {
    aParameterValid = KStifTestModuleParameterChanged;
    
    TRAP_IGNORE(
        CTestModuleParamVer01* param = CTestModuleParamVer01::NewL();
        
    	// Stack size
    	param->iTestThreadStackSize= 2*16384; // 2*16K stack

    	// Heap sizes
    	param->iTestThreadMinHeap = 4096;   // 4K heap min
    	param->iTestThreadMaxHeap = 8*1048576;// 8M heap max

    	aTestModuleParam = param;
	);
	
    return KErrNone;
    }

// ================= MEMBER FUNCTIONS =========================================


CTestModule::CTestModule()
    {
    }


void CTestModule::ConstructL()
    {  
    iTestSuite = CTestSuite::NewL(_L8("Test Suite Container"));

    iTestSuite->addTestL( CAFSQTestAsynchSave::suiteL() );    
    

    
    // SetAllocFailureSimulation( RHeap::EDeterministic, 0 ); // Enable OOM test loop
    SetAllocFailureSimulation( RHeap::ENone, 0 ); // Disable OOM test loop

    /* Install an active scheduler */
    iScheduler = new(ELeave)CActiveScheduler;
    CActiveScheduler::Install(iScheduler);

    }


CTestModule* CTestModule::NewL()
    {

    // Construct new CTestModule instance.
    CTestModule* self = new ( ELeave ) CTestModule();    
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();

    return self;
  
    }


CTestModule::~CTestModule()
    {
    delete iTestSuite;
    delete iScheduler;
    }


/*
-------------------------------------------------------------------------------

    Class: CTestModule

    Method: GetTestCases

    Description: GetTestCases is used to inquire test cases 
    from the test module. Because this test module have hard coded test cases
    (i.e cases are not read from file), paramter aConfigFile is not used.

    This function loops through all cases defined in Cases() function and 
    adds corresponding items to aTestCases array.

    Parameters: const TFileName&  : in: Configuration file name. Not used                                                       
                RPointerArray<TTestCaseInfo>& aTestCases: out: 
                      Array of TestCases.
    
    Return Values: KErrNone: No error

    Errors/Exceptions: Function leaves if any memory allocation operation fails

    Status: Proposal
    
-------------------------------------------------------------------------------
*/      
TInt CTestModule::GetTestCasesL( const TFileName& /*aConfigFile*/, 
                                     RPointerArray<TTestCaseInfo>& aTestCases )
    {

    // Loop through all test cases and create new
    // TTestCaseInfo items and append items to aTestCase array    
    for( TInt i = 0; i< iTestSuite->CountTestCases(); i++ )
        {
 
	    // Allocate new TTestCaseInfo from heap for a testcase definition.
        TTestCaseInfo* newCase = new( ELeave ) TTestCaseInfo();
    
	    // PushL TTestCaseInfo to CleanupStack.    
        CleanupStack::PushL( newCase );

	    // Set number for the testcase.
	    // When the testcase is run, this comes as a parameter to RunTestCaseL.
        newCase->iCaseNumber = i;

	    // Set title for the test case. This is shown in UI to user.
        newCase->iTitle.Copy( iTestSuite->TestCaseName(i) );

	    // Append TTestCaseInfo to the testcase array. After appended 
	    // successfully the TTestCaseInfo object is owned (and freed) 
	    // by the TestServer. 
        User::LeaveIfError(aTestCases.Append ( newCase ) );
        
	    // Pop TTestCaseInfo from the CleanupStack.
        CleanupStack::Pop( newCase );

        }
    
    return KErrNone;
  
    }

/*
-------------------------------------------------------------------------------

    Class: CTestModule

    Method: RunTestCase

    Description: Run a specified testcase.

    Function runs a test case specified by test case number. Test case file
    parameter is not used.

    If case number is valid, this function runs a test case returned by
    function Cases(). 
  
    Parameters: const TInt aCaseNumber: in: Testcase number 
                const TFileName& : in: Configuration file name. Not used
                TTestResult& aResult: out: Testcase result
    
    Return Values: KErrNone: Testcase ran.
                   KErrNotFound: Unknown testcase

    Errors/Exceptions: None
    
    Status: Proposal
    
-------------------------------------------------------------------------------
*/
TInt CTestModule::RunTestCaseL( const TInt aCaseNumber, 
                                    const TFileName& /*aConfig*/,
                                    TTestResult& aResult )
    {
    // Next is a temporary solution for Stif memory leak error
    //TestModuleIf().SetBehavior(CTestModuleIf::ETestLeaksMem);
    // TestModuleIf().SetBehavior(CTestModuleIf::ETestLeaksRequests);
    // TestModuleIf().SetBehavior(CTestModuleIf::ETestLeaksHandles);

    if ( iAllocFailureType != RHeap::ENone )
        {
        RunTestCaseInOOMLoopL( aCaseNumber, aResult );
        }
    else
        {
        iTestSuite->ExecuteTestL( aResult, aCaseNumber );
        }

    // Return case execution status (not the result of the case execution)
    return KErrNone; 
    }


/*
*/    

void CTestModule::RunTestCaseInOOMLoopL( const TInt aCaseNumber,
                                        TTestResult& aResult )
    {

    // 
    TInt error = KErrNone; 
    aResult.SetResult( KErrNoMemory, _L("") ); // Initial value

    for (; ( aResult.iResult == KErrNoMemory ) && !error;)
        {      
        // Switches on alloc failure simulation if the parameters are set for it
        AllocFailureSimulation( ETrue ); 
        RDebug::Print(_L("*** OOM loop : %d ***\n"), iCurrentAllocFailureRate );
        TRAP( error, iTestSuite->ExecuteTestL( aResult, aCaseNumber ) );
        if ( error == KErrNoMemory )
            {
            error = KErrNone;
            }
        }
    
    //
    AllocFailureSimulation( EFalse );
    User::LeaveIfError( error ); 
    }


/*
*/    

void CTestModule::AllocFailureSimulation (TBool aSwitchedOn)
	{
	if (aSwitchedOn)
		{
		__UHEAP_SETFAIL ( iAllocFailureType, iCurrentAllocFailureRate );
        iCurrentAllocFailureRate++;
		}
	else
		{
		__UHEAP_RESET;
        iCurrentAllocFailureRate = iAllocFailureRate;
		}
	}


/*
*/    

void CTestModule::SetAllocFailureSimulation( RHeap::TAllocFail aAllocFailureType, TInt aAllocFailureRate )
    {
    iAllocFailureType = aAllocFailureType;
    iAllocFailureRate = aAllocFailureRate;
    iCurrentAllocFailureRate = aAllocFailureRate;
    }

// ================= OTHER EXPORTED FUNCTIONS =================================

/*
-------------------------------------------------------------------------------
   
    Function: LibEntryL

    Description: Polymorphic Dll Entry Point
    
    Test framework calls this function to obtain new instance of test module
    class. 

    Parameters:    None
    
    Return Values: CTestModule*    Pointer to CTestModule instance
    
    Errors/Exceptions: Leaves if CTestModule::NewL leaves
    
    Status: Approved

-------------------------------------------------------------------------------
*/
EXPORT_C CTestModule* LibEntryL()
    {
    return CTestModule::NewL();

    }

/*
-------------------------------------------------------------------------------
   
    Function: E32Dll

    Description: DLL entry point function
    
    Parameters:    TDllReason: Not used
    
    Return Values: KErrNone: always
    
    Errors/Exceptions: None

    Status: Approved

-------------------------------------------------------------------------------
*/
#ifndef EKA2
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
    {
    return( KErrNone );

    }
#endif

// End of File