diff -r 000000000000 -r 72b543305e3a email/pop3andsmtpmtm/clientmtms/test/src/T_imcm07.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/pop3andsmtpmtm/clientmtms/test/src/T_imcm07.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,529 @@ +// 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_IMCM07 +// Component: IMCM +// Owner: VK +// Brief description of test harness: +// Tests CImEmailAutoSend class. This test code creates POP and SMTS +// mtms and calls InvokeAsync (with command KIMAP4MTMConnect/KPOP3MTMConnect) +// on them which creates SMTC and tries to autosend. +// Detailed description of test harness: +// As above. +// updated to not use TestUtils when instantiating email accounts - TestUtils does +// not associate an SMTP account with POP or IMAP accounts. +// Input files required to run test harness: +// \MSG\IMCMTSRC\RFCT_IMCM07\rfc82202.txt :\msgtest\IMCM\RFCT_IMCM07\rfc82202.txt +// \MSG\IMCMTSRC\RFCT_IMCM07\rfc82203.txt :\msgtest\IMCM\RFCT_IMCM07\rfc82203.txt +// \MSG\IMCMTSRC\RFCT_IMCM07\rfc82204.txt :\msgtest\IMCM\RFCT_IMCM07\rfc82204.txt +// \MSG\IMCMTSRC\RFCT_IMCM07\rfc82205.txt :\msgtest\IMCM\RFCT_IMCM07\rfc82205.txt +// \MSG\IMCMTSRC\RFCT_IMCM07\rfc82206.txt :\msgtest\IMCM\RFCT_IMCM07\rfc82206.txt +// Intermediate files produced while running test harness: +// None +// Output files produced by running test harness: +// :\msglogs\T_IMCM07...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_IMCM07.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_IMCM07.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_IMCM07.exe on the other platform +// +// + + +#include "emailtestutils.h" +#include +#include +#include +#include +#include +#include +#include +#include + +// For loading the serial comms device drivers +#if defined (__WINS__) + #define PDD_NAME _L("ECDRV") + #define LDD_NAME _L("ECOMM") +#else + #define PDD_NAME _L("EUART1") + #define LDD_NAME _L("ECOMM") +#endif + +// local variables etc // + +_LIT(KImcmTest, "T_IMCM07 - Testing AutoSend of Email Messages"); +_LIT(KDontPanic, "All unsent messages were suspended--this is the expected behaviour"); +_LIT(KServer, "lon-cn-exchng2k.msexchange2k.closedtest.intra"); +RTest test(KImcmTest); + +_LIT(KTestParams,"-testparams"); +enum TCmdLineArgs + { + EArgProgramName, + EArgTestParams, + EArgPopServerAddress, + EArgPopLogin, + EArgPopPassword, + EArgImapServerAddress, + EArgImapLogin, + EArgImapPassword, + EArgSmtpServerAddress, + EArgSmtpEmail, + EArgEnd + }; + +LOCAL_D CTrapCleanup* theCleanup; +LOCAL_D CEmailTestUtils* testUtils; +LOCAL_D CActiveScheduler* scheduler; +LOCAL_C CMsvEntrySelection* msvSelection; +LOCAL_D TInt globalError; +LOCAL_D TMsvId Pop3ServiceId; +LOCAL_D TMsvId SmtpServiceId; +LOCAL_D TMsvId ImapServiceId; +LOCAL_D TMsvId SmtpService2Id; + +// + +// +// The CUndertaker class notifies its client of the death of a particular thread +// or process. When this occurs it stops the active scheduler. + + + +// Test harness code. + +LOCAL_C void DoAutoSendL(TBool aPop) + { + TBuf8<1> aParameter; + msvSelection->ResizeL(0); + + CTestActive* testActive = new (ELeave) CTestActive(); + CleanupStack::PushL(testActive); + CMsvOperation* msvOperation=NULL; + if (!aPop) + { + testUtils->WriteComment(_L("Connecting to the Pop3 server")); + msvSelection->AppendL(Pop3ServiceId); + msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnect, *msvSelection, aParameter, testActive->iStatus); + } + + CleanupStack::PushL(msvOperation); + testActive->StartL(); // Start the connect active object + CActiveScheduler::Start(); + + CleanupStack::PopAndDestroy(2); //testactive, msvOperation + aParameter.Zero(); + msvSelection->ResizeL(0); + + testActive = new (ELeave) CTestActive(); + CleanupStack::PushL(testActive); + msvOperation=NULL; + if (!aPop) + { + testUtils->WriteComment(_L("Disconnecting from the Pop3 server")); + msvSelection->AppendL(Pop3ServiceId); + msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMDisconnect, *msvSelection, aParameter, testActive->iStatus); + } + + CleanupStack::PushL(msvOperation); + testActive->StartL(); // Start the connect active object + CActiveScheduler::Start(); + + TBuf<64> logString; + if (!aPop) + { + TPop3Progress temp; + TPckgC paramPack(temp); + paramPack.Set(msvOperation->ProgressL()); + TPop3Progress progress=paramPack(); + logString.Format(_L(" InvokeAsyncFunctionL completed with %d"),progress.iErrorCode); + testUtils->WriteComment(logString); + globalError=progress.iErrorCode; + } + CleanupStack::PopAndDestroy(2); //testactive, msvOperation + } + +LOCAL_C void Closedown() + { + if (globalError) + testUtils->TestHarnessFailed(globalError); + else + testUtils->TestHarnessCompleted(); + CleanupStack::PopAndDestroy(2); //testUtils, scheduler, + } + +// updates POP account settings +LOCAL_C void UpdatePopSettingsL(CImPop3Settings& aPopSettings) + { + aPopSettings.SetServerAddressL(KServer); + aPopSettings.SetLoginNameL(testUtils->MachineName()); + aPopSettings.SetPasswordL(testUtils->MachineName()); + aPopSettings.SetPort(110); + aPopSettings.SetAutoSendOnConnect(ETrue); + } + +// updates SMTP account settings +LOCAL_C void UpdateSmtpSettingsL(CImSmtpSettings& aSmtpSettings) + { + aSmtpSettings.SetServerAddressL(KServer); + _LIT(KSmtpEmailAddress, ""); + aSmtpSettings.SetEmailAddressL(KSmtpEmailAddress); + aSmtpSettings.SetReplyToAddressL(KSmtpEmailAddress); + aSmtpSettings.SetReceiptAddressL(KSmtpEmailAddress); + aSmtpSettings.SetEmailAliasL(_L("IMCM07")); + aSmtpSettings.SetBodyEncoding(EMsgOutboxMIME); + aSmtpSettings.SetPort(25); + } + +LOCAL_C void InitL() + { + scheduler = new (ELeave) CActiveScheduler; + CleanupStack::PushL(scheduler); + CActiveScheduler::Install( scheduler ); + + testUtils = CEmailTestUtils::NewLC(test); + + // Load the serial comms device drivers. If this is not done, + // connecting via NT-RAS returns KErrNotFound (-1). + TInt driverErr; + driverErr=User::LoadPhysicalDevice(PDD_NAME); + if (driverErr!=KErrNone && driverErr!=KErrAlreadyExists) + User::Leave(driverErr); + driverErr=User::LoadLogicalDevice(LDD_NAME); + if (driverErr!=KErrNone && driverErr!=KErrAlreadyExists) + User::Leave(driverErr); + } + + +LOCAL_C void InitPopL() + { + // delete all accounts, emails etc + testUtils->CleanMessageFolderL(); + testUtils->ClearEmailAccountsL(); + testUtils->GoClientSideL(); + + // Create POP account via CEmailAccounts... + CEmailAccounts* emailAccounts = CEmailAccounts::NewLC(); + + // Create objects requried for POP account + CImIAPPreferences* popIapPreferences = CImIAPPreferences::NewLC(); + + CImPop3Settings* popSettings = new (ELeave) CImPop3Settings; + CleanupStack::PushL(popSettings); + + // Create objects requried for SMTP account + CImIAPPreferences* smtpIapPreferences = CImIAPPreferences::NewLC(); + + CImSmtpSettings *smtpSettings = new (ELeave) CImSmtpSettings; + CleanupStack::PushL(smtpSettings); + + // Set the default POP and SMTP settings + emailAccounts->PopulateDefaultPopSettingsL(*popSettings, *popIapPreferences); + emailAccounts->PopulateDefaultSmtpSettingsL(*smtpSettings, *smtpIapPreferences); + + // overwrite the IAP preferences + TImIAPChoice iapChoice; + iapChoice.iIAP = 1; + iapChoice.iDialogPref = ECommDbDialogPrefDoNotPrompt; + + TInt index = 0; + popIapPreferences->AddIAPL(iapChoice, index); + smtpIapPreferences->AddIAPL(iapChoice, index); + + // update POP, IMAP and SMTP settings + UpdatePopSettingsL(*popSettings); + UpdateSmtpSettingsL(*smtpSettings); + + // Create the POP account + _LIT(KPopAccountName, "PopAccount"); + TPopAccount popAccount = emailAccounts->CreatePopAccountL(KPopAccountName, *popSettings,*popIapPreferences,EFalse); + TSmtpAccount smtpAccount = emailAccounts->CreateSmtpAccountL(popAccount, *smtpSettings, *smtpIapPreferences, EFalse); + emailAccounts->SetDefaultSmtpAccountL(smtpAccount); + + // set the global service ID variables + Pop3ServiceId = popAccount.iPopService; + SmtpServiceId = smtpAccount.iSmtpService; + + // tell the test utils what the ids are. + testUtils->iPopServiceId = Pop3ServiceId; + testUtils->iSmtpServiceId = SmtpServiceId; + + CleanupStack::PopAndDestroy(5, emailAccounts); + + // Create test message files + testUtils->GoServerSideL(); + testUtils->CreateMessageFilesL(SmtpServiceId, KMsvDraftEntryId,_L("c:\\mailtest\\rfcT_IMCM07\\")); + testUtils->GoClientSideL(); + } + +LOCAL_C void EmptyDraftsFolderL() + { + CTestActive* testActive = new (ELeave) CTestActive(); + CleanupStack::PushL(testActive); + testUtils->iMsvEntry->SetEntryL(KMsvDraftEntryIdValue); + CMsvEntrySelection* draftSel = testUtils->iMsvEntry->ChildrenL(); + CleanupStack::PushL(draftSel); + CMsvOperation* operation = testUtils->iMsvEntry->DeleteL(*draftSel, testActive->iStatus); + CleanupStack::PushL(operation); + testActive->StartL(); // Start the connect active object + CActiveScheduler::Start(); + CleanupStack::PopAndDestroy(3, testActive); //testActive, draftSel, operation + } + + +LOCAL_C void SetDifferentSendingStatesOnMessagesL(CMsvEntrySelection& msgList) + { + test(msgList.Count()>=3); //otherwise following will fail!! + + TMsvEmailEntry entry; + + testUtils->iMsvEntry->SetEntryL(msgList.At(0)); + entry = testUtils->iMsvEntry->Entry(); + if (entry.SendingState() != KMsvSendStateResend) + entry.SetSendingState(KMsvSendStateResend); + testUtils->ChangeEntryL(entry); + + testUtils->iMsvEntry->SetEntryL(msgList.At(1)); + entry = testUtils->iMsvEntry->Entry(); + if (entry.SendingState() != KMsvSendStateScheduled) + entry.SetSendingState(KMsvSendStateScheduled); + testUtils->ChangeEntryL(entry); + + //This message should not be sent! + testUtils->iMsvEntry->SetEntryL(msgList.At(2)); + entry = testUtils->iMsvEntry->Entry(); + if (entry.SendingState() != KMsvSendStateSuspended) + entry.SetSendingState(KMsvSendStateSuspended); + testUtils->ChangeEntryL(entry); + + for (TInt count = 3; countiMsvEntry->SetEntryL(msgList.At(count)); + entry = testUtils->iMsvEntry->Entry(); + if (entry.SendingState() != KMsvSendStateWaiting) + entry.SetSendingState(KMsvSendStateWaiting); + testUtils->ChangeEntryL(entry); + } + } + +LOCAL_C void CheckMessagesCreatedAndCopyToOutboxL() + { + testUtils->iMsvEntry->SetEntryL(KMsvDraftEntryId); + CMsvEntrySelection* msgList = testUtils->iMsvEntry->ChildrenL(); + CleanupStack::PushL(msgList); + TInt count=msgList->Count(); + CMsvOperation* msvOperation=NULL; + if (count) + { + CMsvEntry* msvEntry = testUtils->iMsvSession->GetEntryL(KMsvDraftEntryId); + CleanupStack::PushL(msvEntry); + TRequestStatus status=KRequestPending; + msvOperation = msvEntry->CopyL(*msgList, KMsvGlobalOutBoxIndexEntryId,status); + CleanupStack::PushL(msvOperation); + + TInt err=KErrNone; + while(status==KRequestPending) + { + CActiveScheduler::Current()->RunIfReady(err,0); + User::WaitForAnyRequest(); + } + + test(err==KErrNone); + test(msvOperation->iStatus.Int() == KErrNone); + testUtils->WriteComment(_L("Messages created sucessfully in the Outbox")); + testUtils->iMsvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId); + CMsvEntrySelection* outboxSel = testUtils->iMsvEntry->ChildrenL(); + CleanupStack::PushL(outboxSel); + // set sending states on the messages + SetDifferentSendingStatesOnMessagesL(*outboxSel); + testUtils->iMsvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId); + CleanupStack::PopAndDestroy(3); //msvOperation, msvEntry, outboxSel + } + else + { + testUtils->WriteComment(_L("Failed to create messages")); + Closedown(); + return; + } + CleanupStack::PopAndDestroy(msgList); + } + + + +LOCAL_C TInt CountUnsentEmailsSuspended(CMsvEntrySelection& aUnsentEmails) +/** +Counts how many of the unsent emails were suspended, and hence shouldn't have been sent anyway! + + @param aUnsentEmails a CMsvEntrySelection of the emails that were left behind in the outbox. + @return The number of unsent emails that were marked as suspended +*/ + { + TInt suspendedCount = 0; + TMsvEntry entry; + for (TInt count = 0; countiMsvEntry->SetEntryL(aUnsentEmails.At(count)); + entry = testUtils->iMsvEntry->Entry(); + + //Was it suspended? + if (entry.SendingState() == KMsvSendStateSuspended) + //if so, increment the count + suspendedCount++; + } + + testUtils->iMsvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId); //Remove lock so entry can be deleted + + return suspendedCount; + } + + +// Get a handle on the SMTP autosend process/thread and pass it to the undertaker. +// The undertaker will handle death notifications from the process or thread and stop +// the active scheduler accordingly. +// Note: When running on WINS the autosend is launched in a separate thread as opposed to a +// fully fledged process. +LOCAL_C void WaitForAutosendToComplete() + { + // Give the process a chance to get started first... + User::After(3*1000*1000); + + RProcess thread; // Process masquerading as a thread. + _LIT(KAutoSendProcess, "AUTOSEND*"); + TFullName name; + TFindProcess findAutoSendProcess(KAutoSendProcess); + TInt errorInt = findAutoSendProcess.Next(name); + if (errorInt == KErrNone) + errorInt = thread.Open(findAutoSendProcess); + + // Get undertaker to wait for Autosend to finish. + // KErrNone might indicate that it finished already. + if(errorInt == KErrNone) + { + TRequestStatus status; + thread.Logon(status); + User::WaitForRequest(status); + thread.Close(); + } + } + + +LOCAL_C void CheckMessagesSentL(TInt aTestNumber) + { + testUtils->TestStart(aTestNumber,_L("Checking all messages in Outbox have been sent")); + + // make sure that selection on outbox is refreshed by changing context to an + // alternative mailbox prior to getting the outbox selection. + testUtils->iMsvEntry->SetEntryL(KMsvDraftEntryIdValue); + testUtils->iMsvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryIdValue); + CMsvEntrySelection* selection = testUtils->iMsvEntry->ChildrenL(); + CleanupStack::PushL(selection); + + // Are there any messages in the outbox? + // if so, delete them and report an error if any remain that should have been sent. + if (selection->Count()!=0) + { + TInt unsent = CountUnsentEmailsSuspended(*selection); + CTestActive* testActive = new (ELeave) CTestActive(); + CleanupStack::PushL(testActive); + testUtils->WriteComment(_L("Not all messages sent - deleting unsent messages")); + + //only interested in the ones that *should've* been sent + globalError = selection->Count() - unsent; + CMsvOperation* operation = testUtils->iMsvEntry->DeleteL(*selection, testActive->iStatus); + CleanupStack::PushL(operation); + testActive->StartL(); // Start the connect active object + CActiveScheduler::Start(); + CleanupStack::PopAndDestroy(2, testActive); //testActive, operation + + if (!globalError) + { + testUtils->WriteComment(KDontPanic); + } + } + + CleanupStack::PopAndDestroy(selection); + testUtils->TestFinish(aTestNumber,globalError); + } + + + +LOCAL_C void TestPop3AutosendL() + { + InitPopL(); + + + testUtils->InstantiatePopClientMtmL(); + testUtils->InstantiateSmtpClientMtmL(); + + CheckMessagesCreatedAndCopyToOutboxL(); + + testUtils->TestStart(1,_L("Connect to pop and auto send messages from the outbox")); + DoAutoSendL(EFalse); + testUtils->TestFinish(1,globalError); + + WaitForAutosendToComplete(); + + CheckMessagesSentL(2); + } + + +LOCAL_C void doMainL() + { + InitL(); + + msvSelection = new (ELeave) CMsvEntrySelection; + CleanupStack::PushL(msvSelection); + + // Test Autosend via POP3 + TestPop3AutosendL(); + + CleanupStack::PopAndDestroy(msvSelection); + Closedown(); + } + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + test.Start(_L("T_IMCM07 Test CImEmailAutoSend Functionality")); + theCleanup=CTrapCleanup::New(); + TRAPD(ret,doMainL()); + test(ret==KErrNone); + delete theCleanup; + test.End(); + test.Close(); + __UHEAP_MARKEND; + User::Heap().Check(); + return(KErrNone); + }