diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/T_DBASE.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/T_DBASE.CPP Tue Feb 02 10:12:17 2010 +0200 @@ -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 +#include +#include +#include +#include +#include +#include +#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* 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 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* aIdList) +// +// Check then edit contact names +// + { + CContactDatabase* db=CntTest->OpenDatabaseL(); + TInt ii=0; + for (;iiOpenContactL(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;iiReadContactL(index); + TBuf<16> name; + name.Format(_L("NEW NAME #%d"),index); + test(name==Name(*item)); + delete item; + } + for (ii=0;iiOpenContactLX(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* 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;iiDeleteContactL(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* idList=new(ELeave) CArrayFixFlat(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; + }