persistentstorage/store/TSTOR/t_stordict.cpp
changeset 0 08ec8eefde2f
child 6 5ffdb8f2067f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/store/TSTOR/t_stordict.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,275 @@
+// 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:
+//
+
+#if !defined(__E32TEST_H__)
+#include <e32test.h>
+#endif
+
+#include <s32mem.h>
+
+//
+// CTestStreamDictionary
+//
+
+class CTestStreamDictionary : public CStreamDictionary
+	{
+public:
+	struct TEntry {TUid uid;TStreamId id;};
+public:
+	static CTestStreamDictionary* NewL();
+	CTestStreamDictionary();
+//*	TUid Uid(TInt aInt) { return (*iEntryList)[aInt].iUid; }
+//*	TStreamId StreamId(TInt aInt) { return (*iEntryList)[aInt].iStreamId; }
+//*	TInt Count() { return iEntryList->Count(); }
+	TUid Uid(TInt aInt) { return (*iCheat)[aInt].uid; }
+	TStreamId StreamId(TInt aInt) { return (*iCheat)[aInt].id; }
+	TInt Count() { return iCheat->Count(); }
+private:
+	CArrayFixSeg<TEntry>* iCheat;
+	};
+
+CTestStreamDictionary* CTestStreamDictionary::NewL()
+	{
+	CTestStreamDictionary* thing=new(ELeave) CTestStreamDictionary();
+//*	CleanupStack::PushL(thing);
+//*	thing->ConstructL();
+//*	CleanupStack::Pop();
+	return thing;
+	}
+
+CTestStreamDictionary::CTestStreamDictionary()
+	: iCheat((CArrayFixSeg<TEntry>*)&iCheat-1) // modification to get to count etc
+	{}
+
+
+//
+// Test code
+//
+
+const TInt KTestCleanupStack=0x40;
+const TInt KTestExpandSize=0x20;
+
+LOCAL_D RTest test(_L("t_stordict"));
+LOCAL_D CTrapCleanup* TheTrapCleanup;
+
+// some uid-stream pairs to use for testing
+const TUid testUid1={1};
+LOCAL_D TStreamId testStreamId1=TStreamId(1);
+//
+const TUid testUid2={57};
+LOCAL_D TStreamId testStreamId2=TStreamId(57);
+//
+const TUid testUid3={99999};
+LOCAL_D TStreamId testStreamId3=TStreamId(425);
+//
+
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1201
+@SYMTestCaseDesc	    Tests for copy operations on dictionary files
+@SYMTestPriority 	    High
+@SYMTestActions  	    Attempt for copying two classes using memory based streams.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+template <class T1,class T2>
+void testCopyL(T1& aCopy,const T2& anOriginal)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1201 "));
+	CBufSeg* buf=0;
+	TRAPD(r,buf=CBufSeg::NewL(KTestExpandSize));
+	if (r!=KErrNone)
+		test.Panic(_L("Allocating buffer"));
+//
+// Write anOriginal out to the buffer.
+//
+	RBufWriteStream out;
+	out.Append(*buf);
+	TRAP(r,out<<anOriginal);
+	test(r==KErrNone);
+	TRAP(r,out.CommitL());
+	if (r!=KErrNone)
+		test.Panic(_L("Committing write stream"));
+//
+// Read anOriginal in from the buffer.
+//
+	RBufReadStream in(*buf);
+	TRAP(r,in>>aCopy);
+	test(r==KErrNone);
+//
+// See if it's consumed the lot.
+//
+	TUint8 b;
+	test(in.Source()->ReadL(&b,1)==0);
+//
+	delete buf;
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1202
+@SYMTestCaseDesc	    Tests if two dictionary files are equal
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests if count of entries,UID and streamID's are equal
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+void testIsEqual(CTestStreamDictionary* aCopy,CTestStreamDictionary* aOrig)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1202 "));
+	TInt origCount=aOrig->Count();
+	test(origCount==aCopy->Count());
+	//
+	for (TInt i=0 ; i<origCount ; i++)
+		{
+		test(aOrig->Uid(i)==aCopy->Uid(i));
+		test(aOrig->StreamId(i)==aCopy->StreamId(i));
+		}
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1203
+@SYMTestCaseDesc	    Tests for simple operations on a dictionary file
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for assign,re-assigning,removing entries from the file
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void simpleTestsL()
+	{
+	CTestStreamDictionary* dic=CTestStreamDictionary::NewL();
+	// attempt finding and removing with an empty dictionary
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1203 Manipulating an empty dictionary "));
+	test(dic->Count()==0);
+	test(dic->At(testUid1)==KNullStreamId);
+	dic->Remove(testUid1);
+	test(dic->Count()==0);
+	test(dic->IsNull());
+	//
+	// assign an entry
+	test.Next(_L("Assigning entries and manipulating them"));
+	TRAPD(ret,dic->AssignL(testUid1,testStreamId1));
+	test(ret==KErrNone);
+	test(dic->Count()==1);
+	test(!dic->IsNull());
+	test(dic->At(testUid1)==testStreamId1);
+	//
+	// assign another entry
+	TRAP(ret,dic->AssignL(testUid2,testStreamId2));
+	test(ret==KErrNone);
+	test(dic->Count()==2);
+	test(dic->At(testUid2)==testStreamId2);
+	//
+	// re-assign uid1
+	TRAP(ret,dic->AssignL(testUid1,testStreamId3));
+	test(ret==KErrNone);
+	test(dic->Count()==2);
+	test(dic->At(testUid1)==testStreamId3);
+	//
+	// test finding and removing a non-existant entry from a non-empty dictionary
+	test(dic->At(testUid3)==KNullStreamId);
+	dic->Remove(testUid3);
+	test(dic->Count()==2);
+	//
+	// test removing an entry
+	dic->Remove(testUid1);
+	test(dic->Count()==1);
+	test(dic->At(testUid1)==KNullStreamId);
+	test(dic->At(testUid2)==testStreamId2);
+	test(!dic->IsNull());
+	//
+	// test removing the other entry
+	dic->Remove(testUid2);
+	test(dic->Count()==0);
+	test(dic->IsNull());
+	test(dic->At(testUid1)==KNullStreamId);
+	test(dic->At(testUid2)==KNullStreamId);
+	//
+	delete dic;
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-STORE-CT-1204
+@SYMTestCaseDesc	    Streaming dictionary files tests
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for copying an empty dictionary and dictionary containing different sets of entries
+                        Tests for equality of two dictionary files and test the copied file.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void streamingTestsL()
+	{
+	CTestStreamDictionary* orig=CTestStreamDictionary::NewL();
+	CTestStreamDictionary* copy=CTestStreamDictionary::NewL();
+	//
+	// copy an empty dictionary
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1204 Streaming an empty dictionary "));
+	test(orig->IsNull());
+	testCopyL(*copy,*orig);
+	test(copy->IsNull());
+	//
+	// copy a dictionary containing a range of entries
+	test.Next(_L("Streaming a dictionary containing entries"));
+	TRAPD(ret,orig->AssignL(testUid1,testStreamId1));
+	TRAP(ret,orig->AssignL(testUid2,testStreamId2));
+	TRAP(ret,orig->AssignL(testUid3,testStreamId3));
+	testCopyL(*copy,*orig);
+	testIsEqual(copy,orig);
+	test(!copy->IsNull());
+	//
+	delete orig;
+	delete copy;
+	}
+
+
+//
+// Initialise the cleanup stack.
+//
+LOCAL_C void setupCleanup()
+    {
+	TheTrapCleanup=CTrapCleanup::New();
+	TRAPD(r,\
+		{\
+		for (TInt i=KTestCleanupStack;i>0;i--)\
+			CleanupStack::PushL((TAny*)1);\
+		test(r==KErrNone);\
+		CleanupStack::Pop(KTestCleanupStack);\
+		});
+	}
+
+
+GLDEF_C TInt E32Main()
+	{
+	setupCleanup();
+	//
+	test.Title();
+	test.Start(_L("Testing CStreamDictionary..."));
+	//
+	// run the testcode (inside an alloc heaven harness)
+	__UHEAP_MARK;
+
+	TRAPD(r,simpleTestsL());
+		test(r==KErrNone);
+
+	TRAP(r,streamingTestsL());
+		test(r==KErrNone);
+
+	__UHEAP_MARKEND;
+
+ 	test.End();
+	test.Close();
+
+	delete TheTrapCleanup;
+	return KErrNone;
+	}
+