kerneltest/e32test/hcr/d_hcrut.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 14 5d2844f35677
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2008-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:
// Prototype HCR test driver library
//


// -- INCLUDES ----------------------------------------------------------------

#include "hcr_uids.h"
#include "hcr_debug.h"

#include <kernel/kern_priv.h>
#include <platform.h>
#include <u32hal.h>
#include "d_hcrut.h"
#include "hcr_hai.h"

#include "hcr_pil.h"

#include <drivers/hcr.h>

#define TEST_MEMGET(s, d, l)	kumemget(d, s, l)
#define TEST_MEMPUT(d, s, l)    kumemput(d, s, l)

#include "HcrImageData_102400.h"
// -- CLASSES -----------------------------------------------------------------

class DHcrTestFactory : public DLogicalDevice
	{
public:
	virtual TInt Install();
	virtual void GetCaps(TDes8& aDes) const;
	virtual TInt Create(DLogicalChannelBase*& aChannel);
	};


class DHcrTestChannel : public DLogicalChannelBase
	{
public:
	DHcrTestChannel();
	virtual ~DHcrTestChannel();
	
	//	Inherited from DObject
	virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType);
	
	// Inherited from DLogicalChannelBase
	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
	virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2);
		
public:
	static void TestTrace(DHcrTestChannel* aSelf);
	
private:
	DThread* iClient;
    
	};
	
namespace HCR {
class HCRInternalTestObserver 
	{
public:
	HCRInternalTestObserver() : iHcrInt(0) { return; } ;
	HCRInternalTestObserver(HCR::HCRInternal* aSubject) :
		iHcrInt(aSubject) { return; } ;
	~HCRInternalTestObserver() { return; } ; 

	TInt PrintAttirbutes(); 
	
	TInt PrintState();
	
	HCR::TRepository* GetVariantImgRepos();
	HCR::TRepository* GetCoreImgRepos();
	HCR::TRepository* GetOverrideImgRepos();
	
	HCR::MVariant* GetVariant() {return iHcrInt->iVariant;};
	TInt SwitchRepository(const TText * aFileName, const HCR::HCRInternal::TReposId aId=HCR::HCRInternal::ECoreRepos);
	    
	TInt CheckIntegrity(void);
	TInt FindSetting(const TSettingId& aId, TSettingType aType, TSettingRef& aSetting);

public:

	HCR::HCRInternal* iHcrInt;
	};
}

TInt Testfunc1(TSuperPage* aSuperPagePtr);


TInt HCR::HCRInternalTestObserver::PrintAttirbutes() 
	{
	HCR_TRACE1("HCRInternalTestObserver initialised, iVariant=0x%0x\n", iHcrInt->iVariant);
	return KErrNone;
	}
	
TInt HCR::HCRInternalTestObserver::PrintState() 
	{
	HCR_TRACE2("iVariant     =0x%08X, iVariantStore =0x%08X, \n", iHcrInt->iVariant, iHcrInt->iVariantStore);
	HCR_TRACE2("iCoreImgStore=0x%08X, iOverrideStore=0x%08X, \n", iHcrInt->iCoreImgStore, iHcrInt->iOverrideStore);
	return KErrNone;
	}	


HCR::TRepository* HCR::HCRInternalTestObserver::GetVariantImgRepos()
	{
	return iHcrInt->iVariantStore;
	}

HCR::TRepository* HCR::HCRInternalTestObserver::GetCoreImgRepos()
	{
	return iHcrInt->iCoreImgStore;
	}
HCR::TRepository* HCR::HCRInternalTestObserver::GetOverrideImgRepos()
	{
	return iHcrInt->iOverrideStore;
	}
TInt HCR::HCRInternalTestObserver::SwitchRepository(const TText * aFileName, const HCR::HCRInternal::TReposId aId)
    {
    NKern::ThreadEnterCS();
    TInt retVal = iHcrInt->SwitchRepository(aFileName, aId);
    NKern::ThreadLeaveCS();
    return retVal;
    }
    
    
TInt HCR::HCRInternalTestObserver::CheckIntegrity(void)
    {
    TInt retVal = iHcrInt->CheckIntegrity();
    return retVal;    
    }
    
TInt HCR::HCRInternalTestObserver::FindSetting(const TSettingId& aId, TSettingType aType, TSettingRef& aSetting)
    {
    TInt retVal = iHcrInt->FindSetting( aId, aType, aSetting);
    return retVal;
    }
    
// -- GLOBALS -----------------------------------------------------------------
//


