messagingfw/biomsgfw/BDBTSRC/T_BdbHF.CPP
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/BDBTSRC/T_BdbHF.CPP	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,893 @@
+// Copyright (c) 2003-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: Test code for test CBioDatabase with Heap Failure
+//
+// Author	March 2000
+// 
+//
+
+#include <e32test.h>
+#include <e32hal.h>
+#include <f32fsys.h>
+#include <s32file.h>
+#include <barsc.h>
+#include "biotestutils.h"
+
+#include <e32uid.h>
+
+#include "BIODB.H"	
+#include <biouids.h>
+#include <bifchangeobserver.h>	
+
+//----------------------------------------------------------------------------------------
+
+// Id array
+const TBioMsgIdType										KId0Type=EBioMsgIdIana;
+const CApaDataRecognizerType::TRecognitionConfidence	KId0Confidence=CApaDataRecognizerType::EPossible;
+const TBioMsgIdText										KId0Text=_L("text/x-bio");
+const TInt16											KId0Port=0;
+const TUid												KId0CharacterSet={0x10003b10};
+const TInt16											KId0GeneralIdData=0x0000;
+
+const TBioMsgIdType						KId1Type=EBioMsgIdWap;
+const TBioMsgIdText										KId1Text=_L("");
+
+const TBioMsgIdText										KId2Text=_L("");
+
+const TUid KUidBioMsgTypeEmailNotification = {0x10005530};
+const TUid KUidBioMsgTypeVCal = {0x10005533};
+
+// end of test data.
+//----------------------------------------------------------------------------------------
+
+#include "CMSTD.H"
+
+
+//----------------------------------------------------------------------------------------
+RTest gTest(_L("BIODB.dll Test Harness"));
+LOCAL_D RFs				gFs;	
+LOCAL_D CBioTestUtils*	testUtils;
+CActiveScheduler		gScheduler;
+
+//----------------------------------------------------------------------------------------
+_LIT(kTestBifFile,"C:\\test\\bio\\bif\\bogus.rsc");
+#define KBifDir		_L("c:\\resource\\messaging\\bif\\")
+_LIT(kTestDestFile,"c:\\resource\\messaging\\bif\\bogus.rsc");
+
+//----------------------------------------------------------------------------------------
+//
+// Does nothing at all but is required for the CMsvSession constructor.
+class CDummyObserver : public CBase , public MBifChangeObserver
+{
+	//MBifChangeObserver
+	void HandleBifChangeL(TBifChangeEvent aEvent, TUid BioID)
+	{
+		HBufC* commentText = HBufC::NewLC(100);
+					
+		(commentText->Des()).Format(_L("HandleBifChangeL %D"), BioID);
+		testUtils->WriteComment(commentText->Des());
+
+		switch (aEvent)
+		{
+			case EBifChangeUnknown:
+				(commentText->Des()).Format(_L("HandleBifChangeL EBifChangeUnknown"));
+				break;
+			case EBifAdded:
+				(commentText->Des()).Format(_L("HandleBifChangeL EBifAdded"));
+				break;
+			case EBifDeleted:
+				(commentText->Des()).Format(_L("HandleBifChangeL EBifDeleted"));
+				break;
+			case EBifChanged:
+				(commentText->Des()).Format(_L("HandleBifChangeL EBifChanged"));
+				break;
+		}
+		CleanupStack::PopAndDestroy();	// commentText
+		CActiveScheduler::Stop();
+
+	};
+};
+
+//----------------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------------
+class CFileCopyTimer : public CTimer
+    {
+public:
+    static CFileCopyTimer* NewL(const CBifChangeObserver* const );
+private:
+    CFileCopyTimer(const CBifChangeObserver* const);
+    void RunL();
+	TBool iDeleteObserver;
+	const CBifChangeObserver * const iBifChangeObserver;
+    };
+//----------------------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------------------
+CFileCopyTimer::CFileCopyTimer(const CBifChangeObserver* const observer) : 
+	CTimer(EPriorityLow),
+	iBifChangeObserver(observer)		
+{
+	// If an observer is provided then it will need to be deleted later
+
+	iDeleteObserver = (observer!=NULL);
+
+	CActiveScheduler::Add(this);
+}
+
+//----------------------------------------------------------------------------------------
+CFileCopyTimer* CFileCopyTimer::NewL(const CBifChangeObserver* const observer)
+//----------------------------------------------------------------------------------------
+	{
+	CFileCopyTimer* self = new(ELeave) CFileCopyTimer(observer);
+	CleanupStack::PushL(self);
+	self->ConstructL(); // CTimer
+	self->After(1000000);
+	CleanupStack::Pop();
+	return self;
+	}
+
+//----------------------------------------------------------------------------------------
+void CFileCopyTimer::RunL()
+//----------------------------------------------------------------------------------------
+{
+	// Check whether the observer needs to be deleted
+	
+	if (iDeleteObserver)
+	{
+		delete iBifChangeObserver;
+
+		iDeleteObserver = EFalse;
+
+		After(1000000);
+	}
+	else
+	{
+		// Copy a test file in
+		CFileMan *cfMan = CFileMan::NewL(gFs);
+		CleanupStack::PushL(cfMan);
+		User::LeaveIfError(cfMan->Copy(kTestBifFile,kTestDestFile)); 
+		CleanupStack::PopAndDestroy();	// cfMan
+	}
+}
+
+//----------------------------------------------------------------------------------------
+void TestScheduler::ErrorL( TInt anError ) const
+//----------------------------------------------------------------------------------------
+	{
+	User::Leave( anError );
+	}
+
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void InitTestUtils()
+//----------------------------------------------------------------------------------------
+	{
+	testUtils = CBioTestUtils::NewLC(gTest,ETuCleanMessageFolder);
+	gTest.Start(_L("CBIODatabase"));
+	gTest.Console()->ClearScreen();
+	}
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void CloseTestUtils()
+//----------------------------------------------------------------------------------------
+	{
+	testUtils->TestHarnessCompleted();
+	CleanupStack::PopAndDestroy(testUtils);
+	//gTest.Console()->SetPos(0, 13);
+	gTest.End();
+	gTest.Close();
+	}
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void OpenFileSession() 
+//----------------------------------------------------------------------------------------
+	{
+	gFs.Connect();
+	gFs.MkDir(KBifDir);
+	gFs.SetSessionPath(KBifDir);
+
+
+	CActiveScheduler::Install( &gScheduler );
+	}
+
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void CloseFileSession()
+//----------------------------------------------------------------------------------------
+	{
+	gFs.Close( );
+	}
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void GetBearerText(TInt aBearer, TBuf<100>& rBearerString)
+//----------------------------------------------------------------------------------------
+{
+	switch (aBearer)
+	{
+	case EBioMsgIdIana:
+		rBearerString.Copy(_L("Iana"));
+		break;
+	case EBioMsgIdNbs:
+		rBearerString.Copy(_L("Nbs"));
+		break;
+	case EBioMsgIdWap:
+		rBearerString.Copy(_L("Wap"));
+		break;
+	case EBioMsgIdWapSecure:
+		rBearerString.Copy(_L("WapSecure"));
+		break;
+	case EBioMsgIdUnknown:
+	default:
+		rBearerString.Copy(_L("Unknown"));
+		break;
+	}
+}
+//----------------------------------------------------------------------------------------
+LOCAL_C void CreateBDBWithHeapFailure(TInt aTestNumber)
+{
+	gTest.Printf(_L("Create BDB With Heap Failure\n"));
+	testUtils->TestStart(aTestNumber, _L("Opening & Failing CBioDB"));
+
+	// Testing for heap failure in the client
+	TInt error;
+#ifdef _DEBUG
+	TInt failCount = 0;
+#endif
+	TBool finished = EFalse;
+	CBIODatabase* bioDB = NULL;
+
+	while(!finished)
+		{
+		__UHEAP_FAILNEXT(failCount++);
+
+		TRAP(error, bioDB = CBIODatabase::NewL(gFs));
+
+		__UHEAP_RESET;
+
+		// Did an error occur?
+		if (error == KErrNone)
+			{
+			// Check that the CMsvEntry has been updated
+			// Exit the loop
+			finished = ETrue;
+			}
+		else
+			{
+			// Check we failed correctly
+			gTest(error == KErrNoMemory);
+			}
+		}
+	delete bioDB;
+	
+	testUtils->TestFinish(aTestNumber,0 );
+
+}
+//----------------------------------------------------------------------------------------
+LOCAL_C void CreateBioObserverWithHeapFailure(TInt aTestNumber)
+//----------------------------------------------------------------------------------------
+{
+	gTest.Printf(_L("Create CBioObserver With Heap Failure\n"));
+	testUtils->TestStart(aTestNumber, _L("Opening & Failing CBioObserver"));
+
+	// Testing for heap failure in the client
+	TInt error;
+#ifdef _DEBUG
+	TInt failCount = 0;
+#endif
+	TBool finished = EFalse;
+	CBifChangeObserver* bioObserver = NULL;
+	CDummyObserver dumObserver;
+	
+		while(!finished)
+		{
+		__UHEAP_FAILNEXT(failCount++);
+
+		TRAP(error, bioObserver = CBifChangeObserver::NewL(dumObserver, gFs));
+
+		__UHEAP_RESET;
+
+		// Did an error occur?
+		if (error == KErrNone)
+			{
+			// Check that the CMsvEntry has been updated
+			// Exit the loop
+			finished = ETrue;
+			}
+		else
+			{
+			// Check we failed correctly
+			gTest(error == KErrNoMemory);
+			}
+		}
+	delete bioObserver;
+
+	testUtils->TestFinish(aTestNumber,0 );
+}	
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void DumpBifFiles(TInt aTestNumber)
+//----------------------------------------------------------------------------------------
+{
+	HBufC* commentText = HBufC::NewLC(100);
+	
+	gTest.Printf(_L("Opening & Searching DB\n"));
+	testUtils->TestStart(aTestNumber, _L("Opening & Searching DB"));
+
+	
+
+	CBIODatabase* bioDB = CBIODatabase::NewL(gFs);
+	CleanupStack::PushL( bioDB );
+	gTest.Printf(_L("Opened DB Successfully!\n"));
+	
+	(commentText->Des()).Format(_L("<%D> Bif files read\n"), bioDB->BIOCount());
+	testUtils->WriteComment(commentText->Des());
+	gTest.Printf(commentText->Des());
+
+	const CArrayFix<TBioMsgId>* ent = NULL;
+
+	for (TInt i=0; i < bioDB->BIOCount(); i++)
+	{
+		const CBioInfoFileReader& bifReader = bioDB->BifReader(i);
+
+		TPtrC desc;
+		desc.Set(bifReader.Description());
+		gTest.Printf(_L("File: %d: "), i);
+		gTest.Printf(_L("Desc: %S "), &desc);
+	
+		(commentText->Des()).Format(_L("%D: '%S'"), i, &desc);
+		testUtils->WriteComment(commentText->Des());
+		
+		ent = bioDB->BIOEntryLC(i);
+		gTest.Printf(_L("Has %d identifiers \n"), ent->Count());
+		CleanupStack::PopAndDestroy();	// ent
+	}
+
+	//
+	gTest.Printf(_L("Looking for all Wap Ports to Watch\n"));
+	testUtils->WriteComment(_L("Looking for all Wap Ports to Watch\n"));
+
+	TPtrC desc;
+	TInt pos;
+	ent = bioDB->BioEntryByTypeLC(CBIODatabase::EStart, EBioMsgIdWap, pos);
+	
+	while(pos < bioDB->BIOCount())
+	{
+		desc.Set(bioDB->BifReader(pos).Description());
+		gTest.Printf(_L("Desc: %S \n"), &desc);
+
+		for (TInt i = 0; ent && i < ent->Count(); i++)
+		{
+			if ((*ent)[i].iType == EBioMsgIdWap)
+			{
+				gTest.Printf(_L("Wap Port number %D\n"), (*ent)[i].iPort);
+				(commentText->Des()).Format(_L("%D: '%S' Port#:%D"), i, &desc, (*ent)[i].iPort);
+				testUtils->WriteComment(commentText->Des());
+			}
+			
+		}
+		if (ent)
+			CleanupStack::PopAndDestroy();	// ent
+		ent = bioDB->BioEntryByTypeLC(CBIODatabase::ENext, EBioMsgIdWap, pos);
+	}
+
+	if (ent)
+		CleanupStack::PopAndDestroy();	// ent
+	//
+
+	gTest.Printf(_L("Looking for all NBS Ports to Watch\n"));
+	testUtils->WriteComment(_L("Looking for all NBS Ports to Watch\n"));
+
+	ent = bioDB->BioEntryByTypeLC(CBIODatabase::EStart, EBioMsgIdNbs, pos);
+	
+	while(pos < bioDB->BIOCount())
+	{
+		desc.Set(bioDB->BifReader(pos).Description());
+		gTest.Printf(_L("Desc: %S \n"), &desc);
+
+		for (TInt i = 0; ent && i < ent->Count(); i++)
+		{
+			if ((*ent)[i].iType == EBioMsgIdNbs)
+			{
+				gTest.Printf(_L("Wap Port number %D\n"), (*ent)[i].iPort);
+				(commentText->Des()).Format(_L("%D: '%S' String:%S"), i, &desc, &((*ent)[i].iText));
+				testUtils->WriteComment(commentText->Des());
+			}
+			
+		}
+		if (ent)
+			CleanupStack::PopAndDestroy();	// ent
+		ent = bioDB->BioEntryByTypeLC(CBIODatabase::ENext, EBioMsgIdNbs, pos);
+	}
+
+	if (ent)
+		CleanupStack::PopAndDestroy();	// ent
+
+
+
+
+	CleanupStack::PopAndDestroy();	// bioDB
+	CleanupStack::PopAndDestroy();  // commentText
+	
+	testUtils->TestFinish(aTestNumber,0 );
+}
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void TestAPIs(TInt aTestNumber)
+//----------------------------------------------------------------------------------------
+{
+	CBIODatabase* bioDB = CBIODatabase::NewL(gFs);
+	CleanupStack::PushL( bioDB );
+
+	testUtils->TestStart(aTestNumber, _L("Testing APIs"));
+
+	testUtils->WriteComment(_L("RemoveBifL"));
+	TUid msgID;
+	TInt error = 0;
+	while (bioDB->BIOCount())
+	{
+		bioDB->GetBioMsgID(0,msgID);
+		TRAP(error, bioDB->RemoveBifL(msgID));
+		if (error)
+			testUtils->TestFinish(aTestNumber,error );
+			break;
+	}
+	CleanupStack::PopAndDestroy();	// bioDB
+	testUtils->TestFinish(aTestNumber,error );
+}
+
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void DumpWapBifFiles(TInt aTestNumber)
+//----------------------------------------------------------------------------------------
+{
+	// gets a list of port numbers for WAP Port type
+	TInt pos;
+
+	HBufC* commentText = HBufC::NewLC(100);
+	CBIODatabase* bioDB = CBIODatabase::NewL(gFs);
+	CleanupStack::PushL( bioDB );
+	
+	gTest.Printf(_L("Dump WAP Bif Files...\n"));
+	testUtils->TestStart(aTestNumber, _L("Dump WAP Bif Files..."));
+
+	const CArrayFix<TBioMsgId>* bioMsgIDs = bioDB->BioEntryByTypeLC(
+							CBIODatabase::EStart,
+							EBioMsgIdWap, pos);
+	while (bioMsgIDs)
+	{
+		TUid msgUID;
+		bioDB->GetBioMsgID(pos, msgUID);
+		gTest.Printf(_L("Message %D "),msgUID );
+
+		TFileName parserName(bioDB->GetBioParserNameL(msgUID));
+		gTest.Printf(_L("Parser %S\n"), &parserName );
+
+		TPtrC ext;
+		ext.Set(bioDB->GetFileExtL(msgUID));
+		gTest.Printf(_L("File Extension '%S'\n"),&ext );
+	
+		TPtrC desc;
+		desc.Set(bioDB->BifReader(pos).Description());
+		(commentText->Des()).Format(_L("<%S> BioUID:%D\tParserName:%S\tFileExt:%S"), &desc, msgUID, &parserName, &ext);
+		testUtils->WriteComment(commentText->Des());
+
+		for (TInt i = 0; i < bioMsgIDs->Count(); i++)
+		{
+			// Really should make a copy contructor & = operator
+			gTest.Printf(_L("Type\t: %D\n"),bioMsgIDs->At(i).iType );
+			gTest.Printf(_L("Confidence\t:%D\n"),bioMsgIDs->At(i).iConfidence );
+			gTest.Printf(_L("IANA\t:%S\n"),&(bioMsgIDs->At(i).iText) );
+			gTest.Printf(_L("Wap Port\t: %D\n"),bioMsgIDs->At(i).iPort );
+			gTest.Printf(_L("CharSet\t: %D\n"),bioMsgIDs->At(i).iCharacterSet );
+		
+			TBuf<100> bearerString;
+			GetBearerText(bioMsgIDs->At(i).iType, bearerString);
+			(commentText->Des()).Format(_L("\tType:%S\tConf:%D\tIANA:%S\tPort:%D\t"),
+					&bearerString,
+					bioMsgIDs->At(i).iConfidence,
+					&(bioMsgIDs->At(i).iText),
+					bioMsgIDs->At(i).iPort);
+			
+			testUtils->WriteComment(commentText->Des());
+		}
+		CleanupStack::PopAndDestroy();	// bioMsgID
+		
+		bioMsgIDs = bioDB->BioEntryByTypeLC(
+							CBIODatabase::ENext,
+							EBioMsgIdWap, pos);
+	}
+
+
+	TInt portNumber = 0;
+	TRAP_IGNORE(bioDB->GetPortNumberL(KUidBioMsgTypeEmailNotification, 
+							EBioMsgIdWap, 
+							portNumber));
+	
+	gTest.Printf(_L("Email Notify is Wap Port %d \n"), portNumber);
+	(commentText->Des()).Format(_L("Email Notify is Wap Port %d"),portNumber);
+	testUtils->WriteComment(commentText->Des());
+
+	TBioMsgIdText ianaString;
+	TRAP_IGNORE(bioDB->GetIdentifierTextL(KUidBioMsgTypeEmailNotification, 
+							EBioMsgIdIana, 
+							ianaString));
+	gTest.Printf(_L("Email Notify is IANA String %S \n"), &ianaString);
+	(commentText->Des()).Format(_L("Email Notify is IANA String %d"), &ianaString);
+	testUtils->WriteComment(commentText->Des());
+		
+	
+	CleanupStack::PopAndDestroy();	// bioDB
+	CleanupStack::PopAndDestroy();	// commentText
+	
+	testUtils->TestFinish(aTestNumber,0 );
+}
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void CheckBioness(TInt aTestNumber)
+//----------------------------------------------------------------------------------------
+{
+	HBufC* commentText = HBufC::NewLC(100);
+	testUtils->TestStart(aTestNumber, _L("Check Bioness..."));
+
+	// Check if message is bio
+	CBIODatabase* bioDB = CBIODatabase::NewL(gFs);
+	CleanupStack::PushL( bioDB );
+	TUid bioMsgId;
+	
+	gTest.Printf(_L("Searching if this data type is a BIO Message\n"));
+	(commentText->Des()).Format(_L("Searching if this data type is a BIO Message"));
+	testUtils->WriteComment(commentText->Des());
+	
+	TBioMsgId bioMessageData;
+	bioMessageData.iType=			KId0Type;
+	bioMessageData.iConfidence=		KId0Confidence;
+	bioMessageData.iText=			KId0Text;
+	bioMessageData.iPort=			KId0Port;
+	bioMessageData.iCharacterSet=	KId0CharacterSet;
+	bioMessageData.iGeneralIdData=	KId0GeneralIdData;
+
+	if (bioDB->IsBioMessageL(bioMessageData, bioMsgId))
+	{
+		gTest.Printf(_L("This is a BIO Message\n"));
+	}
+	else
+	{
+		gTest.Printf(_L("This is not a BIO Message\n"));
+	}
+
+
+
+	bioMessageData.iType = KId1Type;
+	
+	bioDB->IsBioMessageL(bioMessageData, bioMsgId);
+	if (bioMsgId != KNullUid)
+		gTest.Printf(_L("This is a BIO Message\n"));
+	else
+		gTest.Printf(_L("This is not a BIO Message\n"));
+
+	TBioMsgIdText text  = _L("//MLAP11");
+
+	bioDB->IsBioMessageL(EBioMsgIdNbs, text, 0, bioMsgId);
+	if (bioMsgId != KNullUid)
+		gTest.Printf(_L("%S is a BIO Message with Uid: %D\n"), &text, bioMsgId);
+	else
+		gTest.Printf(_L("%S is NOT a BIO Message\n"), &text);
+
+	text = _L("Some Bogus Text");
+	bioDB->IsBioMessageL(EBioMsgIdWapSecure, text, 9, bioMsgId);
+	if (bioMsgId != KNullUid)
+		gTest.Printf(_L("%S is a BIO Message with Uid: %D\n"), &text, bioMsgId );
+	else
+		gTest.Printf(_L("%S is NOT a BIO Message\n"), &text);
+
+	CleanupStack::PopAndDestroy();	// bioDB
+	CleanupStack::PopAndDestroy();	// commentText
+	testUtils->TestFinish(aTestNumber,0 );
+}
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void DefaultSendBearer(TInt aTestNumber)
+//----------------------------------------------------------------------------------------
+{
+	HBufC* commentText = HBufC::NewLC(100);
+	TBuf<100> bearerString;
+	testUtils->TestStart(aTestNumber, _L("DefaultSendBearer..."));
+
+	// Check if message is bio
+	CBIODatabase* bioDB = CBIODatabase::NewL(gFs);
+	CleanupStack::PushL( bioDB );
+	
+	gTest.Printf(_L("Getting Default Send Bearer info\n"));
+	
+	TBioMsgId aBioMsgIdentifier;
+	TRAPD(err, bioDB->GetDefaultSendBearerL(KUidBioMsgTypeEmailNotification, aBioMsgIdentifier));
+	if (!err)
+	{
+		GetBearerText(aBioMsgIdentifier.iType, bearerString);
+		(commentText->Des()).Format(_L("Default Send Bearer for EmailNotifciation: %S"),&bearerString);
+		gTest.Printf(_L("Default Send Bearer for EmailNotifciation %d \n"), aBioMsgIdentifier.iType);
+	}
+	else if (err == KErrNotFound)
+	{
+		gTest.Printf(_L("Default Send Bearer for EmailNotifciation cannot be found \n"));
+		(commentText->Des()).Format(_L("Default Send Bearer for EmailNotifciation cannot be found"));
+	}
+	else 
+	{
+		gTest.Printf(_L("Unexepect Error %d"), err);
+		(commentText->Des()).Format(_L("Unexepect Error %d"), err);
+	}
+
+	testUtils->WriteComment(commentText->Des());
+
+	TBioMsgIdType aPortType = EBioMsgIdWap;
+	TRAP( err, bioDB->GetDefaultSendBearerTypeL(KUidBioMsgTypeVCal, aPortType));
+	if (!err)
+	{
+		gTest.Printf(_L("Default Send Bearer for KUidBioMsgTypeVCal %d \n"), aPortType);
+		GetBearerText(aPortType, bearerString);
+		(commentText->Des()).Format(_L("Default Send Bearer for vCalendar %S"),&bearerString);
+	}
+	else if (err == KErrNotFound)
+	{
+		gTest.Printf(_L("Default Send Bearer for KUidBioMsgTypeVCal cannot be found\n"));
+		(commentText->Des()).Format(_L("Default Send Bearer for KUidBioMsgTypeVCal cannot be found"));
+	}
+	else 
+	{
+		gTest.Printf(_L("Unexepect Error %d"), err);
+		(commentText->Des()).Format(_L("Unexepect Error %d"), err);
+	}
+	testUtils->WriteComment(commentText->Des());
+	
+
+	TRAP(err, bioDB->GetDefaultSendBearerByTypeL(KUidBioMsgTypeEmailNotification, EBioMsgIdWapSecure, aBioMsgIdentifier));
+	if (!err) 
+	{
+		gTest.Printf(_L(" Send Bearer for KUidBioMsgTypeVCard, WAPSecure: Port %d \n"), aBioMsgIdentifier.iPort);
+		(commentText->Des()).Format(_L("Secure WAP Bearer for vCalendar %d"),aBioMsgIdentifier.iPort);
+	
+	}
+	else if (err == KErrNotFound)
+	{
+		gTest.Printf(_L("Default Send Bearer for KUidBioMsgTypeVCard cannot be found \n"));
+	}
+	else
+	{
+		gTest.Printf(_L("Unexepect Error %d"), err);
+		(commentText->Des()).Format(_L("Unexepect Error %d"), err);
+	}
+		
+	testUtils->WriteComment(commentText->Des());
+
+
+	CleanupStack::PopAndDestroy();	// bioDB
+	CleanupStack::PopAndDestroy();	// commentText
+	testUtils->TestFinish(aTestNumber,0 );
+}
+
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void TestBifObserver(TInt aTestNumber)
+//----------------------------------------------------------------------------------------
+{
+	HBufC* commentText = HBufC::NewLC(100);
+	testUtils->TestStart(aTestNumber, _L("Testing the Bif Change Observer..."));
+
+	// See if we have a test file and if we do - test...
+	TEntry entry;
+	TInt err = gFs.Entry(kTestBifFile, entry);
+	if (err)
+		{
+		gTest.Printf(_L("No test files installed on kTestBifFile\n"));
+		(commentText->Des()).Format(_L("No test files installed on %S"), &kTestBifFile);
+		testUtils->WriteComment(commentText->Des());
+		}
+	else 
+		{
+		// Delete old file if it's there
+		CFileMan *cfMan = CFileMan::NewL(gFs);
+		CleanupStack::PushL(cfMan);
+		cfMan->Delete(kTestDestFile); 
+		CleanupStack::PopAndDestroy();	// cfMan
+
+		CBifChangeObserver* bioObserver = NULL;
+		CDummyObserver dumObserver;
+		
+		// Create a BifObserver
+		gTest.Printf(_L("Creating a BifObserver\n"));
+		(commentText->Des()).Format(_L("Creating a BifObserver"));
+		testUtils->WriteComment(commentText->Des());
+		
+		bioObserver = CBifChangeObserver::NewL(dumObserver, gFs);
+		CleanupStack::PushL(bioObserver);
+
+		(commentText->Des()).Format(_L("Starting a BifObserver\n"));
+		testUtils->WriteComment(commentText->Des());
+		bioObserver->Start();
+
+		// Add A Bif
+		gTest.Printf(_L("Adding a Bif\n"));
+		(commentText->Des()).Format(_L("Adding a Bif"));
+		testUtils->WriteComment(commentText->Des());
+		
+		CFileCopyTimer *ct = CFileCopyTimer::NewL(NULL);
+		CleanupStack::PushL(ct);
+		
+		CActiveScheduler::Start();
+
+
+		// wait for the bif to show up
+
+		// Remove a Bif
+		gTest.Printf(_L("Removing a Bif"));
+		(commentText->Des()).Format(_L("Removing a Bif"));
+		testUtils->WriteComment(commentText->Des());
+
+		// Clean Up
+		gTest.Printf(_L("Cleaning Up"));
+		(commentText->Des()).Format(_L("Cleaning Up"));
+		testUtils->WriteComment(commentText->Des());
+			
+		CleanupStack::PopAndDestroy(2);	// bioObserver, ct
+		}
+	CleanupStack::PopAndDestroy(); //commentText
+
+	testUtils->TestFinish(aTestNumber,0 );
+}
+
+//----------------------------------------------------------------------------------------
+// This test creates 2 CBifChangeObservers and starts them up.
+// It also creates a CFileCopyTimer object, specifying the first
+// CBifChangeObserver to be deleted.
+// When CFileCopyTimer times out it deletes the first observer.
+// This will cancel the change notification request that the first
+// observer has issued to the File Server. However, it should not
+// cancel the change notification request that the second observer
+// has issued to the File Server. Therefore, when the CFileCopyTimer
+// times out for the second time and copies the Bif file over, the
+// second observer should notice the new Bif file.
+//
+LOCAL_C void TestCancelOfBifObserver(TInt aTestNumber)
+{
+	HBufC* commentText = HBufC::NewLC(100);
+	testUtils->TestStart(aTestNumber, _L("Testing the Bif Change Observer Cancel..."));
+
+	// See if we have a test file and if we do - test...
+	TEntry entry;
+	TInt err = gFs.Entry(kTestBifFile, entry);
+	if (err)
+		{
+		gTest.Printf(_L("No test files installed on kTestBifFile\n"));
+		(commentText->Des()).Format(_L("No test files installed on %S"), &kTestBifFile);
+		testUtils->WriteComment(commentText->Des());
+		}
+	else 
+		{
+		// Delete old file if it's there
+		CFileMan *cfMan = CFileMan::NewL(gFs);
+		CleanupStack::PushL(cfMan);
+		cfMan->Delete(kTestDestFile); 
+		CleanupStack::PopAndDestroy();	// cfMan
+
+		CBifChangeObserver* bioObserver1 = NULL;
+		CBifChangeObserver* bioObserver2 = NULL;
+		CDummyObserver dumObserver;
+		
+		// Create a BifObserver
+		gTest.Printf(_L("Creating the first BifObserver\n"));
+		(commentText->Des()).Format(_L("Creating a BifObserver"));
+		testUtils->WriteComment(commentText->Des());
+		
+		bioObserver1 = CBifChangeObserver::NewL(dumObserver, gFs);
+		CleanupStack::PushL(bioObserver1);
+
+		gTest.Printf(_L("Creating the second BifObserver\n"));
+		(commentText->Des()).Format(_L("Creating a BifObserver"));
+		testUtils->WriteComment(commentText->Des());
+		
+		bioObserver2 = CBifChangeObserver::NewL(dumObserver, gFs);
+		CleanupStack::PushL(bioObserver2);
+
+		(commentText->Des()).Format(_L("Starting the first BifObserver\n"));
+		testUtils->WriteComment(commentText->Des());
+		bioObserver1->Start();
+
+		(commentText->Des()).Format(_L("Starting the second BifObserver\n"));
+		testUtils->WriteComment(commentText->Des());
+		bioObserver2->Start();
+
+		// Add A Bif
+		gTest.Printf(_L("Adding a Bif\n"));
+		(commentText->Des()).Format(_L("Adding a Bif"));
+		testUtils->WriteComment(commentText->Des());
+		
+		// Specify that the first observer should be deleted
+
+		CFileCopyTimer *ct = CFileCopyTimer::NewL(bioObserver1);
+		
+		CleanupStack::PushL(ct);
+		
+		CActiveScheduler::Start();
+
+		// wait for the bif to show up
+
+		// Remove a Bif
+		gTest.Printf(_L("Removing a Bif"));
+		(commentText->Des()).Format(_L("Removing a Bif"));
+		testUtils->WriteComment(commentText->Des());
+
+		// Clean Up
+		gTest.Printf(_L("Cleaning Up"));
+		(commentText->Des()).Format(_L("Cleaning Up"));
+		testUtils->WriteComment(commentText->Des());
+			
+		CleanupStack::PopAndDestroy(2);	// bioObserver2, ct
+		
+		CleanupStack::Pop();			// bioObserver1, it has
+										// already been deleted by
+										// CFileCopyTimer
+		}
+	CleanupStack::PopAndDestroy(); //commentText
+
+	testUtils->TestFinish(aTestNumber,0 );
+}
+
+//----------------------------------------------------------------------------------------
+LOCAL_C void doMainL()
+//----------------------------------------------------------------------------------------
+	{
+	TInt testNumber = 1;
+
+	OpenFileSession();
+	InitTestUtils();
+	
+
+	__UHEAP_MARK;
+	CreateBDBWithHeapFailure(testNumber++);
+
+	CreateBioObserverWithHeapFailure(testNumber++);
+
+	DumpBifFiles(testNumber++);
+
+	TestAPIs(testNumber++);
+
+	DumpWapBifFiles(testNumber++);
+	
+	CheckBioness(testNumber++);
+
+	DefaultSendBearer(testNumber++);
+
+	TestBifObserver(testNumber++);
+
+	TestCancelOfBifObserver(testNumber++);
+
+	__UHEAP_MARKEND;
+	CloseFileSession();
+	CloseTestUtils();
+	}
+
+
+
+GLDEF_C TInt E32Main()
+	{	
+	__UHEAP_MARK;
+	CTrapCleanup*	theCleanup = CTrapCleanup::New();
+	TRAPD(ret,doMainL());		
+	gTest(ret==KErrNone);
+	delete theCleanup;	
+	__UHEAP_MARKEND;
+	return(KErrNone);
+	}