sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include "../../test/t_cenrep_helper.h" sl@0: #include sl@0: sl@0: #ifdef __TOOLS2__ sl@0: #define CENREP_PC_TEST sl@0: #endif sl@0: sl@0: #ifdef CENREP_PC_TEST sl@0: #include sl@0: #else sl@0: #include sl@0: #endif sl@0: sl@0: _LIT( KCentralRepositoryServerName, "Centralrepositorysrv"); sl@0: sl@0: sl@0: //DEFINED IN THE TEST MAIN CPP sl@0: extern void SetupEnv(const TDesC& aInFilePath,const TDesC& aOutFilePath,TUint aTestMode); sl@0: extern void InitialiseLC(CRepository*& aRepository,TUid aUid,const TDesC& aInFilePath,const TDesC& aOutFilePath,TUint aTestMode); sl@0: extern RFs TheFs; sl@0: extern RTest TheTest; sl@0: sl@0: LOCAL_C void Check(TInt aValue, TInt aLine) sl@0: { sl@0: if(!aValue) sl@0: { sl@0: TheTest(EFalse, aLine); sl@0: } sl@0: } sl@0: sl@0: LOCAL_C void Check(TInt aValue, TInt aExpected, TInt aLine) sl@0: { sl@0: if(aValue != aExpected) sl@0: { sl@0: RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue); sl@0: TheTest(EFalse, aLine); sl@0: } sl@0: } sl@0: sl@0: #define TEST(arg) ::Check((arg), __LINE__) sl@0: #define TEST2(aValue, aExpected) ::Check(aValue, aExpected, __LINE__) sl@0: sl@0: /////////////////////////////////////////////////////////////////////////////////////// sl@0: TInt CopyFile(const TDesC& aSource, const TDesC& aTarget) sl@0: { sl@0: RFile file; sl@0: TInt ret=file.Open(TheFs,aSource,EFileRead); sl@0: if (ret!=KErrNone) sl@0: return ret; sl@0: TInt fileSize; sl@0: file.Size(fileSize); sl@0: HBufC8* buf=HBufC8::New(fileSize); sl@0: if (!buf) sl@0: { sl@0: file.Close(); sl@0: return KErrNoMemory; sl@0: } sl@0: TPtr8 mod(buf->Des()); sl@0: file.Read(mod); sl@0: file.Close(); sl@0: ret=file.Replace(TheFs,aTarget,EFileWrite); sl@0: if (ret==KErrNone) sl@0: { sl@0: file.Write(*buf); sl@0: } sl@0: file.Close(); sl@0: delete buf; sl@0: return ret; sl@0: } sl@0: sl@0: void OomTest(void (*testFuncL)(CRepository* aRepository),TUid aUid,const TDesC& aInFilePath,const TDesC& aOutFilePath,TUint aTestMode) sl@0: { sl@0: TInt error; sl@0: TInt count = 0; sl@0: sl@0: do sl@0: { sl@0: SetupEnv(aInFilePath,aOutFilePath,aTestMode); sl@0: //for CRE testing we need to ensure we have a fresh copy of CRE(sourced from the TXT template) sl@0: sl@0: __UHEAP_MARK; sl@0: CRepository* repository=NULL; sl@0: sl@0: #ifndef CENREP_PC_TEST sl@0: //for CS testing, we want to kill server to start with fresh repos, otherwise might still use sl@0: //cache version from previous test sl@0: KillProcess(KCentralRepositoryServerName); sl@0: #endif sl@0: InitialiseLC(repository,aUid,aInFilePath,aOutFilePath,aTestMode); sl@0: if (repository) sl@0: CleanupStack::Pop(); sl@0: // This is supported by symuser but still have problem, so skiped sl@0: // User::__DbgSetAllocFail(RHeap::EUser, RHeap::EDeterministic, ++count); sl@0: sl@0: sl@0: // find out the number of open handles sl@0: // TOOLS2 somehow not supporting RThread().HandleCount()? sl@0: #ifndef __TOOLS2__ sl@0: TInt startProcessHandleCount; sl@0: TInt startThreadHandleCount; sl@0: RThread().HandleCount(startProcessHandleCount, startThreadHandleCount); sl@0: #endif sl@0: sl@0: TRAP(error, (testFuncL)(repository)); sl@0: sl@0: // check that no handles have leaked sl@0: #ifndef __TOOLS2__ sl@0: TInt endProcessHandleCount; sl@0: TInt endThreadHandleCount; sl@0: RThread().HandleCount(endProcessHandleCount, endThreadHandleCount); sl@0: sl@0: TEST2(endProcessHandleCount, startProcessHandleCount); sl@0: TEST2(endThreadHandleCount, startThreadHandleCount); sl@0: #endif sl@0: // User::__DbgSetAllocFail(RHeap::EUser, RHeap::ENone, 1); sl@0: sl@0: delete repository; sl@0: sl@0: __UHEAP_MARKEND; sl@0: sl@0: } while(error == KErrNoMemory); sl@0: _LIT(KTestFailed, "Out of memory test failure on iteration %d\n"); sl@0: __ASSERT_ALWAYS(error==KErrNone, TheTest.Panic(error, KTestFailed, count)); sl@0: } sl@0: sl@0: void ObjectCreateDeleteOOM(TUid aUid,const TDesC& aInFilePath,const TDesC& aOutFilePath,TUint aTestMode) sl@0: { sl@0: // TInt count=0; sl@0: TInt error=KErrNone; sl@0: do sl@0: { sl@0: SetupEnv(aInFilePath,aOutFilePath,aTestMode); sl@0: sl@0: __UHEAP_MARK; sl@0: #ifndef __TOOLS2__ sl@0: TInt startProcessHandleCount; sl@0: TInt startThreadHandleCount; sl@0: RThread().HandleCount(startProcessHandleCount, startThreadHandleCount); sl@0: #endif sl@0: // This is supported by symuser but still has problems, so skipped. sl@0: // User::__DbgSetAllocFail(RHeap::EUser, RHeap::EDeterministic, ++count); sl@0: sl@0: CRepository* repository=NULL; sl@0: sl@0: TRAP(error,InitialiseLC(repository,aUid,aInFilePath,aOutFilePath,aTestMode);CleanupStack::Pop()); sl@0: sl@0: delete repository; sl@0: sl@0: // User::__DbgSetAllocFail(RHeap::EUser, RHeap::ENone, 1); sl@0: sl@0: #ifndef __TOOLS2__ sl@0: // check that no handles have leaked sl@0: TInt endProcessHandleCount; sl@0: TInt endThreadHandleCount; sl@0: RThread().HandleCount(endProcessHandleCount, endThreadHandleCount); sl@0: sl@0: TEST2(endProcessHandleCount, startProcessHandleCount); sl@0: TEST2(endThreadHandleCount, startThreadHandleCount); sl@0: #endif sl@0: sl@0: __UHEAP_MARKEND; sl@0: } while(error == KErrNoMemory); sl@0: } sl@0: sl@0: void GetFunctionL(CRepository* aRepository) sl@0: { sl@0: //[GET] sl@0: TInt intVal; sl@0: TReal realVal; sl@0: User::LeaveIfError(aRepository->Get(6,intVal)); sl@0: TEST(intVal==12); sl@0: User::LeaveIfError(aRepository->Get(8,realVal)); sl@0: TEST(realVal==1.5); sl@0: TBuf<255> stringVal; sl@0: User::LeaveIfError(aRepository->Get(0x300,stringVal)); sl@0: TEST(stringVal.Compare(_L("Hello World"))==0); sl@0: sl@0: TBuf<5> shortBuffer; sl@0: TInt actualLength=0; sl@0: TInt ret=aRepository->Get(0x300,shortBuffer,actualLength); sl@0: TEST(ret==KErrOverflow); sl@0: TEST(actualLength==11); sl@0: TEST(shortBuffer.Compare(_L("Hello"))==0); sl@0: sl@0: //[GETMETA] sl@0: TUint32 metaValue; sl@0: User::LeaveIfError(aRepository->GetMeta(2,metaValue)); sl@0: TEST(metaValue==0xa); sl@0: //range based sl@0: User::LeaveIfError(aRepository->GetMeta(0x204,metaValue)); sl@0: TEST(metaValue==0x20); sl@0: //default based sl@0: User::LeaveIfError(aRepository->GetMeta(0x10000,metaValue)); sl@0: TEST(metaValue==0x10); sl@0: } sl@0: sl@0: void FindFunctionL(CRepository* aRepository) sl@0: { sl@0: RArray keyList; sl@0: CleanupClosePushL(keyList); sl@0: //Find all settings sl@0: TInt ret=aRepository->FindL(0xFFFFFFFF,0,keyList); sl@0: User::LeaveIfError(ret); sl@0: TEST(ret==KErrNone); sl@0: TEST(keyList.Count()==33); sl@0: keyList.Reset(); sl@0: //Find match EQ specific value sl@0: ret=aRepository->FindEqL(0xFFFFFFFF,0,10,keyList); sl@0: User::LeaveIfError(ret); sl@0: TEST(ret==KErrNone); sl@0: TEST(keyList.Count()==3); sl@0: keyList.Reset(); sl@0: //Find match NEQ specific value sl@0: ret=aRepository->FindNeqL(0xFFFFFFFF,0,10,keyList); sl@0: TEST(ret==KErrNone); sl@0: TEST(keyList.Count()==30); sl@0: keyList.Reset(); sl@0: //Find using string matching instead sl@0: _LIT(KString,"empty"); sl@0: ret=aRepository->FindEqL(0xFFFFFFFF,0,KString(),keyList); sl@0: User::LeaveIfError(ret); sl@0: TEST(ret==KErrNone); sl@0: TEST(keyList.Count()==1); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: void SetFunctionL(CRepository* aRepository) sl@0: { sl@0: //[SET] sl@0: //int sl@0: TUint32 metaValue; sl@0: TInt value; sl@0: User::LeaveIfError(aRepository->Get(1,value)); sl@0: TEST(value==1); sl@0: User::LeaveIfError(aRepository->Set(1,100)); sl@0: User::LeaveIfError(aRepository->Get(1,value)); sl@0: TEST(value==100) ; sl@0: //real sl@0: TReal realValue; sl@0: User::LeaveIfError(aRepository->Get(2,realValue)); sl@0: TEST(realValue==2.732); sl@0: TReal newrealValue(5.464); sl@0: User::LeaveIfError(aRepository->Set(2,newrealValue)); sl@0: User::LeaveIfError(aRepository->Get(2,realValue)); sl@0: TEST(realValue==5.464); sl@0: //string sl@0: TBuf<255> stringValue; sl@0: User::LeaveIfError(aRepository->Get(0x10000,stringValue)); sl@0: TEST(stringValue.Compare(_L("empty"))==0); sl@0: User::LeaveIfError(aRepository->Set(0x10000,_L("full"))); sl@0: stringValue.Zero(); sl@0: User::LeaveIfError(aRepository->Get(0x10000,stringValue)); sl@0: TEST(stringValue.Compare(_L("full"))==0); sl@0: sl@0: //use set to create new setting and also check the meta sl@0: TInt newIntegerKeyValue=205; sl@0: User::LeaveIfError(aRepository->Set(0x205,newIntegerKeyValue)); sl@0: User::LeaveIfError(aRepository->Get(0x205,value)); sl@0: TEST(value==205); sl@0: User::LeaveIfError(aRepository->GetMeta(0x205,metaValue)); sl@0: //as the key 0x205 is within range, expect use of range meta sl@0: TEST(metaValue==0x20); sl@0: } sl@0: sl@0: void CreateFunctionL(CRepository* aRepository) sl@0: { sl@0: TUint32 metaValue; sl@0: TInt value=206; sl@0: User::LeaveIfError(aRepository->Create(0x206,value)); sl@0: User::LeaveIfError(aRepository->Get(0x206,value)); sl@0: TEST(value==206); sl@0: User::LeaveIfError(aRepository->GetMeta(0x206,metaValue)); sl@0: //within meta range sl@0: TEST(metaValue==0x20); sl@0: sl@0: TReal realValue=207.207; sl@0: User::LeaveIfError(aRepository->Create(0x407,realValue)); sl@0: User::LeaveIfError(aRepository->Get(0x407,realValue)); sl@0: TEST(realValue==207.207); sl@0: User::LeaveIfError(aRepository->GetMeta(0x407,metaValue)); sl@0: //default meta sl@0: TEST(metaValue==0x10); sl@0: sl@0: //create already existing setting sl@0: TInt ret=aRepository->Create(1,value); sl@0: TEST(ret==KErrAlreadyExists); sl@0: } sl@0: sl@0: void DeleteFunctionL(CRepository* aRepository) sl@0: { sl@0: //delete single sl@0: TInt value; sl@0: User::LeaveIfError(aRepository->Delete(6)); sl@0: TInt ret=aRepository->Get(6,value); sl@0: TEST(ret==KErrNotFound); sl@0: sl@0: //delete range sl@0: RArray keyList; sl@0: CleanupClosePushL(keyList); sl@0: //make sure that the list of keys are there first sl@0: ret=aRepository->FindL(0x03010000,0xFFFFF0FF,keyList); sl@0: User::LeaveIfError(ret); sl@0: TEST(keyList.Count()==5); sl@0: TUint32 error; sl@0: User::LeaveIfError(aRepository->Delete(0x03010000,0xFFFFF0FF,error)); sl@0: //check that key no longer exist sl@0: keyList.Reset(); sl@0: ret=aRepository->FindL(0x03010000,0xFFFFF0FF,keyList); sl@0: if (ret!=KErrNotFound) sl@0: User::LeaveIfError(ret); sl@0: TEST(ret==KErrNotFound); sl@0: TEST(keyList.Count()==0); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: void MoveFunctionL(CRepository* aRepository) sl@0: { sl@0: RArray keyList; sl@0: CleanupClosePushL(keyList); sl@0: TUint32 errorKey; sl@0: //check source key exists first sl@0: keyList.Reset(); sl@0: TInt ret=aRepository->FindL(0x02010000,0xFFFFF0FF,keyList); sl@0: User::LeaveIfError(ret); sl@0: TEST(keyList.Count()==5); sl@0: sl@0: User::LeaveIfError(aRepository->Move(0x02010000,0x06010000,0xFFFFF0FF,errorKey)); sl@0: sl@0: keyList.Reset(); sl@0: //check target now exists sl@0: ret=aRepository->FindL(0x06010000,0xFFFFF0FF,keyList); sl@0: User::LeaveIfError(ret); sl@0: sl@0: TEST(keyList.Count()==5); sl@0: //check source now deleted sl@0: keyList.Reset(); sl@0: ret=aRepository->FindL(0x02010000,0xFFFFF0FF,keyList); sl@0: TEST(ret==KErrNotFound); sl@0: TEST2(keyList.Count(),0); sl@0: sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: /** sl@0: */ sl@0: void BasicFunctionL(TUid aUid,const TDesC& aInFilePath,const TDesC& aOutFilePath,TUint aTestMode) sl@0: { sl@0: //TEST SETUP sl@0: SetupEnv(aInFilePath,aOutFilePath,aTestMode); sl@0: sl@0: __UHEAP_MARK; sl@0: CRepository* repository=NULL; sl@0: sl@0: InitialiseLC(repository,aUid,aInFilePath,aOutFilePath,aTestMode); sl@0: sl@0: #ifdef CENREP_PC_TEST sl@0: //testing transaction sl@0: TInt r= repository->StartTransaction(CRepository::EConcurrentReadWriteTransaction); sl@0: TEST2(r, KErrNone); sl@0: repository->CleanupCancelTransactionPushL(); sl@0: #endif sl@0: sl@0: GetFunctionL(repository); sl@0: FindFunctionL(repository); sl@0: SetFunctionL(repository); sl@0: CreateFunctionL(repository); sl@0: DeleteFunctionL(repository); sl@0: MoveFunctionL(repository); sl@0: sl@0: #ifdef CENREP_PC_TEST sl@0: CleanupStack::PopAndDestroy(); sl@0: #endif sl@0: sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: __UHEAP_MARKEND; sl@0: } sl@0: sl@0: void OomBasicFunction(TUid aUid,const TDesC& aInFilePath,const TDesC& aOutFilePath,TUint aTestMode) sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: OomTest(GetFunctionL,aUid,aInFilePath,aOutFilePath,aTestMode); sl@0: OomTest(FindFunctionL,aUid,aInFilePath,aOutFilePath,aTestMode); sl@0: OomTest(SetFunctionL,aUid,aInFilePath,aOutFilePath,aTestMode); sl@0: OomTest(CreateFunctionL,aUid,aInFilePath,aOutFilePath,aTestMode); sl@0: OomTest(DeleteFunctionL,aUid,aInFilePath,aOutFilePath,aTestMode); sl@0: OomTest(MoveFunctionL,aUid,aInFilePath,aOutFilePath,aTestMode); sl@0: sl@0: __UHEAP_MARKEND; sl@0: } sl@0: sl@0: void DEF130394L(TUid aUid) sl@0: { sl@0: CRepository* repos=NULL; sl@0: sl@0: repos = CRepository::NewL(aUid); sl@0: sl@0: TInt err = repos->Create(1,1); sl@0: TEST(err==KErrNone); sl@0: sl@0: delete repos; sl@0: sl@0: repos = CRepository::NewL(aUid); sl@0: sl@0: err = repos->Create(1,1); sl@0: TEST(err==KErrAlreadyExists); sl@0: sl@0: delete repos; sl@0: } sl@0: sl@0: void DoFileCompL(const TDesC& aGenerated, const TDesC& aReference, TUint32& aCrcValue) sl@0: { sl@0: RFile genFile; sl@0: RFile refFile; sl@0: TInt err = genFile.Open(TheFs,aGenerated,EFileRead); sl@0: User::LeaveIfError(err); sl@0: err = refFile.Open(TheFs,aReference,EFileRead); sl@0: User::LeaveIfError(err); sl@0: sl@0: TInt sizeOfGen; sl@0: genFile.Size(sizeOfGen); sl@0: TInt sizeOfRef; sl@0: refFile.Size(sizeOfRef); sl@0: TEST(sizeOfGen == sizeOfRef); sl@0: sl@0: TUint32 crcGen = 0; sl@0: TUint32 crcRef = 0; sl@0: sl@0: HBufC8* buf = HBufC8::New(sizeOfGen); sl@0: if (!buf) sl@0: { sl@0: genFile.Close(); sl@0: refFile.Close(); sl@0: User::Leave(KErrNoMemory); sl@0: } sl@0: TPtr8 data(buf->Des()); sl@0: sl@0: err = genFile.Read(data); sl@0: User::LeaveIfError(err); sl@0: Mem::Crc32(crcGen, buf, sizeOfGen); sl@0: err = refFile.Read(data); sl@0: User::LeaveIfError(err); sl@0: Mem::Crc32(crcRef, buf, sizeOfRef); sl@0: sl@0: TEST(crcGen == crcRef); sl@0: sl@0: aCrcValue = crcGen; sl@0: sl@0: delete buf; sl@0: genFile.Close(); sl@0: refFile.Close(); sl@0: sl@0: return; sl@0: } sl@0: sl@0: void DoCrcCompL(const TUint32& aCrcValue, const TDesC& aCrcRecord, TBool aCreOrTxt) sl@0: { sl@0: RFile file; sl@0: TInt err = file.Open(TheFs, aCrcRecord, EFileRead); sl@0: User::LeaveIfError(err); sl@0: sl@0: TBuf8<100> buf; sl@0: file.Read(buf); sl@0: sl@0: TBuf8<1> breaker(_L8("-")); sl@0: TInt pos = buf.Find(breaker); sl@0: sl@0: TInt length = buf.Length(); sl@0: sl@0: const TPtrC8 crePtr = buf.Right(length - pos -1); sl@0: const TPtrC8 txtPtr = buf.Left(pos); sl@0: sl@0: TUint32 crc = 0; sl@0: sl@0: if (aCreOrTxt) sl@0: { sl@0: TLex8 lex (crePtr); sl@0: lex.Val(crc, EDecimal); sl@0: } sl@0: else sl@0: { sl@0: TLex8 lex (txtPtr); sl@0: lex.Val(crc, EDecimal); sl@0: } sl@0: TEST2(crc, aCrcValue); sl@0: file.Close(); sl@0: } sl@0: