phonebookengines/contactsmodel/tsrc/t_contactsramtest.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/t_contactsramtest.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,362 @@
+// Copyright (c) 1997-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 <e32test.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntviewbase.h>
+#include <cntfldst.h>
+#include <e32panic.h>
+
+_LIT(KTestName, "Ram consumption Test");
+
+LOCAL_D RTest test(KTestName);
+
+#define DELETE_SET_NULL(x) { delete x; x = NULL; }
+
+static const TInt KMaxContacts = 2000;
+static const TInt KManyFields = 8;
+static const TInt KAgentId = 2;
+_LIT(KTime,"22000101:235959.999999");// time to use for datetime storage
+_LIT(KFieldValue,"Standard length field value");
+TInt manycontacts = 0;
+
+_LIT(KContactsIniFileFullPath, "c:\\private\\10003A73\\Cntmodel.ini");
+_LIT(KContactsDbFileFullPath, "c:\\private\\10003A73\\Contacts.cdb");
+_LIT(KContactsBackupRegistrationIniFileFullPath, "c:\\private\\10003A73\\backup_registration.xml");
+
+static RFs TheFsSession;
+
+class CContactsRamTest : public CActive, public MContactViewObserver
+	{
+public:
+	static CContactsRamTest* NewLC();
+	~CContactsRamTest();
+	void SetView(const CContactViewBase *aLocalView);
+	void RamTestL();
+	void RamTest2L();
+	void Activate();
+	void CloseView();
+	
+private:
+	CContactsRamTest();
+	void ConstructL();
+	void AddContactsL(const TInt aNumber);
+	void SetFieldL(const CContactItemField &aField, const TDesC& aText);
+	void SetManyFieldsL(const TDesC& aText, const TInt aMany, CContactItemFieldSet &fields);
+	void PrintHeap();
+	
+private: // From CActive.
+	void RunL();
+	void DoCancel();
+	TInt RunError(TInt aError);
+private: // From MContactViewObserver.
+	virtual void HandleContactViewEvent(const CContactViewBase& aView, 
+										const TContactViewEvent& aEvent);
+
+private:
+	CContactDatabase* iContactsDatabase;
+	CContactRemoteView* iRemoteView;
+	RContactViewSortOrder iViewSortOrder;
+	TBool iEnd;
+	};
+
+
+CContactsRamTest* CContactsRamTest::NewLC()
+	{
+	CContactsRamTest* self = new(ELeave) CContactsRamTest();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+	
+
+void CContactsRamTest::ConstructL()
+	{
+	CActiveScheduler::Add(this);
+	iViewSortOrder.AppendL(KUidContactFieldGivenName);	
+	iViewSortOrder.AppendL(KUidContactFieldFamilyName);
+	}
+	
+
+CContactsRamTest::~CContactsRamTest()
+	{
+	CloseView();
+	iViewSortOrder.Close();
+	delete iContactsDatabase;
+	}
+
+CContactsRamTest::CContactsRamTest() : CActive(EPriorityStandard)
+	{
+	}
+	
+	
+void CContactsRamTest::RunL()
+	{
+	if( iEnd )
+		{
+		iEnd = EFalse;
+		RamTest2L();
+		CActiveScheduler::Stop();
+		}
+	else
+		{
+		RamTestL();
+		}
+	}
+	
+void CContactsRamTest::DoCancel()
+	{
+	}
+
+TInt CContactsRamTest::RunError(TInt aError)
+	{
+	test.Printf( _L("ViewObserver:: Error in doTest runL: %d"), aError );
+	return aError;
+	}
+
+void CContactsRamTest::Activate()
+	{
+	TRequestStatus *pS=&iStatus;
+	User::RequestComplete(pS,KErrNone);
+	SetActive();
+	}
+
+void CContactsRamTest::RamTestL()
+	{
+	test.Next(_L("Initial ram test"));
+
+	test.Printf( _L("Ram test for %d contacts\n"), manycontacts);
+	DELETE_SET_NULL( iContactsDatabase );
+	test.Printf(_L("Empty Database is opened\n"));
+	iContactsDatabase = CContactDatabase::ReplaceL();
+	PrintHeap();
+	AddContactsL( manycontacts );
+	test.Printf(_L("Database is opened and contacts added\n"));
+	PrintHeap();
+	test.Printf(_L("RemoteView with first/surname order is created\n"));
+	iRemoteView = CContactRemoteView::NewL(	*this, *iContactsDatabase, iViewSortOrder, EContactsOnly);
+	PrintHeap();
+	
+	}	
+
+void CContactsRamTest::RamTest2L()
+	{
+	test.Printf(_L("RemoteView is populated\n"));
+	PrintHeap();
+	CloseView();
+	DELETE_SET_NULL( iContactsDatabase );
+	test.Printf(_L("Full Database is re-opened\n"));
+	iContactsDatabase = CContactDatabase::OpenL();
+	PrintHeap();
+	DELETE_SET_NULL( iContactsDatabase );
+	}	
+	
+void CContactsRamTest::HandleContactViewEvent(	const CContactViewBase& aView, 
+											const TContactViewEvent& aEvent)
+	{
+	if (&aView==iRemoteView)
+		{
+		switch(aEvent.iEventType)
+			{
+			case TContactViewEvent::EReady:
+				{				
+				iEnd = ETrue;
+				Activate();
+				break;
+				}
+			}
+		}
+	}
+	
+void CContactsRamTest::AddContactsL(const TInt aNumber)
+/**
+Add number of contacts to db, using the system template.
+@return None
+@param aNumber number of contacts to be added
+@pre None
+@post database now contains aNumber of empty contacts
+*/
+	{
+	
+
+	//viewdef that loads all fields 	
+	CContactItemViewDef *viewAll = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
+	viewAll->AddL(KUidContactFieldMatchAll);
+	CContactTemplate *ttemplate = static_cast< CContactTemplate* >(
+	iContactsDatabase->ReadContactLC( iContactsDatabase->TemplateId(), *viewAll ) );
+
+	CContactCard* contact = CContactCard::NewLC(ttemplate);
+	SetManyFieldsL(KFieldValue, KManyFields, contact->CardFields());
+	for(TInt k = 0; k<aNumber; k++)
+		{		
+		iContactsDatabase->AddNewContactL(*contact);
+		}	
+	CleanupStack::PopAndDestroy(contact);
+	CleanupStack::PopAndDestroy(ttemplate);
+	CleanupStack::PopAndDestroy(viewAll);
+	}
+
+/*sets a specific contact field to a value as determined by its type.
+field at aPos in aFields is set to aText*/
+void CContactsRamTest::SetFieldL(const CContactItemField &aField, const TDesC& aText)
+	{
+	if( aField.IsTemplateLabelField() )
+		{
+		return;
+		}
+		
+	if( 0 == aText.Size() )
+		{
+		return;
+		}
+	
+	switch(aField.StorageType())
+		{
+		case KStorageTypeText:
+			aField.TextStorage()->SetTextL(aText);
+		break;
+		case KStorageTypeStore:
+			{
+			HBufC8 *buf = HBufC8::NewLC(aText.Size());
+			TPtr8 tptr8 = buf->Des();
+			tptr8.Copy(aText);
+			aField.StoreStorage()->SetThingL(*buf);
+			CleanupStack::PopAndDestroy(buf);
+			}
+		break;
+		case KStorageTypeContactItemId:
+			{
+			aField.AgentStorage()->SetAgentId( KAgentId );
+			}
+		break;
+		case KStorageTypeDateTime:
+			{
+			if( aText.Size() > 0 ) 
+				{
+				aField.DateTimeStorage()->SetTime( TTime(KTime) );
+				}
+			else
+				{
+				aField.DateTimeStorage()->SetTime( TTime(0) );
+				}
+			}
+		break;
+		default:
+			User::Panic(aText,EInvariantFalse);
+		break;
+		}
+	}
+
+/**
+sets aMany fields of a currently read / open item to aText
+*/
+void CContactsRamTest::SetManyFieldsL(const TDesC& aText, const TInt aMany, CContactItemFieldSet &fields)
+	{
+	TInt count = fields.Count();
+	if( count > aMany )
+		{
+		count = aMany;
+		}
+	TInt i = 0;
+	for(; i < count; ++i)
+		{
+		SetFieldL(fields[i],aText);
+		}
+	}
+	
+void CContactsRamTest::PrintHeap()
+	{
+	TInt totalAllocSize(0);
+	User::Heap().AllocSize(totalAllocSize);
+	
+	test.Printf(_L("Client heap size: %d bytes\n"), totalAllocSize);
+	iContactsDatabase->CntServerResourceCount();
+	}
+
+void CContactsRamTest::CloseView()
+	{
+	if(iRemoteView)
+		{
+		iRemoteView->Close(*this);
+		iRemoteView = NULL;
+		}
+	}
+
+void CleanupFiles()
+	{
+	TheFsSession.Delete(KContactsIniFileFullPath);
+	TheFsSession.Delete(KContactsDbFileFullPath);
+	TheFsSession.Delete(KContactsBackupRegistrationIniFileFullPath);
+	}
+
+/**
+
+@SYMTestCaseID     PIM-T-CONTACTSRAMTEST-0001
+
+*/
+	
+void DoTestsL()
+    {
+    test.SetLogged( ETrue );
+	test.Start(_L("@SYMTESTCaseID:PIM-T-CONTACTSRAMTEST-0001 Test Ram usage for contacts model"));
+
+	
+	test.Printf(_L("Uninitilized Client Heap count: %d bytes, Heap Size: %d bytes\n"), User::Heap().Count(), User::Heap().Size());
+
+	TInt error =TheFsSession.Connect();
+	User::LeaveIfError(error);
+
+	CleanupFiles();
+	for ( manycontacts = 500; manycontacts <= KMaxContacts; manycontacts+=500 )
+		{
+		CContactsRamTest* res = CContactsRamTest::NewLC();	
+		res->Activate();
+		CActiveScheduler::Start();
+		CleanupStack::PopAndDestroy(res);
+		}
+    test.End();
+	test.Close();
+	CleanupFiles();
+	//cleanup
+	CContactDatabase::DeleteDefaultFileL();
+    }
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    if (!cleanupStack)
+        {
+        return KErrNoMemory;
+        }
+
+    CActiveScheduler* activeScheduler = new CActiveScheduler;
+    if (!activeScheduler)
+        {
+        return KErrNoMemory;
+        }
+    CActiveScheduler::Install(activeScheduler);
+
+    // Run the tests
+    TRAPD(err, DoTestsL());
+
+    // Cleanup
+    delete activeScheduler;
+    delete cleanupStack;
+	__UHEAP_MARKEND;
+	return err;
+    }
+