phonebookengines_old/contactsmodel/tsrc/t_groupviewpanic.cpp
branchRCL_3
changeset 19 5b6f26637ad3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/t_groupviewpanic.cpp	Tue Aug 31 15:05:21 2010 +0300
@@ -0,0 +1,369 @@
+// Copyright (c) 2003-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:
+// GroupViewPanic Test module
+// 
+//
+
+
+#include <e32test.h>
+#include <cntdef.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfield.h>
+#include <cntfldst.h>
+#include <cntviewbase.h>
+
+#include "CContactViewEventQueue.h"
+
+_LIT(KTestName, "T_GroupViewPanic");
+
+_LIT(KTestDbName, "c:T_GroupViewPanic.cdb");
+
+
+LOCAL_D RTest test(KTestName);
+
+
+class CRemoteViewTestResources : public CBase
+    {
+    public:
+        static CRemoteViewTestResources* NewLC();
+        void ConstructL();
+        ~CRemoteViewTestResources();
+        void CreateTestGroupsL();
+
+        CContactDatabase* iDb;
+        CContactIdArray* iContacts;
+        CContactViewEventQueue* iViewEventQueue;
+        RContactViewSortOrder iViewSortOrder;
+        CContactRemoteView* iRemoteView;
+    };
+   
+CRemoteViewTestResources* CRemoteViewTestResources::NewLC()
+    {
+    CRemoteViewTestResources* self = new(ELeave) CRemoteViewTestResources;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+void CRemoteViewTestResources::ConstructL()
+    {          
+    iDb = CContactDatabase::ReplaceL(KTestDbName);
+	iContacts = CContactIdArray::NewL();
+    iViewEventQueue = CContactViewEventQueue::NewL();
+    iViewSortOrder.AppendL(KUidContactFieldTemplateLabel);
+
+    const TContactViewPreferences prefs = static_cast<TContactViewPreferences>
+    			(EGroupsOnly |ESingleWhiteSpaceIsEmptyField | EUnSortedAtEnd);       
+    iRemoteView = CContactRemoteView::NewL(*iViewEventQueue, *iDb, iViewSortOrder, prefs);
+    
+    // Wait for view to get ready
+    TContactViewEvent event;
+	
+	TBool eventReady = iViewEventQueue->ListenForEvent(10,event);
+    __ASSERT_ALWAYS(eventReady,User::Invariant());
+    ASSERT(event.iEventType == TContactViewEvent::EReady);
+    }
+
+CRemoteViewTestResources::~CRemoteViewTestResources()
+    {
+    if (iRemoteView)
+    	{
+    	iRemoteView->Close(*iViewEventQueue);	
+    	delete iViewEventQueue;
+    	}
+    iViewSortOrder.Close();    
+    delete iContacts;
+    delete iDb;
+    TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KTestDbName));
+    }
+    
+class CTestResources : public CBase
+    {
+    public:
+        static CTestResources* NewLC();
+        void ConstructL();
+        void CreateTestContactsL();
+        void CreateTestGroupsL();
+        ~CTestResources();
+
+        CContactDatabase* iDb;
+        CContactIdArray* iContacts;
+        CContactViewEventQueue* iViewEventQueue;
+        RContactViewSortOrder iViewSortOrder;
+        CContactLocalView* iLocalView;
+    };
+    
+CTestResources* CTestResources::NewLC()
+    {
+    CTestResources* self = new(ELeave) CTestResources;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+
+
+
+void CTestResources::ConstructL()
+    {
+    iDb = CContactDatabase::ReplaceL(KTestDbName);
+    iContacts = CContactIdArray::NewL();
+
+    // Create some contacts into the database (don't create any groups)
+    CreateTestContactsL();
+
+    // Close and reopen the DB (this does not help with the bug)
+    /*
+    delete iDb;
+    iDb = NULL;
+    iDb = CContactDatabase::OpenL(KTestDbName);
+    */
+
+    iViewEventQueue = CContactViewEventQueue::NewL();
+
+    iViewSortOrder.AppendL(KUidContactFieldTemplateLabel);
+    
+    // Create a groups only contact view
+    const TContactViewPreferences prefs = 
+        static_cast<TContactViewPreferences>(EGroupsOnly);
+    iLocalView = CContactLocalView::NewL
+        (*iViewEventQueue, *iDb, iViewSortOrder, prefs);
+#if defined (_DEBUG)
+    // Wait for view to get ready
+    TContactViewEvent event;
+#endif
+    ASSERT(iViewEventQueue->ListenForEvent(10,event));
+    ASSERT(event.iEventType == TContactViewEvent::EReady);
+    }
+
+LOCAL_C void AddFieldToContactL
+        (CContactItem& aContact, TFieldType aFieldType, const TDesC& aText)
+    {
+    CContactItemField* field = CContactItemField::NewLC(KStorageTypeText, aFieldType);
+    field->TextStorage()->SetTextL(aText);
+    aContact.AddFieldL(*field);
+    CleanupStack::Pop(field);
+    }
+
+LOCAL_C TContactItemId CreateTestContactL
+        (CContactDatabase& aDb,
+        const TDesC& aFamilyName, 
+        const TDesC& aGivenName, 
+        const TDesC& aCompanyName)
+    {
+    CContactCard* card = CContactCard::NewLC();
+    AddFieldToContactL(*card, KUidContactFieldFamilyName, aFamilyName);
+    AddFieldToContactL(*card, KUidContactFieldGivenName, aGivenName);
+    AddFieldToContactL(*card, KUidContactFieldCompanyName, aCompanyName);
+    const TContactItemId id = aDb.AddNewContactL(*card);
+    CleanupStack::PopAndDestroy(card);
+    return id;
+    }
+
+// Creates a few test contacts.
+void CTestResources::CreateTestContactsL()
+    {
+    TContactItemId id;
+    id = CreateTestContactL(*iDb, _L("Example1"), _L("test"), _L("Name1"));
+    iContacts->AddL(id);
+    id = CreateTestContactL(*iDb, _L("Example2"), _L("test1"), _L("Name2"));
+    iContacts->AddL(id);
+    id = CreateTestContactL(*iDb, _L("Example12"), _L("test0"), _L("Name3"));
+    iContacts->AddL(id);
+    id = CreateTestContactL(*iDb, _L("Example13"), _L("test3"), _L("Name4"));
+    iContacts->AddL(id);
+    }
+
+CTestResources::~CTestResources()
+    {
+    if (iLocalView)
+    	{
+    	iLocalView->Close(*iViewEventQueue);	
+    	delete iViewEventQueue;
+    	}
+    iViewSortOrder.Close();    
+    delete iContacts;
+    delete iDb;
+    TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KTestDbName));
+    }
+
+LOCAL_C void TestDeleteContactsL()
+    {
+    // Create test resources
+    CTestResources* res = CTestResources::NewLC();
+
+    // Delete all contacts in the DB
+    for (TInt i=0; i < res->iContacts->Count(); ++i)
+        {
+        res->iDb->DeleteContactL((*res->iContacts)[i]);
+        }
+
+    CleanupStack::PopAndDestroy(res);
+    }
+
+void CheckEvent(const TContactViewEvent& event, 
+				TContactViewEvent::TEventType expectedEventType,
+				TInt expectedUnderlyingIndex,
+				TContactItemId expectedItemId)
+	{	
+	test(event.iEventType == expectedEventType);
+	test(event.iInt == expectedUnderlyingIndex);
+	test(event.iContactId == expectedItemId);
+	}
+
+
+void CRemoteViewTestResources::CreateTestGroupsL()
+    {
+	test.Next(_L("Test for creating a remote view and validating that queued events are received in the correct order."));
+
+	TContactViewEvent event;
+
+	// Create A then "unnanmed", then rename "unnamed" to B
+	test.Next(_L("Test for Create group A, then create group B"));
+
+	CContactItem* group1 = iDb->CreateContactGroupLC(_L("A"));	
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemAdded, 0, group1->Id());
+
+	CContactItem* group0 = iDb->CreateContactGroupLC(_L(""));
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemAdded, 1, group0->Id());
+	 	
+	CContactItem *group00 = iDb->OpenContactL(group0->Id());
+	static_cast<CContactGroup*> (group00)->SetGroupLabelL(_L("B"));
+	iDb->CommitContactL(*group00);
+		
+	// Received 3 events, grp changed, removed and added
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EGroupChanged, 0, group00->Id());
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemRemoved, 1, group00->Id());
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemAdded, 1, group00->Id()); 	
+
+	// Create D then "unnamed", then rename "unnamed" to C
+	test.Next(_L("Test for Create group D, then create group C"));
+
+	CContactItem* group2 = iDb->CreateContactGroupLC(_L("D"));	
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemAdded, 2, group2->Id());
+
+	CContactItem* group3 = iDb->CreateContactGroupLC(_L(""));
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemAdded, 3, group3->Id());
+	 	
+	CContactItem *group4 = iDb->OpenContactL(group3->Id());
+	static_cast<CContactGroup*> (group4)->SetGroupLabelL(_L("C"));
+	iDb->CommitContactL(*group4);
+		
+	// Received 3 events, grp changed, removed and added
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EGroupChanged, 0, group4->Id());
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemRemoved, 3, group4->Id());
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemAdded, 2, group4->Id()); 
+
+	// More complex set of add and deletes.
+	test.Next(_L("Test-Addgroup E, Addgroup F, Addgroup G , RemoveGroup G Addgroup H RenameGroup H as EA"));
+
+	CContactItem* group5 = iDb->CreateContactGroupLC(_L("E"));	   
+	CContactItem* group6 = iDb->CreateContactGroupLC(_L("F"));	    
+	CContactItem* group7 = iDb->CreateContactGroupLC(_L("G"));    
+	iDb->DeleteContactL(group7->Id());	    
+	CContactItem* group8 = iDb->CreateContactGroupLC(_L("H"));	
+
+	CContactItem *group01 = iDb->OpenContactL(group8->Id());
+	static_cast<CContactGroup*> (group01)->SetGroupLabelL(_L("EA"));
+	iDb->CommitContactL(*group01);
+
+	// Should receive events for operations above, order is not important 
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemAdded, 4, group5->Id());
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemAdded, 5, group6->Id());
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EItemRemoved, 6, group7->Id());
+	iViewEventQueue->ListenForEvent(2,event);
+	CheckEvent(event, TContactViewEvent::EGroupChanged, 0, group8->Id());
+
+	// Cleanup
+	delete group01;
+	delete group00;
+	delete group4;    
+	CleanupStack::PopAndDestroy(group8);
+	CleanupStack::PopAndDestroy(group7);
+	CleanupStack::PopAndDestroy(group6);
+	CleanupStack::PopAndDestroy(group5);
+	CleanupStack::PopAndDestroy(group3);
+	CleanupStack::PopAndDestroy(group2);     
+	CleanupStack::PopAndDestroy(group0);
+	CleanupStack::PopAndDestroy(group1);
+    }    
+
+/**
+@SYMTestCaseID PIM-T-GROUPVIEWPANIC-0001
+@SYMTestType UT
+@SYMTestPriority Urgent
+@SYMDEF INC097928
+@SYMTestCaseDesc Check the sequence of events when groups are added, removed or edited
+@SYMTestActions
+@SYMTestExpectedResults The sequence of events should be proper.
+*/    
+LOCAL_C void TestEventsForGroupCreationL()
+    {
+    // Create test resources
+    CRemoteViewTestResources * pRes = CRemoteViewTestResources::NewLC();
+    pRes->CreateTestGroupsL();  
+    CleanupStack::PopAndDestroy(pRes);  
+    }   
+
+LOCAL_C void DoTestsL()
+    {
+	test.Start(_L("@SYMTESTCaseID:PIM-T-GROUPVIEWPANIC-0001 T_GroupViewPanic"));
+
+    TestDeleteContactsL();
+    TestEventsForGroupCreationL();    
+    test.End();
+    test.Close();
+    }
+
+GLDEF_C TInt E32Main()
+	{
+    // Init
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    if (!cleanupStack)
+        {
+        return KErrNoMemory;
+        }
+
+    CActiveScheduler* activeScheduler = new CActiveScheduler;
+    if (!activeScheduler)
+        {
+        return KErrNoMemory;
+        }
+    CActiveScheduler::Install(activeScheduler);
+
+    // Run the tests
+    __UHEAP_MARK;
+    TRAPD(err, DoTestsL());
+    __UHEAP_MARKEND;
+
+    // Cleanup
+    delete activeScheduler;
+    delete cleanupStack;
+
+	return err;
+    }