phonebookengines_old/contactsmodel/tsrc/T_RecoverView.cpp
changeset 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/T_RecoverView.cpp	Fri Jun 11 13:29:23 2010 +0300
@@ -0,0 +1,263 @@
+// 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:
+// RecoverView Test module
+// 
+//
+
+
+#include <e32test.h>
+#include <cntviewbase.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+
+#include "CContactViewEventQueue.h"
+
+_LIT(KTestName, "T_RecoverView");
+
+_LIT(KTestDbName, "c:T_RecoverView.cdb");
+
+LOCAL_D RTest test(KTestName);
+
+
+class CTestResources : public CBase
+    {
+    public:
+        static CTestResources* NewLC(TBool aDamaged);
+        void ConstructL(TBool aDamaged);
+        ~CTestResources();
+
+        CContactDatabase* iDb;
+        CContactViewEventQueue* iViewEventQueue;
+        RContactViewSortOrder iViewSortOrder;
+        CContactLocalView* iLocalView;
+    };
+
+/**
+ * Creates new test resources object.
+ *
+ * @param aDamaged  if true creates the database as initially damaged.
+ */
+CTestResources* CTestResources::NewLC(TBool aDamaged)
+    {
+    CTestResources* self = new(ELeave) CTestResources;
+    CleanupStack::PushL(self);
+    self->ConstructL(aDamaged);
+    return self;
+    }
+
+/**
+ * Creates a new, nondamaged DB.
+ */
+void CTestResources::ConstructL(TBool aDamaged)
+    {
+    if (aDamaged)
+        {
+        // Create an empty DB...
+        CContactDatabase* db = CContactDatabase::ReplaceL(KTestDbName);
+        CleanupStack::PushL(db);
+        // Damage the DB...
+        db->DamageDatabaseL(0x666);
+        // Close the DB.
+        CleanupStack::PopAndDestroy(db);
+        // Open the damaged database. CContactDatabase::OpenL() does recovery
+        // by calling RecoverL().
+		iDb = CContactDatabase::OpenL(KTestDbName);
+        }
+    else
+        {
+        // Just create an empty DB
+        iDb = CContactDatabase::ReplaceL(KTestDbName);
+        }
+
+    iViewEventQueue = CContactViewEventQueue::NewL();
+
+    iViewSortOrder.AppendL(KUidContactFieldFamilyName);
+    iViewSortOrder.AppendL(KUidContactFieldGivenName);
+    iViewSortOrder.AppendL(KUidContactFieldCompanyName);
+    
+    iLocalView = CContactLocalView::NewL
+        (*iViewEventQueue, *iDb, iViewSortOrder, EContactsOnly);
+    }
+
+CTestResources::~CTestResources()
+    {
+    if (iLocalView) iLocalView->Close(*iViewEventQueue);
+    iViewSortOrder.Close();
+    delete iViewEventQueue;
+    delete iDb;
+    TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KTestDbName));
+    }
+
+#if defined(_DEBUG)
+
+LOCAL_C void TestRecoverWhenViewReadyL()
+    {
+	test.Next(_L("Recover database when view is ready"));
+
+    CTestResources* res = CTestResources::NewLC(EFalse);
+	
+	//Creating a contact to test recovery
+	_LIT(KPhoneNumLabel,"Phone Number");
+	_LIT(KPhoneNum,		"+447700900012");
+
+	CContactCard* contact		= CContactCard::NewLC();
+	CContactItemField* field	= CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber);
+	
+	field->SetLabelL(KPhoneNumLabel());
+	field->TextStorage()->SetTextL(KPhoneNum());
+	
+	contact->AddFieldL(*field);
+	
+	TContactItemId aContactId = res->iDb->AddNewContactL(*contact);
+	
+	CleanupStack::Pop(field);
+
+    // Wait 5 seconds for the view to get ready
+    TContactViewEvent event;
+    test(res->iViewEventQueue->ListenForEvent(5,event));
+    test(event.iEventType == TContactViewEvent::EReady);
+
+    // Damage the DB
+	test.Next(_L("Damage the open database"));
+
+    res->iDb->DamageDatabaseL(0x666);
+    test(res->iDb->IsDamaged());
+   
+    // Damaging should not send view events
+    test(!res->iViewEventQueue->ListenForEvent(5,event));
+
+	//Attempt to read contact from the damaged database - this should fail with KErrNotReady
+	test.Next(_L("Attempting to read from damaged database"));
+
+	CContactItem* testCard = NULL;
+	TRAPD(ret,testCard = res->iDb->ReadContactLC(aContactId));
+	test(ret == KErrNotReady);
+		
+	// Recover the DB
+	test.Next(_L("Recover the damaged database"));
+
+    res->iDb->RecoverL();
+		
+    // View should be unavailable here
+    test(res->iViewEventQueue->ListenForEvent(5,event));
+    test(event.iEventType == TContactViewEvent::EUnavailable);
+
+	//View should now be ready for use again
+	test(res->iViewEventQueue->ListenForEvent(5,event));
+	test(event.iEventType == TContactViewEvent::EReady);
+
+	//Line below included to fix ARMV5 minor build warnings.
+	testCard = res->iDb->ReadContactLC(aContactId);
+	test(testCard != NULL);
+	
+	CleanupStack::PopAndDestroy(testCard);
+	CleanupStack::PopAndDestroy(contact);
+    CleanupStack::PopAndDestroy(res);
+    }
+
+LOCAL_C void TestOpenDamagedDbL()
+    {
+    test.Next(_L("Open damaged database"));
+
+    CTestResources* res = CTestResources::NewLC(ETrue);
+
+    // Wait 10 seconds for the view to get ready
+    TContactViewEvent event;
+    test(res->iViewEventQueue->ListenForEvent(10,event));
+    test(event.iEventType == TContactViewEvent::EReady);
+    CleanupStack::PopAndDestroy(res);
+    }
+
+LOCAL_C void TestOpenAndCloseTablesL()
+    {
+    test.Next(_L("Open and close tables"));
+
+    CTestResources* res = CTestResources::NewLC(EFalse);
+
+    // Wait 10 seconds for the view to get ready
+    TContactViewEvent event;
+    test(res->iViewEventQueue->ListenForEvent(5,event));
+    test(event.iEventType == TContactViewEvent::EReady);
+
+    // Close tables
+    res->iDb->CloseTables();
+   
+    // View should get unavailable
+    test(res->iViewEventQueue->ListenForEvent(5,event));
+    test(event.iEventType == TContactViewEvent::EUnavailable);
+
+    // Reopen tables
+    res->iDb->OpenTablesL();
+
+    // Wait 10 seconds for the view to get ready
+    test(res->iViewEventQueue->ListenForEvent(10,event));
+    test(event.iEventType == TContactViewEvent::EReady);
+    CleanupStack::PopAndDestroy(res);
+    }
+
+#endif
+
+/**
+
+@SYMTestCaseID     PIM-T-RECOVERVIEW-0001
+
+*/
+
+LOCAL_C void DoTestsL()
+    {
+	test.Start(_L("@SYMTESTCaseID:PIM-T-RECOVERVIEW-0001 T_RecoverView"));
+
+
+#if defined(_DEBUG)
+	TestRecoverWhenViewReadyL();
+	TestOpenDamagedDbL();
+	TestOpenAndCloseTablesL();
+#else
+	test.Printf(_L("T_RecoverView only perform functionality testing in UDEB build"));
+
+	// reference CntModel DLL to remove linker warning
+    TRAP_IGNORE(CContactDatabase::DefaultContactDatabaseExistsL());
+#endif
+
+    test.End();
+	test.Close();
+    }
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+    // Init
+    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());
+	User::LeaveIfError(err);
+
+    // Cleanup
+    delete activeScheduler;
+    delete cleanupStack;
+	__UHEAP_MARKEND;
+	return err;
+    }