email/imap4mtm/imapsession/test/src/ctestimapfetchbody.cpp
changeset 80 8b14b30db193
parent 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imapsession/test/src/ctestimapfetchbody.cpp	Wed Nov 03 22:55:44 2010 +0530
@@ -0,0 +1,815 @@
+// Copyright (c) 2006-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 "ctestimapfetchbody.h"
+#include "cfakeinputstream.h"
+#include "cfakeoutputstream.h"
+#include "cactivewaiter.h"
+#include "moutputstream.h"
+#include "cimapsession.h"
+#include <msvids.h>
+#include <msvuids.h>
+#include <miuthdr.h>
+#include <miutset.h>
+#include "emailtestutils.h"
+#include "MSVSERV.H"
+#include "cimapfetchbodyresponse.h"
+#include "cimaputils.h"
+#include "cimapfolderinfo.h"
+#if (defined SYMBIAN_EMAIL_CAPABILITY_SUPPORT)
+#include "cimapcapabilityinfo.h"
+#endif
+
+_LIT(KImapFetchBodyTest,"t_imapfetchbody");
+_LIT(KBodyDetails,"testbody");
+_LIT(KCDrive,"c:\\");
+RTest test(KImapFetchBodyTest);
+
+CTestImapFetchBody::CTestImapFetchBody()
+	: iInputStream(NULL)
+	, iOutputStream(NULL)
+	, iActiveWaiter(NULL)
+	, iImapSession(NULL)
+	, iFetchBodyInfo(NULL)
+	, iMsvMessageEntry(0)
+	, iAttMessageEntry(0)
+	, iBodyMessageEntry(0)
+	, iFolderId(0)
+	, iImapSettings(NULL)
+	, iImapMailStore(NULL)
+	, iServerEntry(NULL)
+	, iFetchBodyResponse(NULL)
+	, iMsvServer(NULL)
+	{}
+
+CTestImapFetchBody::~CTestImapFetchBody()
+	{
+	delete iImapSession;
+	delete iActiveWaiter;
+	delete iOutputStream;
+	delete iInputStream;
+	delete iFetchBodyInfo;	
+	delete iImapMailStore;
+	delete iImapSettings;
+	delete iFetchBodyResponse;
+	delete iServerEntry;
+	CImapUtils::Delete();
+	delete iMsvServer;
+	}
+	
+
+void CTestImapFetchBody::CreateMessageStructureL(TMsvId aId)
+	{
+	//message root entry
+	TMsvEntry entry1;
+	entry1.iType = KUidMsvMessageEntry;
+	entry1.iServiceId = KMsvLocalServiceIndexEntryId;
+	entry1.iMtm = KUidMsgTypeIMAP4;
+	iServerEntry->SetEntry(aId);
+	iServerEntry->CreateEntry(entry1);
+	iServerEntry->SetEntry(entry1.Id());
+	iMsvMessageEntry=entry1.Id();
+
+	//folder entry
+	TMsvEntry folder;
+	folder.iType = KUidMsvFolderEntry;
+	folder.iMtm = KUidMsvLocalServiceMtm;
+	folder.iServiceId = KMsvLocalServiceIndexEntryId;
+	iServerEntry->SetEntry(iMsvMessageEntry);
+	iServerEntry->CreateEntry(folder);
+	iServerEntry->SetEntry(folder.Id());
+	iFolderId=folder.Id();
+
+	//body entry
+	TMsvEntry bodyentry;
+	bodyentry.iType = KUidMsvEmailTextEntry;
+	bodyentry.iServiceId = KMsvLocalServiceIndexEntryId;
+	bodyentry.iMtm = KUidMsgTypeIMAP4;
+	bodyentry.iDetails.Set(KBodyDetails);
+	iServerEntry->SetEntry(iFolderId);
+	iServerEntry->CreateEntry(bodyentry);
+	iServerEntry->SetEntry(bodyentry.Id());
+	iBodyMessageEntry=bodyentry.Id();	
+	}
+
+
+void CTestImapFetchBody::SetupL()
+	{	
+	ASSERT(iInputStream == NULL);
+	ASSERT(iOutputStream == NULL);
+	ASSERT(iActiveWaiter == NULL);
+	ASSERT(iImapSession == NULL);
+	ASSERT(iMsvServer == NULL);
+	
+	//clear the messaging folder
+	CEmailTestUtils* testUtils;
+	testUtils = CEmailTestUtils::NewL(test);
+	CleanupStack::PushL(testUtils);
+	testUtils->FileSession().SetSessionPath(KCDrive);
+	
+// TODO: How to clean the message folders or close the messaging server without a PANIC ????
+//	testUtils->CleanMessageFolderL();
+	
+	testUtils->ClearEmailAccountsL();
+	
+	testUtils->CreateAllTestDirectories( );
+	testUtils->FileSession( ).SetSessionPath( _L( "C:\\" ) );
+
+	CleanupStack::PopAndDestroy(testUtils);
+
+	iMsvServer = CMsvServer::NewL();
+
+	// wait a couple of seconds
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(5000000);
+	CActiveScheduler::Start();
+	delete timer;
+	iServerEntry = CMsvServerEntry::NewL(*iMsvServer, KMsvRootIndexEntryId);
+	CImapUtils::CreateL();
+	iImapMailStore = CImapMailStore::NewL(*iServerEntry);	 
+	iImapSettings = CImapSettings::NewL(*iServerEntry);
+
+	iInputStream = CFakeInputStream::NewL(Logger());
+	iOutputStream = CFakeOutputStream::NewL(Logger());
+	iActiveWaiter = new(ELeave)CActiveWaiter(Logger());
+	iImapSession = CImapSession::NewL(*iImapSettings,*iImapMailStore,*iInputStream, *iOutputStream);
+	
+	//create the test environment 
+	CreateMessageStructureL(KMsvGlobalOutBoxIndexEntryIdValue);	
+
+	
+	INFO_PRINTF1(_L("Setup: ServerGreeting"));
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* OK Microsoft Exchange 2000 IMAP4rev1 server version 6.0.6249.0 (lon-cn-exchng2k.msexchange2k.closedtest.intra) ready.\r\n"));
+	
+	ASSERT_EQUALS(CImapSession::EServerStateNone, iImapSession->ServerState());
+	
+	iImapSession->ReadServerGreetingL(iActiveWaiter->iStatus);
+	iActiveWaiter->WaitActive();
+	
+	INFO_PRINTF1(_L("...Login"));
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("1 OK LOGIN completed\r\n"));
+			
+	iImapSession->LoginL(iActiveWaiter->iStatus, _L8("username"), _L8("password"));
+	iActiveWaiter->WaitActive();
+
+	ASSERT_EQUALS(CImapSession::EServerStateAuthenticated, iImapSession->ServerState());
+
+
+	INFO_PRINTF1(_L("...Select inbox"));
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("2 OK [READ-WRITE] SELECT completed\r\n"));
+		
+	CImapFolderInfo* folderInfo = CImapFolderInfo::NewL();
+	CleanupStack::PushL(folderInfo);
+	
+	folderInfo->SetNameL(_L16("inbox"));	
+	CleanupStack::Pop();//folderInfo
+	iImapSession->SelectL(iActiveWaiter->iStatus, folderInfo);
+	iActiveWaiter->WaitActive();
+
+	ASSERT_EQUALS(CImapSession::EServerStateSelected, iImapSession->ServerState());
+	ASSERT_EQUALS(folderInfo, iImapSession->SelectedFolderInfo());
+	
+	
+	INFO_PRINTF1(_L("Setup: Complete"));
+	}
+	
+void CTestImapFetchBody::TearDownL()
+	{
+	delete iImapSession;
+	iImapSession = NULL;
+	
+	delete iActiveWaiter;
+	iActiveWaiter = NULL;
+	
+	delete iOutputStream;
+	iOutputStream = NULL;
+	
+	delete iInputStream;
+	iInputStream = NULL;
+	
+	delete iServerEntry;
+	iServerEntry = NULL;
+	
+	delete iImapMailStore;
+	iImapMailStore = NULL;
+		
+	delete iImapSettings;
+	iImapSettings = NULL;
+	
+	delete iServerEntry;
+	iServerEntry = NULL;
+
+	CImapUtils::Delete();
+	
+	delete iMsvServer;
+	iMsvServer = NULL;
+	}
+
+// Tests
+void CTestImapFetchBody::TestFetchBodyL()
+	{
+	INFO_PRINTF1(_L("TestFetchBodyL"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (BODY[1]<0> {19}\r\n"));
+	iInputStream->AppendInputStringL(_L8("a small test body\r\n")); 
+	iInputStream->AppendInputStringL(_L8("UID 2717 FLAGS (\\Seen))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	CFetchBodyInfo* iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus,messageUid,peek,*iFetchBodyInfo, *iFetchBodyResponse);
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+	
+void CTestImapFetchBody::TestFetchBodyWithMimeL()
+	{
+	INFO_PRINTF1(_L("TestFetchBodyWithMimeL"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (BODY[1]<0> {10}\r\n"));
+	iInputStream->AppendInputStringL(_L8("the end.\r\n"));
+	iInputStream->AppendInputStringL(_L8(" BODY[1.MIME] {417}\r\n"));
+	iInputStream->AppendInputStringL(_L8("From: \"pipex\" <mdgi05@imap.dial.pipex.com>\r\n"));
+	iInputStream->AppendInputStringL(_L8("To: \"David Test Account\" <davids@msexchange2k.closedtest.intra>\r\n"));
+	iInputStream->AppendInputStringL(_L8("Subject: t1\r\n"));
+	iInputStream->AppendInputStringL(_L8("Date: Wed, 10 May 2006 10:23:50 +0100\r\n"));
+	iInputStream->AppendInputStringL(_L8("MIME-Version: 1.0\r\n"));
+	iInputStream->AppendInputStringL(_L8("Content-Type: text/plain;\r\n"));
+	iInputStream->AppendInputStringL(_L8("	 charset=\"iso-8859-1\"\r\n"));
+	iInputStream->AppendInputStringL(_L8("Content-Transfer-Encoding: 7bit\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-Priority: 3\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-MSMail-Priority: Normal\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-Mailer: Microsoft Outlook Express 6.00.2800.1807\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1807\r\n"));
+	iInputStream->AppendInputStringL(_L8(" UID 3120 FLAGS (\\Seen \\Draft))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed.\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	delete iFetchBodyInfo;
+	iFetchBodyInfo=NULL;
+	iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	TImEncodingType encoding = EEncodingTypeNone;
+	iFetchBodyInfo->SetCharsetId(KCharacterSetIdentifierAscii);	
+	iFetchBodyInfo->SetContentTransferEncoding(encoding);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus,messageUid,peek,*iFetchBodyInfo, *iFetchBodyResponse);
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+	
+void CTestImapFetchBody::TestFetchBodyWithMime2L()
+	{
+	INFO_PRINTF1(_L("TestFetchBodyWithMime2L"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (UID 3120 BODY[1]<0> {10}\r\n"));
+	iInputStream->AppendInputStringL(_L8("the end.\r\n"));
+	iInputStream->AppendInputStringL(_L8(" BODY[1.MIME] {417}\r\n"));
+	iInputStream->AppendInputStringL(_L8("From: \"pipex\" <mdgi05@imap.dial.pipex.com>\r\n"));
+	iInputStream->AppendInputStringL(_L8("To: \"David Test Account\" <davids@msexchange2k.closedtest.intra>\r\n"));
+	iInputStream->AppendInputStringL(_L8("Subject: t1\r\n"));
+	iInputStream->AppendInputStringL(_L8("Date: Wed, 10 May 2006 10:23:50 +0100\r\n"));
+	iInputStream->AppendInputStringL(_L8("MIME-Version: 1.0\r\n"));
+	iInputStream->AppendInputStringL(_L8("Content-Type: text/plain;\r\n"));
+	iInputStream->AppendInputStringL(_L8("	 charset=\"iso-8859-1\"\r\n"));
+	iInputStream->AppendInputStringL(_L8("Content-Transfer-Encoding: 7bit\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-Priority: 3\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-MSMail-Priority: Normal\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-Mailer: Microsoft Outlook Express 6.00.2800.1807\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1807\r\n"));
+	iInputStream->AppendInputStringL(_L8(" FLAGS (\\Seen \\Draft))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed.\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	delete iFetchBodyInfo;
+	iFetchBodyInfo=NULL;
+	iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	TImEncodingType encoding = EEncodingTypeNone;
+	iFetchBodyInfo->SetCharsetId(KCharacterSetIdentifierAscii);	
+	iFetchBodyInfo->SetContentTransferEncoding(encoding);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus, messageUid, peek,*iFetchBodyInfo, *iFetchBodyResponse);
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+
+// When server responses with no body length
+void CTestImapFetchBody::TestFetchBodyWithNoBodyLengthInServerResponseL()
+	{
+	INFO_PRINTF1(_L("TestFetchBodyWithNoBodyLengthInServerResponseL"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (UID 3120 BODY[1]<0> \"text is written here\" BODY[1.MIME] {417}\r\n"));
+	iInputStream->AppendInputStringL(_L8("From: \"pipex\" <mdgi05@imap.dial.pipex.com>\r\n"));
+	iInputStream->AppendInputStringL(_L8("To: \"David Test Account\" <davids@msexchange2k.closedtest.intra>\r\n"));
+	iInputStream->AppendInputStringL(_L8("Subject: t1\r\n"));
+	iInputStream->AppendInputStringL(_L8("Date: Wed, 10 May 2006 10:23:50 +0100\r\n"));
+	iInputStream->AppendInputStringL(_L8("MIME-Version: 1.0\r\n"));
+	iInputStream->AppendInputStringL(_L8("Content-Type: text/plain;\r\n"));
+	iInputStream->AppendInputStringL(_L8("	 charset=\"iso-8859-1\"\r\n"));
+	iInputStream->AppendInputStringL(_L8("Content-Transfer-Encoding: 7bit\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-Priority: 3\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-MSMail-Priority: Normal\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-Mailer: Microsoft Outlook Express 6.00.2800.1807\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1807\r\n"));
+	iInputStream->AppendInputStringL(_L8(" FLAGS (\\Seen \\Draft))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed.\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	delete iFetchBodyInfo;
+	iFetchBodyInfo=NULL;
+	iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	TImEncodingType encoding = EEncodingTypeNone;
+	iFetchBodyInfo->SetCharsetId(KCharacterSetIdentifierAscii);	
+	iFetchBodyInfo->SetContentTransferEncoding(encoding);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus, messageUid, peek,*iFetchBodyInfo, *iFetchBodyResponse);
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+
+/**
+ The server might explicitly state that there is no MIME data by using NIL
+ */
+void CTestImapFetchBody::TestFetchBodyWithNilMimeL()
+	{
+	INFO_PRINTF1(_L("TestFetchBodyWithNilMimeL"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (FLAGS (\\Seen \\Draft)"));
+	iInputStream->AppendInputStringL(_L8("UID 3120 BODY[1]<0> {10}\r\n"));
+	iInputStream->AppendInputStringL(_L8("the end.\r\n"));
+	iInputStream->AppendInputStringL(_L8(" BODY[1.MIME] nil)\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed.\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	delete iFetchBodyInfo;
+	iFetchBodyInfo=NULL;
+	iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	TImEncodingType encoding = EEncodingTypeNone;
+	iFetchBodyInfo->SetCharsetId(KCharacterSetIdentifierAscii);	
+	iFetchBodyInfo->SetContentTransferEncoding(encoding);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus, messageUid, peek, *iFetchBodyInfo, *iFetchBodyResponse);
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+
+/**
+ The server might explicitly state that there is no MIME data by using an empty string.
+ This is what the WU server does.
+ */
+void CTestImapFetchBody::TestFetchBodyWithEmptyMimeL()
+	{
+	INFO_PRINTF1(_L("TestFetchBodyWithEmptyMimeL"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (FLAGS (\\Seen \\Draft)"));
+	iInputStream->AppendInputStringL(_L8("UID 3120 BODY[1]<0> {10}\r\n"));
+	iInputStream->AppendInputStringL(_L8("the end.\r\n"));
+	iInputStream->AppendInputStringL(_L8(" BODY[1.MIME] \"\")\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed.\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	delete iFetchBodyInfo;
+	iFetchBodyInfo=NULL;
+	iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	TImEncodingType encoding = EEncodingTypeNone;
+	iFetchBodyInfo->SetCharsetId(KCharacterSetIdentifierAscii);	
+	iFetchBodyInfo->SetContentTransferEncoding(encoding);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus, messageUid, peek, *iFetchBodyInfo, *iFetchBodyResponse);
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+void CTestImapFetchBody::TestFetchBodyWithMimeZeroAngelBracketL()
+	{
+	INFO_PRINTF1(_L("TestFetchBodyWithMimeZeroAngelBracketL"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (BODY[1]<0> {10}\r\n"));
+	iInputStream->AppendInputStringL(_L8("the end.\r\n"));
+	iInputStream->AppendInputStringL(_L8(" BODY[1.MIME]<0> {417}\r\n"));
+	iInputStream->AppendInputStringL(_L8("From: \"pipex\" <mdgi05@imap.dial.pipex.com>\r\n"));
+	iInputStream->AppendInputStringL(_L8("To: \"David Test Account\" <davids@msexchange2k.closedtest.intra>\r\n"));
+	iInputStream->AppendInputStringL(_L8("Subject: t1\r\n"));
+	iInputStream->AppendInputStringL(_L8("Date: Wed, 10 May 2006 10:23:50 +0100\r\n"));
+	iInputStream->AppendInputStringL(_L8("MIME-Version: 1.0\r\n"));
+	iInputStream->AppendInputStringL(_L8("Content-Type: text/plain;\r\n"));
+	iInputStream->AppendInputStringL(_L8("	 charset=\"iso-8859-1\"\r\n"));
+	iInputStream->AppendInputStringL(_L8("Content-Transfer-Encoding: 7bit\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-Priority: 3\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-MSMail-Priority: Normal\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-Mailer: Microsoft Outlook Express 6.00.2800.1807\r\n"));
+	iInputStream->AppendInputStringL(_L8("X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1807\r\n"));
+	iInputStream->AppendInputStringL(_L8(" UID 3120 FLAGS (\\Seen \\Draft))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed.\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	delete iFetchBodyInfo;
+	iFetchBodyInfo=NULL;
+	iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	TImEncodingType encoding = EEncodingTypeNone;
+	iFetchBodyInfo->SetCharsetId(KCharacterSetIdentifierAscii);	
+	iFetchBodyInfo->SetContentTransferEncoding(encoding);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus,messageUid,peek,*iFetchBodyInfo, *iFetchBodyResponse);
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+
+void CTestImapFetchBody::TestFetchBodyWithCancelL()
+	{
+	INFO_PRINTF1(_L("TestFetchBodyWithCancelL"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (BODY[1]<0> {19}\r\n"));
+	iInputStream->AppendInputStringL(_L8("a small test body\r\n")); 
+		
+	iInputStream->NotifyWhenStreamIsEmpty(*this);
+	
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	CFetchBodyInfo* iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus,messageUid,peek,*iFetchBodyInfo, *iFetchBodyResponse);
+	
+	// OnInputStreamIsEmptyL will be called during WaitActive, causing FetchBodyL to be cancelled
+	iActiveWaiter->WaitActive(KErrCancel);	
+
+	// Simulate the rest of the response being returned (after the cancel)
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("UID 2717 FLAGS (\\Seen))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed\r\n"));
+		
+		
+	// Flush the rest of the response
+	iImapSession->FlushCancelledCommand(iActiveWaiter->iStatus);
+	iActiveWaiter->WaitActive();
+
+	// Response data should now be flushed.
+	// Try to do a simple list command using the same input stream.
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* LIST (\\UnMarked) \"/\" Drafts\r\n"));
+	iInputStream->AppendInputStringL(_L8("* LIST (\\Marked) \"/\" INBOX\r\n"));
+	iInputStream->AppendInputStringL(_L8("4 OK LIST completed\r\n"));
+		
+	RArrayImapListFolderInfo folderList;
+	iImapSession->ListL(iActiveWaiter->iStatus, _L(""), _L("%"), folderList);
+	iActiveWaiter->WaitActive();
+
+	ASSERT_EQUALS(folderList.Count(), 2);
+	
+	ASSERT_EQUALS(folderList[0]->iHierarchySeperator, (TChar)'/');
+	ASSERT_EQUALS(folderList[0]->FolderName(), _L16("Drafts"));
+	ASSERT_FALSE(folderList[0]->QueryFlag(CImapListFolderInfo::ENoinferiors));
+	ASSERT_FALSE(folderList[0]->QueryFlag(CImapListFolderInfo::ENoselect));
+	ASSERT_FALSE(folderList[0]->QueryFlag(CImapListFolderInfo::EMarked));
+	ASSERT_TRUE(folderList[0]->QueryFlag(CImapListFolderInfo::EUnmarked));
+	
+	ASSERT_EQUALS(folderList[1]->iHierarchySeperator, (TChar)'/');
+	ASSERT_EQUALS(folderList[1]->FolderName(), _L16("INBOX"));
+	ASSERT_FALSE(folderList[1]->QueryFlag(CImapListFolderInfo::ENoinferiors));
+	ASSERT_FALSE(folderList[1]->QueryFlag(CImapListFolderInfo::ENoselect));
+	ASSERT_TRUE(folderList[1]->QueryFlag(CImapListFolderInfo::EMarked));
+	ASSERT_FALSE(folderList[1]->QueryFlag(CImapListFolderInfo::EUnmarked));
+
+	folderList.ResetAndDestroy();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+
+	
+// Tests
+void CTestImapFetchBody::TestFetchMultiChunkBodyL()
+	{
+	INFO_PRINTF1(_L("TestFetchMultiChunkBodyL"));
+	
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (BODY[1] {19}\r\n"));
+	iInputStream->AppendInputStringL(_L8("a small test body\r\n")); 
+	iInputStream->AppendInputStringL(_L8("UID 2717 FLAGS (\\Seen))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	CFetchBodyInfo* fetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	TImEncodingType encoding = EEncodingTypeNone;
+	fetchBodyInfo->SetCharsetId(KCharacterSetIdentifierAscii);	
+	fetchBodyInfo->SetContentTransferEncoding(encoding);
+	fetchBodyInfo->SetSizeToFetch(messageSize);
+	fetchBodyInfo->SetIsText(ETrue);
+	fetchBodyInfo->SetRelativePathL(bodySection);
+	fetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus,messageUid,peek,*fetchBodyInfo, *iFetchBodyResponse);
+	delete fetchBodyInfo;
+
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+#if (defined SYMBIAN_EMAIL_CAPABILITY_SUPPORT)
+void CTestImapFetchBody::TestFetchBinaryBodyL()
+	{
+	INFO_PRINTF1(_L("TestFetchBinaryBodyL"));
+		
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (BINARY[1]<0> {19}\r\n"));
+	iInputStream->AppendInputStringL(_L8("a small test body\r\n")); 
+	iInputStream->AppendInputStringL(_L8("UID 2717 FLAGS (\\Seen))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed\r\n"));
+		
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	// Set BINARY capability
+	CImapCapabilityInfo& capabilityInfo = const_cast<CImapCapabilityInfo&>(iImapSession->CapabilityInfo());
+	capabilityInfo.SetFlag(CImapCapabilityInfo::EBinaryCap, ETrue);
+	
+	CFetchBodyInfo* iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus,messageUid,peek,*iFetchBodyInfo, *iFetchBodyResponse);
+	iActiveWaiter->WaitActive();
+
+	INFO_PRINTF1(_L("Complete"));
+	}	
+
+void CTestImapFetchBody::TestFetchBinaryBodyWithCancelL()
+	{
+	INFO_PRINTF1(_L("TestFetchBinaryBodyWithCancelL"));
+	
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* 1 FETCH (BINARY[1]<0> {19}\r\n"));
+	iInputStream->AppendInputStringL(_L8("a small test body\r\n")); 
+		
+	iInputStream->NotifyWhenStreamIsEmpty(*this);
+	
+	//some test values for the info class
+	_LIT8(KBodySection,"1");
+	const TDesC8& bodySection(KBodySection);
+	TInt messageSize=19;
+	
+	//more test values
+	TUint messageUid=45;
+	TBool peek=ETrue;
+	
+	// Set BINARY capability
+	CImapCapabilityInfo& capabilityInfo = const_cast<CImapCapabilityInfo&>(iImapSession->CapabilityInfo());
+	capabilityInfo.SetFlag(CImapCapabilityInfo::EBinaryCap, ETrue);
+	
+	CFetchBodyInfo* iFetchBodyInfo = CFetchBodyInfo::NewL(iBodyMessageEntry);
+	iFetchBodyInfo->SetSizeToFetch(messageSize);
+	iFetchBodyInfo->SetIsText(ETrue);
+	iFetchBodyInfo->SetRelativePathL(bodySection);
+	iFetchBodyInfo->SetBodyPartRemainingSize(0);
+
+	delete iFetchBodyResponse;
+	iFetchBodyResponse = NULL;
+	iFetchBodyResponse = CImapFetchBodyResponse::NewL();
+	iImapSession->FetchBodyL(iActiveWaiter->iStatus,messageUid,peek,*iFetchBodyInfo, *iFetchBodyResponse);
+	
+	// OnInputStreamIsEmptyL will be called during WaitActive, causing FetchBodyL to be cancelled
+	iActiveWaiter->WaitActive(KErrCancel);	
+
+	// Simulate the rest of the response being returned (after the cancel)
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("UID 2717 FLAGS (\\Seen))\r\n"));
+	iInputStream->AppendInputStringL(_L8("3 OK FETCH completed\r\n"));
+		
+		
+	// Flush the rest of the response
+	iImapSession->FlushCancelledCommand(iActiveWaiter->iStatus);
+	iActiveWaiter->WaitActive();
+
+	// Response data should now be flushed.
+	// Try to do a simple list command using the same input stream.
+	iInputStream->ResetInputStrings();
+	iInputStream->AppendInputStringL(_L8("* LIST (\\UnMarked) \"/\" Drafts\r\n"));
+	iInputStream->AppendInputStringL(_L8("* LIST (\\Marked) \"/\" INBOX\r\n"));
+	iInputStream->AppendInputStringL(_L8("4 OK LIST completed\r\n"));
+		
+	RArrayImapListFolderInfo folderList;
+	iImapSession->ListL(iActiveWaiter->iStatus, _L(""), _L("%"), folderList);
+	iActiveWaiter->WaitActive();
+
+	ASSERT_EQUALS(folderList.Count(), 2);
+	
+	ASSERT_EQUALS(folderList[0]->iHierarchySeperator, (TChar)'/');
+	ASSERT_EQUALS(folderList[0]->FolderName(), _L16("Drafts"));
+	ASSERT_FALSE(folderList[0]->QueryFlag(CImapListFolderInfo::ENoinferiors));
+	ASSERT_FALSE(folderList[0]->QueryFlag(CImapListFolderInfo::ENoselect));
+	ASSERT_FALSE(folderList[0]->QueryFlag(CImapListFolderInfo::EMarked));
+	ASSERT_TRUE(folderList[0]->QueryFlag(CImapListFolderInfo::EUnmarked));
+	
+	ASSERT_EQUALS(folderList[1]->iHierarchySeperator, (TChar)'/');
+	ASSERT_EQUALS(folderList[1]->FolderName(), _L16("INBOX"));
+	ASSERT_FALSE(folderList[1]->QueryFlag(CImapListFolderInfo::ENoinferiors));
+	ASSERT_FALSE(folderList[1]->QueryFlag(CImapListFolderInfo::ENoselect));
+	ASSERT_TRUE(folderList[1]->QueryFlag(CImapListFolderInfo::EMarked));
+	ASSERT_FALSE(folderList[1]->QueryFlag(CImapListFolderInfo::EUnmarked));
+
+	folderList.ResetAndDestroy();
+
+	INFO_PRINTF1(_L("Complete"));
+	}
+#endif
+	
+void CTestImapFetchBody::OnInputStreamIsEmptyL()
+	{
+	iActiveWaiter->CancelWaitActive(*this);
+	}
+	
+void CTestImapFetchBody::DoCancel()
+	{
+	iImapSession->Cancel();
+	}	
+
+CTestSuite* CTestImapFetchBody::CreateSuiteL(const TDesC& aName)
+// static
+	{
+	SUB_SUITE;
+	ADD_ASYNC_TEST_STEP(TestFetchBodyL);
+	ADD_ASYNC_TEST_STEP(TestFetchBodyWithCancelL);
+//	ADD_ASYNC_TEST_STEP(TestFetchMultiChunkBodyL);
+	ADD_ASYNC_TEST_STEP(TestFetchBodyWithMimeL);
+	ADD_ASYNC_TEST_STEP(TestFetchBodyWithMimeZeroAngelBracketL);
+	ADD_ASYNC_TEST_STEP(TestFetchBodyWithMime2L);
+	ADD_ASYNC_TEST_STEP(TestFetchBodyWithNoBodyLengthInServerResponseL);
+	ADD_ASYNC_TEST_STEP(TestFetchBodyWithNilMimeL);
+	ADD_ASYNC_TEST_STEP(TestFetchBodyWithEmptyMimeL);
+#if (defined SYMBIAN_EMAIL_CAPABILITY_SUPPORT)
+	// repeate the above test cases using FETCH BINARY 
+	ADD_ASYNC_TEST_STEP(TestFetchBinaryBodyL);		
+	ADD_ASYNC_TEST_STEP(TestFetchBinaryBodyWithCancelL); 
+#endif 
+	END_SUITE;
+	}