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