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;
}