phonebookengines/contactsmodel/tsrc/T_DBASE.CPP
branchRCL_3
changeset 20 f4a778e096c2
parent 0 e686773b3f54
--- /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;
+    }