--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/T_SEC_CNTDBASE.CPP Fri Jun 11 13:29:23 2010 +0300
@@ -0,0 +1,2033 @@
+// Copyright (c) 2004-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 <e32base.h>
+
+#include <e32std.h>
+#include <f32file.h>
+#include <s32file.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfield.h>
+#include <cntfldst.h>
+#include <coreappstest/testserver.h>
+#include "T_UTILS.H"
+
+_LIT(KTestName,"T_SEC_CNTDBASE");
+
+#include "testhelpers.h"
+
+LOCAL_C RFs fileServer;
+LOCAL_C TDriveList drives;
+LOCAL_C const TInt NoDrives = 2;
+LOCAL_C TInt driveIdx=0;
+LOCAL_C TInt NoDatabases=0;
+LOCAL_C TInt NoFileOnPreviousDrive=0;
+const TInt KNumTestContacts=20;
+LOCAL_C TFileName KNewCntTestFile(_L("Contacts.cbrchar"));
+
+
+LOCAL_C TDriveUnit driveArray[NoDrives];
+LOCAL_C CContactDatabase* db;
+
+
+_LIT(KNoFiles,"NoFiles");
+_LIT(KContactsFilename,"Contacts.cdb");
+
+// These defines and the Local method DrivesOfMediaTypeL should be moved to the
+// Agenda Test Library (agntestlibrary)
+_LIT(KMediaNotPresent, "MediaNotPresent");
+_LIT(KMediaUnknown, "MediaUnknown");
+_LIT(KMediaFloppy, "MediaFloppy");
+_LIT(KMediaHardDisk, "MediaHardDisk");
+_LIT(KMediaCdRom, "MediaCdRom");
+_LIT(KMediaRam, "MediaRam");
+_LIT(KMediaFlash, "MediaFlash");
+_LIT(KMediaRom, "MediaRom");
+_LIT(KMediaRemote, "MediaRemote");
+_LIT(KMediaNANDFlash, "MediaNANDFlash");
+TPtrC MediaTypes[] =
+ { KMediaNotPresent(),KMediaUnknown(),KMediaFloppy(),KMediaHardDisk(),KMediaCdRom(),
+ KMediaRam(),KMediaFlash(),KMediaRom(),KMediaRemote(),KMediaNANDFlash()};
+_LIT(KCdbSecure,"c:T_Sec_Cntdbase.cdb");
+
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+_LIT(KCdbPrivate,"c:\\private\\10003A73\\SQLite__T_Sec_Cntdbase.cdb");
+#else
+_LIT(KCdbPrivate,"c:\\private\\10003A73\\T_Sec_Cntdbase.cdb");
+#endif
+
+_LIT(KCntNameFormat, "NAME #%d");
+_LIT(KCntNewNameFormat, "NEW NAME #%d");
+
+LOCAL_C CArrayFix<TInt>* DrivesOfMediaTypeL( TMediaType aMedia, RFs& aFs, TBool aStopAtFirst )
+ {
+ TDriveInfo info;
+ TInt error = KErrNone;
+ TDriveList driveList;
+ CArrayFix<TInt>* array = new (ELeave) CArrayFixFlat<TInt>(10);
+ CleanupStack::PushL( array );
+ error = aFs.DriveList(driveList);
+ User::LeaveIfError(error);
+ for(TInt drive=EDriveA;drive<=EDriveZ;drive++)
+ {
+ if( driveList[drive] )
+ {
+ error = aFs.Drive(info, drive);
+ if (error != KErrNone)
+ {
+ continue;
+ }
+ if ( info.iType == aMedia )
+ {
+ array->AppendL( drive );
+ if( aStopAtFirst )
+ { // return if only the first drive of the required type.
+ break;
+ }
+ }
+ }
+ }
+ CleanupStack::Pop( array );
+ return array;
+ }
+
+/**
+ MMCDriveL
+
+ Determines a list of drives of type EMediaHardDisk.
+ The first drive in this list is returned and used
+ by the rest of the test.
+
+ NOTE: if this test is running on ARMv5, an MMC card
+ must be present otherwise the test fails.
+
+*/
+LOCAL_C TDriveUnit MMCDriveL()
+ {
+ CArrayFix<TInt>* drives = DrivesOfMediaTypeL(EMediaHardDisk,fileServer,EFalse);
+ CleanupStack::PushL(drives);
+ TInt drivesTInt = drives->Count();
+ if( drivesTInt )
+ {
+ test.Printf(_L("Found the following drives of type %S\n"),&MediaTypes[EMediaHardDisk]);
+ for(TInt i=0;i<drivesTInt;i++)
+ {
+ TDriveUnit drv(drives->At(i));
+ TPtrC drvPtr(drv.Name());
+ test.Printf(_L("%S\n"),&drvPtr);
+ }
+ }
+ else
+ {
+ test.Printf( _L("No drives found of type %S\n"),&MediaTypes[EMediaHardDisk]);
+ User::LeaveIfError(KErrHardwareNotAvailable);
+ }
+ TDriveUnit mmcDrive(drives->At(0));
+ CleanupStack::PopAndDestroy(drives);
+ // Use the first drive in the list for the rest of the test.
+ return mmcDrive;
+ }
+
+/**
+ AddNewContactsL
+ Add KNumTestContacts new contacts with varying numbres of text fields
+
+ @param aIdList
+*/
+LOCAL_C void AddNewContactsL(CArrayFix<TContactItemId>* aIdList)
+ {
+ 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(KCntNameFormat, 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
+ }
+
+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();
+ }
+
+/**
+ EditContactsL
+ Check then edit contact names
+
+ @param aIdList
+*/
+LOCAL_C void EditContactsL(CArrayFix<TContactItemId>* aIdList)
+ {
+ TInt ii=0;
+ test.Next(_L("Change all contact names"));
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ for (;ii<aIdList->Count();++ii)
+#else
+ for (;ii<KNumTestContacts;ii++)
+#endif
+ {
+ const TInt index=(*aIdList)[ii];
+ // exercise OpenContactLX api, Commit the change and Pop the lock record
+ CContactItem* item=db->OpenContactLX(index);
+ CleanupStack::PushL(item);
+ TBuf<16> name;
+ name.Format(KCntNameFormat, ii); // "NAME %d"
+ test(name==Name(*item));
+ name.Format(KCntNewNameFormat, index); // "NEW NAME %d"
+ SetNameL(*item,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,name,EFalse);
+ db->CommitContactL(*item);
+ CleanupStack::PopAndDestroy(); // item;
+ CleanupStack::Pop(); // lock record
+ }
+ test.Next(_L("Check new contact names"));
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ for (;ii<aIdList->Count();++ii)
+#else
+ for (ii=0;ii<KNumTestContacts;ii++)
+#endif
+ {
+ const TInt index=(*aIdList)[ii];
+ CContactItem* item=db->ReadContactL(index);
+ TBuf<16> name;
+ name.Format(KCntNewNameFormat, index);
+ test(name==Name(*item));
+ delete item;
+ }
+ test.Next(_L("Regression test for Contact locking/unlocking (DEF067162)"));
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ for (;ii<aIdList->Count();++ii)
+#else
+ for (ii = 0; ii < KNumTestContacts; ii++)
+#endif
+ {
+ // open 2 different items
+ const TInt index1 = (*aIdList)[ii];
+ const TInt index2 = (*aIdList)[(ii + 1) % KNumTestContacts];
+ CContactItem* item1 = db->OpenContactLX(index1);
+ CleanupStack::PushL(item1);
+ CContactItem* item2 = db->OpenContactLX(index2);
+ delete item2;
+ CleanupStack::PopAndDestroy(); // destroy lock = close item2
+ CleanupStack::PopAndDestroy(item1);
+ CleanupStack::PopAndDestroy(); // destroy lock = close item1
+
+ // re-open 1st item - should not be locked
+ // OpenContactLX() and PopAndDestroy()
+ item1 = db->OpenContactLX(index1);
+ delete item1;
+ CleanupStack::PopAndDestroy(); // destroy lock = close item1
+
+ // re-open 2nd item - should not be locked
+ // OpenContactL() and CloseContactL()
+ item2 = db->OpenContactL(index2);
+ CleanupStack::PushL(item2);
+ db->CloseContactL(index2); // explicitly close item 2
+ CleanupStack::PopAndDestroy(item2);
+ }
+
+
+ // try to read a non-existant contact
+ TRAPD(err,db->ReadContactL(KNullContactId));
+ TESTTRUEL(err!=KErrNone);
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ if(aIdList->Count() > 0)
+ {
+#endif
+ // try to edit a contact that hasn't been opened
+ CContactItem* item=db->ReadContactLC((*aIdList)[0]);
+ TRAP(err,db->CommitContactL(*item));
+ CleanupStack::PopAndDestroy(); // item
+ TESTTRUEL(err==KErrAccessDenied);
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ }
+#endif
+ // try to close a non-existant contact
+ TRAP(err,db->CloseContactL(KNullContactId));
+ TESTTRUEL(err==KErrNone); // test changed from 001 (using DBMS 043) - this test makes more sense anyway
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ if(aIdList->Count() > 0)
+ {
+#endif
+ // try to close a contact that hasn't been opened
+ TRAP(err,db->CloseContactL((*aIdList)[0]));
+ TESTTRUEL(err==KErrNone);
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ }
+#endif
+ }
+
+/**
+ Gets the list of installed drives and then stores the first 2
+ in the array drives for use within the test. The second entry
+ in this array should use method MMCDriveL as used in T_Sec_Tidy
+ and T_Sec_ListAgendaFile.
+*/
+LOCAL_C void DrivesL()
+ {
+ driveArray[0] = EDriveC;
+ driveArray[1] = MMCDriveL();
+
+ // Tell the user which drive has been chosen.
+ TPtrC drv( driveArray[1].Name() );
+ test.Printf(_L("%S chosen for the test.\n"),&drv);
+ }
+
+/**
+ Ensure that the filename conforms to the correct form.
+ The analysis functionality is dependent on the flags:
+ SYMBIAN_SECURE_DBMS. Unlike Agenda, in contacts as GetDefaultNameL
+ existed before platsec there is legacy functionality that must
+ maintained. In not SYMBIAN_SECURE_DBMS the full path must be checked
+ for. The default filename exits on the current drive.
+ @param reference to the default file name.
+ @return ETrue if the default filename is correctly formed.
+*/
+LOCAL_C TBool CheckDefaultContactsFilename( TFileName& aFilename )
+ {
+ _LIT(KDriveFailure, "Incorrect Drive Specified" );
+ _LIT(KPathFailure, "Incorrect No Path expected" );
+ _LIT(KFilenameFailure, "Incorrect Filename" );
+
+ TDriveUnit lDriveUnit;
+
+ // Get the current drive.
+ CContactDatabase::DatabaseDrive(lDriveUnit);
+
+ TParse filename;
+ filename.Set( aFilename, NULL, NULL);
+
+ // Check that the drive letter exists. No drive is an error
+ // in both modes.
+ if( filename.Drive() != lDriveUnit.Name())
+ {
+ test.Printf(KDriveFailure);
+ return EFalse;
+ }
+ if( filename.Path().Length())
+ {
+ test.Printf(KPathFailure);
+ return EFalse;
+ }
+ if( filename.NameAndExt().CompareF(KContactsFilename()))
+ {
+ test.Printf(KFilenameFailure);
+ return EFalse;
+ }
+ return ETrue;
+ }
+
+/**
+ CheckNotDefaultContactsFiles
+
+ Uses all the default database related API's to ensure that
+ they all return negative, now that the default db has been
+ removed.
+ @return ETrue if a default database cannot be found on the
+ default drive.
+*/
+LOCAL_C TBool CheckNotDefaultContactsFiles()
+ {
+ // The default database on the current default drive.(3)
+ // The default database on the specific drive. (4)
+ TBool response = EFalse;
+ TRAPD(err, response = CContactDatabase::DefaultContactDatabaseExistsL());
+ if( !(err == KErrNone && !response ))
+ {
+ return EFalse;
+ }
+
+ // Use the default database, as we have confirmed previously
+ // this shouldn't exits. This is dependent upon the Security mode.
+ TFileName filename;
+ filename.Copy(driveArray[driveIdx].Name());
+ filename.Append(KContactsFilename);
+ // (5)
+ TRAP(err, response = CContactDatabase::ContactDatabaseExistsL(filename));
+ if( !(err == KErrNone && !response ))
+ {
+ return EFalse;
+ }
+
+ // None of the API return true, no default Contact DB files were detected.
+ return ETrue;
+ }
+
+
+/**
+ CheckCntFilesL
+
+ Ensure that cntFiles contains the list of correct files.
+ The analysis functionality is dependent on the flags:
+ _SECURE_DATA_ and _UNSECURE_DATA_
+ Determines the list of agn files, checks for the existance of aFilename
+ within the list of aNum names.
+
+ @param aNum number of expected files.
+ @param aFilename a reference to an expected filename.
+ @return aFileExpectedToExist ETrue if the list contains the expected files.
+*/
+LOCAL_C TBool CheckCntFilesL( TInt aNum, const TDesC& aFilename , TBool aFileExpectedToExist = ETrue)
+ {
+ // Data bases on all drives.
+ CDesCArray* cntFiles = CContactDatabase::ListDatabasesL();
+ CleanupStack::PushL(cntFiles);
+ // Data bases on the specified drive.
+ CDesCArray* cntFilesFromDrive = CContactDatabase::ListDatabasesL(driveArray[driveIdx]);
+ CleanupStack::PushL(cntFilesFromDrive);
+
+ TInt DriveZCount=0;
+ // Determine files on drive Z:
+
+ if( !cntFiles->Count() && !cntFilesFromDrive->Count() && !aNum )
+ {
+ CleanupStack::PopAndDestroy( cntFilesFromDrive );
+ CleanupStack::PopAndDestroy( cntFiles );
+ return !aFileExpectedToExist;
+ }
+ // Ensure that all drive contents add up.
+ if( cntFiles->Count() != NoFileOnPreviousDrive + DriveZCount + cntFilesFromDrive->Count() )
+ {
+ CleanupStack::PopAndDestroy(cntFilesFromDrive);
+ CleanupStack::PopAndDestroy(cntFiles);
+ return !aFileExpectedToExist;
+ }
+ TFileName filename;
+ // In un-secure mode if aFilename contains no path, then
+ // a backslash must be included between the drive and the
+ // filename. This because when asked to create filename
+ // "c:filename" ListDatabasesL returns the name "c:\filename"
+ // hence a backslash is inserted for comparison purposes.
+ TParse file;
+ file.Set(aFilename,NULL,NULL);
+
+ filename.Copy(aFilename);
+
+ // Check that aFilename is in the list.
+ TBool retValue = ETrue;
+ if (!aFileExpectedToExist)
+ {
+ // File is not expected to exist. So return EFalse if we find it.
+ for(TInt i=0;i<cntFilesFromDrive->Count();i++)
+ {
+ TFileName driveList_1 = (*cntFilesFromDrive)[i];
+ if(!driveList_1.CompareF(filename))
+ {
+ CleanupStack::PopAndDestroy(cntFilesFromDrive);
+ CleanupStack::PopAndDestroy(cntFiles);
+ return !retValue;
+ }
+ }
+ retValue = EFalse;
+ }
+ else
+ {
+ // File is expected to exist. We should find it in both lists.
+ // return EFalse if not found in this list.
+ TBool fileFound = EFalse;
+ // does file exist in list from drive
+ for(TInt j=0;j<cntFilesFromDrive->Count();j++)
+ {
+ TFileName driveList_2 = (*cntFilesFromDrive)[j];
+ if(!driveList_2.CompareF(filename))
+ {
+ fileFound = ETrue;
+ break;
+ }
+ }
+
+ if(!fileFound)
+ {
+ CleanupStack::PopAndDestroy(cntFilesFromDrive);
+ CleanupStack::PopAndDestroy(cntFiles);
+ return !retValue;
+ }
+ }
+
+ // We found the file in cntFilesFromDrive
+ // Does file exist in list from all drives
+ for(TInt k=0;k<cntFiles->Count();k++)
+ {
+ TFileName driveList_3 = (*cntFiles)[k];
+ if(!driveList_3.CompareF(filename))
+ {
+ CleanupStack::PopAndDestroy(cntFilesFromDrive);
+ CleanupStack::PopAndDestroy(cntFiles);
+ return retValue;
+ }
+ }
+ CleanupStack::PopAndDestroy(cntFilesFromDrive);
+ CleanupStack::PopAndDestroy(cntFiles);
+ // File was not found so return false.
+ return !retValue;
+ }
+
+/**
+ This API uses all the Contacts API's relating to identification
+ of the default file.
+*/
+LOCAL_C TBool DefaultDatabaseL()
+ {
+ // The default database on the current default drive.
+ if(!CContactDatabase::DefaultContactDatabaseExistsL())
+ return EFalse;
+
+ // Use the default database, as we have confirmed previously
+ // this shouldn't exits. This is dependent upon the Security mode.
+ TFileName filename;
+ filename.Copy(driveArray[driveIdx].Name());
+ filename.Append(KContactsFilename);
+ if(!CContactDatabase::ContactDatabaseExistsL(filename))
+ return EFalse;
+
+ // None of the API return true, no files were detected.
+ return ETrue;
+
+ }
+
+/**
+ This function uses Five API's available to determine the existance
+ of database files. These are (1)ListDatabasesL(),(2)ListDatabasesL(TDriveUnit&)
+ (3)DefaultContactDatabaseExistsL(),(4)DefaultContactDatabaseExistsL(TDriveUnit&)
+ and (5)ContactDatabaseExistsL(const TDesC&). All five should confirm that there
+ are no contacts database files.
+*/
+LOCAL_C TBool CheckNoDatabaseFilesL()
+ {
+
+ TFileName filename;
+ TBool retVal = EFalse;
+ filename.Copy(driveArray[driveIdx].Name());
+
+ filename.Append(KContactsFilename);
+
+ retVal = CheckCntFilesL(NoDatabases, filename , EFalse);
+
+ if (retVal == EFalse)
+ return retVal;
+ else
+ return CheckNotDefaultContactsFiles();
+ }
+
+/**
+ Tidy
+
+ This function removes any files that may exist as a result of a
+ previous run of the T_Sec_cntdbase test.
+ The configuration of this operation is dependent upon __SECURE_DATA_
+*/
+
+LOCAL_C void Tidy()
+ {
+ TFileName addedFile;
+ CDesCArray* driveFiles = NULL;
+ for(TInt i =0;i<NoDrives; i++ )
+ {
+ addedFile.Copy(driveArray[i].Name());
+ addedFile.Append(KNewCntTestFile);
+ TRAPD( err, CContactDatabase::SetDatabaseDriveL(driveArray[i], EFalse));
+ TRAP( err, CContactDatabase::DeleteDefaultFileL());
+ TRAP(err, CContactDatabase::DeleteDatabaseL(addedFile));
+ }
+
+ TRAPD(ret, driveFiles = CContactDatabase::ListDatabasesL());
+ for(TInt j =0;j<driveFiles->Count();j++)
+ {
+ CContactDatabase::DeleteDatabaseL((*driveFiles)[j]);
+ }
+ if( ret == KErrNone )
+ {
+ delete driveFiles;
+ }
+ }
+
+// support CreateL and ReplaceL OOM tests
+LOCAL_C TInt CheckDatabaseIsAbsentOrOpenable(TBool aDeleteDatabase=EFalse)
+ {
+ // CreateL or ReplaceL failed, so database can either be absent or it must Open
+ TBool exists(EFalse);
+
+ TRAPD(err, exists = CContactDatabase::DefaultContactDatabaseExistsL());
+
+ if (err)
+ {
+ test.Printf(_L("CheckDatabaseIsAbsentOrOpenable - DefaultContactDatabaseExistsL error %d"), err);
+ }
+
+ if(exists)
+ {
+ CContactDatabase* dbaseOpen = NULL;
+
+ TRAP(err, dbaseOpen = CContactDatabase::OpenL());
+
+ if (err)
+ {
+ test.Printf(_L("CheckDatabaseIsAbsentOrOpenable - OpenL error %d"), err);
+ }
+
+ if (dbaseOpen != NULL)
+ {
+ // database exists, so it should have opened
+ delete dbaseOpen;
+ }
+
+ if (aDeleteDatabase && (err == KErrNone))
+ {
+ // for client side CreateL OOM test
+ CContactDatabase::DeleteDefaultFileL();
+ }
+ }
+
+ return err;
+ }
+
+
+// Client Side OOM Tests //
+LOCAL_C TBool ReplaceLOOM_ClientSideL()
+ {
+ test.Next(_L("ReplaceL client side OOM test.\n"));
+
+ CContactDatabase* dBase = NULL;
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ TRAP(ret, dBase = CContactDatabase::ReplaceL());
+ if( ret == KErrNone )
+ {
+ delete dBase;
+ }
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+
+ if (ret != KErrNone)
+ {
+ if(ret != KErrNoMemory)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL(ret == KErrNoMemory);
+ }
+
+ TESTNOERRL(CheckDatabaseIsAbsentOrOpenable());
+ }
+ }
+
+ // Remove the default database, created by Replace.
+ CContactDatabase::DeleteDefaultFileL();
+ test.Printf(_L("\n"));
+ return ETrue;
+ }
+
+
+LOCAL_C TBool ContactDatabaseExistsLOOM_ClientSideL()
+ {
+ test.Next(_L("ContactDatabaseExistsL client side OOM test.\n"));
+ _LIT(KContactDBase,"c:ContactDBase");
+
+ TBool dExists = EFalse;
+ // First create a database to be detected.
+ CContactDatabase* dBase = NULL;
+ TRAPD(err, dBase = CContactDatabase::CreateL(KContactDBase));
+
+ // need the file to be present to test if it exists
+ TESTTRUEL((err == KErrNone) || (err == KErrAlreadyExists));
+ if (err == KErrNone)
+ {
+ delete dBase;
+ }
+
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ TRAP(ret, dExists = CContactDatabase::ContactDatabaseExistsL(KContactDBase));
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+
+ if (ret != KErrNoMemory && ret != KErrNone)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ }
+ if( ret == KErrNone && dExists )
+ {
+ // Remove the database.
+ CContactDatabase::DeleteDatabaseL(KContactDBase);
+ }
+ test.Printf(_L("\n"));
+ return ETrue;
+ }
+
+LOCAL_C TBool DefaultContactDatabaseExistsLOOM_ClientSideL()
+ {
+ test.Next(_L("DefaultContactDatabaseExistsL client side OOM test.\n"));
+
+ TBool dExists = EFalse;
+ // First create a default database.
+ CContactDatabase* dBase = NULL;
+ TRAPD( err, dBase = CContactDatabase::CreateL());
+ // need the file to be present to test if it exists
+ TESTTRUEL((err == KErrNone) || (err == KErrAlreadyExists));
+ if (err == KErrNone)
+ {
+ delete dBase;
+ }
+
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ TRAP(ret, dExists = CContactDatabase::DefaultContactDatabaseExistsL());
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+
+ if (ret != KErrNoMemory && ret != KErrNone)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ }
+ if( ret == KErrNone && dExists )
+ {
+ // Remove the default database
+ CContactDatabase::DeleteDefaultFileL();
+ }
+ test.Printf(_L("\n"));
+ return ETrue;
+ }
+
+LOCAL_C TBool GetDefaultNameLOOM_ClientSideL()
+ {
+ test.Next(_L("GetDefaultNameL client side OOM test.\n"));
+ TFileName filename;
+
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ TRAP(ret, CContactDatabase::GetDefaultNameL(filename));
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+
+ if (ret != KErrNoMemory && ret != KErrNone)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ }
+ test.Printf(_L("\n"));
+ return ETrue;
+ }
+
+LOCAL_C TBool DeleteDatabaseLOOM_ClientSideL()
+ {
+ test.Next(_L("DeleteDatabaseL client side OOM test.\n"));
+ _LIT(KTestFile,"C:TestFile");
+ CContactDatabase* dBase = NULL;
+ // Create a file to delete.
+ TRAPD(err, dBase = CContactDatabase::CreateL(KTestFile));
+ // need the file to be present to delete it
+ TESTTRUEL((err == KErrNone) || (err == KErrAlreadyExists));
+ if (err == KErrNone)
+ {
+ delete dBase;
+ }
+
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ TRAP(ret, CContactDatabase::DeleteDatabaseL(KTestFile));
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+
+ if (ret != KErrNoMemory && ret != KErrNone)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ }
+ test.Printf(_L("\n"));
+ // Check to see that database has been removed.
+ TBool dExists = EFalse;
+ TRAP(ret, dExists = CContactDatabase::ContactDatabaseExistsL(KTestFile));
+ TESTNOERRL(ret);
+
+ return !dExists;
+ }
+
+LOCAL_C TBool DeleteDefaultFileLOOM_ClientSideL()
+ {
+ test.Next(_L("DeleteDefaultFileL client side OOM test.\n"));
+
+ CContactDatabase* dBase = NULL;
+ TRAPD( err, dBase = CContactDatabase::CreateL());
+ // need the file to be present to delete it
+ TESTTRUEL((err == KErrNone) || (err == KErrAlreadyExists));
+ if (err == KErrNone)
+ {
+ delete dBase;
+ }
+
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ TRAP(ret, CContactDatabase::DeleteDefaultFileL());
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+
+ if (ret != KErrNoMemory && ret != KErrNone)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ }
+ test.Printf(_L("\n"));
+ // Ensure that the default File has been removed.
+ TBool dExists = EFalse;
+ TRAP(ret, dExists = CContactDatabase::DefaultContactDatabaseExistsL());
+ TESTNOERRL(ret);
+
+ return !dExists;
+ }
+
+LOCAL_C TBool CreateLOOM_ClientSideL()
+ {
+ test.Next(_L("CreateL client side OOM test.\n"));
+
+ TRAPD(err, CContactDatabase::DeleteDefaultFileL());
+ TESTTRUEL((err == KErrNone) || (err == KErrNotFound));
+
+ CContactDatabase* dBase = NULL;
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+
+ TRAP(ret, dBase = CContactDatabase::CreateL());
+ if( ret == KErrNone )
+ {
+ delete dBase;
+ dBase=NULL;
+ }
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+ if (ret != KErrNone)
+ {
+ if(ret != KErrNoMemory)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL(ret == KErrNoMemory);
+ }
+
+ TESTNOERRL(CheckDatabaseIsAbsentOrOpenable(ETrue));
+ }
+ }
+
+ //cleanup
+ if(CContactDatabase::DefaultContactDatabaseExistsL())
+ {
+ CContactDatabase::DeleteDefaultFileL();
+ }
+
+ test.Printf(_L("\n"));
+ return ETrue;
+ }
+
+LOCAL_C TBool OpenLOOM_ClientSideL()
+ {
+ test.Next(_L("OpenL client side OOM test.\n"));
+
+ // Create a default database.
+ CContactDatabase* dBase = NULL;
+ TRAPD( err, dBase = CContactDatabase::CreateL());
+ // need the file to be present to open it
+ TESTTRUEL((err == KErrNone) || (err == KErrAlreadyExists));
+ if (err == KErrNone)
+ {
+ delete dBase;
+ }
+
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ TRAP(ret, dBase = CContactDatabase::OpenL());
+ if( ret == KErrNone )
+ {
+ delete dBase;
+ }
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+
+ if (ret != KErrNoMemory && ret != KErrNone)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+
+ }
+ test.Printf(_L("\n"));
+ // Remove the default file we just opened.
+ TRAP( ret, CContactDatabase::DeleteDefaultFileL());
+
+ return ETrue;
+ }
+
+LOCAL_C TBool ListDatabasesLOOM_ClientSideL()
+ {
+ test.Next(_L("ListDatabasesL client side OOM test.\n"));
+
+ CDesCArray* driveFiles = NULL;
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone )
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ TRAP(ret, driveFiles = CContactDatabase::ListDatabasesL());
+ if( ret == KErrNone )
+ {
+ delete driveFiles;
+ }
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+
+ if (ret != KErrNoMemory && ret != KErrNone)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ }
+ test.Printf(_L("\n"));
+ return ETrue;
+ }
+
+#ifdef _DEBUG
+LOCAL_C TBool CreateLOOM_ServerSideL()
+ {
+ test.Next(_L("CreateL Server side OOM test.\n"));
+
+ _LIT(KTemporaryFile,"C:TempFile");
+
+ CContactDatabase* dBase = NULL;
+ CContactDatabase* newDataBase = NULL;
+
+ // First create an instance of CContactDatabase to be used to call
+ // Server side heap methods.
+ TRAPD( err, dBase = CContactDatabase::ReplaceL(KTemporaryFile));
+ // need the file to be present for server connection
+ TESTTRUEL((err == KErrNone) && (dBase != NULL));
+ CleanupStack::PushL(dBase);
+
+ TRAP_IGNORE(CContactDatabase::DeleteDefaultFileL());
+
+ TInt allocCells(0);
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+
+ while(ret != KErrNone)
+ {
+ failAt++;
+
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("%d,"), failAt);
+ }
+
+ dBase->SetCntServerHeapFailure(RHeap::EDeterministic, failAt);
+ allocCells = dBase->CntServerResourceCount(); //__UHEAP_MARK;
+
+ TRAP(ret, newDataBase = CContactDatabase::CreateL());
+ if( ret == KErrNone )
+ {
+ delete newDataBase;
+ }
+
+ dBase->SetCntServerHeapFailure(RHeap::ENone, 1);
+
+ if (ret != KErrNone)
+ {
+ if (ret == KErrNoMemory)
+ {
+ TInt allocLatest = dBase->CntServerResourceCount();
+ if (allocLatest != allocCells)
+ {
+ #ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ if(allocLatest != allocCells -1)
+ #endif
+ {
+ test.Printf(_L("iteraton %d failed - initial alloc cells = %d, alloc Latest = %d\n"),
+ failAt, allocCells, allocLatest);
+ TESTVALUEL(allocLatest, allocCells); //__UHEAP_MARKEND;
+ }
+ }
+ }
+ else
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+
+ TESTNOERRL(CheckDatabaseIsAbsentOrOpenable(ETrue));
+ }
+ }
+
+ CleanupStack::PopAndDestroy(dBase);
+ // This test has created two files; a default and KTemporaryFile
+ // both must be deleted.
+ TRAP( ret, CContactDatabase::DeleteDefaultFileL());
+ TRAP( ret, CContactDatabase::DeleteDatabaseL( KTemporaryFile ));
+
+ return ETrue;
+ }
+
+LOCAL_C TBool DeleteDatabaseLOOM_ServerSideL()
+ {
+ test.Next(_L("DeleteDatabaseL Server side OOM test.\n"));
+
+ _LIT(KFileToDelete,"c:FileToDelete");
+ CContactDatabase* dBase = NULL;
+ CContactDatabase* dBaseForFile = NULL;
+
+ //
+ // create db file for delete test
+ TRAPD( err, dBaseForFile = CContactDatabase::CreateL(KFileToDelete));
+ TESTTRUEL((err == KErrNone) || (err == KErrAlreadyExists));
+ if (err == KErrNone)
+ {
+ // Close the file
+ delete dBaseForFile;
+ }
+
+ // Create Default dBase to be used by ServerSide OOM Calls.
+ TRAP( err, dBase = CContactDatabase::ReplaceL());
+ // need the file to be present for server connection
+ TESTTRUEL(err == KErrNone);
+ CleanupStack::PushL(dBase);
+
+
+ TInt allocCells(0);
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone)
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+ dBase->SetCntServerHeapFailure(RHeap::EDeterministic, failAt);
+ allocCells = dBase->CntServerResourceCount(); //__UHEAP_MARK;
+
+ TRAP(ret, CContactDatabase::DeleteDatabaseL(KFileToDelete));
+
+ //__SRVHEAP_RESET;
+ dBase->SetCntServerHeapFailure(RHeap::ENone, 1);
+
+ if (ret == KErrNoMemory)
+ {
+ TInt allocLatest = dBase->CntServerResourceCount();
+
+ if (allocLatest != allocCells)
+ {
+ test.Printf(_L("iteraton %d failed - initial alloc cells = %d, alloc Latest = %d\n"),
+ failAt, allocCells, allocLatest);
+ TESTVALUEL(allocLatest, allocCells); //__UHEAP_MARKEND;
+ }
+ }
+ else if ( ret != KErrNone )
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ }
+ CleanupStack::PopAndDestroy(dBase);
+ // Delete default file.
+ TRAP(ret, CContactDatabase::DeleteDefaultFileL());
+
+ return ETrue;
+ }
+
+LOCAL_C TBool DefaultContactDatabaseExistsLOOM_ServerSideL()
+ {
+ test.Next(_L("DefaultContactDatabaseExistsL Server side OOM test.\n"));
+
+ CContactDatabase* dBase = NULL;
+
+ TRAPD( err, dBase = CContactDatabase::ReplaceL());
+ // need the file to be present for server connection
+ TESTTRUEL((err == KErrNone) && (dBase != NULL));
+ CleanupStack::PushL(dBase);
+
+ TInt allocCells(0);
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone)
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+ dBase->SetCntServerHeapFailure(RHeap::EDeterministic, failAt);
+ allocCells = dBase->CntServerResourceCount(); //__UHEAP_MARK;
+
+ TRAP(ret, CContactDatabase::DefaultContactDatabaseExistsL());
+
+ //__SRVHEAP_RESET;
+ dBase->SetCntServerHeapFailure(RHeap::ENone, 1);
+
+ if (ret == KErrNoMemory)
+ {
+ TInt allocLatest = dBase->CntServerResourceCount();
+
+ if (allocLatest != allocCells)
+ {
+ test.Printf(_L("iteraton %d failed - initial alloc cells = %d, alloc Latest = %d\n"),
+ failAt, allocCells, allocLatest);
+ TESTVALUEL(allocLatest, allocCells); //__UHEAP_MARKEND;
+ }
+
+ }
+ else if ( ret != KErrNone )
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone)); //Bad leaving code
+ }
+ }
+ CleanupStack::PopAndDestroy(dBase);
+ // Check to see that database has been removed.
+ TRAP_IGNORE(CContactDatabase::DeleteDefaultFileL());
+
+ return ETrue;
+ }
+
+
+LOCAL_C TBool OpenLOOM_ServerSideL()
+ {
+ test.Next(_L("OpenL Server side OOM test.\n"));
+
+ CContactDatabase* dBase = NULL;
+ CContactDatabase* dBaseToOpen = NULL;
+
+ // Create the default contacts file.
+ TRAPD(err, dBase = CContactDatabase::ReplaceL());
+ // need the file to be present for server connection
+ TESTTRUEL((err == KErrNone) && (dBase != NULL));
+ CleanupStack::PushL(dBase);
+
+ TInt allocCells(0);
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone)
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+ dBase->SetCntServerHeapFailure(RHeap::EDeterministic, failAt);
+ allocCells = dBase->CntServerResourceCount(); //__UHEAP_MARK;
+
+ TRAP(ret, dBaseToOpen = CContactDatabase::OpenL());
+ if( ret == KErrNone )
+ {
+ delete dBaseToOpen;
+ }
+
+ //__SRVHEAP_RESET;
+ dBase->SetCntServerHeapFailure(RHeap::ENone, 1);
+
+ if (ret == KErrNoMemory)
+ {
+ TInt allocLatest = dBase->CntServerResourceCount();
+
+ if (allocLatest != allocCells)
+ {
+ #ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ if(allocLatest != allocCells + 1)
+ #endif
+ {
+ test.Printf(_L("iteraton %d failed - initial alloc cells = %d, alloc Latest = %d\n"),
+ failAt, allocCells, allocLatest);
+ TESTVALUEL(allocLatest, allocCells); //__UHEAP_MARKEND;
+ }
+ }
+ }
+ else if ( ret != KErrNone )
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+
+ }
+ CleanupStack::PopAndDestroy(dBase);
+ // Remove the default.
+ TRAP(ret, CContactDatabase::DeleteDefaultFileL());
+
+ return ETrue;
+ }
+
+LOCAL_C TBool ContactDatabaseExistsLOOM_ServerSideL()
+ {
+ test.Next(_L("ContactDatabaseExistsL Server side OOM test.\n"));
+
+ _LIT(KCntFileToExist,"C:FileToDetect");
+
+ CContactDatabase* dBase = NULL;
+ // Create the named contacts file.
+ TRAPD(err, dBase = CContactDatabase::ReplaceL(KCntFileToExist));
+ // need the file to be present for server connection
+ TESTTRUEL((err == KErrNone) && (dBase != NULL));
+ CleanupStack::PushL(dBase);
+
+ TInt allocCells(0);
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone)
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+ dBase->SetCntServerHeapFailure(RHeap::EDeterministic, failAt);
+ allocCells = dBase->CntServerResourceCount(); //__UHEAP_MARK;
+ TRAP(ret, CContactDatabase::ContactDatabaseExistsL(KCntFileToExist));
+
+ //__SRVHEAP_RESET;
+ dBase->SetCntServerHeapFailure(RHeap::ENone, 1);
+
+ if (ret == KErrNoMemory)
+ {
+ TInt allocLatest = dBase->CntServerResourceCount();
+
+ if (allocLatest != allocCells)
+ {
+ test.Printf(_L("iteraton %d failed - initial alloc cells = %d, alloc Latest = %d\n"),
+ failAt, allocCells, allocLatest);
+ TESTVALUEL(allocLatest, allocCells); //__UHEAP_MARKEND;
+ }
+ }
+ else if ( ret != KErrNone )
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));//Bad leaving code
+ }
+ }
+ CleanupStack::PopAndDestroy(dBase);
+ // Remove the default.
+ TRAP(ret, CContactDatabase::DeleteDatabaseL(KCntFileToExist));
+
+ return ETrue;
+ }
+
+LOCAL_C TBool ReplaceLOOM_ServerSideL()
+ {
+ test.Next(_L("ReplaceL Server side OOM test.\n"));
+ _LIT(KCntFileToExist,"C:FileToDetect");
+ CContactDatabase* dBase = NULL;
+ CContactDatabase* dBaseReplace = NULL;
+
+ // Create the named contacts file.
+ TRAPD(err, dBase = CContactDatabase::ReplaceL(KCntFileToExist));
+ // need the file to be present for server connection
+ TESTTRUEL((err == KErrNone) && (dBase != NULL));
+ CleanupStack::PushL(dBase);
+
+ TInt allocCells(0);
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone)
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+ dBase->SetCntServerHeapFailure(RHeap::EDeterministic, failAt);
+ allocCells = dBase->CntServerResourceCount(); //__UHEAP_MARK;
+
+ TRAP(ret, dBaseReplace = CContactDatabase::ReplaceL());
+ if(ret == KErrNone)
+ {
+ delete dBaseReplace;
+ }
+
+ //__SRVHEAP_RESET;
+ dBase->SetCntServerHeapFailure(RHeap::ENone, 1);
+
+ if (ret != KErrNone)
+ {
+ if(ret != KErrNoMemory)
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ else
+ {
+ TInt allocLatest = dBase->CntServerResourceCount();
+
+ if (allocLatest != allocCells)
+ {
+ #ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ if(allocLatest != allocCells - 1)
+ #endif
+ {
+ test.Printf(_L("iteraton %d failed - initial alloc cells = %d, alloc Latest = %d\n"),
+ failAt, allocCells, allocLatest);
+ TESTVALUEL(allocLatest, allocCells); //__UHEAP_MARKEND;
+ }
+ }
+ }
+
+ TESTNOERRL(CheckDatabaseIsAbsentOrOpenable());
+ }
+
+
+ }
+ CleanupStack::PopAndDestroy(dBase);
+
+ // Remove the default file associated with the dBase.
+ TRAP(ret, CContactDatabase::DeleteDatabaseL(KCntFileToExist));
+
+ return ETrue;
+ }
+
+LOCAL_C TBool DeleteDefaultFileLOOM_ServerSideL()
+ {
+ test.Next(_L("DeleteDefaultFileL Server side OOM test.\n"));
+ _LIT(KCntFileToExist,"C:FileToDetect");
+
+ CContactDatabase* dBase = NULL;
+ CContactDatabase* dBaseDefaultFile = NULL;
+ // ensure default contacts file is created
+ TRAPD(err, dBaseDefaultFile = CContactDatabase::CreateL());
+ // need file to be created for delete test
+ TESTTRUEL( (err == KErrNone) || (err == KErrAlreadyExists))
+ if (err == KErrNone)
+ {
+ delete dBaseDefaultFile;
+ }
+
+ // Create the named contacts file.
+ TRAP(err, dBase = CContactDatabase::ReplaceL(KCntFileToExist));
+ // need the file to be present for server connection
+ TESTTRUEL(err == KErrNone);
+ CleanupStack::PushL(dBase);
+
+ TInt allocCells(0);
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+ while(ret != KErrNone)
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+ dBase->SetCntServerHeapFailure(RHeap::EDeterministic, failAt);
+ allocCells = dBase->CntServerResourceCount(); //__UHEAP_MARK;
+
+ TRAP(ret, CContactDatabase::DeleteDefaultFileL());
+
+ //__SRVHEAP_RESET;
+ dBase->SetCntServerHeapFailure(RHeap::ENone, 1);
+
+ if (ret == KErrNoMemory)
+ {
+ TInt allocLatest = dBase->CntServerResourceCount();
+
+ if (allocLatest != allocCells)
+ {
+ test.Printf(_L("iteraton %d failed - initial alloc cells = %d, alloc Latest = %d\n"),
+ failAt, allocCells, allocLatest);
+ TESTVALUEL(allocLatest, allocCells); //__UHEAP_MARKEND;
+ }
+ }
+ else if ( ret != KErrNone )
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone));
+ }
+ }
+ CleanupStack::PopAndDestroy(dBase);
+
+ // Remove the default file associated with the dBase.
+ // Ensure that the default File has been removed.
+ TBool dExists = EFalse;
+ TRAP(ret, dExists = CContactDatabase::DefaultContactDatabaseExistsL());
+ TESTNOERRL(ret);
+ TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KCntFileToExist));
+
+ return !dExists;
+ }
+
+LOCAL_C TBool GetDefaultNameLOOM_ServerSideL()
+ {
+ test.Next(_L("GetDefaultNameL Server side OOM test.\n"));
+
+ CContactDatabase* dBase = NULL;
+ // Create the default contacts file.
+ TRAPD(err, dBase = CContactDatabase::ReplaceL());
+ // need the file to be present
+ TESTTRUEL((err == KErrNone) && (dBase != NULL));
+ CleanupStack::PushL(dBase);
+
+
+ TInt allocCells(0);
+ TInt ret = KErrNoMemory;
+ TInt failAt = 0;
+
+ TFileName filename;
+ while(ret != KErrNone)
+ {
+ failAt++;
+ if( !(failAt % 5 ))
+ {
+ test.Printf(_L("."));
+ }
+ dBase->SetCntServerHeapFailure(RHeap::EDeterministic, failAt);
+ allocCells = dBase->CntServerResourceCount(); //__UHEAP_MARK;
+
+ TRAP(ret, CContactDatabase::GetDefaultNameL(filename));
+
+ //__SRVHEAP_RESET;
+ dBase->SetCntServerHeapFailure(RHeap::ENone, 1);
+
+ if (ret == KErrNoMemory)
+ {
+ TInt allocLatest = dBase->CntServerResourceCount();
+
+ if (allocLatest != allocCells)
+ {
+ test.Printf(_L("iteraton %d failed - initial alloc cells = %d, alloc Latest = %d\n"),
+ failAt, allocCells, allocLatest);
+ TESTVALUEL(allocLatest, allocCells); //__UHEAP_MARKEND;
+ }
+ }
+ else if ( ret != KErrNone )
+ {
+ test.Printf(_L("iteration %d failed - non-memory error in OOM test: %d\n"), failAt, ret);
+ TESTTRUEL((ret == KErrNoMemory || ret == KErrNone)); //Bad leaving code
+ }
+ }
+ CleanupStack::PopAndDestroy(dBase);
+ TRAP_IGNORE(CContactDatabase::DeleteDefaultFileL());
+ return ETrue;
+ }
+#endif
+
+
+LOCAL_C void OOMTestingL()
+ {
+
+ // Client side OOM Testing.
+ TESTTRUE(ListDatabasesLOOM_ClientSideL());
+ TESTTRUE(OpenLOOM_ClientSideL());
+ TESTTRUE(DeleteDatabaseLOOM_ClientSideL());
+ TESTTRUE(CreateLOOM_ClientSideL());
+ TESTTRUE(GetDefaultNameLOOM_ClientSideL());
+ TESTTRUE(DefaultContactDatabaseExistsLOOM_ClientSideL());
+ TESTTRUE(ContactDatabaseExistsLOOM_ClientSideL());
+ TESTTRUE(ReplaceLOOM_ClientSideL());
+ TESTTRUE(DeleteDefaultFileLOOM_ClientSideL());
+
+#ifdef _DEBUG
+ // Server side OOM testing. Only server side debug method are
+ // available in debug mode.
+
+ TESTTRUE(CreateLOOM_ServerSideL());
+
+ TESTTRUE(DeleteDatabaseLOOM_ServerSideL());
+ TESTTRUE(DefaultContactDatabaseExistsLOOM_ServerSideL());
+ TESTTRUE(OpenLOOM_ServerSideL());
+ TESTTRUE(ContactDatabaseExistsLOOM_ServerSideL());
+ TESTTRUE(ReplaceLOOM_ServerSideL());
+ TESTTRUE(DeleteDefaultFileLOOM_ServerSideL());
+ TESTTRUE(GetDefaultNameLOOM_ServerSideL());
+#endif
+
+ }
+
+/**
+ NegTestL
+
+ Intended to identify the failing cases of the API and ensure that they behave
+ carefully under these conditions.
+
+ This section of the test needs more coverage.
+*/
+LOCAL_C void NegTestL()
+ {
+ TInt err (KErrNone);
+
+ test.Next(_L("Test drive Setting and Getting\n"));
+
+ {
+ TBool dbDriveSet;
+ TDriveUnit driveUnit;
+
+ // Set the Current drive to C:
+ TRAP( err, CContactDatabase::SetDatabaseDriveL(TDriveUnit(2), EFalse));
+ TESTTRUEL( err == KErrNone );
+
+ // Read the current drive back, ensuring it has been changed correctly.
+ dbDriveSet = CContactDatabase::DatabaseDrive(driveUnit);
+ TESTTRUEL(dbDriveSet);
+ TESTTRUEL(driveUnit == 2);
+
+ // Create and open an empty contact database
+ TRAP(err, db = CContactDatabase::ReplaceL());
+ TESTTRUEL( err == KErrNone && db != NULL);
+ if( !err )
+ {
+ delete db;
+ db = NULL;
+ }
+ err = KErrNone;
+ TBool exists = EFalse;
+ TRAP( err, exists = CContactDatabase::DefaultContactDatabaseExistsL());
+ TESTTRUEL( exists && err == KErrNone );
+
+
+ TRAP(err, CContactDatabase::DeleteDefaultFileL());
+ TESTTRUEL( err == KErrNone);
+
+ TRAP( err, exists = CContactDatabase::DefaultContactDatabaseExistsL());
+ TESTTRUEL( !exists && err == KErrNone );
+
+ // delete again should fail
+ TRAP(err, CContactDatabase::DeleteDefaultFileL());
+ TESTTRUEL( err == KErrNotFound );
+
+ db = CContactDatabase::CreateL();
+ TRAP( err, exists = CContactDatabase::DefaultContactDatabaseExistsL());
+ TESTTRUEL( exists );
+ delete db;
+ db = NULL;
+
+ TRAP( err, CContactDatabase::SetDatabaseDriveL(TDriveUnit(5), EFalse));
+ TESTTRUEL( err == KErrNone );
+
+ TRAP( err, dbDriveSet = CContactDatabase::DatabaseDrive(driveUnit));
+ TESTTRUEL( err == KErrNone );
+ TESTTRUEL( dbDriveSet );
+ TESTTRUEL( driveUnit == 5 );
+
+ TRAP( err, CContactDatabase::SetDatabaseDriveL(TDriveUnit(2), EFalse));
+ TESTTRUEL( err == KErrNone );
+
+ TRAP( err, dbDriveSet = CContactDatabase::DatabaseDrive(driveUnit));
+ TESTTRUEL( dbDriveSet );
+ TESTTRUEL( driveUnit == 2 );
+ }
+
+ TRAP( err, db = CContactDatabase::OpenL());
+ TESTTRUEL( err == KErrNone && db != NULL );
+ delete db;
+ db = NULL;
+
+ test.Next(_L("Test database opening\n"));
+ {
+ // open twice
+ db = CContactDatabase::OpenL();
+ TESTTRUEL(db != NULL);
+ CContactDatabase* db2 = CContactDatabase::OpenL();
+ TESTTRUEL(db2 != NULL);
+ TESTTRUEL(db2 != db);
+ delete db;
+ db = NULL;
+ delete db2;
+ db2 =NULL;
+
+ // KNullDesC is used internally, but is not a valid parameter
+ TRAP(err, db = CContactDatabase::OpenL(KNullDesC));
+ TESTTRUEL(err == KErrBadName);
+ TESTTRUEL(db == NULL);
+
+ // KNullDesC is used internally, but is not a valid parameter
+ TRAP(err, db = CContactDatabase::ReplaceL(KNullDesC));
+ TESTTRUEL(err == KErrBadName);
+ TESTTRUEL(db == NULL);
+
+ // check for Open and Create Failing
+ CContactDatabase::DeleteDefaultFileL();
+
+ TRAP(err, db = CContactDatabase::OpenL());
+ TESTTRUEL(err == KErrNotFound);
+ TESTTRUEL(db == NULL);
+
+ TRAP(err, db = CContactDatabase::CreateL());
+ TESTTRUEL(err == KErrNone);
+ delete db;
+ db = NULL;
+
+ TRAP(err, db = CContactDatabase::CreateL());
+ TESTTRUEL(err == KErrAlreadyExists);
+ TESTTRUEL(db == NULL);
+
+ // check for Replace replacing!
+ TRAP(err, db = CContactDatabase::ReplaceL());
+ TESTTRUEL(err == KErrNone);
+ TESTTRUEL(db != NULL);
+ delete db;
+ db = NULL;
+
+ // wait for server to shutdown (6s)
+ User::After(6000000);
+
+ // open twice
+ db = CContactDatabase::OpenL();
+ db2 = CContactDatabase::OpenL();
+ delete db;
+ db = NULL;
+ delete db2;
+ db2 =NULL;
+ }
+ }
+
+/**
+ FunctionTestL
+
+ Excersises: ListDatabasesL varients over 2 drives; C & F
+ SetDatabaseDriveL, DatabaseDrive, GetDefaultNameL,
+ the varients of DefaultContactDatabaseExistsL, CreateL,
+ asynchronous OpenL, FindContactFile, DeleteDefaultFileL and
+ DeleteDatabaseL.
+*/
+LOCAL_C void FunctionTestL()
+ {
+
+ TFileName addedFile;
+ test.Next(_L("FunctionTestL CContactDatabase::ListDatabasesL over multiple drives.\n"));
+ // At this point there should only be 1 file which is the default.
+ TFileName filename, defaultFilename;
+
+
+ for(driveIdx =0;driveIdx<NoDrives; driveIdx++ )
+ {
+ addedFile.Copy(driveArray[driveIdx].Name());
+ addedFile.Append(KNewCntTestFile);
+ Tidy();
+
+ CDesCArray* cntFiles = NULL;
+ TRAPD(err, cntFiles = CContactDatabase::ListDatabasesL());
+ TESTTRUEL(err == KErrNone && cntFiles != NULL);
+ NoDatabases = 0;
+ if( !err )
+ {
+ NoDatabases = cntFiles->Count();
+ delete cntFiles;
+ }
+
+
+ // Check Set and Get default drive.
+ TPtrC drvName(driveArray[driveIdx].Name());
+ test.Printf(_L("Testing Drive %S\n"), &drvName);
+ test.Next(_L("Setting Drive\n"));
+ TRAP( err, CContactDatabase::SetDatabaseDriveL(driveArray[driveIdx], EFalse));
+ if( err )
+ {
+ test.Printf(_L("CContactDatabase::SetDatabaseDriveL:Leave code:%d"),err);
+ }
+ TDriveUnit myDriveUnit;
+ {
+ TESTTRUEL(CContactDatabase::DatabaseDrive(myDriveUnit));
+ }
+ TESTTRUEL(myDriveUnit == driveArray[driveIdx]);
+
+ // Steve. To see if Drive of default filename changes.
+ TRAP( err, CContactDatabase::GetDefaultNameL( filename ));
+ if( err )
+ {
+ test.Printf(_L("CContactDatabase::GetDefaultNameL:Leave code:%d"),err);
+ }
+ test.Next(_L("Checking default filename.\n"));
+ TESTTRUEL(CheckDefaultContactsFilename(filename));
+ defaultFilename = filename;
+
+ // Exercise all API's the look for Contacts files.
+
+
+ TESTTRUEL(CheckCntFilesL( NoDatabases, KNoFiles, EFalse ));
+ TESTTRUEL(CheckNoDatabaseFilesL());
+
+ // ReplaceL and OpenL //
+
+ test.Next(_L("Creating/Replacing default db: ReplaceL.\n"));
+ TRAP( err, db = CContactDatabase::ReplaceL() );
+ TESTTRUEL( err == KErrNone && db != NULL );
+ if ((err != KErrNone) && (db == NULL))
+ {
+ test.Printf(_L("CContactDatabase::ReplaceL failed: leave code %d, db pointer %X"), err, db);
+ }
+ delete db;
+ db = NULL;
+ TESTTRUEL(CheckCntFilesL( NoDatabases + 1, defaultFilename ));
+ TESTTRUEL(DefaultDatabaseL());
+
+
+ __UHEAP_MARK;
+ test.Next(_L("Opening Default: OpenL().\n"));
+ TRAP( err, db = CContactDatabase::OpenL());
+ if ((err != KErrNone) && (db == NULL))
+ {
+ test.Printf(_L("CContactDatabase::OpenL failed: leave code %d, db pointer %X"), err, db);
+ }
+ // these tests Leave, as the database needs to be open to continue
+ TESTTRUEL( db != NULL ); // db should exist..
+ TESTTRUEL( err == KErrNone);
+
+ // Add contacts to the db
+ CArrayFix<TContactItemId>* idList=new(ELeave) CArrayFixFlat<TContactItemId>(5);
+ CleanupStack::PushL(idList);
+ test.Next(_L("Add new contacts"));
+ TRAP(err,AddNewContactsL(idList));
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ TESTTRUEL( err == KErrNone || err == KErrDiskFull);
+#else
+ TESTTRUEL( err == KErrNone );
+#endif
+
+ // Read and modify contacts.
+ test.Next(_L("Read and modify contacts"));
+ TRAP(err,EditContactsL(idList));
+ TESTTRUEL( err == KErrNone );
+
+ CleanupStack::PopAndDestroy(idList);
+
+ delete db;
+ db = NULL;
+ __UHEAP_MARKEND;
+
+ //Now test opening another database, should succeed
+ test.Next(_L("Creating addedFile: CreateL(addedFile).\n"));
+ TRAP( err, db = CContactDatabase::CreateL(addedFile) );
+ TESTTRUEL( err == KErrNone && db != NULL );
+ // check that file with name filename exists.
+ TESTTRUEL(CheckCntFilesL( NoDatabases + 2, addedFile ));
+ TESTTRUEL(DefaultDatabaseL());
+
+ //Add test to check that the db is opened
+ delete db;
+ db = NULL;
+
+ // Ensure that RecreateSystemTemplateL does not leave
+ test.Printf(_L("About to recreate template on:"));
+ test.Printf(addedFile);
+
+ test.Next(_L("Testing: RecreateSystemTemplateL( addedFile )"));
+
+ err = KErrNone;
+ TRAP( err, CContactDatabase::RecreateSystemTemplateL( addedFile ));
+#ifdef __SYMBIAN_CNTMODEL_USE_SQLITE__
+ test.Printf(_L("Recieved %d"),err);
+ TESTTRUEL( err == KErrNone || err == KErrDiskFull);
+#else
+ TESTTRUEL( err == KErrNone );
+#endif
+
+ test.Next(_L("Opening file addedFile: OpenL( addedFile )\n"));
+ TRAP( err, db = CContactDatabase::OpenL( addedFile ));
+ TESTTRUEL( db != NULL );
+ TESTTRUEL( err == KErrNone);
+
+ // Files existing now: Contacts.cdb & Contacts.cdrchar
+ // File Deletion //
+
+ // So at this point we have a default db and another.
+ // Time to start deleting them ! Start with DeleteDefaultFileL
+ test.Next(_L("Deleting default file: DeleteDefaultFileL()\n"));
+ TRAP( err, CContactDatabase::DeleteDefaultFileL());
+ TESTTRUEL( err == KErrNone );
+ // only filename should exist.
+ TESTTRUEL(CheckCntFilesL( NoDatabases + 1, addedFile ));
+ TESTTRUEL(CheckNotDefaultContactsFiles());
+
+ // Check that an open file is cannot be deleted.
+ // There is one remaining database which we can now remove using DeleteDatabaseL
+ test.Next(_L("Deleting database addedFile, should fail first time: DeleteDatabaseL(addedFile)\n"));
+ TRAP(err, CContactDatabase::DeleteDatabaseL(addedFile));
+ // Given that this file is currently open it DeleteDatabaseL should fail.
+ TESTTRUEL(err == KErrInUse);
+ delete db;
+ db = NULL;
+
+ // We have just opened another we can now delete the one that was originally open.
+ test.Next(_L("Deleting database addedFile, should pass second time: DeleteDatabaseL(addedFile)\n"));
+ TRAP(err, CContactDatabase::DeleteDatabaseL(addedFile));
+ TESTTRUEL(err == KErrNone);
+
+ // Check that the file "filename" has been deleted and that
+ // the default file exists.
+ TESTTRUEL(CheckCntFilesL( NoDatabases, KContactsFilename, EFalse )); // exercise ListDatabasesL
+
+ // NoFileOnPreviousDrive is used by CheckCntFilesL as once we start adding files
+ // to the second drive, so ListDatabasesL() without a parameter returns the total on
+ // both drives.
+ CDesCArray* driveFiles = CContactDatabase::ListDatabasesL(driveArray[driveIdx]);
+ NoFileOnPreviousDrive = driveFiles->Count();
+ delete driveFiles;
+ }
+ }
+
+
+LOCAL_C TBool EmptyCntDatabaseDeleteL()
+ {
+/**
+@SYMTestCaseID PIM-T-SEC-CNTDBASE-DEF049719-0001
+@SYMTestType UT
+@SYMTestPriority High
+@SYMDEF DEF049719
+@SYMTestCaseDependencies CntModel CoreAppsTest
+@SYMTestCaseDesc Check that a zero length CntDatabase file can be deleted using CContactDatabase::DeleteDatabaseL()
+@SYMTestActions Create an empty file where the default contact database should be.
+Try to delete it using CContactDatabase::DeleteDefaultFileL().
+Check that it has been deleted.
+@SYMTestExpectedResults The empty contact database should be deleted.
+*/
+ test.Next(_L("@SYMTestCaseID:PIM-T-SEC-CNTDBASE-DEF049719-0001 Check zero length CntDatabase can be deleted in CContactDatabase::DeleteDatabaseL()"));
+ TBool result(EFalse);
+ // Create an empty file
+ RFs fs;
+ User::LeaveIfError(fs.Connect());
+ RFile file;
+
+ RPIMTestServer serv;
+ User::LeaveIfError(serv.Connect());
+ serv.CreateEmptyFileL(KCdbPrivate);
+ serv.Close();
+ const TDesC& datab=KCdbSecure;
+
+ file.Close();
+ fs.Close();
+
+ // Delete the contact database
+ TRAPD(err,CContactDatabase::DeleteDatabaseL(datab));
+
+ result = (err == KErrNone);
+ if(result)
+ {
+ // try to open the file
+ User::LeaveIfError(fs.Connect());
+ User::LeaveIfError(serv.Connect());
+ TInt ret(serv.CheckForFile(KCdbPrivate));
+ serv.Close();
+
+ file.Close();
+ fs.Close();
+
+ // if the file is not found then it has been deleted and test is successful
+ result= (ret == KErrNotFound);
+ }
+ return result;
+ }
+
+LOCAL_C TBool EmptyCntDatabaseOverwriteL()
+ {
+/**
+@SYMTestCaseID PIM-T-SEC-CNTDBASE-DEF049719-0002
+@SYMTestType UT
+@SYMTestPriority High
+@SYMDEF DEF049719
+@SYMTestCaseDependencies CntModel CoreAppsTest
+@SYMTestCaseDesc Check that a zero length CntDatabase file can't be overwritten using CContactDatabase::CreateL()
+@SYMTestActions Create an empty file where the default contact database should be.
+Try to overwrite it using CContactDatabase::CreateL().
+@SYMTestExpectedResults The empty contact database should not be overwritten.
+*/
+ test.Next(_L("@SYMTestCaseID:PIM-T-SEC-CNTDBASE-DEF049719-0002 Check zero length CntDatabase can't be overwritten in CContactDatabase::CreateL()"));
+
+ // Create an empty file
+ RFs fs;
+ User::LeaveIfError(fs.Connect());
+ RFile file;
+
+ RPIMTestServer serv;
+ User::LeaveIfError(serv.Connect());
+ serv.CreateEmptyFileL(KCdbPrivate);
+ serv.Close();
+ const TDesC& datab=KCdbSecure;
+
+ file.Close();
+ fs.Close();
+
+ CContactDatabase * tData=NULL;
+ // create the contact database
+ TRAPD(err,tData=CContactDatabase::CreateL(datab));
+ CContactDatabase::DeleteDatabaseL(datab); //Delete the test file after use
+ delete tData;
+
+ return (err == KErrAlreadyExists);
+ }
+
+LOCAL_C void ContactDatabaseZeroL()
+ {
+ TESTTRUEL(EmptyCntDatabaseDeleteL());
+ TESTTRUEL(EmptyCntDatabaseOverwriteL());
+ }
+
+/**
+@SYMTestCaseID PIM-T-SEC-CNTDBASE-0001
+*/
+LOCAL_C void DoTestsL()
+ {
+ test.Start(_L("@SYMTestCaseID:PIM-T-SEC-CNTDBASE-0001 T_Sec_CntDBase\n"));
+
+ User::LeaveIfError(fileServer.Connect());
+
+ // Before we do anything else check that there is an MMC drive mapped.
+ DrivesL();
+
+ __UHEAP_MARK;
+ // This test Switches drives and calls CreateL, ListDatabasesL(TDriveUnit)
+ FunctionTestL();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ // This test is similar to the previous, but doesn't use ListDatabasesL(TDriveUnit)
+ // It also makes use of ReplaceL()
+ NegTestL();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ OOMTestingL();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ ContactDatabaseZeroL();
+ __UHEAP_MARKEND;
+
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ __UHEAP_MARK;
+ // The contacts database uses Active Objects to it must
+ // be provided with an Active Scheduler.
+ CActiveScheduler* scheduler=new CActiveScheduler;
+ if (scheduler)
+ {
+ CActiveScheduler::Install(scheduler);
+ CTrapCleanup* cleanup=CTrapCleanup::New();
+ if (cleanup)
+ {
+ TRAPD(err,DoTestsL());
+ // reset default drive location
+ TRAP_IGNORE(CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC), EFalse));
+ test(err == KErrNone);
+ delete cleanup;
+ }
+ delete scheduler;
+ }
+
+
+ test(__NB_failures == 0);
+
+ test.End();
+ test.Close();
+
+ __UHEAP_MARKEND;
+ return KErrNone;
+ }