persistentstorage/store/TCONT/t_storset.cpp
changeset 0 08ec8eefde2f
child 51 7d4490026038
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/store/TCONT/t_storset.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,426 @@
+// Copyright (c) 1998-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 <s32cont.h>
+#include <s32page.h>
+#include <s32mem.h>
+#include <e32test.h>
+#include "U32STD.H"
+
+const TInt KTestCleanupStack=0x20;
+
+LOCAL_D CTrapCleanup* TheTrapCleanup;
+LOCAL_D RTest test(_L("t_storset"));
+
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1121
+@SYMTestCaseDesc	    TPagedSet class functionality test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests insert/delete/contains without duplicates.
+                        Tests for emptying the set
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void test1L()
+	{
+	const TInt KEntryCount=200;
+
+	TPagedSet<TInt32> set;
+	set.Connect(CMemPagePool::NewLC());
+	test.Start(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1121 Insertion & Deletion "));
+
+	TInt32 it=0;
+//*	test(set.InsertL(it));
+	set.InsertL(it);
+	test(set.Count()==1);
+//*	test(!set.InsertL(it));
+	test(set.Count()==1);
+	test(set.ContainsL(it));
+//*	test(set.DeleteL(it));
+	set.DeleteL(it);
+	test(set.Count()==0);
+//*	test(!set.DeleteL(it));
+//*	test(set.Count()==0);
+	test(!set.ContainsL(it));
+
+//*	test.Next(_L("Duplicates"));
+	TInt ii;
+//*	for (ii=0;ii<KEntryCount;++ii)
+//*		test(set.InsertL(it,EAllowDuplicates));
+//*	test(set.Count()==KEntryCount);
+//*	test(set.ContainsL(it));
+//*	test(!set.InsertL(it));
+//*	for (ii=0;ii<KEntryCount;++ii)
+//*		test(set.DeleteL(it));
+//*	test(!set.ContainsL(it));
+//*	test(!set.DeleteL(it));
+//*	test(set.Count()==0);
+
+	test.Next(_L("No duplicates"));
+	for (ii=0;ii<KEntryCount;++ii)
+		{
+		it=ii;
+//*		test(set.InsertL(it));
+		set.InsertL(it);
+		}
+	for (ii=0;ii<KEntryCount;++ii)
+		{
+		it=ii;
+//*		test(!set.InsertL(it));
+		test(set.ContainsL(it));
+		}
+	test(set.Count()==KEntryCount);
+
+	test.Next(_L("Empty the set"));
+	set.ClearL();
+	test(set.Count()==0);
+	for (ii=0;ii<KEntryCount;++ii)
+		{
+		it=ii;
+		test(!set.ContainsL(it));
+		}
+
+	test.End();
+	CleanupStack::PopAndDestroy();
+	}
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1122
+@SYMTestCaseDesc	    TPagedSet class functionality test with large (10000) set of TUint32.
+@SYMTestPriority 	    High
+@SYMTestActions  	    Insert,delete,contains,iteration operations test
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void test2L()
+	{
+	const TInt KEntryCount=10000;
+
+	TPagedSet<TUint32> set;
+//*	set.Connect(CMemPagePool::NewLC(),TBtree::EQosFastest);
+	set.Connect(CMemPagePool::NewLC());
+
+	test.Start(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1122 Add items "));
+	TUint32 jj=0;
+	TInt32 ii;
+	for (ii=KEntryCount;ii>0;--ii)
+		{
+		jj=(jj+17)%KEntryCount;
+//*		test(set.InsertL(jj));
+		set.InsertL(jj);
+		}
+	test(set.Count()==KEntryCount);
+
+	test.Next(_L("Check contents"));
+	for (ii=0;ii<KEntryCount;++ii)
+		test(set.ContainsL(ii));
+
+	test.Next(_L("Iterate over items"));
+	TUint8 *checkMap=(TUint8*)User::AllocLC(KEntryCount);
+	Mem::FillZ(checkMap,KEntryCount);
+	TPagedSetIter<TUint32> iter(set);
+	if (iter.ResetL())
+		do	++checkMap[iter.AtL()]; while (iter.NextL());
+	for (ii=0;ii<KEntryCount;++ii)
+		test(checkMap[ii]==1);
+	CleanupStack::PopAndDestroy();
+
+	test.Next(_L("Delete items"));
+	jj=0;
+	for (ii=KEntryCount;ii>KEntryCount/2;--ii)
+		{
+		jj=(jj+17)%KEntryCount;
+//*		test(set.DeleteL(jj));
+		set.DeleteL(jj);
+		}
+	test(set.Count()==KEntryCount/2);
+
+	test.Next(_L("Check contents"));
+	for (;ii>0;--ii)
+		{
+		jj=(jj+17)%KEntryCount;
+		test(set.ContainsL(jj));
+		}
+	jj=0;
+	for (ii=KEntryCount;ii>KEntryCount/2;--ii)
+		{
+		jj=(jj+17)%KEntryCount;
+		test(!set.ContainsL(jj));
+		}
+
+	test.Next(_L("Delete items"));
+	for (;ii>1;--ii)
+		{
+		jj=(jj+17)%KEntryCount;
+//*		test(set.DeleteL(jj));
+		set.DeleteL(jj);
+		}
+	test(set.Count()==1);
+
+	test.Next(_L("Check contents"));
+	jj=(jj+17)%KEntryCount;
+	TPagedSetBiIter<TUint32> biter(set);
+	test(biter.FirstL());
+	test(biter.AtL()==jj);
+	test(!biter.NextL());
+	test(biter.LastL());
+	test(biter.AtL()==jj);
+	test(!biter.PreviousL());
+	TPagedSetRIter<TUint32> riter(set);
+	test(riter.ResetL());
+	test(riter.AtL()==jj);
+	test(!riter.NextL());
+
+//*	test(set.DeleteL(jj));
+	set.DeleteL(jj);
+	test(!iter.ResetL());
+	test(set.Count()==0);
+
+	test.End();
+
+	CleanupStack::PopAndDestroy();
+	}
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1123
+@SYMTestCaseDesc	    Stream set out test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Build set and stream out
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void test3aL(RWriteStream& aStream,MPagePool *aPool,TInt aCount)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1123 "));
+	TPagedSet<TInt32> set;
+//*	set.Connect(aPool,TBtree::EQosFastest);
+	set.Connect(aPool);
+
+	for (TInt ii=0;ii<aCount;ii++)
+		{
+		TInt32 it=ii;
+//*		test(set.InsertL(it));
+		set.InsertL(it);
+		}
+	aStream<<set.Token();
+	}
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1124
+@SYMTestCaseDesc	    Stream in and set test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Read a token from a stream,create and a pagedset.Tests for emptying the set.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void test3bL(RReadStream& aStream,MPagePool *aPool,TInt aCount)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1124 "));
+	TPagedSetToken token;
+	aStream>>token;
+	TPagedSet<TInt32> set(token);
+//*	set.Connect(aPool,TBtree::EQosFastest);
+	set.Connect(aPool);
+
+	test(set.Count()==aCount);
+	for (TInt ii=0;ii<aCount;ii++)
+		{
+		TInt32 it=ii;
+//*		test(set.DeleteL(it));
+		set.DeleteL(it);
+		}
+	test(set.Count()==0);
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1125
+@SYMTestCaseDesc	    Streaming sets test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for token streaming operations on pagedsets.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void test3L()
+	{
+	const TInt KEntryCount=1000;
+	MPagePool *pool=CMemPagePool::NewLC();
+	TUint8 stream[0x40];
+	test.Start(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1125 Build set and stream out "));
+	RMemWriteStream out(stream,sizeof(stream));
+	test3aL(out,pool,KEntryCount);
+	test.Next(_L("Stream in and test set "));
+	RMemReadStream in(stream,sizeof(stream));
+	test3bL(in,pool,KEntryCount);
+	test.End();
+	CleanupStack::PopAndDestroy();
+	}
+
+class CPersistentStoreHelper: public CPersistentStore
+	{
+	virtual MStreamBuf* DoReadL(TStreamId /*anId*/) const
+		{
+		return NULL;
+		}
+	virtual MStreamBuf* DoCreateL(TStreamId& /*anId*/)
+		{
+		return NULL;
+		}
+	void Help()
+		{
+		//just do nothing
+		return;
+		}
+	};
+
+/**
+@SYMTestCaseID          PDS-STORE-CT-4015
+@SYMTestCaseDesc	    Test untested APIs of TPagedMultiset and TPagedSetToken
+@SYMTestPriority 	    High
+@SYMTestActions  	    Test possibility of adding duplicates into TPagedMultiset. Calling empy constructor TPagedSetToken.
+						Test RepairL();
+@SYMTestExpectedResults Insterting duplicates should be possible and should not fail. After adding KEntryCount
+						identical elements Count() should equal KEntryCount. Constructor should create valid object.
+						RepairL function can't be runned now, because it has a problem inside that cause KERN-EXEC: 3.
+@SYMDEF                 DEF135804
+*/
+LOCAL_C void test4L()
+	{
+	const TInt KEntryCount=200;
+
+	test.Start(_L(" @SYMTestCaseID:PDS-STORE-CT-4015 Test untested APIs "));
+
+	TInt32 it=0;
+	TPagedMultiset<TInt32> set;
+	set.Connect(CMemPagePool::NewLC());
+	test.Next(_L("Duplicates"));
+	TInt ii, err;
+	for (ii=0;ii<KEntryCount;++ii)
+		{
+		TRAP(err, set.InsertL(it));
+		test(err==KErrNone);
+		}
+	test(set.Count()==KEntryCount);
+	TRAP(err, set.ContainsL(it));
+	test(err==KErrNone);
+	TRAP(err, set.InsertL(it));
+	test(err==KErrNone);
+		
+	for (ii=0;ii<KEntryCount;++ii)
+		{
+		TRAP(err, set.DeleteL(it));
+		test(err==KErrNone);
+		}
+		
+	TRAP(err, set.ContainsL(it));
+	test(err==KErrNone);
+	TRAP(err, set.DeleteL(it));
+	test(err==KErrNone);
+	test(set.Count()==0);
+	
+	test.Next(_L("Calling MPagePool::Delete"));
+	CMemPagePool* mpp = CMemPagePool::NewLC();
+	const TPageAbandonFunction& nopFunc = mpp->AcquireL();
+	test(&nopFunc != NULL);
+	TAny* any = mpp->AllocL();
+	TPageRef pref;
+	pref = mpp->AssignL(any, EPageReclaimable);
+	mpp->MPagePool::Delete(pref);
+	CleanupStack::PopAndDestroy();
+	
+	test.Next(_L("CPersistentStore DoSetRootL"));
+	CPersistentStoreHelper* ps = new (ELeave) CPersistentStoreHelper();
+	CleanupStack::PushL(ps);
+	ps->SetRootL(KNullStreamId);
+	CleanupStack::PopAndDestroy();
+	
+	test.Next(_L("HDirectStoreBuf::DoSeekL calls"));
+	HBufC8* buf = HBufC8::NewLC(1024);
+	RDesWriteStream wts;
+	
+	TPtr8 ptr(buf->Des());
+	wts.Open(ptr);
+	TStreamId id(5);
+	wts << id;
+	wts.CommitL();
+	wts.Close();
+	buf->Des().Append(_L8("Ala ma kota a kot ma futro. Futro jest dobre by chronic przed zimnem."));
+	RDesReadStream rts;
+	ptr.Set(buf->Des());
+	rts.Open(ptr);
+		
+	CEmbeddedStore* estor = CEmbeddedStore::FromLC(rts);
+	RStoreReadStream rstream;
+	rstream.OpenL(*estor, id);
+	TStreamPos pos = rstream.Source()->SeekL(MStreamBuf::ERead, 5);
+	test(pos.Offset() == 5);
+	rts.Close();
+	rstream.Close();
+	CleanupStack::PopAndDestroy(2);
+	
+	test.Next(_L("Calling TEmpty Constructor"));
+	TPagedSetToken set2(TBtreeToken::EEmpty);
+	test( set2.Count() == 0);
+	
+	test.Next(_L("Set function"));
+	set.Set(set2);
+	const TPagedSetToken& pst = set.Token();
+	test(pst.Count() == set2.Count());
+	
+	test.End();
+	CleanupStack::PopAndDestroy();
+	}
+
+LOCAL_C void doMainL()
+	{
+	test.Start(_L("Basic operations"));
+	test1L();
+	test.Next(_L("Large set TUint32"));
+	test2L();
+	test.Next(_L("Tokens and streaming"));
+	test3L();
+	test.Next(_L("Forgotten API"));
+	test4L();
+	test.End();
+	}
+
+LOCAL_C void setupCleanup()
+//
+// Initialise the cleanup stack.
+//
+    {
+	TheTrapCleanup=CTrapCleanup::New();
+	test(TheTrapCleanup!=NULL);
+	TRAPD(r,\
+		{\
+		for (TInt i=KTestCleanupStack;i>0;i--)\
+			CleanupStack::PushL((TAny*)1);\
+		test(r==KErrNone);\
+		CleanupStack::Pop(KTestCleanupStack);\
+		});
+	test(r==KErrNone);
+	}
+
+GLDEF_C TInt E32Main()
+	{
+	test.Title();
+	setupCleanup();
+	__UHEAP_MARK;
+//
+	TRAPD(r,doMainL());
+	test(r==KErrNone);
+//
+	__UHEAP_MARKEND;
+	delete TheTrapCleanup;
+	test.Close();
+	return 0;
+	}
+