diff -r 000000000000 -r 72b543305e3a email/pop3andsmtpmtm/clientmtms/test/src/T_SMTSND.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/pop3andsmtpmtm/clientmtms/test/src/T_SMTSND.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,596 @@ +// Copyright (c) 1998-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: +// Name of test harness: T_SMTSND +// Component: IMCM +// Owner: KP +// Brief description of test harness: +// Tests SMTP SendAs functionality - creates SMTP messages; adds recipients; +// store the body text; saves message; adds/removes attachments; +// Detailed description of test harness: +// As above. +// Input files required to run test harness: +// \MSG\IMCMTSRC\rfc82201.txt :\msgtest\imcm\rfc82201.txt +// Intermediate files produced while running test harness: +// :\msglogs\T_SMTSND\T_IMCM.log +// Output files produced by running test harness: +// :\msglogs\T_SMTSND...LOG.txt +// Description of how to build test harness: +// cd \msg\imcm\ +// bldmake bldfiles +// abld test build +// Description of how to run test harness: +// The following instructions are the same for all platforms: +// 1. Build T_DB test harness from COMMDB component: +// cd \commdb\group +// bldmake bldfiles +// abld test build t_db +// 2. Build the test utilities: +// cd \msg\testutils\group\ +// bldmake bldfiles +// abld build +// WINS running instructions: +// 1. \epoc32\release\wins\\T_SMTSND.exe can be used at the command prompt +// or executable can be run from Windows Explorer. +// All other platform running instructions: +// 1. Copy \epoc32\release\\\T_SMTSND.exe onto the other platform +// 2. Copy \epoc32\release\\\MSVTESTUTILS.DLL into +// :\system\libs on the other platform +// 3. Copy \epoc32\release\\\EMAILTESTUTILS.DLL into +// :\system\libs on the other platform +// 4. Run T_SMTSND.exe on the other platform +// +// + +#include "emailtestutils.h" +#include +#include +#include +#include "smtcmtm.h" // CSmtpClientMtm +#include "smtpset.h" // CImSmtpSettings +#include +#include "miutlog.h" // CImLog +#include +#include +#include + + #include + #include + +RTest test(_L("SMTP SendAs Testrig")); +LOCAL_D CTrapCleanup* theCleanup; +LOCAL_D CEmailTestUtils* testUtils; +LOCAL_D CImLog* log; + +#define KRecipient _L("test@psion9.demon.co.uk") +#define KRecipientAlias _L("Test Account") + + +// + + +// + +LOCAL_C void InitL() + { + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; + CActiveScheduler::Install(scheduler); + CleanupStack::PushL(scheduler); + + testUtils = CEmailTestUtils::NewLC(test); + testUtils->CreateAllTestDirectories(); + testUtils->FileSession().SetSessionPath(_L("C:\\")); + testUtils->CleanMessageFolderL(); + testUtils->ClearEmailAccountsL(); + + testUtils->GoServerSideL(); + + test.Next(_L("Create Data Component FileStores")); + testUtils->CreateSmtpServerMtmRegL(); + + // Loading the DLLs + testUtils->CreateRegistryObjectAndControlL(); + testUtils->InstallSmtpMtmGroupL(); + + log = CImLog::NewL(_L("c:\\logs\\email\\T_IMCM.log"), EAppend); + CleanupStack::PushL(log); + log->AppendComment(_L8("******** T_SMTSND Test (SMTP) Send As API ********")); + TBuf8<80> buf; +#if defined(__WINS__) + buf.Append(_L8("WINS ")); +#else + buf.Append(_L8("MARM ")); +#endif +#if defined(_UNICODE) + buf.Append(_L8("U")); +#endif +#if defined(_DEBUG) + buf.Append(_L8("DEB")); +#else + buf.Append(_L8("REL")); +#endif + log->AppendComment(buf); + } + +LOCAL_C void Closedown() + { + log->AppendComment(_L8("********** T_SMTSND Tests Complete **********")); + log->AppendComment(_L8("")); + + CleanupStack::PopAndDestroy(3); //testUtils, log, scheduler + } + +// + +LOCAL_C void TestSMTSendL(CMsvEntry& aEntry, TMsvId aDestination) + { + // Get count of children + aEntry.SetEntryL(KMsvRootIndexEntryId); + aEntry.SetEntryL(aDestination); + TInt children = aEntry.Count(); + + CTestTimer* timer = CTestTimer::NewL(); + timer->After(0x200000); + CActiveScheduler::Start(); + delete timer; + + // rich text + CParaFormatLayer* paraFormatLayer=CParaFormatLayer::NewL(); + CleanupStack::PushL(paraFormatLayer); + + CCharFormatLayer* charFormatLayer=CCharFormatLayer::NewL(); + CleanupStack::PushL(charFormatLayer); + + CRichText* bodyText=CRichText::NewL(paraFormatLayer, charFormatLayer, CEditableText::EFlatStorage, 256); + CleanupStack::PushL(bodyText); + + TBuf<100> bodyContents = _L("Test body contents so that we can test the SendAs API. We \06 can try using a delimiter"); + bodyText->InsertL(0, bodyContents); + + + RSendAs sa; + TInt err = sa.Connect(); + User::LeaveIfError(err); + CleanupClosePushL(sa); + + RSendAsMessage sa_msg; + sa_msg.CreateL(sa, KUidMsgTypeSMTP); + + CleanupClosePushL(sa_msg); + + sa_msg.AddRecipientL(KRecipient, RSendAsMessage::ESendAsRecipientTo); + sa_msg.AddRecipientL(KRecipient, KRecipientAlias, RSendAsMessage::ESendAsRecipientTo); + + sa_msg.SetSubjectL(_L("t_smtsnd message test 1")); + sa_msg.SetBodyTextL(*bodyText); + + sa_msg.SaveMessageAndCloseL(); + + CleanupStack::Pop(); // sa_msg + CleanupStack::PopAndDestroy(); // sa + + + // Check child count has increased + aEntry.SetEntryL(KMsvRootIndexEntryId); + aEntry.SetEntryL(aDestination); + test(aEntry.Count() == children + 1); + + // Check the body text + + // ok, need to find the message entry + TMsvId message = 0x00000000; + TMsvEntry msgEntry; + TBool found = EFalse; + CMsvEntrySelection* sel = aEntry.ChildrenL(); + CleanupStack::PushL(sel); + + // Loop through the sub-entries + for(TInt i=0;iCount();i++) + { + // Reset the entry to the child[i] + aEntry.SetEntryL(sel->At(i)); + msgEntry = aEntry.Entry(); + if (msgEntry.iDescription.Compare(_L("t_smtsnd message test 1")) == 0) + { + message = aEntry.EntryId(); + found = ETrue; + break; + } + } + + CleanupStack::PopAndDestroy(); // sel + + // make sure we actually found our message + if (!found) + User::Leave(KErrNotFound); + + + // Check we've got what we wanted + aEntry.SetEntryL(message); + test(aEntry.Entry().Parent() == aDestination); + + CRichText* validRichText1=CRichText::NewL(paraFormatLayer, charFormatLayer, CEditableText::EFlatStorage, 256); + CleanupStack::PushL(validRichText1); + + CMsvOperationWait* iWait=CMsvOperationWait::NewLC(); + + CImEmailMessage* imEmailMessage = CImEmailMessage::NewLC(*testUtils->iMsvEntry); + imEmailMessage->GetBodyTextL(iWait->iStatus, msgEntry.Id(), CImEmailMessage::EThisMessageOnly, *validRichText1, *paraFormatLayer, *charFormatLayer); + iWait->Start(); + CActiveScheduler::Start(); // wait for the asynch operation to complete + + TBuf<100> bufa = bodyText->Read(0); + TBuf<100> bufb = validRichText1->Read(0); + + test((bufa.Compare(bufb))==0); + + aEntry.SetEntryL(msgEntry.Id()); + CMsvStore* store = aEntry.ReadStoreL(); + CleanupStack::PushL(store); + CImHeader* header = CImHeader::NewLC(); + header->RestoreL(*store); + + // check that there are 2 recipients + test(header->ToRecipients().Count() == 2); + + // check that the alias in the second recipient is not lost! + TBuf<50> recipient; + recipient.Append('\"'); + recipient.Append(KRecipientAlias); + recipient.Append('\"'); + recipient.Append(' '); + recipient.Append('<'); + recipient.Append(KRecipient); + recipient.Append('>'); + + TPtrC toRecipient = header->ToRecipients()[1]; + test(toRecipient.CompareF(recipient)==0); + + CleanupStack::PopAndDestroy(header); + CleanupStack::PopAndDestroy(store); + + CleanupStack::PopAndDestroy(2); //imEmailMessage, iWait + + CleanupStack::PopAndDestroy(4); //bodyText, validRichText1, paraFormatLayer, charFormatLayer + } + +LOCAL_C void TestSMTSendL() + { + TMsvDummyObserver* ob = new(ELeave) TMsvDummyObserver; + CleanupStack::PushL(ob); + + CMsvSession* session = CMsvSession::OpenSyncL(*ob); + CleanupStack::PushL(session); + + CMsvEntry* cEntry = session->GetEntryL(KMsvRootIndexEntryId); + CleanupStack::PushL(cEntry); + + + // with the new SendAs2 API messages are always created in Drafts + TestSMTSendL(*cEntry, KMsvDraftEntryId); + + + CleanupStack::PopAndDestroy(3); // cEntry, session, ob + } + +LOCAL_C void TestCapabilityL() + { + + RSendAs sa; + User::LeaveIfError(sa.Connect()); + CleanupClosePushL(sa); + + sa.FilterAgainstCapability(KUidMtmQuerySupportedBody); + sa.FilterAgainstCapability(KUidMtmQuerySupportAttachments); + sa.FilterAgainstCapability(KUidMtmQuerySupportSubject); + sa.FilterAgainstCapability(KUidMtmQueryCanSendMsg); + + CSendAsMessageTypes* msgTypes = CSendAsMessageTypes::NewL(); + CleanupStack::PushL(msgTypes); + + sa.FilteredMessageTypesL(*msgTypes); + + // make sure SMTP is still in the list + TInt found = 0; + TInt count = msgTypes->Count(); + for (TInt i = 0; i < count; i++) + { + if (msgTypes->MessageTypeUid(i) == KUidMsgTypeSMTP) + { + found++; + break; + } + } + + test(found > 0); + + // now set a capability not supported by SMTP + msgTypes->Reset(); + sa.FilterAgainstCapability(KUidMtmQuerySupportsFolder); + sa.FilteredMessageTypesL(*msgTypes); + + // make sure SMTP is no longer in the list + found = EFalse; + count = msgTypes->Count(); + for (TInt i = 0; i < count; i++) + { + if (msgTypes->MessageTypeUid(i) == KUidMsgTypeSMTP) + { + found = ETrue; + break; + } + } + + test(found == 0); + + CleanupStack::PopAndDestroy(2); // sa, msgTypes + + } + +LOCAL_C void TestValidationL() + { + +// Looks line validation functionality is not part of the new SendAs2 API, so we skip this test + } + +LOCAL_C void TestAttachmentL(CMsvEntry& aEntry, TMsvId aDestination) + { + // Get count of children + aEntry.SetEntryL(KMsvRootIndexEntryId); + aEntry.SetEntryL(aDestination); + TInt childCount = aEntry.Count(); + + CTestTimer* timer = CTestTimer::NewL(); + timer->After(0x200000); + CActiveScheduler::Start(); + delete timer; + + // rich text + CParaFormatLayer* paraFormatLayer=CParaFormatLayer::NewL(); + CleanupStack::PushL(paraFormatLayer); + + CCharFormatLayer* charFormatLayer=CCharFormatLayer::NewL(); + CleanupStack::PushL(charFormatLayer); + + CRichText* bodyText=CRichText::NewL(paraFormatLayer, charFormatLayer, CEditableText::EFlatStorage, 256); + CleanupStack::PushL(bodyText); + + TBuf<100> bodyContents = _L("Test body contents so that we can test the SendAs API. We \06 can try using a delimiter"); + bodyText->InsertL(0, bodyContents); + + + RSendAs sa; + User::LeaveIfError(sa.Connect()); + CleanupClosePushL(sa); + + RSendAsMessage sa_msg; + sa_msg.CreateL(sa, KUidMsgTypeSMTP); + CleanupClosePushL(sa_msg); + + sa_msg.AddRecipientL(KRecipient, RSendAsMessage::ESendAsRecipientTo); + + sa_msg.SetSubjectL(_L("t_smtsnd message test 2")); + sa_msg.SetBodyTextL(*bodyText); + + TRequestStatus status; + sa_msg.AddAttachment(_L("C:\\mailtest\\imcm\\rfc82201.txt"), status); + User::WaitForRequest(status); + + sa_msg.SaveMessageAndCloseL(); + + TMsvId message = 0x00000000; + TMsvEntry msgEntry; + TBool found = EFalse; + + aEntry.SetEntryL(KMsvRootIndexEntryId); + aEntry.SetEntryL(aDestination); + + CMsvEntrySelection* sel = aEntry.ChildrenL(); + CleanupStack::PushL(sel); + + // Loop through the sub-entries + for(TInt i=0;iCount();i++) + { + // Reset the entry to the child[i] + aEntry.SetEntryL(sel->At(i)); + msgEntry = aEntry.Entry(); + if (msgEntry.iDescription.Compare(_L("t_smtsnd message test 2")) == 0) + { + message = aEntry.EntryId(); + found = ETrue; + break; + } + } + + CleanupStack::PopAndDestroy(); // sel + + // make sure we actually found our message + if (!found) + User::Leave(KErrNotFound); + + // Check child count has increased + aEntry.SetEntryL(KMsvRootIndexEntryId); + aEntry.SetEntryL(aDestination); + test(aEntry.Count() == childCount + 1); + + // Check we've got what we wanted + aEntry.SetEntryL(message); + test(aEntry.Entry().Parent() == aDestination); + testUtils->iMsvEntry->SetEntryL(msgEntry.Id()); + + + CImEmailMessage* imEmailMessage = CImEmailMessage::NewLC(*testUtils->iMsvEntry); + + // Testing the message has one attachment using attachment manager + TInt count = imEmailMessage->AttachmentManager().AttachmentCount(); + test(count == 1); + + // open the file for read, using index + RFile file = imEmailMessage->AttachmentManager().GetAttachmentFileL(count-1); + CleanupClosePushL(file); + TInt size = 0; + test(KErrNone == file.Size(size)); + HBufC8* buf8 = HBufC8::NewLC(size); + TPtr8 des = buf8->Des(); + test(KErrNone == file.Read(des)); + CleanupStack::PopAndDestroy(2,&file); // buf8, file + + // open the file for read, using attachment id + + // with the new API we don't know the attachment ID, so we skip this test for SendAs2 + + _LIT8(KTestData,"Some test data"); + + // open the file for write, using index + file = imEmailMessage->AttachmentManager().GetAttachmentFileForWriteL(count-1); + CleanupClosePushL(file); + TInt filePosition = size; + test(KErrNone == file.Write(filePosition,KTestData)); + file.Flush(); + + + // get the updated file size + test(KErrNone == file.Size(size)); + CleanupStack::PopAndDestroy(&file); + + // get the attachment info, using index + CMsvAttachment* attachmentInfo = imEmailMessage->AttachmentManager().GetAttachmentInfoL(count-1); + CleanupStack::PushL(attachmentInfo); + + + // modify size information in attachment info + attachmentInfo->SetSize(size); + + // Test modify the attachment info + CTestActive* testActive = new (ELeave) CTestActive(); + CleanupStack::Pop(attachmentInfo); // pass ownership to attachment manager + CleanupStack::PushL(testActive); + + imEmailMessage->AttachmentManager().ModifyAttachmentInfoL(attachmentInfo,testActive->iStatus); + + testActive->StartL(); + CActiveScheduler::Start(); // wait for the asynch operation to complete + TInt result = testActive->iStatus.Int(); + + + CleanupStack::PopAndDestroy(2,imEmailMessage); // testActive , imEmailMessage + testUtils->iMsvEntry->SetEntryL(msgEntry.Id()); + + + // Check that the structure of message is: + // MESSAGE + // FOLDER_MIX + // TEXT + // ATTACHMENT + + CMsvEntrySelection* children = testUtils->iMsvEntry->ChildrenL(); + CleanupStack::PushL(children); + test(children->Count() == 1); + + TMsvId serviceId; + TMsvEmailEntry entry; + testUtils->iMsvEntry->Session().GetEntry(children->At(0), serviceId, entry); + test(entry.MessageFolderType() == EFolderTypeMixed); + + testUtils->SetEntryL(children->At(0)); + + CleanupStack::PopAndDestroy(); //children + children = testUtils->iMsvEntry->ChildrenL(); + CleanupStack::PushL(children); + test(children->Count() == 2); + testUtils->iMsvEntry->Session().GetEntry(children->At(0), serviceId, entry); + test(entry.iType == KUidMsvAttachmentEntry); + + + testUtils->iMsvEntry->Session().GetEntry(children->At(1), serviceId, entry); + test(entry.iType == KUidMsvEmailTextEntry); + + CleanupStack::PopAndDestroy(children); //children + CleanupStack::PopAndDestroy(2); //sendAs, bodyText + CleanupStack::PopAndDestroy(3); // ob, paraFormatLayer, charFormatLayer + } + +LOCAL_C void TestAttachmentL() + { + TMsvDummyObserver* ob = new(ELeave) TMsvDummyObserver; + CleanupStack::PushL(ob); + + CMsvSession* session = CMsvSession::OpenSyncL(*ob); + CleanupStack::PushL(session); + + CMsvEntry* cEntry = session->GetEntryL(KMsvRootIndexEntryId); + CleanupStack::PushL(cEntry); + + + // with the new SendAs2 API messages are always created in Drafts + TestAttachmentL(*cEntry, KMsvDraftEntryId); + + CleanupStack::PopAndDestroy(3); // cEntry, session, ob + } + +LOCAL_C void doMainL() + { + InitL(); + + testUtils->GoClientSideL(); + + TMsvId smtpService = testUtils->CreateSmtpServiceL(); + + CEmailAccounts* accounts = CEmailAccounts::NewLC(); + TSmtpAccount smtpAccount; + accounts->GetSmtpAccountL(smtpService, smtpAccount); + accounts->SetDefaultSmtpAccountL(smtpAccount); + CleanupStack::PopAndDestroy(accounts); + + testUtils->TestStart(1); + test.Start(_L("Send SMTP message")); + TestSMTSendL(); + log->AppendComment(_L8("Test 1 OK\n")); + testUtils->TestFinish(1); + + testUtils->TestStart(2); + test.Next(_L("Query message capability")); + TestCapabilityL(); + log->AppendComment(_L8("Test 2 OK\n")); + testUtils->TestFinish(2); + + testUtils->TestStart(3); + test.Next(_L("Message validation")); + TestValidationL(); + log->AppendComment(_L8("Test 3 OK\n")); + testUtils->TestFinish(3); + + testUtils->TestStart(4); + test.Next(_L("Add attachment Test")); + TestAttachmentL(); + log->AppendComment(_L8("Test 4 OK\n")); + testUtils->TestFinish(4); + + log->AppendComment(_L8("Tests completed\n")); + testUtils->TestHarnessCompleted(); + + Closedown(); + } + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + theCleanup=CTrapCleanup::New(); + TRAPD(ret,doMainL()); + test(ret == KErrNone); + delete theCleanup; + test.End(); + test.Close(); + __UHEAP_MARKEND; + return(KErrNone); + }