diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/T_RecoverView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/T_RecoverView.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -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 +#include +#include +#include + +#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; + }