--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/T_DBASE.CPP Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,342 @@
+// 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 <f32file.h>
+#include <s32file.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfield.h>
+#include <cntfldst.h>
+#include "T_UTILS.H"
+
+CCntTest* CntTest=NULL;
+LOCAL_D RTest test(_L("T_DBASE"));
+
+const TPtrC KDatabaseFileName=_L("C:T_DBASE.cdb");
+
+const TInt KNumTestContacts=20;
+
+LOCAL_C void CreateDatabaseL()
+//
+// Create a database in a store
+//
+ {
+ CntTest->TestLockServerCloses();
+ CntTest->CreateDatabaseL();
+ CntTest->TestLockServerExists();
+ CntTest->DeleteAllTemplateFieldsL();
+ CntTest->CloseDatabase();
+ CntTest->TestLockServerCloses();
+ }
+
+LOCAL_C void OpenDatabaseL()
+//
+// Open an existing database in a store
+//
+ {
+ CContactDatabase* db=CContactDatabase::OpenL(KDatabaseFileName);
+ CntTest->TestLockServerExists();
+ delete db;
+ CntTest->TestLockServerCloses();
+ }
+
+LOCAL_C TPtrC Name(CContactItem& aItem)
+ {
+ CContactItemFieldSet& fieldSet=aItem.CardFields();
+ const TInt pos=fieldSet.Find(KUidContactFieldFamilyName);
+ if (pos==KErrNotFound)
+ return _L("");
+ return fieldSet[pos].TextStorage()->Text();
+ }
+
+LOCAL_C void SetDriveErrMsg()
+ {
+ test.Printf(_L("Error: For this test to run properly "));
+#if defined(__WINS__)
+ test.Printf(_L("_EPOC_DRIVE_D must be set up to create a valid drive D:\n"));
+#else
+ test.Printf(_L("a writable D: must exist\n"));
+#endif
+ test.Getch();
+ }
+
+LOCAL_C void TestDriveSettingL()
+ {
+ RFs fs;
+ test(fs.Connect()==KErrNone);
+
+ TDriveInfo driveInfo;
+ if (fs.Drive(driveInfo,EDriveD)!=KErrNone || driveInfo.iType==EMediaNotPresent || driveInfo.iMediaAtt&KMediaAttWriteProtected)
+ SetDriveErrMsg();
+ else
+ {
+ TInt err=fs.MkDirAll(_L("D:\\___t___\\"));
+ if (err!=KErrNone)
+ SetDriveErrMsg();
+ else
+ {
+ fs.RmDir(_L("D:\\___t___\\"));
+ TUint att;
+ TFileName name;
+ CContactDatabase::GetDefaultNameL(name);
+ if (fs.Att(name,att)==KErrNotFound)
+ {
+ CContactDatabase *createDb=CContactDatabase::CreateL();
+ delete createDb;
+ }
+ TDriveUnit driveUnit;
+ CContactDatabase::DatabaseDrive(driveUnit);
+ if (driveUnit!=TDriveUnit(EDriveC))
+ CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC));
+ //
+ // NEEDS _EPOC_DRIVE_D SET TO POINT TO A VALID DIRECTORY NAME
+ //
+ CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveD));
+ test(CContactDatabase::DatabaseDrive(driveUnit));
+ test(driveUnit==TDriveUnit(EDriveD));
+ // _EPOC_DRIVE_P Must not exist for the following test
+ TRAPD(err,CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveP)));
+ test(err!=KErrNone);
+ test(CContactDatabase::DatabaseDrive(driveUnit));
+ test(driveUnit==TDriveUnit(EDriveD));
+ //
+ CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC));
+ test(CContactDatabase::DatabaseDrive(driveUnit));
+ test(driveUnit==TDriveUnit(EDriveC));
+
+ //
+ TDriveUnit cColon(EDriveC);
+ CContactDatabase::SetDatabaseDriveL(cColon); // Leave it set to C: for further tests
+ test(CContactDatabase::DatabaseDrive(driveUnit));
+ test(driveUnit==cColon);
+ }
+ }
+ fs.Close();
+ CntTest->TestLockServerCloses();
+ }
+
+LOCAL_C void TestDeleteFileL()
+ {
+ TFileName defaultName;
+ CContactDatabase::GetDefaultNameL(defaultName);
+ test(CntTest->Fs().SetAtt(defaultName,0,KEntryAttReadOnly)==KErrNone);
+ CntTest->TestLockServerCloses();
+ CContactDatabase *db=CContactDatabase::ReplaceL();
+ delete db;
+ CntTest->TestLockServerCloses();
+ TUint att;
+ test(CntTest->Fs().Att(defaultName,att)==KErrNone);
+ CContactDatabase::DeleteDefaultFileL();
+ test(CntTest->Fs().Att(defaultName,att)==KErrNotFound);
+//
+ db=CContactDatabase::CreateL();
+ delete db;
+ test(CntTest->Fs().Att(defaultName,att)==KErrNone);
+ test(CntTest->Fs().SetAtt(defaultName,KEntryAttReadOnly,0)==KErrNone);
+ TRAPD(readOnlyErr,CContactDatabase::DeleteDefaultFileL());
+ test(readOnlyErr==KErrAccessDenied);
+ test(CntTest->Fs().SetAtt(defaultName,0,KEntryAttReadOnly)==KErrNone);
+ CContactDatabase::DeleteDefaultFileL();
+ }
+
+LOCAL_C void AddNewContactsL(CArrayFix<TContactItemId>* aIdList)
+//
+// Add KNumTestContacts new contacts with varying numbres of text fields
+//
+ {
+ CntTest->TestLockServerCloses();
+ CContactDatabase* db=CntTest->OpenDatabaseL();
+ CntTest->TestLockServerExists();
+ CContactCard* card=CContactCard::NewL();
+ CleanupStack::PushL(card);
+ TContactItemId id=KNullContactId;
+ TContactItemId newId=KNullContactId;
+ for (TInt ii=0;ii<KNumTestContacts;ii++)
+ {
+ TBuf<16> name;
+ name.Format(_L("NAME #%d"),ii);
+ SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,name,EFalse);
+ CContactItemField* field=CContactItemField::NewLC(KStorageTypeText);
+ card->AddFieldL(*field);
+ CleanupStack::Pop(); // field
+ newId=db->AddNewContactL(*card);
+ id=newId;
+ aIdList->AppendL(id);
+ }
+ CleanupStack::PopAndDestroy(); // card
+ CntTest->CloseDatabase();
+ CntTest->TestLockServerCloses();
+ }
+
+LOCAL_C void EditContactsL(CArrayFix<TContactItemId>* aIdList)
+//
+// Check then edit contact names
+//
+ {
+ CContactDatabase* db=CntTest->OpenDatabaseL();
+ TInt ii=0;
+ for (;ii<KNumTestContacts;ii++)
+ {
+ const TInt index=(*aIdList)[ii];
+ CContactItem* item=db->OpenContactL(index);
+ CleanupStack::PushL(item);
+ TBuf<16> name;
+ name.Format(_L("NAME #%d"),ii);
+ test(name==Name(*item));
+ name.Format(_L("NEW NAME #%d"),index);
+ SetNameL(*item,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,name,EFalse);
+ db->CommitContactL(*item);
+ CleanupStack::PopAndDestroy(); // item;
+ }
+ for (ii=0;ii<KNumTestContacts;ii++)
+ {
+ const TInt index=(*aIdList)[ii];
+ CContactItem* item=db->ReadContactL(index);
+ TBuf<16> name;
+ name.Format(_L("NEW NAME #%d"),index);
+ test(name==Name(*item));
+ delete item;
+ }
+ for (ii=0;ii<KNumTestContacts;ii++)
+ {
+ const TInt index=(*aIdList)[ii];
+ CContactItem* item=db->OpenContactLX(index);
+ delete item;
+ CleanupStack::PopAndDestroy(); // close
+ }
+
+ // try to read a non-existant contact
+ TRAPD(err,db->ReadContactL(KNullContactId));
+ test(err!=KErrNone);
+ // try to edit a contact that hasn't been opened
+ CContactItem* item=db->ReadContactLC((*aIdList)[0]);
+ TRAP(err,db->CommitContactL(*item));
+ CleanupStack::PopAndDestroy(); // item
+ test(err==KErrAccessDenied);
+ // try to close a non-existant contact
+ TRAP(err,db->CloseContactL(KNullContactId));
+ test(err==KErrNone); // test changed from 001 (using DBMS 043) - this test makes more sense anyway
+ // try to close a contact that hasn't been opened
+ TRAP(err,db->CloseContactL((*aIdList)[0]));
+ test(err==KErrNone);
+
+ CntTest->CloseDatabase();
+ }
+
+LOCAL_C void DeleteContactsL(CArrayFix<TContactItemId>* aIdList)
+//
+// Delete all contacts
+//
+ {
+ CContactDatabase* db=CntTest->OpenDatabaseL();
+
+ // try to delete a contact that is open
+ const TContactItemId id=(*aIdList)[0];
+ CContactItem* item=db->OpenContactL(id);
+ CleanupStack::PushL(item);
+ TRAPD(err,db->DeleteContactL(id));
+
+ CleanupStack::PopAndDestroy(); // item
+ test(err==KErrInUse);
+ db->CloseContactL(id);
+ // delete all contacts
+ for (TInt ii=0;ii<KNumTestContacts;ii++)
+ {
+ const TInt index=(*aIdList)[ii];
+ db->DeleteContactL(index);
+ }
+ // try to delete a non-existant contact
+ TRAP(err,db->DeleteContactL(KNullContactId));
+ test(err!=KErrNone);
+ CntTest->CloseDatabase();
+ }
+
+void TestErr(TInt aErr)
+ {
+ if (aErr!=KErrNone)
+ {
+ test.Printf(_L("Error %d\n"),aErr);
+ test(EFalse);
+ }
+ }
+
+/**
+
+@SYMTestCaseID PIM-T-DBASE-0001
+
+*/
+
+
+void DoTestsL()
+ {
+ test.Start(_L("@SYMTESTCaseID:PIM-T-DBASE-0001 T_DBASE"));
+
+ test.Next(_L("Test drive setting"));
+
+ test.Printf(_L("The following tests will delete your default contacts file"));
+ test.Printf(_L("Press to 'd' to run the test or any other key to skip them\n"));
+ if (test.Getch()=='d')
+ {
+ test.Next(_L("Set Drive"));
+
+ TRAPD(ret,TestDriveSettingL());
+ TestErr(ret);
+ test.Next(_L("Delete database file"));
+
+ TRAP(ret,TestDeleteFileL());
+ TestErr(ret);
+ }
+ test.Next(_L("Create new database"));
+
+ TRAPD(ret,CreateDatabaseL());
+ TestErr(ret);
+ test.Next(_L("Re-open existing database"));
+
+ TRAP(ret,OpenDatabaseL());
+ TestErr(ret);
+ CArrayFix<TContactItemId>* idList=new(ELeave) CArrayFixFlat<TContactItemId>(5);
+ CleanupStack::PushL(idList);
+ test.Next(_L("Add new contacts"));
+
+ TRAP(ret,AddNewContactsL(idList));
+ TestErr(ret);
+ test.Next(_L("Edit contacts"));
+
+ TRAP(ret,EditContactsL(idList));
+ TestErr(ret);
+ test.Next(_L("Delete contacts"));
+
+ TRAP(ret,DeleteContactsL(idList));
+ CleanupStack::PopAndDestroy(); // idList
+ TestErr(ret);
+ test.Next(_L("Delete empty database"));
+
+ CntTest->DeleteDatabaseL();
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ __UHEAP_MARK;
+
+ CntTest=new(ELeave) CCntTest;
+ CntTest->ConstructL(test,KDatabaseFileName);
+ TRAPD(err,DoTestsL());
+ CntTest->EndTestLib(err);
+
+ __UHEAP_MARKEND;
+
+ return KErrNone;
+ }