static HCR::HCRInternal gTestHcrInt;
static HCR::HCRInternalTestObserver gObserver;

// -- METHODS -----------------------------------------------------------------
//
// DHcrTestFactory
//

TInt DHcrTestFactory::Install()
	{
    HCR_FUNC("DHcrTestFactory::Install");
	return SetName(&RHcrTest::Name());
	}

void DHcrTestFactory::GetCaps(TDes8& aDes) const
	{
    HCR_FUNC("DHcrTestFactory::GetCaps");
  	Kern::InfoCopy(aDes,0,0);
	}

TInt DHcrTestFactory::Create(DLogicalChannelBase*& aChannel)
	{
    HCR_FUNC("DHcrTestFactory::Create");
   
   	aChannel=new DHcrTestChannel();
	if(!aChannel)
		return KErrNoMemory;
	return KErrNone;
	}


// -- METHODS -----------------------------------------------------------------
//
// DHcrTestChannel
//

DHcrTestChannel::DHcrTestChannel()
	{
    HCR_FUNC("DHcrTestChannel");
   	}

DHcrTestChannel::~DHcrTestChannel()
	{
    HCR_FUNC("~DHcrTestChannel");
	}

TInt DHcrTestChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& /*aVer*/)
	{
    HCR_FUNC("DHcrTestChannel::DoCreate");
   	
    iClient = &Kern::CurrentThread();
	return KErrNone;
	}

TInt DHcrTestChannel::RequestUserHandle(DThread* aThread, TOwnerType aType)
	{
    HCR_FUNC("DHcrTestChannel::RequestUserHandle");
    
	if (aType!=EOwnerThread || aThread!=iClient)
		return KErrAccessDenied;
	return KErrNone;
	}

