diff -r 2981cb3aa489 -r 8b14b30db193 email/imap4mtm/imapsession/test/src/ctestimapfetchbody.cpp --- /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 +#include +#include +#include +#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\" \r\n")); + iInputStream->AppendInputStringL(_L8("To: \"David Test Account\" \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\" \r\n")); + iInputStream->AppendInputStringL(_L8("To: \"David Test Account\" \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\" \r\n")); + iInputStream->AppendInputStringL(_L8("To: \"David Test Account\" \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\" \r\n")); + iInputStream->AppendInputStringL(_L8("To: \"David Test Account\" \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(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(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; + }