email/pop3andsmtpmtm/imapservermtm/test/src/T_DEF075510_Offline_Populate.cpp
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/imapservermtm/test/src/T_DEF075510_Offline_Populate.cpp	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,427 @@
+// 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:
+// Name of test harness: T_DEF075510_Offline_Populate.cpp 
+// Component: imapservermtm
+// Output files produced by running test harness:
+// <DRIVE>:\msglogs\T_DEF075510_Offline_Populate.WINSCW.DEB.LOG
+// 
+//
+
+
+#include "EmailTestUtils.h"
+#include <ImapConnectionObserver.H>
+#include <cemailaccounts.h>
+
+
+_LIT(KAt ,"@");
+_LIT8(KFolderPath, "");
+_LIT(KServer, ".intra");
+_LIT(KVisible, "OFFLINE POPULATE  MESSAGE VISIBILITY FLAG SET TO : %d");
+_LIT(KImoffpopulate, " Testing Offline_Populate");
+_LIT(KMsgCompleted, "\t CopyL completed with : %d");
+_LIT(KMsgSend, "\t messages to send in the outbox = : %d");
+_LIT(KProgressError, "\t Progress error = %d");
+	
+RTest test(KImoffpopulate);
+TImapAccount imapAccount;
+LOCAL_D TMsvId imap4Service;
+LOCAL_D TMsvId smtpService;
+LOCAL_D CEmailTestUtils* testUtils;
+LOCAL_D CTrapCleanup* theCleanup;
+
+#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 //
+
+class TDummySessionObserver : public CBase , public MMsvSessionObserver
+	{
+public:
+	void HandleSessionEventL(TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/){}
+	};
+	
+
+class CDummyConnectionObserver : public MMsvImapConnectionObserver
+	{
+		void HandleImapConnectionEvent(TImapConnectionEvent /*aConnectionEvent*/){}
+	};
+
+// Disconnect from ImapServer
+LOCAL_C void DisconnectImapServerL()
+	{
+	test.Printf(_L("DisConnecting to IMAP server                      \n"));
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+ 	
+  	CMsvEntrySelection *msvSelection = new(ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+	msvSelection->AppendL(imap4Service);
+
+	TBuf8 <1> aParameter;
+  	CMsvOperation* msvOperation = testUtils->iImapClientMtm->InvokeAsyncFunctionL(KIMAP4MTMDisconnect,*msvSelection, aParameter, testActive->iStatus);
+	testUtils->WriteComment(_L("Dissconnect from IMAP server  "));
+	CleanupStack::PushL(msvOperation);
+
+	testActive->StartL();
+	CActiveScheduler::Start();
+	CleanupStack::PopAndDestroy(3,testActive);//msvOperation,msvSelection,children,testActive
+	}
+
+
+LOCAL_C void ConnectAndFullSyncImapServerL()
+	{
+	CTestActive* testActive = new(ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+	
+	CMsvEntrySelection * msvSelection = new(ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+	
+	test.Printf(_L("Connecting to IMAP server             \n"));
+	msvSelection->AppendL(imap4Service);
+	
+	CDummyConnectionObserver *dummyObserver = new(ELeave)CDummyConnectionObserver; 
+	CleanupStack::PushL(dummyObserver);
+	TPckg<MMsvImapConnectionObserver*> aParameter(dummyObserver);
+  	
+  	CMsvOperation* msvOperation = testUtils->iImapClientMtm->InvokeAsyncFunctionL(KIMAP4MTMConnectAndSyncCompleteAfterFullSync,*msvSelection, aParameter, testActive->iStatus);
+  	testUtils->WriteComment(_L(" Connect to Imap server and Sync the mails  "));
+	CleanupStack::PushL(msvOperation);
+	
+	testActive->StartL();
+	CActiveScheduler::Start();
+
+   	CleanupStack::PopAndDestroy(4,testActive);//msvOperation,dummyObserver,msvSelection,testActive
+   	}
+
+LOCAL_C void PopulateMessagesWhenOfflineL(CMsvEntrySelection & aSelection)
+	{
+	testUtils->WriteComment(_L("Testing Offline_Populat "));
+
+	CTestActive* testActive = new(ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+	TBuf8 <1> aParameter;
+	TMsvSelectionOrdering ordering;
+	
+	TDummySessionObserver *sessionObserver = new (ELeave) TDummySessionObserver;
+	// Session. Needed to create a client registry.
+	CMsvSession* session = CMsvSession::OpenSyncL(*sessionObserver);
+    CMsvOperation*	msvOperation = testUtils->iImapClientMtm->InvokeAsyncFunctionL(KIMAP4MTMPopulate, aSelection, aParameter, testActive->iStatus);	
+	testUtils->WriteComment(_L("Populate mails from  the  Imap Server When Offline "));
+	testActive->StartL();
+	CActiveScheduler::Start();	// Start the populate all mail active object
+	CMsvEntry*	inboxEntry1 = CMsvEntry::NewL(*session, (aSelection)[0],ordering);
+	CleanupStack::PushL(inboxEntry1);
+
+	TMsvEmailEntry entry = inboxEntry1->Entry();
+	TBool visible = entry.Visible();
+	test(visible == 1);
+	testUtils->Printf(KVisible, visible);
+
+	CleanupStack::PopAndDestroy(inboxEntry1);
+	
+    delete msvOperation;
+    delete sessionObserver;
+    delete session;
+	CleanupStack::PopAndDestroy(testActive);
+	
+	}
+	
+	
+//	
+LOCAL_C void CreateNewSmtpSettingsL()
+	{
+	testUtils->iMsvEntry->SetEntryL(smtpService);
+	TMsvId serviceId = smtpService;
+	//overwrite the settings with test code one.  Don't want the default settings.
+	CImSmtpSettings* settings = new(ELeave) CImSmtpSettings();
+	CleanupStack::PushL(settings);
+	CEmailAccounts* accounts = CEmailAccounts::NewLC();
+	TSmtpAccount smtpAccountId;
+	accounts->GetSmtpAccountL( serviceId, smtpAccountId);
+	accounts->LoadSmtpSettingsL(smtpAccountId, *settings);
+	TInt serverLength = testUtils->MachineName().Length();
+	HBufC* serverad = HBufC::NewL(serverLength + 7 ); // 7 is the length of KServerAddress
+	CleanupStack::PushL(serverad);
+	serverad->Des().Copy(testUtils->MachineName());
+	serverad->Des().Append(KServer);	
+    settings->SetServerAddressL(*serverad);
+    HBufC* emailaddress = HBufC::NewL(serverLength + 8 + serverad->Des().Length() + 1 );
+   	CleanupStack::PushL(emailaddress);
+   	emailaddress->Des().Copy(testUtils->MachineName());
+   	emailaddress->Des().Append(KAt);
+   	emailaddress->Des().Append(*serverad);
+   	settings->SetEmailAddressL(*emailaddress);
+	settings->SetReplyToAddressL(*emailaddress);
+	settings->SetReceiptAddressL(*emailaddress);
+	settings->SetEmailAliasL(_L("Test Account"));
+	settings->SetBodyEncoding(EMsgOutboxMIME);
+	settings->SetRequestReceipts(EFalse);
+	settings->SetPort(25);
+	TSmtpAccount smtpAccount;
+ 	accounts->GetSmtpAccountL(smtpService, smtpAccount);
+	accounts->SaveSmtpSettingsL(smtpAccount, *settings);
+	CleanupStack::PopAndDestroy(emailaddress);
+	CleanupStack::PopAndDestroy(serverad);
+	CleanupStack::PopAndDestroy(2,settings);
+	testUtils->WriteComment(_L("Created New SmtpSettings  "));	
+		
+	}
+LOCAL_C void CreateNewPlaintextMessageL()
+	{
+	CTestActive* testActive = new(ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+	TMsvEmailTypeList msvEmailTypeList = 0;
+	TMsvPartList partList = (KMsvMessagePartBody | KMsvMessagePartAttachments);
+	CImEmailOperation* emailOperation = CImEmailOperation::CreateNewL(testActive->iStatus, *(testUtils->iMsvSession),KMsvGlobalOutBoxIndexEntryId, partList, msvEmailTypeList, KUidMsgTypeSMTP);
+	CleanupStack::PushL(emailOperation);
+	TestMsvOperationTimer* testMsvOperationTimer = TestMsvOperationTimer::NewLC(test.Console(), emailOperation, test);
+	testActive->StartL();
+	testMsvOperationTimer->IssueRequest();
+	CActiveScheduler::Start();
+	//check progress
+	TMsvId temp;
+	TPckgC<TMsvId> paramPack(temp);
+	const TDesC8& progBuf = emailOperation->ProgressL();
+	paramPack.Set(progBuf);
+	TMsvId newMessageId;
+	newMessageId = paramPack();
+	test(newMessageId != NULL);
+	testUtils->WriteComment(_L("\t Created New plaintext message"));
+	testUtils->iMsvEntry->SetEntryL(newMessageId);
+    CMsvStore* store = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(store);
+	CImHeader* header = CImHeader::NewLC();
+	header->RestoreL(*store);
+	
+	TInt serverLength = testUtils->MachineName().Length();
+	HBufC* serverad = HBufC::NewL(serverLength + 7 ); // 7 is the length of KServerAddress
+	CleanupStack::PushL(serverad);
+	serverad->Des().Copy(testUtils->MachineName());
+	serverad->Des().Append(KServer);	
+    HBufC* emailaddress = HBufC::NewL(serverLength + 8 + serverad->Des().Length() + 1 );
+   	CleanupStack::PushL(emailaddress);
+   	emailaddress->Des().Copy(testUtils->MachineName());
+   	emailaddress->Des().Append(KAt);
+   	emailaddress->Des().Append(*serverad);
+   	header->ToRecipients().AppendL(*emailaddress);
+   	
+	header->SetSubjectL(_L("Test sending message using CMsvEntry::CopyL!!"));
+	header->StoreL(*store);
+	store->CommitL();
+	CleanupStack::PopAndDestroy(emailaddress);
+	CleanupStack::PopAndDestroy(serverad);
+	CleanupStack::PopAndDestroy(5,testActive); // header,store,testMsvOperationTimer,emailOperation,testActive
+	
+		
+	}
+LOCAL_C void SendSmtpMessageL()
+	{
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);
+	testUtils->InstantiateSmtpClientMtmL();
+	CMsvEntrySelection* sendSel = testUtils->iMsvEntry->ChildrenL();
+	CleanupStack::PushL(sendSel);
+	TInt count = sendSel->Count();
+	test(count >= 1);
+	testUtils->Printf(KMsgSend, count);
+	testUtils->iSmtpClientMtm->SetCurrentEntryL(testUtils->iMsvSession->GetEntryL(KMsvGlobalOutBoxIndexEntryId));
+	CMsvOperation* msvOperation = testUtils->iSmtpClientMtm->Entry().CopyL(*sendSel, smtpService, testActive->iStatus);
+	CleanupStack::PushL(msvOperation);
+	testActive->StartL();
+	CActiveScheduler::Start();
+
+	//check progress
+    testUtils->Printf(KMsgCompleted, testActive->iStatus.Int()); 
+
+	CMsvEntrySelection* sendSelc = testUtils->iMsvEntry->ChildrenL();
+	TInt noOfMessages = sendSelc->Count();
+
+	// Check Whether the mails in Outbox is Zero (i.e. mails has been sent..).
+    test(noOfMessages == 0);
+  	delete sendSelc;
+ 	TImSmtpProgress temp;	
+	TPckgC<TImSmtpProgress> paramPack(temp);
+	const TDesC8& progBuf = msvOperation->ProgressL();
+	paramPack.Set(progBuf);
+	TImSmtpProgress progress = paramPack();	
+	
+	testUtils->Printf(KProgressError, progress.Error()); 
+
+	test(progress.Error()==0);
+	CleanupStack::PopAndDestroy(3,testActive); //msvOperation,sendsel,testActive
+	}
+	
+LOCAL_C void CreateandSendMessageL()
+	{
+	test.Next(_L("Test sending message to server "));
+	CreateNewSmtpSettingsL();
+	testUtils->iMsvEntry->SetEntryL(smtpService);
+	CreateNewPlaintextMessageL();
+	SendSmtpMessageL();
+	}
+
+LOCAL_C void TestOfflinePopulateL()
+	{
+	CreateandSendMessageL();
+	// Tests start here
+	testUtils->iImapClientMtm->SwitchCurrentEntryL(imap4Service);
+	// connect, do full sync and then  so that the inbox can be synced
+    test.Printf(_L("Connecting to IMAP server            \n"));
+    
+    ConnectAndFullSyncImapServerL();
+    
+    CMsvEntry* imapService=NULL;
+    CMsvEntry* inboxEntry=NULL;
+    TMsvSelectionOrdering ordering;
+	
+	TDummySessionObserver *sessionObserver = new (ELeave) TDummySessionObserver;
+	// Session. Needed to create a client registry.
+	CMsvSession* session = CMsvSession::OpenSyncL(*sessionObserver);
+
+	// message in remote inbox					
+	//create a CMsvEntry for the service entry
+	imapService = CMsvEntry::NewL(*session, imapAccount.iImapService,ordering);
+	CleanupStack::PushL(imapService);
+	//retrieve the inbox from the imap service entry
+	CMsvEntrySelection* msvEntrySelection =imapService->ChildrenL();
+	CleanupStack::PushL(msvEntrySelection);
+ 
+	
+	//create a CMsvEntry for the inbox entry
+	inboxEntry = CMsvEntry::NewL(*session, (*msvEntrySelection)[0],ordering);
+	TBuf8 <1> aParameter;	    
+				
+	CleanupStack::PopAndDestroy(msvEntrySelection);
+	CleanupStack::PushL(inboxEntry);
+			
+	//retrieve the message from the inboxEntry service entry
+    CMsvEntrySelection* selection = inboxEntry->ChildrenL();
+    
+    DisconnectImapServerL();
+      
+    PopulateMessagesWhenOfflineL(*selection);
+    ConnectAndFullSyncImapServerL();
+    
+    CleanupStack::PopAndDestroy(inboxEntry);
+	CleanupStack::PopAndDestroy(imapService);
+    
+    delete sessionObserver;
+    delete session;
+    delete selection;
+   
+	}
+
+LOCAL_C void InitL()
+	{
+	// 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);
+
+	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->GoServerSideL();
+    testUtils->ClearEmailAccountsL();
+	test.Next(_L("Create Data Component FileStores"));
+	testUtils->CreateSmtpServerMtmRegL();
+	//	Loading the DLLs
+	testUtils->CreateRegistryObjectAndControlL();
+	testUtils->InstallSmtpMtmGroupL();
+	testUtils->GoClientSideL();
+	// Create Services
+	smtpService = testUtils->CreateSmtpServiceL();
+	imap4Service = testUtils->CreateImapServiceL();
+	CEmailAccounts* accounts = CEmailAccounts::NewLC();
+	TSmtpAccount smtpAccount;
+	accounts->GetSmtpAccountL(smtpService, smtpAccount);
+	accounts->SetDefaultSmtpAccountL(smtpAccount);
+    testUtils->WriteComment(_L("Create  Imap   Services           ")); 
+	// Delete any *.scr files in c:\logs\email directory.
+	testUtils->DeleteScriptFilesFromLogsDirL();
+
+	testUtils->iMsvEntry->SetEntryL(imap4Service);
+	//overwrite the settings with test code one.  Don't want the default settings.
+	CImImap4Settings* settings = new(ELeave) CImImap4Settings();
+	CleanupStack::PushL(settings);
+	settings->Reset();
+	TInt serverLength = testUtils->MachineName().Length();
+	HBufC* serverad = HBufC::NewL(serverLength + 7 ); // 7 is the length of KServerAddress
+	CleanupStack::PushL(serverad);
+	serverad->Des().Copy(testUtils->MachineName());
+	serverad->Des().Append(KServer);
+	settings->SetServerAddressL(*serverad);
+	CleanupStack::PopAndDestroy(serverad); 
+	settings->SetDeleteEmailsWhenDisconnecting(ETrue);
+	settings->SetAcknowledgeReceipts(ETrue);
+	settings->SetAutoSendOnConnect(ETrue);
+	settings->SetLoginNameL(testUtils->MachineName());
+	settings->SetPasswordL(testUtils->MachineName());
+   	settings->SetPort(143);
+	settings->SetFolderPathL(KFolderPath);
+	accounts->GetImapAccountL(imap4Service, imapAccount);
+	accounts->SaveImapSettingsL(imapAccount, *settings);
+	CleanupStack::PopAndDestroy(2,accounts); //accounts,settings
+	test.Printf(_L("Instantiating IMAP4 Client MTM"));
+	testUtils->InstantiateImapClientMtmL();
+	}
+
+LOCAL_C void Closedown()
+	{
+     
+	CleanupStack::PopAndDestroy(2);  //testUtils, scheduler 
+	}
+
+LOCAL_C void doMainL()
+	{
+	test.Start(_L("IMAP4 - Offline Populate"));
+	InitL();
+  	testUtils->TestStart(1);
+	TestOfflinePopulateL();
+ 	testUtils->TestFinish(1);
+
+	testUtils->TestHarnessCompleted();
+
+	Closedown();		
+	}
+
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	theCleanup=CTrapCleanup::New();
+	TRAPD(ret,doMainL());		
+	test(ret==KErrNone);
+	delete theCleanup;	
+	test.Console()->SetPos(0, 13);
+	test.End();
+	test.Close();
+	__UHEAP_MARKEND;
+	return(KErrNone);
+	}
+