--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pimprotocols/phonebooksync/Test/TE_cntsync/te_cntsyncdelete.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,964 @@
+// Copyright (c) 2002-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 "te_cntsyncbase.h"
+#include "te_cntsyncdelete.h"
+
+_LIT(KDeletedNameInADN, "ADN Delete Test");
+_LIT(KDeletedNameInSDN, "SDN Delete Test");
+_LIT(KDeletedNameInLND, "LND Delete Test");
+_LIT(KDeletedNameInUsim,"Usim Delete Test");
+_LIT(KDeletedNameInFDN, "FDN Delete Test");
+
+_LIT(KDeletedNumberInADN, "0202020323909094394");
+_LIT(KDeletedNumberInSDN, "1212121323919194394");
+_LIT(KDeletedNumberInLND, "2222222323929294394");
+_LIT(KDeletedNumberInUsim,"3232323323939394394");
+_LIT(KDeletedNumberInFDN, "4242424343949494394");
+
+_LIT(KDeletedEmailInUsim,"example@here");
+
+_LIT(KSearchStringInADN, "AAAAAAAAAAAAAAAAA");
+_LIT(KSearchStringInSDN, "BBBBBBBBBBBBBBBBB");
+_LIT(KSearchStringInLND, "CCCCCCCCCCCCCCCCC");
+_LIT(KSearchStringInUsim,"DDDDDDDDDDDDDDDDD");
+_LIT(KSearchStringInFDN, "EEEEEEEEEEEEEEEEE");
+
+_LIT(KSearchNameInADN, "ADN Name");
+_LIT(KSearchNameInSDN, "SDN Name");
+_LIT(KSearchNameInLND, "LND Name");
+_LIT(KSearchNameInUsim,"Usim Name");
+_LIT(KSearchNameInFDN, "FDN Name");
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteICCContactTest object
+ */
+CPhbkDeleteICCContactTest* CPhbkDeleteICCContactTest::NewL()
+ {
+ CPhbkDeleteICCContactTest* self = new(ELeave) CPhbkDeleteICCContactTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteICCContactTest::CPhbkDeleteICCContactTest()
+ {
+ SetTestStepName(_L("DeleteICCContactTest"));
+ }
+
+/** Delete an ICC entry - normal case */
+enum TVerdict CPhbkDeleteICCContactTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(0);
+ DoSyncL();
+
+ DeleteContactL(KUidIccGlobalAdnPhonebook);
+ DeleteContactL(KUidIccGlobalSdnPhonebook);
+ DeleteContactL(KUidIccGlobalLndPhonebook);
+ DeleteContactL(KUidUsimAppAdnPhonebook);
+ DeleteContactL(KUidIccGlobalFdnPhonebook);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteEntryInvalidUIDTest object
+ */
+CPhbkDeleteEntryInvalidUIDTest* CPhbkDeleteEntryInvalidUIDTest::NewL()
+ {
+ CPhbkDeleteEntryInvalidUIDTest* self = new(ELeave) CPhbkDeleteEntryInvalidUIDTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteEntryInvalidUIDTest::CPhbkDeleteEntryInvalidUIDTest()
+ {
+ SetTestStepName(_L("DeleteEntryInvalidUIDTest"));
+ }
+
+/** Delete an ICC entry - invalid UID */
+enum TVerdict CPhbkDeleteEntryInvalidUIDTest::doTestStepL()
+ {
+ TContactItemId id(1500); // Exceeded max number on ICC
+ TRAPD(err, iDb->DeleteContactL(id));
+ TESTCHECKL(err, KErrNotFound);
+
+ id = -2; // Negative UID
+ TRAP(err, iDb->DeleteContactL(id));
+ TESTCHECKL(err, KErrNotFound);
+
+ id = 6789; // Out-of-range UID
+ TRAP(err, iDb->DeleteContactL(id));
+ TESTCHECKL(err, KErrNotFound);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteAllEntriesTest object
+ */
+CPhbkDeleteAllEntriesTest* CPhbkDeleteAllEntriesTest::NewL()
+ {
+ CPhbkDeleteAllEntriesTest* self = new(ELeave) CPhbkDeleteAllEntriesTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteAllEntriesTest::CPhbkDeleteAllEntriesTest()
+ {
+ SetTestStepName(_L("DeleteAllEntriesTest"));
+ }
+
+/** Delete all ICC entries one at a time */
+enum TVerdict CPhbkDeleteAllEntriesTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(0);
+ DoSyncL();
+
+ iDb->SetDbViewContactType(KUidContactICCEntry);
+ const CContactIdArray* sortedItems = iDb->SortedItemsL();
+ TContactItemId id(KNullContactId);
+ TInt count = sortedItems->Count();
+
+ TInt err(KErrNone);
+ for(TInt i=0; i<=count-1;i++)
+ {
+ id = (*sortedItems)[0];
+ iDb->DeleteContactL(id);
+ CContactItem* item=NULL; //check the item has been removed from the database
+ TRAP(err, item = iDb->ReadContactL(id));
+ TESTCHECKL(err, KErrNotFound);
+ delete item;
+ }
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteEntryICCLockedTest object
+ */
+CPhbkDeleteEntryICCLockedTest* CPhbkDeleteEntryICCLockedTest::NewL()
+ {
+ CPhbkDeleteEntryICCLockedTest* self = new(ELeave) CPhbkDeleteEntryICCLockedTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteEntryICCLockedTest::CPhbkDeleteEntryICCLockedTest()
+ {
+ SetTestStepName(_L("DeleteEntryICCLockedTest"));
+ }
+
+/** Delete an ICC entry - ICC locked */
+enum TVerdict CPhbkDeleteEntryICCLockedTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(2);
+ DoSyncL();
+
+ // Access ICC and wait for it to be locked
+ iDb->SetDbViewContactType(KUidContactICCEntry);
+ const CContactIdArray* sortedItems = iDb->SortedItemsL();
+ TContactItemId id = (*sortedItems)[0];
+ TInt err(KErrNone);
+ while(err==KErrNone) // Wait for ICC to become locked
+ {
+ User::After(1000000); // Wait a second and try again.
+ CContactICCEntry* failEntry=NULL;
+ TRAP(err, failEntry = (CContactICCEntry*)iDb->ReadContactL(id, *iDb->AllFieldsView())); // Entry unavailable due to ICC being locked
+ delete failEntry;
+ }
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalAdnPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalSdnPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalLndPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidUsimAppAdnPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalFdnPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteEntryICCDeleteFailsTest object
+ */
+CPhbkDeleteEntryICCDeleteFailsTest* CPhbkDeleteEntryICCDeleteFailsTest::NewL()
+ {
+ CPhbkDeleteEntryICCDeleteFailsTest* self = new(ELeave) CPhbkDeleteEntryICCDeleteFailsTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteEntryICCDeleteFailsTest::CPhbkDeleteEntryICCDeleteFailsTest()
+ {
+ SetTestStepName(_L("DeleteEntryICCDeleteFailsTest"));
+ }
+
+/** Delete an ICC entry - ICC delete fails */
+enum TVerdict CPhbkDeleteEntryICCDeleteFailsTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(4);
+ DoSyncL();
+
+ TRAPD(err, DeleteContactL(KUidIccGlobalAdnPhonebook));
+ TESTCHECKL(err, KErrBadHandle);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalSdnPhonebook));
+ TESTCHECKL(err, KErrBadHandle);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalLndPhonebook));
+ TESTCHECKL(err, KErrBadHandle);
+
+ TRAP(err, DeleteContactL(KUidUsimAppAdnPhonebook));
+ TESTCHECKL(err, KErrBadHandle);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalFdnPhonebook));
+ TESTCHECKL(err, KErrBadHandle);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteEntryReadOnlyAccessTest object
+ */
+CPhbkDeleteEntryReadOnlyAccessTest* CPhbkDeleteEntryReadOnlyAccessTest::NewL()
+ {
+ CPhbkDeleteEntryReadOnlyAccessTest* self = new(ELeave) CPhbkDeleteEntryReadOnlyAccessTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteEntryReadOnlyAccessTest::CPhbkDeleteEntryReadOnlyAccessTest()
+ {
+ SetTestStepName(_L("DeleteEntryReadOnlyAccessTest"));
+ }
+
+/** Delete an ICC entry - read-only phonebook */
+enum TVerdict CPhbkDeleteEntryReadOnlyAccessTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(12);
+ DoSyncL();
+
+ TRAPD(err, DeleteContactL(KUidIccGlobalAdnPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalSdnPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalLndPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidUsimAppAdnPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ TRAP(err, DeleteContactL(KUidIccGlobalFdnPhonebook));
+ TESTCHECKL(err, KErrAccessDenied);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteArrayOneEntryTest object
+ */
+CPhbkDeleteArrayOneEntryTest* CPhbkDeleteArrayOneEntryTest::NewL()
+ {
+ CPhbkDeleteArrayOneEntryTest* self = new(ELeave) CPhbkDeleteArrayOneEntryTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteArrayOneEntryTest::CPhbkDeleteArrayOneEntryTest()
+ {
+ SetTestStepName(_L("DeleteArrayOneEntryTest"));
+ }
+
+/** Delete an array of ICC entries - one entry in the array */
+enum TVerdict CPhbkDeleteArrayOneEntryTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(10);
+ DoSyncL();
+
+ // *
+ // * MJH - 12 Sept 2002
+ // * Assumptions for test data:
+ // *
+ // * Each phonebook must use a unique number format in order that the array
+ // * of entries to be deleted only contains a single entry.
+ // *
+
+ DeleteArrayWithOneEntryL(KDeletedNumberInADN, KDeletedNameInADN, KUidIccGlobalAdnPhonebook);
+ DeleteArrayWithOneEntryL(KDeletedNumberInSDN, KDeletedNameInSDN, KUidIccGlobalSdnPhonebook);
+ DeleteArrayWithOneEntryL(KDeletedNumberInLND, KDeletedNameInLND, KUidIccGlobalLndPhonebook);
+ DeleteArrayWithOneEntryL(KDeletedNumberInUsim, KDeletedNameInUsim, KUidUsimAppAdnPhonebook, KDeletedEmailInUsim);
+ DeleteArrayWithOneEntryL(KDeletedNumberInFDN, KDeletedNameInFDN, KUidIccGlobalFdnPhonebook);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteArrayInvalidIdTest object
+ */
+CPhbkDeleteArrayInvalidIdTest* CPhbkDeleteArrayInvalidIdTest::NewL()
+ {
+ CPhbkDeleteArrayInvalidIdTest* self = new(ELeave) CPhbkDeleteArrayInvalidIdTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteArrayInvalidIdTest::CPhbkDeleteArrayInvalidIdTest()
+ {
+ SetTestStepName(_L("DeleteArrayInvalidIdTest"));
+ }
+
+/** Delete an array of ICC entries - invalid ID added to the array */
+enum TVerdict CPhbkDeleteArrayInvalidIdTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(10);
+ DoSyncL();
+
+ // *
+ // * MJH - 12 Sept 2002
+ // * Assumptions for test data:
+ // *
+ // * Each phonebook must use a unique number format in order that the array
+ // * of entries to be deleted only relates to that phonebook.
+ // *
+
+ DeleteArrayWithInvalidIdL(KDeletedNumberInADN);
+ DeleteArrayWithInvalidIdL(KDeletedNumberInSDN);
+ DeleteArrayWithInvalidIdL(KDeletedNumberInLND);
+ DeleteArrayWithInvalidIdL(KDeletedNumberInUsim);
+ DeleteArrayWithInvalidIdL(KDeletedNumberInFDN);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteArrayMultipleEntriesTest object
+ */
+CPhbkDeleteArrayMultipleEntriesTest* CPhbkDeleteArrayMultipleEntriesTest::NewL()
+ {
+ CPhbkDeleteArrayMultipleEntriesTest* self = new(ELeave) CPhbkDeleteArrayMultipleEntriesTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteArrayMultipleEntriesTest::CPhbkDeleteArrayMultipleEntriesTest()
+ {
+ SetTestStepName(_L("DeleteArrayMultipleEntriesTest"));
+ }
+
+/** Delete an array of ICC entries - multiple entries in the array */
+enum TVerdict CPhbkDeleteArrayMultipleEntriesTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(10);
+ DoSyncL();
+
+ // *
+ // * MJH - 12 Sept 2002
+ // * Assumptions for test data:
+ // *
+ // * Each phonebook must use a unique format of name for its entries in order
+ // * that the array of entries to be deleted only relates to that phonebook.
+ // *
+
+ DeleteArrayWithMultEntryL(KDeletedNumberInADN, KSearchStringInADN, KUidIccGlobalAdnPhonebook);
+ DeleteArrayWithMultEntryL(KDeletedNumberInSDN, KSearchStringInSDN, KUidIccGlobalSdnPhonebook);
+ DeleteArrayWithMultEntryL(KDeletedNumberInLND, KSearchStringInLND, KUidIccGlobalLndPhonebook);
+ DeleteArrayWithMultEntryL(KDeletedNumberInUsim, KSearchStringInUsim, KUidUsimAppAdnPhonebook, KDeletedEmailInUsim);
+ DeleteArrayWithMultEntryL(KDeletedNumberInFDN, KSearchStringInFDN, KUidIccGlobalFdnPhonebook);
+
+ return TestStepResult();
+ }
+
+
+/** Delete and then Add Multiple entries */
+void CPhbkDeleteIntegrationTestBase::DeleteArrayWithMultEntryL(const TDesC& aNumber, const TDesC& aName, const TUid aPhoneBook, const TDesC& aEmail)
+ {
+ CContactItemFieldDef* def=new(ELeave) CContactItemFieldDef();
+ CleanupStack::PushL(def);
+ def->AppendL(KUidContactFieldFamilyName);
+ CContactIdArray* array=iDb->FindLC(aName,def);
+ TInt count(array->Count());
+ TESTCHECKCONDITIONL(count != 0); // make sure there is at least one entry in array
+ TRAPD(err, iDb->DeleteContactsL(*array));
+ TESTCHECKL(err, KErrNone);
+
+ // Now add same number of entries to Contacts DB
+ CPhbkIntegrationTestUtility* add = CPhbkIntegrationTestUtility::NewL();
+ CleanupStack::PushL(add);
+ for(TInt i=0; i<count; i++)
+ add->AddContactL(aName, aNumber, aPhoneBook, aEmail); // now write new entry
+
+ CleanupStack::PopAndDestroy(3,def); // array & def & add?
+ }
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteArrayICCLockedTest object
+ */
+CPhbkDeleteArrayICCLockedTest* CPhbkDeleteArrayICCLockedTest::NewL()
+ {
+ CPhbkDeleteArrayICCLockedTest* self = new(ELeave) CPhbkDeleteArrayICCLockedTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteArrayICCLockedTest::CPhbkDeleteArrayICCLockedTest()
+ {
+ SetTestStepName(_L("DeleteArrayICCLockedTest"));
+ }
+
+/** Delete an array of ICC entries - ICC locked */
+enum TVerdict CPhbkDeleteArrayICCLockedTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(2);
+ DoSyncL();
+
+ // *
+ // * MJH - 12 Sept 2002
+ // * Assumptions for test data:
+ // *
+ // * Each phonebook must use a unique format of name for its entries in order
+ // * that the array of entries to be deleted only relates to that phonebook.
+ // *
+ // * The value of KTest2ICCSlots defines the total number of entries
+ // * for ALL phonebooks.
+ // *
+
+ // Access ICC and wait for it to become locked
+ iDb->SetDbViewContactType(KUidContactICCEntry);
+ const CContactIdArray* sortedItems = iDb->SortedItemsL();
+ TInt count(sortedItems->Count());
+ TESTCHECKL(count, KTest2ICCSlots);
+ TContactItemId id = (*sortedItems)[0];
+
+ TInt err(KErrNone);
+ while(err==KErrNone) // Wait for ICC to become locked
+ {
+ User::After(1000000); // Wait a second and try again.
+ CContactICCEntry* failEntry=NULL;
+ TRAP(err, failEntry = (CContactICCEntry*)iDb->ReadContactL(id, *iDb->AllFieldsView())); // Entry unavailable due to ICC being locked
+ delete failEntry;
+ }
+ TESTCHECKCONDITIONL(err == KErrAccessDenied || err == KErrNotReady);
+
+ DeleteArrayWithICCLockedL(KSearchStringInADN, KErrAccessDenied);
+ DeleteArrayWithICCLockedL(KSearchStringInSDN, KErrAccessDenied);
+ DeleteArrayWithICCLockedL(KSearchStringInLND, KErrAccessDenied);
+ DeleteArrayWithICCLockedL(KSearchStringInUsim, KErrAccessDenied);
+ DeleteArrayWithICCLockedL(KSearchStringInFDN, KErrAccessDenied);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteArrayReadOnlyAccessTest object
+ */
+CPhbkDeleteArrayReadOnlyAccessTest* CPhbkDeleteArrayReadOnlyAccessTest::NewL()
+ {
+ CPhbkDeleteArrayReadOnlyAccessTest* self = new(ELeave) CPhbkDeleteArrayReadOnlyAccessTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteArrayReadOnlyAccessTest::CPhbkDeleteArrayReadOnlyAccessTest()
+ {
+ SetTestStepName(_L("DeleteArrayReadOnlyAccessTest"));
+ }
+
+/** Delete an array of ICC entries - Read-only Access */
+enum TVerdict CPhbkDeleteArrayReadOnlyAccessTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(12);
+ DoSyncL();
+
+ // *
+ // * MJH - 12 Sept 2002
+ // * Assumptions for test data:
+ // *
+ // * Each phonebook must use a unique format of name for its entries in order
+ // * that the array of entries to be deleted only relates to that phonebook.
+ // *
+
+ DeleteArrayWithFailureL(KSearchNameInADN, KErrAccessDenied);
+ DeleteArrayWithFailureL(KSearchNameInSDN, KErrAccessDenied);
+ DeleteArrayWithFailureL(KSearchNameInLND, KErrAccessDenied);
+ DeleteArrayWithFailureL(KSearchNameInUsim, KErrAccessDenied);
+ DeleteArrayWithFailureL(KSearchNameInFDN, KErrAccessDenied);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteArrayICCDeleteFailsTest object
+ */
+CPhbkDeleteArrayICCDeleteFailsTest* CPhbkDeleteArrayICCDeleteFailsTest::NewL()
+ {
+ CPhbkDeleteArrayICCDeleteFailsTest* self = new(ELeave) CPhbkDeleteArrayICCDeleteFailsTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteArrayICCDeleteFailsTest::CPhbkDeleteArrayICCDeleteFailsTest()
+ {
+ SetTestStepName(_L("DeleteArrayICCDeleteFailsTest"));
+ }
+
+/** Delete an array of ICC entries - ICC delete fails */
+enum TVerdict CPhbkDeleteArrayICCDeleteFailsTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(4);
+ DoSyncL();
+
+ DeleteArrayWithFailureL(KDeletedNameInADN, KErrBadHandle);
+ DeleteArrayWithFailureL(KDeletedNameInSDN, KErrBadHandle);
+ DeleteArrayWithFailureL(KDeletedNameInLND, KErrBadHandle);
+ DeleteArrayWithFailureL(KDeletedNameInUsim, KErrBadHandle);
+ DeleteArrayWithFailureL(KDeletedNameInFDN, KErrBadHandle);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteArrayInvalidUIDTest object
+ */
+CPhbkDeleteArrayInvalidUIDTest* CPhbkDeleteArrayInvalidUIDTest::NewL()
+ {
+ CPhbkDeleteArrayInvalidUIDTest* self = new(ELeave) CPhbkDeleteArrayInvalidUIDTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteArrayInvalidUIDTest::CPhbkDeleteArrayInvalidUIDTest()
+ {
+ SetTestStepName(_L("DeleteArrayInvalidUIDTest"));
+ }
+
+/** Delete an array of ICC entries - array contains both valid and invalid UIDs */
+enum TVerdict CPhbkDeleteArrayInvalidUIDTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(121);
+ DoSyncL();
+
+ // *
+ // * MJH - 12 Sept 2002
+ // * Assumptions for test data:
+ // *
+ // * Each phonebook must use a unique format of name for its entries in order
+ // * that the array of entries to be deleted only relates to that phonebook.
+ // *
+
+ DeleteArrayWithInvalidUIDL(KSearchNameInADN);
+ DeleteArrayWithInvalidUIDL(KSearchNameInSDN);
+ DeleteArrayWithInvalidUIDL(KSearchNameInLND);
+ DeleteArrayWithInvalidUIDL(KSearchNameInUsim);
+ DeleteArrayWithInvalidUIDL(KSearchNameInFDN);
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteArrayFullPhonebookTest object
+ */
+CPhbkDeleteArrayFullPhonebookTest* CPhbkDeleteArrayFullPhonebookTest::NewL()
+ {
+ CPhbkDeleteArrayFullPhonebookTest* self = new(ELeave) CPhbkDeleteArrayFullPhonebookTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteArrayFullPhonebookTest::CPhbkDeleteArrayFullPhonebookTest()
+ {
+ SetTestStepName(_L("DeleteArrayFullPhonebookTest"));
+ }
+
+/** Delete an array of ICC entries - all entries in full phonebook */
+enum TVerdict CPhbkDeleteArrayFullPhonebookTest::doTestStepL()
+ {
+#if 1
+ //
+ // This test has issues with a defect in the current CntModel implementation so it is best
+ // not to run it, otherwise it takes down CntModel and TE_CntSync takes an extra hour to
+ // abort all the remaining tests.
+ //
+ INFO_PRINTF1(_L("<font color=Orange>The current CntModel implementation will not support this test!</font>"));
+ SetTestStepResult(EPass);
+#else
+ SetSimTsyTestNumberL(0);
+ DoSyncL();
+
+ // *
+ // * MJH - 12 Sept 2002
+ // * Assumptions for test data:
+ // *
+ // * Each phonebook must use a unique format of name for its entries in order
+ // * that the array of entries to be deleted only relates to that phonebook.
+ // *
+
+ DeleteWholePhonebookL(KSearchStringInADN);
+ DeleteWholePhonebookL(KSearchStringInSDN);
+ DeleteWholePhonebookL(KSearchStringInLND);
+ DeleteWholePhonebookL(KSearchStringInUsim);
+ DeleteWholePhonebookL(KSearchStringInFDN);
+#endif
+
+ return TestStepResult();
+ }
+
+
+/**
+ * Factory construction method.
+ * @return Pointer to CPhbkDeleteSlotEntryTwiceTest object
+ */
+CPhbkDeleteSlotEntryTwiceTest* CPhbkDeleteSlotEntryTwiceTest::NewL()
+ {
+ CPhbkDeleteSlotEntryTwiceTest* self = new(ELeave) CPhbkDeleteSlotEntryTwiceTest();
+ return self;
+ }
+
+/**
+ * Default constructor. Each test step initialises it's own name.
+ */
+CPhbkDeleteSlotEntryTwiceTest::CPhbkDeleteSlotEntryTwiceTest()
+ {
+ SetTestStepName(_L("DeleteSlotEntryTwiceTest"));
+ }
+
+/** Delete from a given slot, twice */
+enum TVerdict CPhbkDeleteSlotEntryTwiceTest::doTestStepL()
+ {
+ SetSimTsyTestNumberL(23);
+ DoSyncL();
+
+ DeleteSlotTwiceL(KDeletedNumberInADN, KDeletedNameInADN, KUidIccGlobalAdnPhonebook);
+ DeleteSlotTwiceL(KDeletedNumberInSDN, KDeletedNameInSDN, KUidIccGlobalSdnPhonebook);
+ DeleteSlotTwiceL(KDeletedNumberInLND, KDeletedNameInLND, KUidIccGlobalLndPhonebook);
+ DeleteSlotTwiceL(KDeletedNumberInUsim, KDeletedNameInUsim, KUidUsimAppAdnPhonebook, KDeletedEmailInUsim);
+ DeleteSlotTwiceL(KDeletedNumberInFDN, KDeletedNameInFDN, KUidIccGlobalFdnPhonebook);
+
+ return TestStepResult();
+ }
+
+
+/** Delete an ICC contact - normal case */
+void CPhbkDeleteIntegrationTestBase::DeleteContactL(TUid aPhonebookUid)
+ {
+ iDb->SetDbViewContactType(KUidContactICCEntry);
+ // get the unique groupId for the given phonebook
+ TContactItemId groupId(KNullContactId);
+ User::LeaveIfError(iSession.GetPhoneBookId(groupId,
+ RPhoneBookSession::ESyncGroupId,
+ aPhonebookUid));
+ TESTCHECKCONDITIONL(groupId != KNullContactId);
+
+ // based on the groupId, get items belonging to the phonebook
+ CContactGroup* group = NULL;
+ TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+ TESTCHECKL(err, KErrNone);
+ CleanupStack::PushL(group);
+ const CContactIdArray* array = group->ItemsContained();
+
+ // delete first item
+ TContactItemId id = (*array)[0];
+ iDb->DeleteContactL(id);
+
+ //check the item has been removed from the database
+ CContactItem* item=NULL;
+ TRAP(err, item = iDb->ReadContactL(id));
+ TESTCHECKL(err, KErrNotFound);
+ delete item;
+ CleanupStack::PopAndDestroy(); // group
+ }
+
+/** Delete and then Add Single entry */
+void CPhbkDeleteIntegrationTestBase::DeleteArrayWithOneEntryL(const TDesC& aNumber, const TDesC& aName, const TUid aPhoneBook, const TDesC& aEmail)
+ {
+ CContactIdArray* array = iDb->MatchPhoneNumberL(aNumber,KMaxPhoneMatchLength);
+ CleanupStack::PushL(array);
+ TESTCHECKL(array->Count(), 1); // make sure there is only 1 entry in array
+ TContactItemId deleteId=(*array)[0];
+ iDb->DeleteContactsL(*array);
+ CContactItem* item=NULL; // check the item has been removed from the database
+ TRAPD(err, item = iDb->ReadContactL(deleteId));
+ TESTCHECKL(err, KErrNotFound);
+
+ delete item;
+ CPhbkIntegrationTestUtility* add = CPhbkIntegrationTestUtility::NewL();
+ CleanupStack::PushL(add);
+ add->AddContactL(aName, aNumber, aPhoneBook, aEmail); // now write new entry
+
+ CleanupStack::PopAndDestroy(2); // array & add
+ }
+
+/** Delete array with invalid UID added */
+void CPhbkDeleteIntegrationTestBase::DeleteArrayWithInvalidIdL(const TDesC& aNumber)
+ {
+ CContactIdArray* array = iDb->MatchPhoneNumberL(aNumber,KMaxPhoneMatchLength);
+ CleanupStack::PushL(array);
+ TESTCHECKL(array->Count(), 1); // make sure there is only 1 entry in array
+ TContactItemId invalidUID1(1500); // invalid UID
+ array->AddL(invalidUID1); // Add invalid UID
+ TRAPD(err, iDb->DeleteContactsL(*array)); // array contains invalid UID
+ TESTCHECKL(err, KErrNotFound);
+ TRAP_IGNORE(iDb->RecoverL());
+ CleanupStack::PopAndDestroy(); // array
+ }
+
+/** Delete array with failure */
+void CPhbkDeleteIntegrationTestBase::DeleteArrayWithFailureL(const TDesC& aName, const TInt aExpectedError)
+ {
+ CContactItemFieldDef* def=new(ELeave) CContactItemFieldDef();
+ CleanupStack::PushL(def);
+ def->AppendL(KUidContactFieldFamilyName);
+ CContactIdArray* array=iDb->FindLC(aName,def);
+
+ TInt count(array->Count());
+ TESTCHECKCONDITIONL(count != 0); // make sure there is at least one entry in array
+ TRAPD(err, iDb->DeleteContactsL(*array));
+ TESTCHECKL(err, aExpectedError);
+
+ TInt i(0);
+ for(i=0; i<count; i++)
+ {
+ TContactItemId deleteId=(*array)[i];
+ CContactItem* item=NULL; // check the item has NOT been removed from the database
+ TRAP(err, item = iDb->ReadContactL(deleteId));
+ TESTCHECKL(err, KErrNone);
+ delete item;
+ }
+
+ CleanupStack::PopAndDestroy(2); // def, array
+ }
+
+void CPhbkDeleteIntegrationTestBase::DeleteArrayWithICCLockedL(const TDesC& aName, const TInt aExpectedError)
+ {
+ CContactItemFieldDef* def=new(ELeave) CContactItemFieldDef();
+ CleanupStack::PushL(def);
+ def->AppendL(KUidContactFieldFamilyName);
+ TInt error(KErrAccessDenied);
+
+ iDb->SetDbViewContactType(KUidContactICCEntry);
+ const CContactIdArray* sortedItems = iDb->SortedItemsL();
+ TContactItemId id = (*sortedItems)[0];
+ while (error==KErrAccessDenied || error==KErrNotReady || error==KErrNotFound) // Wait for ICC to become unlocked again
+ {
+ User::After(1000000); // Wait a second and try again.
+ CContactICCEntry* failEntry=NULL;
+ TRAP(error, failEntry = (CContactICCEntry*)iDb->ReadContactL(id, *iDb->AllFieldsView())); // Entry unavailable due to ICC being locked
+ delete failEntry;
+ }
+ TESTCHECKL(error, KErrNone);
+
+ WaitForSyncToCompleteL();
+
+ CContactIdArray* array = (CContactIdArray*)iDb->FindLC(aName,def); // Entry unavailable due to ICC being locked
+ iDb->SetDbViewContactType(KUidContactICCEntry);
+ sortedItems = iDb->SortedItemsL();
+ id = (*sortedItems)[0];
+ while (error==KErrNone || error==KErrNotReady) // Wait for ICC to become locked again
+ {
+ User::After(1000000); // Wait a second and try again.
+ CContactICCEntry* failEntry=NULL;
+ TRAP(error, failEntry = (CContactICCEntry*)iDb->ReadContactL(id, *iDb->AllFieldsView())); // Entry unavailable due to ICC being locked
+ delete failEntry;
+ }
+ TESTCHECKL(error, KErrAccessDenied);
+
+ TInt count(array->Count());
+ TESTCHECKCONDITIONL(count != 0); // make sure there is at least one entry in array
+ TRAPD(err, iDb->DeleteContactsL(*array));
+ TESTCHECKL(err, aExpectedError);
+
+ CleanupStack::PopAndDestroy(2); // def, array
+ }
+
+/** Delete with invalid UIDs */
+void CPhbkDeleteIntegrationTestBase::DeleteArrayWithInvalidUIDL(const TDesC& aName)
+ {
+ CContactItemFieldDef* def=new(ELeave) CContactItemFieldDef();
+ CleanupStack::PushL(def);
+ def->AppendL(KUidContactFieldFamilyName);
+ CContactIdArray* array=iDb->FindLC(aName,def);
+
+ TContactItemId invalidUID1(8955), invalidUID2(35457), invalidUID3(5555);
+
+ array->AddL(invalidUID1); // Add some invalid UIDs
+ array->AddL(invalidUID2);
+ array->AddL(invalidUID3);
+
+ TRAPD(err,iDb->DeleteContactsL(*array));
+ TESTCHECK(err, KErrNotFound);
+
+ TRAP_IGNORE(iDb->RecoverL()); // Recovers the database from a rollback. First closes all
+ // tables and then reopens them after the recover.
+ TInt count(array->Count());
+ for(TInt i=0; i<count; i++)
+ {
+ //
+ // Check items are not in the database...
+ //
+ TContactItemId deleteId((*array)[i]);
+ CContactItem* item=NULL;
+
+ TRAP(err, item = iDb->ReadContactL(deleteId));
+ delete item;
+
+ TESTCHECK(err, KErrNotFound);
+ }
+
+ CleanupStack::PopAndDestroy(2); // def, array
+ }
+
+/** Delete whole phonebook */
+void CPhbkDeleteIntegrationTestBase::DeleteWholePhonebookL(const TDesC& aName)
+ {
+ CContactItemFieldDef* def=new(ELeave) CContactItemFieldDef();
+ CleanupStack::PushL(def);
+ def->AppendL(KUidContactFieldFamilyName);
+
+ CContactIdArray* array=iDb->FindLC(aName,def);
+ TRAPD(err,iDb->DeleteContactsL(*array));
+ TESTCHECKL(err, KErrNone);
+
+ TInt count(array->Count());
+ for(TInt i=0; i<count; i++)
+ {
+ TContactItemId deleteId((*array)[i]);
+ CContactItem* item=NULL; // check items have been removed from the database
+ TRAP(err, item = iDb->ReadContactL(deleteId));
+ TESTCHECKL(err, KErrNotFound);
+ delete item;
+ }
+
+ CleanupStack::PopAndDestroy(2); // def
+ }
+
+/** Delete an ICC contact - normal case */
+void CPhbkDeleteIntegrationTestBase::DeleteSlotTwiceL(const TDesC& aNumber, const TDesC& aName, const TUid aPhonebook, const TDesC& aEmail)
+ {
+ iDb->SetDbViewContactType(KUidContactICCEntry);
+ // get the unique groupId for the given phonebook
+ TContactItemId groupId(KNullContactId);
+ User::LeaveIfError(iSession.GetPhoneBookId(groupId,
+ RPhoneBookSession::ESyncGroupId,
+ aPhonebook));
+ TESTCHECKCONDITIONL(groupId != KNullContactId);
+
+ // based on the groupId, get items belonging to the phonebook
+ CContactGroup* group = NULL;
+ TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+ TESTCHECKL(err, KErrNone);
+ CleanupStack::PushL(group);
+ const CContactIdArray* array = group->ItemsContained();
+
+ // delete first item
+ TContactItemId id((*array)[0]);
+ iDb->DeleteContactL(id);
+
+ //check the item has been removed from the database
+ CContactItem* item=NULL;
+ TRAP(err, item = iDb->ReadContactL(id));
+ TESTCHECKL(err, KErrNotFound);
+
+ delete item;
+ // verify that there is a free slot
+ RArray<TInt> slotNums;
+ CleanupClosePushL(slotNums);
+ iSession.GetFreeSlotsL(slotNums, aPhonebook);
+ TESTCHECKCONDITIONL(slotNums.Count() > 0);
+
+ // Now add a new item - which should use the vacated slot
+ CPhbkIntegrationTestUtility* add = CPhbkIntegrationTestUtility::NewL();
+ CleanupStack::PushL(add);
+ add->AddContactL(aName, aNumber, aPhonebook, aEmail);
+
+ // delete this new item - to verify that the delete on same slot is permitted
+ TInt ret = iSession.GetSlotId(slotNums[0], id, aPhonebook);
+ TESTCHECKL(ret, KErrNone);
+
+ item=NULL;
+ TRAP(err, item = static_cast<CContactICCEntry*>(iDb->ReadContactL(id)));
+ TESTCHECKL(err, KErrNone);
+ delete item;
+ TRAP(err, iDb->DeleteContactL(id));
+ TESTCHECKL(err, KErrNone);
+
+ CleanupStack::PopAndDestroy(3); // add, group, slotNums
+ }
+