TInt DHcrTestChannel::Request(TInt aReqNo, TAny* a1, TAny* /*a2*/ )
	{
    HCR_FUNC("DHcrTestChannel::Request");

	switch(aReqNo)
		{
		
	case RHcrTest::ECtrlSanityTestWordSettings:
		{
 		return KErrNone;
		}

	case RHcrTest::ECtrlSanityTestLargeSettings:
		{
		return KErrNone;
		}

	case RHcrTest::ECtrlGetWordSetting:
		{
		TAny* args[3];
		TEST_MEMGET(a1, args, sizeof(args));

		HCR::TCategoryUid category = (HCR::TCategoryUid) args[0];
    
		HCR::TElementId key = (HCR::TElementId) args[1];

		TInt type = (TInt) args[2];

		const TText * fileInSysBinName = (const TText *)"filerepos.dat";
		TInt err = gObserver.SwitchRepository(fileInSysBinName, HCR::HCRInternal::ECoreRepos);
		if (err != KErrNone)
             HCR_TRACE_RETURN(err);

		// Negative tests on HCR::TRepositoryFile; aNum will be 0
		HCR::TRepository* repos = gObserver.GetCoreImgRepos();;
		__NK_ASSERT_DEBUG(repos != NULL);


		HCR::SSettingId* ids[1];// = new HCR::SSettingId*[1];

		TInt32* vals[1];
		TInt* errs[1];
		HCR::TSettingType* types[1];
		
		NKern::ThreadEnterCS();
		ids[0] = new HCR::SSettingId();
		vals[0] = new TInt32();
		errs[0] = new TInt();
		types[0] = new HCR::TSettingType();

		if(ids[0] == NULL || vals[0] == NULL || errs[0] == NULL || types[0] == NULL) 
			{
			delete ids[0];
			delete vals[0];
			delete errs[0];
			delete types[0];
			NKern::ThreadLeaveCS();
			HCR_TRACE_RETURN(KErrNoMemory);
			}

		ids[0]->iCat = category;
		ids[0]->iKey = key;

		// Negative tests on HCR::TRepositoryFile; aNum will be 0
		TInt r = repos->GetWordSettings(0, ids, vals, types, errs);
		// only expected errors are KErrNotFound or KErrNone
		// thest if there is other error; if yes fail the test
		if(r != KErrNotFound && r != KErrNone && r < KErrNone)
			{
			delete ids[0];
			delete vals[0];
			delete errs[0];
			delete types[0];
			NKern::ThreadLeaveCS();
			HCR_TRACE_RETURN(r);
			}

		// Negative testing on HCR::TRepositoryFile; try to get words for large value
		if(type > HCR::ETypeLinAddr)
			{
			r = repos->GetWordSettings(1, ids, vals, types, errs);
			if(r != KErrArgument && r != KErrNotFound && r < KErrNone)
				{
				delete ids[0];
				delete vals[0];
				delete errs[0];
				delete types[0];
				NKern::ThreadLeaveCS();
				HCR_TRACE_RETURN(r);
				}
			}

		HCR::TRepositoryCompiled* compiledRepos = reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos());
		__NK_ASSERT_DEBUG(compiledRepos != NULL);

		ids[0]->iCat = KHCRUID_TestCategory1;
		ids[0]->iKey = key;    
		
		// Negative tests on HCR::TRepositoryCompiled; aNum will be 0
		r = compiledRepos->GetWordSettings(0, ids, vals, types, errs);
		if(r != KErrNotFound && r != KErrNone && r < KErrNone)
			{
			delete ids[0];
			delete vals[0];
			delete errs[0];
			delete types[0];
			NKern::ThreadLeaveCS();
			HCR_TRACE_RETURN(r);
			}

		// Negative testing on HCR::TRepositoryFile; try to get words for large value
		if(type > HCR::ETypeLinAddr)
			{
			r = compiledRepos->GetWordSettings(1, ids, vals, types, errs);
			if(r != KErrArgument && r != KErrNotFound && r < KErrNone)
				{
				delete ids[0];
				delete vals[0];
				delete errs[0];
				delete types[0];
				NKern::ThreadLeaveCS();
				HCR_TRACE_RETURN(r);
				}
			}
		
		delete ids[0];
		delete vals[0];
		delete errs[0];
		delete types[0];
		NKern::ThreadLeaveCS();

		return KErrNone;
		}

	case RHcrTest::ECtrlGetLargeSetting:
		{
		return KErrNone;
		}

	case RHcrTest::ECtrlGetManyWordSettings:
		{
		return KErrNone;
		}

	case RHcrTest::ECtrlGetManyLargeSettings:
		{
		return KErrNone;
		}

	case RHcrTest::ECtrlSwitchRepository:
		{
		TInt err = KErrNone;

        // Clear and reset iCoreImgStore
	    HCR_TRACE1("--- value of iCoreImgStore:0x%08x before clear", gObserver.GetCoreImgRepos());
	    err = gObserver.SwitchRepository(NULL, HCR::HCRInternal::ECoreRepos);

    	HCR_TRACE1("--- value of iCoreImgStore:0x%08x after clear",  gObserver.GetCoreImgRepos());
    	if( err != KErrNone )
    		{
    		return err;
    		}
    	
    	// Clear and reset iOverrideStore	
        HCR_TRACE1("--- value of iOverrideStore:0x%08x before clear", gObserver.GetOverrideImgRepos());
	    err = gObserver.SwitchRepository(NULL, HCR::HCRInternal::EOverrideRepos);

    	HCR_TRACE1("--- value of iOverrideStore:0x%08x after clear",  gObserver.GetOverrideImgRepos());
    	if( err != KErrNone )
    		{
    		return err;
    		}
    	
	    // Switch iCoreImgStore to a repositore store located in \sys\bin directory
		const TText * fileInSysBinName = (const TText *)"d_hcrsim_own.ldd";
		err = gObserver.SwitchRepository(fileInSysBinName, HCR::HCRInternal::ECoreRepos);
		if (err != KErrNone)
             HCR_TRACE_RETURN(err);


        // Switch iOverrideStore to a repositore store located in \sys\Data directory
        const TText * fileInSysDataName = (const TText *)"EMPTY.DAT";
        err = gObserver.SwitchRepository(fileInSysDataName, HCR::HCRInternal::EOverrideRepos);
		if (err != KErrNone)
             HCR_TRACE_RETURN(err);

        // Try to switch iCoreImgStore to a not existing one and check the SwitchRepository() 
        // keeps its original value.
        HCR::TRepository* oldRepos = gObserver.GetCoreImgRepos();
        HCR_TRACE1("--- value of iCoreImgStore:0x%08x before try to switch to a not exist", oldRepos);
        const TText * wrongFileName = (const TText *)"hcr.ldl";
		err = gObserver.SwitchRepository(wrongFileName, HCR::HCRInternal::ECoreRepos);
		if ( err != KErrNotFound)
             HCR_TRACE_RETURN(err);
             
        err = KErrNone;
        
        HCR::TRepository* newRepos = gObserver.GetCoreImgRepos();     
        HCR_TRACE1("--- value of iCoreImgStore:0x%08x after try to switch to a not exist", newRepos);             
        if ( oldRepos != newRepos )
            HCR_TRACE_RETURN(KErrGeneral);
            
        // Switch iOverrideStore to a new, existing repository, different the current and check the 
        // iOverrideStore value changed.
        oldRepos = gObserver.GetOverrideImgRepos();
        HCR_TRACE1("--- value of iOverrideStore:0x%08x before try to switch to existing one", oldRepos);
		err = gObserver.SwitchRepository(fileInSysBinName, HCR::HCRInternal::EOverrideRepos);
		if ( err != KErrNone)
             HCR_TRACE_RETURN(err);
        
        newRepos = gObserver.GetOverrideImgRepos();     
        HCR_TRACE1("--- value of iOverrideStore:0x%08x after try to switch to existing on", newRepos);             
        if ( oldRepos == newRepos )
            HCR_TRACE_RETURN(KErrGeneral);            
        
		return err;
		}
		
	case RHcrTest::ECtrlNegativeTestsLargeValues:
		{
		//Test that HCR::TRepositoryCompiled::GetLargeValue & HCR::TRepositoryFile::GetLargeValue return KErrArgument
		TAny* args[1];
		TEST_MEMGET(a1, args, sizeof(args));
		// Retrieve structures from client
		TInt expectedError = (TUint) args[0];

		const TText * fileInSysBinName = (const TText *)"filerepos.dat";
		TInt err = gObserver.SwitchRepository(fileInSysBinName, HCR::HCRInternal::ECoreRepos);
		if (err != KErrNone)
             HCR_TRACE_RETURN(err);

		// Do test for HCR::TRepositoryFile
		HCR::TRepository* repos = gObserver.GetCoreImgRepos();;
		__NK_ASSERT_DEBUG(repos != NULL);
		
		HCR::UValueLarge value;
		HCR::TSettingRef ref(0,0);
		HCR::TSettingId id(1,1); //word setting value in repository
		err = repos->FindSetting(id, ref);
		if(err == KErrNone)
		    {
            err = repos->GetLargeValue(ref, value);
            if(err != expectedError)
                {
                HCR_TRACE_RETURN(err);
                }
		    }
		
		//Do test for HCR::TRepositoryCompiled
		HCR::TRepositoryCompiled* compiledRepos = reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos());
		if (compiledRepos == 0) 
			{ 
		    HCR_TRACE_RETURN(KErrGeneral);
		    }
		    
		id = HCR::TSettingId(KHCRUID_TestCategory1,1);
		err = compiledRepos->FindSetting(id, ref);
		if(err == KErrNone)
			{
            err = compiledRepos->GetLargeValue(ref, value);
            if(err != expectedError)
				{
				HCR_TRACE_RETURN(err);
                }
			}
		
		return KErrNone;
		}


    case RHcrTest::ECtrlCheckOverrideReposIntegrity:
        {
        HCR::TRepository* overrideRepos = gObserver.GetOverrideImgRepos();  // Shadowed SMR/HCR
        TInt err = KErrNone;
        
        if( 0 != overrideRepos )
            {
            err = overrideRepos->CheckIntegrity();
            
            } 
        return err;
        }
        
    case RHcrTest::ECtrlCheckOverrideRepos102400Content:
        {
        HCR::TRepository* overrideRepos = gObserver.GetOverrideImgRepos();  // Shadowed SMR/HCR
        TInt err = KErrNone;
        
        if( 0 != overrideRepos )
            {
            for( TInt index = 0; index < itemsSize; ++index)
                {
                HCR::TSettingId id(items[index].iCategoryUID, items[index].iElementID);
                HCR_TRACE3("--- index:%5d, iCategoryUID:0x%08x, iElementID:0x%08x"
                            , index
                            , items[index].iCategoryUID
                            , items[index].iElementID
                            );
                HCR::TSettingRef val(overrideRepos, 0);
                HCR::TSettingType type = (HCR::TSettingType)items[index].iType;
    			TInt r = gObserver.FindSetting(id, type, val);
    			if( r != KErrNone)
    			    {
    			        err = KErrNotFound;
    			        break;
    			    }
    			HCR::UValueWord valueWord;
                r = overrideRepos->GetValue(val, valueWord);
                HCR_TRACE1("--- value:0x%08x", valueWord.iUInt32); 
                if( valueWord.iUInt32 != items[index].iValue)
                    {
                    err = KErrNotFound;
    			    break;    
                    }
                }
            }
        return err;
        }
        
    case RHcrTest::ECtrlSwitchFileRepository:
	    {
	    TInt r;
	    TAny* args[2];
	    TEST_MEMGET(a1, args, sizeof(args));
	    const TText* fileRepName = (TText*) args[0];
	    
	    r = gObserver.SwitchRepository(fileRepName, HCR::HCRInternal::ECoreRepos);
	    if (r != KErrNone)
	        {
	        HCR_TRACE_RETURN(r);
	        }
	    else
	        return r;
	    }
	    
	case RHcrTest::ECtrlCompiledFindSettingsInCategory:
	    {
	    TInt r = 0;
	    //Do test for HCR::TRepositoryCompiled
	    TAny* args[3];
	    

	    //It's a pre-condition to enter critical section before
	    //kernel memory allocation
	    NKern::ThreadEnterCS();
	    TInt32* pFirst = new TInt32;
	    TInt32* pLast = new TInt32;
	    //We've done with allocation, exit CS
	    NKern::ThreadLeaveCS();
	    
	    if(!pFirst || !pLast)
	        { 
	        HCR_TRACE_RETURN(KErrNoMemory);
	        }
	    
	    TEST_MEMGET(a1, args, sizeof(args));
	    HCR::TCategoryUid catUid = (HCR::TCategoryUid)args[0];
	    
	    
	    HCR::TRepositoryCompiled* compiledRepos = 
	    reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos());
	    if (compiledRepos == 0) 
	        { 
	        HCR_TRACE_RETURN(KErrGeneral);
	        }
	   
	    //This function return the result of operation r and first element and 
	    //last element in the category written back to the user side test code 
	    //variable referenced by pFirst and pLast pointers
	    r = compiledRepos->FindNumSettingsInCategory(catUid, 
	            *pFirst, *pLast);
	    
	    TEST_MEMPUT(args[1], pFirst, sizeof(TInt32));
	    TEST_MEMPUT(args[2], pLast, sizeof(TInt32));
	    
	    if(r < 0)
	        {HCR_TRACE_RETURN(r);}
	    else
	        return r;
	    }
        
	case RHcrTest::ECtrlFileFindSettingsInCategory:
	    {
	    TInt r;
	    TAny* args[3];
	    TEST_MEMGET(a1, args, sizeof(args));
	    HCR::TCategoryUid catUid = (HCR::TCategoryUid)args[0];

	    //It's a pre-condition to enter critical section before
	    //kernel memory allocation
	    NKern::ThreadEnterCS();
	    TInt32* pFirst = new TInt32;
	    TInt32* pLast = new TInt32;
	    //We've done with allocation, exit CS
	    NKern::ThreadLeaveCS();

	    if(!pFirst || !pLast)
	        { 
	        HCR_TRACE_RETURN(KErrNoMemory);
	        }


	    // Do test for HCR::TRepositoryFile
	    HCR::TRepository* repos = gObserver.GetCoreImgRepos();
	    __NK_ASSERT_DEBUG(repos != NULL);

	    //This function return the result of operation r and first element and 
	    //last element in the category written back to the user side test code 
	    //variable referenced by pFirst and pLast pointers
	    r = repos->FindNumSettingsInCategory(catUid, 
	            *pFirst, *pLast);

	    TEST_MEMPUT(args[1], pFirst, sizeof(TInt32));
	    TEST_MEMPUT(args[2], pLast, sizeof(TInt32));

	    if(r < 0)
	        {HCR_TRACE_RETURN(r);}
	    else
	        return r;
	    }
	    
	           

	default:
		break;
		}
		
	return KErrNotSupported;
	}


// -- GLOBALS -----------------------------------------------------------------


DECLARE_STANDARD_LDD()
	{
    HCR_FUNC("D_HCR_DECLARE_STANDARD_LDD");

	// Try to initialise without a varian; KErrGeneral error should be returned
	new(&gTestHcrInt) HCR::HCRInternal(NULL);
	TInt err = gTestHcrInt.Initialise();
	if (err != KErrGeneral)
    	return 0;


    // Taken from HCR_PIL.CPP InitExtension() method
    
    HCR::MVariant* varPtr = CreateHCRVariant();
	if (varPtr==0)
    	return 0;

	new(&gTestHcrInt) HCR::HCRInternal(varPtr);
    	
	err = gTestHcrInt.Initialise();
	if (err != KErrNone)
    	return 0;

	new(&gObserver) HCR::HCRInternalTestObserver(&gTestHcrInt);
	               
	// ===== Above would be moved to DoRequest for test caes....
	               
   	return new DHcrTestFactory;
   	
	}