messagingfw/msgtest/integration/email/src/imaptests.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgtest/integration/email/src/imaptests.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,1405 @@
+// Copyright (c) 1999-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 "imaptests.h"
+#include <imapconnectionobserver.h>
+#include <cemailaccounts.h>
+#include <iapprefs.h>
+
+
+//Provides access to Settings flag for seen flag tests 
+LOCAL_D CImImap4Settings* isaveSettings;
+_LIT(KImapAccountName, "IMAP");
+
+// Strings....
+_LIT(KErrUseService, "[%4d] Error! you have to select a service for use before you can access it!");
+
+
+//
+//
+// CImapClientTest
+//
+
+CImapClientTest* CImapClientTest::NewL(CEmailTestUtils& aTestUtils, RTest& aTest)
+	{
+	CImapClientTest* self = new (ELeave) CImapClientTest(aTestUtils, aTest);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CImapClientTest::~CImapClientTest()
+	{
+	}
+
+void CImapClientTest::ConstructL()
+	{
+	CEmailClientTest::ConstructL();
+	}
+
+CImapClientTest::CImapClientTest(CEmailTestUtils& aTestUtils, RTest& aTest) : CEmailClientTest(aTestUtils, aTest)
+	{
+	}
+
+
+
+//
+//
+// CCreateImapService
+//
+
+void CCreateImapService::StartL(TRequestStatus& aStatus)
+	{
+	// create imap account
+	CEmailAccounts* account = CEmailAccounts::NewLC();
+
+	CImIAPPreferences* imapIAP = CImIAPPreferences::NewLC();
+	
+	iSettings->SetDisconnectedUserMode(ETrue);
+	iSettings->SetSynchronise(EUseLocal);
+	iSettings->SetSubscribe(EUpdateNeither);	
+	TImapAccount accountId = account->CreateImapAccountL(*iDetails, *iSettings, *imapIAP,EFalse);
+
+	//save settings address
+	isaveSettings = iSettings;
+
+	// get imap service for the account
+	TMsvId service = accountId.iImapService;
+	
+	// select this service
+	CMsvEntry& msvEntry = *(iTestHarness.EmailTestUtils().iMsvEntry);
+	msvEntry.SetEntryL(service);
+	iEntry = msvEntry.Entry();
+	iTestHarness.iCurrentServiceId = service;
+	iTestHarness.EmailTestUtils().iImapServiceId = service;
+
+	CleanupStack::PopAndDestroy(2, account); // imapIAP, account
+
+	if(iTestHarness.EmailTestUtils().iImapClientMtm == NULL)
+		iTestHarness.EmailTestUtils().InstantiateImapClientMtmL();
+	else // no need to create a new one, reuse the existing one
+		iTestHarness.EmailTestUtils().iImapClientMtm->SwitchCurrentEntryL(iTestHarness.iCurrentServiceId);
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}
+
+CCreateImapService* CCreateImapService::NewL(CEmailClientTest& aTestHarness)
+	{
+	CCreateImapService* self = new (ELeave) CCreateImapService(aTestHarness);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CCreateImapService::CCreateImapService(CEmailClientTest& aTestHarness) : CCreateEmailService(aTestHarness), iTestHarness(aTestHarness)
+	{
+	}
+
+void CCreateImapService::ConstructL()
+	{
+	iSettings = new(ELeave) CImImap4Settings();
+	}
+
+CCreateImapService::~CCreateImapService()
+	{
+	delete iSettings;
+	}
+
+CImImap4Settings& CCreateImapService::Settings()
+	{
+	return *iSettings;
+	}
+
+
+//
+//
+// CImapUseService
+//
+
+CImapUseService::CImapUseService(CImapClientTest& aTestHarness) : iTestHarness(aTestHarness)
+	{
+	}
+
+void CImapUseService::StartL(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+
+	// Select current folder
+	CMsvEntry& entry = *(iTestHarness.EmailTestUtils().iMsvEntry);
+	entry.SetEntryL(iTestHarness.iSelectedFolder);
+		
+	// first make sure it is a service which is selected
+	//  then change the test utils service id
+	if(entry.Entry().iType == KUidMsvServiceEntry)
+		{
+		iTestHarness.EmailTestUtils().iImapServiceId = entry.Entry().Id();
+		if(iTestHarness.EmailTestUtils().iImapClientMtm == NULL)
+			iTestHarness.EmailTestUtils().InstantiateImapClientMtmL();
+		else // no need to create a new one, reuse the existing one
+			iTestHarness.EmailTestUtils().iImapClientMtm->SwitchCurrentEntryL(entry.Entry().Id());
+		}
+	else
+		{
+		TBuf<100> logString;
+		logString.Format(KErrUseService, iDebugInfo.LineNumber());
+		iTestHarness.LogComment(logString);
+
+		err = KErrUnknown;
+		}
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+
+
+//
+//
+// CCreateImapClientMtm
+//
+
+CCreateImapClientMtm::CCreateImapClientMtm(CEmailClientTest& aTest) : iTest(aTest)
+	{
+	}
+
+void CCreateImapClientMtm::StartL(TRequestStatus& aStatus)
+	{
+	iTest.EmailTestUtils().InstantiatePopClientMtmL();
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}
+
+//
+//
+// CImapConnect
+//
+
+ImapConnectionObserver::ImapConnectionObserver(CImapConnect* aImapConnect) : iImapConnect(aImapConnect), iCount(0)
+	{
+	}
+
+void ImapConnectionObserver::HandleImapConnectionEvent(TImapConnectionEvent)
+	{
+//	if (aConnectionState == ESynchronisationComplete)
+//		if (++iCount == 2)
+		if (++iCount == 1)
+			iImapConnect->DummyRun();
+	}
+
+CImapConnect::CImapConnect(CEmailClientTest& aParentTestHarness, TSyncStatus aSynchronise) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness), iSynchronise(aSynchronise)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapConnect::StartL(TRequestStatus& aStatus)
+	{
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	CMsvEntry& msvEntry = *(iParentTestHarness.MsvTestUtils().iMsvEntry);
+	msvEntry.SetEntryL(serviceId);
+	iReportStatus = &aStatus;
+	// check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	TBuf8<1> param;
+
+	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+	selection->AppendL(serviceId);
+
+	if(iSynchronise == EConnectAndSync) 
+		iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMConnectAndSynchronise, *selection, param, iStatus));
+	else if (iSynchronise == EConnectAndPeriodicSync) 
+		{
+		iObserver = new(ELeave) ImapConnectionObserver(this);
+		TPckg<MMsvImapConnectionObserver*> paramPeriodic(iObserver);
+		iParentTestHarness.SetCurrentOperation(imapMtm.
+		InvokeAsyncFunctionL(KIMAP4MTMConnectAndSyncCompleteAfterDisconnect, *selection, paramPeriodic, iStatus));
+		}
+
+//	KIMAP4MTMConnectAndSyncCompleteAfterConnect,
+//	KIMAP4MTMConnectAndSyncCompleteAfterFullSync,
+//	KIMAP4MTMConnectAndSyncCompleteAfterDisconnect,
+	else
+		iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMConnect, *selection, param, iStatus));
+
+	CleanupStack::PopAndDestroy(selection);
+	aStatus = KRequestPending;
+	SetActive();
+	}
+
+void CImapConnect::RunL()
+	{
+	if (iDummyComplete == EFalse)
+		User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+void CImapConnect::DummyRun()
+	{
+	User::RequestComplete(iReportStatus, KErrNone);
+	iDummyComplete = ETrue;
+	}
+
+void CImapConnect::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+
+CImapConnect::~CImapConnect()
+	{
+	if (iObserver)
+		delete iObserver;
+	iObserver=0; 
+	}
+
+
+//
+//
+// CImapConnect
+//
+// Connect an monitor connection progress.
+//
+CImapConnectAndMonitor::CImapConnectAndMonitor(CEmailClientTest& aParentTestHarness, TBool aSynchronise) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness), iSynchronise(aSynchronise)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapConnectAndMonitor::LogCommentFormat(TRefByValue<const TDesC> format,...)
+	{
+	// Build parameter list.
+	VA_LIST list;
+	VA_START(list, format);
+	TBuf<0x100> buf;
+	buf.FormatList(format, list);
+
+	// Log the debug buffer.
+	iParentTestHarness.EmailTestUtils().WriteComment(buf);
+	}
+
+void CImapConnectAndMonitor::StartL(TRequestStatus& aStatus)
+	{
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	CMsvEntry& msvEntry = *(iParentTestHarness.MsvTestUtils().iMsvEntry);
+	msvEntry.SetEntryL(serviceId);
+	iReportStatus = &aStatus;
+
+	// Check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+	selection->AppendL(serviceId);
+	TPckg<MMsvImapConnectionObserver*> parameter(this);
+
+	if (iSynchronise)
+		{
+		iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMConnectAndSyncCompleteAfterFullSync, *selection, parameter, iStatus));
+		}
+	else
+		{
+		iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMConnect, *selection, parameter, iStatus));
+		}
+
+	CleanupStack::PopAndDestroy(selection);
+	*iReportStatus = KRequestPending;
+	SetActive();
+
+	MonitorConnectionL();
+	}
+
+void CImapConnectAndMonitor::MonitorConnectionL()
+	{
+	//Initialise to unused values
+	TInt progressState = KInvalidState;
+	TInt connectState = KInvalidState;
+	TInt iap = KInvalidIAP;
+	TInt connection_progress_state = 0;
+
+	RTimer timer; 
+	TRequestStatus timerStatus; // Request status associated with timer
+	timer.CreateLocal(); // Create for this thread
+
+	do
+		{	
+		// Call funtion to return IAP and Poll to find connection state 
+		TImap4GenericProgress temp;	
+		TPckgC<TImap4GenericProgress> paramPack(temp);
+		paramPack.Set(iParentTestHarness.CurrentOperation().ProgressL());
+		TImap4GenericProgress progress = paramPack();	
+
+		progressState = progress.iState;
+		if((connectState != progress.ConnectionState()) || (iap != progress.ConnectionIAP()) )
+			{
+			connectState = progress.ConnectionState();
+			iap = progress.ConnectionIAP();
+			LogCommentFormat(_L("[%4d] Progress state =  %d, Connect State = %d, IAP = %d"), iDebugInfo.LineNumber(), progressState, connectState, iap);
+			
+			//Check that the relevant states are reached in the correct order
+			if ((connectState == ECsdStartingDialling) || (connectState == ECsdStartingConnect))
+					connection_progress_state = 1;
+			if (connectState == ECsdConnectionOpen && connection_progress_state == 1)
+					connection_progress_state = 2;
+			if (connectState == KLinkLayerOpen && connection_progress_state == 2)
+					connection_progress_state = 3;
+			}
+
+		// wait 50 microseconds and then re-test progress!
+		timer.After(timerStatus,50);
+		User::WaitForRequest(timerStatus); 
+	
+		} while (progressState == TImap4GenericProgress::EConnecting);
+
+	timer.Close();
+	if (connection_progress_state != 3)
+		{
+		LogCommentFormat(_L("[%4d] Local Connection Progress state =  %d, Connect State = %d, IAP = %d"), iDebugInfo.LineNumber(), connection_progress_state, connectState, iap);
+		iConnectionError = ETrue;
+		}
+	}
+
+void CImapConnectAndMonitor::RunL()
+	{
+	if (iConnectionError)
+		User::RequestComplete(iReportStatus, KErrUnknown);	
+	else
+		User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+// HandleImapConnectionEvent Callback (from MMsvImapConnectionObserver)
+void CImapConnectAndMonitor::HandleImapConnectionEvent(TImapConnectionEvent)
+	{
+	}
+
+void CImapConnectAndMonitor::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+CImapConnectAndMonitor::~CImapConnectAndMonitor()
+	{
+	}
+
+//
+//
+// CImapConnectAndCancel
+//
+// Connect then disconnect before sync completes
+//
+CImapConnectAndCancel::CImapConnectAndCancel(CEmailClientTest& aParentTestHarness, TUint aCancelDelay) : CActive(EPriorityNormal),iParentTestHarness(aParentTestHarness), iCancelDelay(aCancelDelay)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapConnectAndCancel::LogCommentFormat(TRefByValue<const TDesC> format,...)
+	{
+	// Build parameter list.
+	VA_LIST list;
+	VA_START(list, format);
+	TBuf<0x100> buf;
+	buf.FormatList(format, list);
+
+	// Log the debug buffer.
+	iParentTestHarness.EmailTestUtils().WriteComment(buf);
+	}
+
+
+void CImapConnectAndCancel::StartL(TRequestStatus& aStatus)
+	{
+	iReportStatus = &aStatus;
+
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	TBuf8<1> param;
+	iSelection = new (ELeave) CMsvEntrySelection;
+	iSelection->AppendL(serviceId);
+
+	// Call the Async Connect & Sync funtion
+	iParentTestHarness.SetCurrentOperation(iParentTestHarness.EmailTestUtils().iImapClientMtm->InvokeAsyncFunctionL(KIMAP4MTMConnect, 
+											*iSelection, param, iStatus));
+
+	iCommandState=EFirstConnect;
+	aStatus = KRequestPending;
+	SetActive();
+	LogCommentFormat(_L("First connect started"));
+	}
+
+void CImapConnectAndCancel::RunL()
+	{
+	TBuf8<1> param;
+	//LogCommentFormat(_L("CImapConnectAndCancel::RunL().  State = %d"), iCommandState);	
+
+	switch (iCommandState)
+		{
+		case EFirstConnect:
+			{
+			// The first connect has completed.  Now Disconnect.
+			iParentTestHarness.SetCurrentOperation(iParentTestHarness.EmailTestUtils().iImapClientMtm->InvokeAsyncFunctionL(KIMAP4MTMDisconnect,  
+													*iSelection, param, iStatus));
+			
+			iCommandState = EDisconnect;
+			*iReportStatus = KRequestPending;
+			SetActive();
+			LogCommentFormat(_L("Disconnecting"));
+			break;
+			}
+		case EDisconnect:
+			{
+			// We have now disconnected after the first sync. 
+			// Start a new connect and sync which we will cancel after 
+			//  the specified interval
+			iParentTestHarness.SetCurrentOperation(iParentTestHarness.EmailTestUtils().iImapClientMtm->InvokeAsyncFunctionL(KIMAP4MTMConnectAndSynchronise, 
+													*iSelection, param, iStatus));
+
+			iCommandState=ESecondSyncCancelled;		// This sync is about to be cancelled
+			*iReportStatus = KRequestPending;
+			SetActive();
+			LogCommentFormat(_L("Second Connect and Sync started"));
+
+			// This is where is gets a bit messy...
+
+			// Define a timer so we can cancel after a specified period.
+			// We can't wait for the connect to complete because it's too late by then.
+			// We need to cancel during the stage when the IMAP server Capabilities 
+			//  are being returned
+			RTimer timer; 
+			TRequestStatus timerStatus; // Request status associated with timer
+			timer.CreateLocal(); // Create for this thread
+			LogCommentFormat(_L("Waiting for %d msecs"), iCancelDelay);
+
+			// Wait for the defined interval
+			// OK, so this suspends the current thread which isn't great but the
+			//  server is running in a different thread, so that continues as normal
+			timer.After(timerStatus, iCancelDelay * 1000);
+			User::WaitForRequest(timerStatus); 
+			timer.Close();
+
+			// Cancel the connect & sync
+			DoCancel();
+			LogCommentFormat(_L("Second connect & sync cancelled"));
+			break;
+			}
+		case ESecondSyncCancelled: 
+			// The second sync should have completed when the connect occured, but
+			// we cancelled it before it had chance to complete.
+			// Now start the final sync to check that all is still OK
+			{
+			iParentTestHarness.SetCurrentOperation(iParentTestHarness.EmailTestUtils().iImapClientMtm->InvokeAsyncFunctionL(KIMAP4MTMConnectAndSynchronise, 
+													*iSelection, param, iStatus));
+
+			iCommandState=EThirdSync;
+			*iReportStatus = KRequestPending;
+			SetActive();
+			LogCommentFormat(_L("Third Connect and Sync started"));
+
+			break;
+			}
+		case EThirdSync:
+			{
+			// At this point the third ConnectAndSync reports that it is completed, but actually 
+			//  only the connect has.  The sync continues in background, so create an operation
+			//  to wait for it to complete.
+			iParentTestHarness.SetCurrentOperation(iParentTestHarness.EmailTestUtils().iImapClientMtm->InvokeAsyncFunctionL(KIMAP4MTMWaitForBackground,  
+													*iSelection, param, iStatus));
+			
+			iCommandState = EComplete;
+			*iReportStatus = KRequestPending;
+			SetActive();
+			LogCommentFormat(_L("Waiting for third sync to complete"));
+			break;
+			}
+		case EComplete:
+			{
+			// Everything has completed.  Success!
+			LogCommentFormat(_L("Completed"));
+			User::RequestComplete(iReportStatus, KErrNone);
+			break;
+			}
+		default:
+			{
+			//  This shouldn't happen...
+			LogCommentFormat(_L("Unknown state in ConnectAndCancel"));
+			User::RequestComplete(iReportStatus, KErrUnknown);
+			break;
+			}
+		}
+	}
+
+
+
+void CImapConnectAndCancel::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+
+CImapConnectAndCancel::~CImapConnectAndCancel()
+	{
+	delete iSelection;
+	}
+
+
+//
+//
+// CImapDisconnect
+//
+
+CImapDisconnect::CImapDisconnect(CEmailClientTest& aParentTestHarness) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapDisconnect::StartL(TRequestStatus& aStatus)
+	{
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	CMsvEntry& msvEntry = *(iParentTestHarness.MsvTestUtils().iMsvEntry);
+	msvEntry.SetEntryL(serviceId);
+	iReportStatus = &aStatus;
+	// check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	TBuf8<1> param;
+	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+	selection->AppendL(serviceId);
+	iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMDisconnect, *selection, param, iStatus));
+	CleanupStack::PopAndDestroy(selection);
+	aStatus = KRequestPending;
+	SetActive();
+	}
+
+void CImapDisconnect::RunL()
+	{
+	User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+void CImapDisconnect::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+
+CImapDisconnect::~CImapDisconnect()
+	{
+	}
+
+
+//
+//
+// CImapSetSyncLimits
+//
+
+CImapSetSyncLimits::CImapSetSyncLimits(TInt aInboxSyncLimit, TInt aFolderSyncLimit, CImapClientTest& aTestHarness) : 
+	iTestHarness(aTestHarness), iInboxSyncLimit(aInboxSyncLimit), iFolderSyncLimit(aFolderSyncLimit)
+	{
+	}
+
+void CImapSetSyncLimits::LogCommentFormat(TRefByValue<const TDesC> format,...)
+	{
+	// Build parameter list.
+	VA_LIST list;
+	VA_START(list, format);
+	TBuf<0x100> buf;
+	buf.FormatList(format, list);
+
+	// Log the debug buffer.
+	iTestHarness.EmailTestUtils().WriteComment(buf);
+	}
+
+void CImapSetSyncLimits::StartL(TRequestStatus& aStatus)
+	{
+// Assumes that IMAP service currently selected.
+
+	LogCommentFormat(_L("[%4d] Setting sync limits (inbox=%d) (folders=%d)"), iDebugInfo.LineNumber(), iInboxSyncLimit, iFolderSyncLimit);
+	
+	CImImap4Settings* settings = new(ELeave) CImImap4Settings();
+	CleanupStack::PushL(settings);	
+	
+	CEmailAccounts* account = CEmailAccounts::NewLC();
+	
+	TImapAccount imapAccountId;
+	account->GetImapAccountL(iTestHarness.EmailTestUtils().iMsvEntry->EntryId(),imapAccountId); 
+	account->LoadImapSettingsL(imapAccountId, *settings);
+						
+	settings->SetInboxSynchronisationLimit(iInboxSyncLimit);
+	settings->SetMailboxSynchronisationLimit(iFolderSyncLimit);
+	account->SaveImapSettingsL(imapAccountId, *settings);
+
+	CleanupStack::PopAndDestroy(account);
+	CleanupStack::PopAndDestroy(settings);
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}
+
+//
+//
+// CCheckImapOperation
+//
+
+CCheckImapOperation::CCheckImapOperation(TInt aExpectedStatus, CImapClientTest& aTestHarness) : iTestHarness(aTestHarness), iExpectedStatus(aExpectedStatus)
+	{
+	}
+
+void CCheckImapOperation::StartL(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+
+	TImap4GenericProgress temp;	
+	TPckgC<TImap4GenericProgress> paramPack(temp);
+	paramPack.Set(iTestHarness.CurrentOperation().ProgressL());
+	TImap4GenericProgress progress=paramPack();	
+
+	if (progress.iErrorCode != iExpectedStatus)
+		{
+		TBuf<100> logString;
+		logString.Format(_L("Operation didn't complete as expected. Expected status: %d, actual status: %d"), iExpectedStatus, progress.iErrorCode);
+		iTestHarness.LogComment(logString);
+		err = KErrUnknown;
+		}
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+
+//
+//
+// CImapSyncTree
+//
+
+CImapSyncTree::CImapSyncTree(CEmailClientTest& aParentTestHarness) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapSyncTree::StartL(TRequestStatus& aStatus)
+	{
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	iReportStatus = &aStatus;
+	// check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	TBuf8<1> param;
+	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+	selection->AppendL(serviceId);
+	iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMSyncTree, *selection, param, iStatus));
+	CleanupStack::PopAndDestroy(selection);
+	aStatus = KRequestPending;
+	SetActive();
+	}
+
+void CImapSyncTree::RunL()
+	{
+	User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+void CImapSyncTree::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+
+CImapSyncTree::~CImapSyncTree()
+	{
+	}
+
+
+
+//
+//
+// CImapInboxNewSync
+//
+
+CImapInboxNewSync::CImapInboxNewSync(CEmailClientTest& aParentTestHarness) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapInboxNewSync::StartL(TRequestStatus& aStatus)
+	{
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	iReportStatus = &aStatus;
+	// check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	TBuf8<1> param;
+	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+	selection->AppendL(serviceId);
+	iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMInboxNewSync, *selection, param, iStatus));
+	CleanupStack::PopAndDestroy(selection);
+	aStatus = KRequestPending;
+	SetActive();
+	}
+
+void CImapInboxNewSync::RunL()
+	{
+	User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+void CImapInboxNewSync::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+
+CImapInboxNewSync::~CImapInboxNewSync()
+	{
+	}
+
+//
+//
+// CImapFolderSync
+//
+
+CImapFolderSync::CImapFolderSync(CEmailClientTest& aParentTestHarness) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapFolderSync::StartL(TRequestStatus& aStatus)
+	{
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	iReportStatus = &aStatus;
+	// check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	TBuf8<1> param;
+	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+	selection->AppendL(serviceId);
+	iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMFolderFullSync, *selection, param, iStatus));
+	CleanupStack::PopAndDestroy(selection);
+	aStatus = KRequestPending;
+	SetActive();
+	}
+
+void CImapFolderSync::RunL()
+	{
+	User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+void CImapFolderSync::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+
+CImapFolderSync::~CImapFolderSync()
+	{
+	}
+
+//
+//
+// CImapPerformFullSync
+//
+
+CImapPerformFullSync::CImapPerformFullSync(CEmailClientTest& aParentTestHarness) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapPerformFullSync::StartL(TRequestStatus& aStatus)
+	{
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	iReportStatus = &aStatus;
+	// check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	TBuf8<1> param;
+	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+	selection->AppendL(serviceId);
+	iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMFullSync, *selection, param, iStatus));
+	CleanupStack::PopAndDestroy(selection);
+	aStatus = KRequestPending;
+	SetActive();
+	}														
+
+void CImapPerformFullSync::RunL()
+	{
+	User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+void CImapPerformFullSync::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+CImapPerformFullSync::~CImapPerformFullSync()
+	{
+	}
+
+//
+//
+// CImapPopulateFolder
+//
+
+CImapPopulateFolder::CImapPopulateFolder(CEmailClientTest& aParentTestHarness) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapPopulateFolder::StartL(TRequestStatus& aStatus)
+	{
+	iReportStatus = &aStatus;
+	// check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	TBuf8<1> param;
+	iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMPopulate, *(iParentTestHarness.iCurrentSelection), param, iStatus));
+	aStatus = KRequestPending;
+	SetActive();
+	}
+
+void CImapPopulateFolder::RunL()
+	{
+	User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+void CImapPopulateFolder::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+
+CImapPopulateFolder::~CImapPopulateFolder()
+	{
+	}
+
+
+
+//
+//
+// CImapSubscribeFolder
+//
+
+CImapSubscribeFolder::CImapSubscribeFolder(TBool aSubscribe, CEmailClientTest& aParentTestHarness) : CActive(EPriorityNormal), iParentTestHarness(aParentTestHarness), iSubscribe(aSubscribe)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImapSubscribeFolder::StartL(TRequestStatus& aStatus)
+	{
+	TMsvId serviceId = iParentTestHarness.iSelectedFolder;
+	iReportStatus = &aStatus;
+	// check that current entry is a service
+	CImap4ClientMtm& imapMtm = *(iParentTestHarness.EmailTestUtils().iImapClientMtm);
+	TBuf8<1> param;
+	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+	selection->AppendL(serviceId);
+	if (iSubscribe)
+		iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMLocalSubscribe, *selection, param, iStatus));
+	else
+		iParentTestHarness.SetCurrentOperation(imapMtm.InvokeAsyncFunctionL(KIMAP4MTMLocalUnsubscribe, *selection, param, iStatus));
+	CleanupStack::PopAndDestroy(selection);
+	aStatus = KRequestPending;
+	SetActive();
+	}
+
+void CImapSubscribeFolder::RunL()
+	{
+	User::RequestComplete(iReportStatus, iStatus.Int());
+	}
+
+void CImapSubscribeFolder::DoCancel()
+	{
+	iParentTestHarness.CurrentOperation().Cancel();
+	}
+
+
+CImapSubscribeFolder::~CImapSubscribeFolder()
+	{
+	}
+
+
+//
+//
+// CImapMarkSelectionUnRead
+//
+
+CImapMarkSelection::CImapMarkSelection(TBool aUnreadflag, CMsvEntrySelection& aSelection, CMsvTestUtils& aTestUtils) 
+: iTestUtils(aTestUtils),
+  iSelection(aSelection),
+  iUnreadflag(aUnreadflag)
+	{
+	}
+
+void CImapMarkSelection::LogCommentFormat(TRefByValue<const TDesC> format,...)
+	{
+	// Build parameter list.
+	VA_LIST list;
+	VA_START(list, format);
+	TBuf<0x100> buf;
+	buf.FormatList(format, list);
+
+	// Log the debug buffer.
+	iTestUtils.WriteComment(buf);
+	}
+
+void CImapMarkSelection::StartL(TRequestStatus& aStatus)
+	{
+	// check that current entry is a service
+	CMsvEntry& msvEntry = *(iTestUtils.iMsvEntry);	
+	
+	CTestActive* active = new (ELeave) CTestActive; CleanupStack::PushL(active);
+
+	LogCommentFormat(_L("[%4d] Unread mark Folder contains %d children"), iDebugInfo.LineNumber(), iSelection.Count());
+
+	TInt count=iSelection.Count();
+	// Set the Unread flag of each message
+	while(count--)
+		{
+		msvEntry.SetEntryL(iSelection.At(count));
+		TMsvEntry message = msvEntry.Entry();
+		
+		message.SetUnread(iUnreadflag);	// true - sets message to unread and false to read.
+
+		CMsvOperation *op=msvEntry.ChangeL(message,active->iStatus);
+		CleanupStack::PushL(op);
+		active->StartL();
+		CActiveScheduler::Start();
+		CleanupStack::PopAndDestroy(op);
+
+		}
+
+	LogCommentFormat(_L("[%4d] Unread mark: Set things read"), iDebugInfo.LineNumber());
+
+	CleanupStack::PopAndDestroy(active);
+
+	LogCommentFormat(_L("[%4d] Unread mark: Completing parent"), iDebugInfo.LineNumber());
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}														
+
+
+CImapMarkSelection::~CImapMarkSelection()
+	{
+	}
+
+
+//
+//
+// CImapCheckSelectionUnread
+//
+
+CImapCheckSelectionUnread::CImapCheckSelectionUnread(TInt aTestType, CMsvEntrySelection& aSelection, CMsvTestUtils& aTestUtils) 
+: iTestUtils(aTestUtils),
+  iSelection(aSelection),
+  iTestType(aTestType)
+  	{
+	}
+
+void CImapCheckSelectionUnread::LogCommentFormat(TRefByValue<const TDesC> format,...)
+	{
+	// Build parameter list.
+	VA_LIST list;
+	VA_START(list, format);
+	TBuf<0x100> buf;
+	buf.FormatList(format, list);
+
+	// Log the debug buffer.
+	iTestUtils.WriteComment(buf);
+	}
+
+void CImapCheckSelectionUnread::StartL(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+	// check that current entry is a service
+	CMsvEntry& msvEntry = *(iTestUtils.iMsvEntry);	
+	
+	CTestActive* active = new (ELeave) CTestActive; CleanupStack::PushL(active);
+
+	LogCommentFormat(_L("[%4d] Unread mark Folder contains %d children"), iDebugInfo.LineNumber(), iSelection.Count());
+
+	TInt count=iSelection.Count();
+
+	//Check unseen and imap4 flag
+	TBool imapUnread, Seen, Answered, Flagged, Deleted, Draft, Recent;
+	TBool Unreadflag;	
+	// Check the Unread flag of each message
+
+	while(count--)
+		{
+		msvEntry.SetEntryL(iSelection.At(count));
+		TMsvEmailEntry emailmessage = msvEntry.Entry();
+
+		/* get seen flag */
+		emailmessage.GetIMAP4Flags(imapUnread, Seen, Answered, Flagged, Deleted, Draft, Recent);
+		/* get relevant unread flag */
+		Unreadflag = emailmessage.Unread();
+		
+		switch (iTestType)
+			{
+			case 0:
+				/* read test */	
+				if (imapUnread)
+					{
+					LogCommentFormat(_L("[%4d] Error: Unread flag wrongly set to true "), iDebugInfo.LineNumber());
+					err = KErrUnknown;
+					}
+			break;
+			case 1:	
+				/* unread test */
+				if (!Unreadflag)
+					{
+					LogCommentFormat(_L("[%4d] Error: Unread flag wrongly set to false "), iDebugInfo.LineNumber());
+					err = KErrUnknown;
+					}	
+				break;
+			}
+		}
+	
+	LogCommentFormat(_L("[%4d] all flags checked"), iDebugInfo.LineNumber());
+
+	CleanupStack::PopAndDestroy(active);
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}														
+
+
+CImapCheckSelectionUnread::~CImapCheckSelectionUnread()
+	{
+	}
+
+
+//
+//
+// CImapCheckSelectionSeen
+//
+
+CImapCheckSelectionSeen::CImapCheckSelectionSeen(TInt aSeenflag, CMsvEntrySelection& aSelection, CMsvTestUtils& aTestUtils) 
+: iTestUtils(aTestUtils),
+  iSelection(aSelection),
+  iSeenflag(aSeenflag)
+  	{
+	}
+
+void CImapCheckSelectionSeen::LogCommentFormat(TRefByValue<const TDesC> format,...)
+	{
+	// Build parameter list.
+	VA_LIST list;
+	VA_START(list, format);
+	TBuf<0x100> buf;
+	buf.FormatList(format, list);
+
+	// Log the debug buffer.
+	iTestUtils.WriteComment(buf);
+	}
+
+void CImapCheckSelectionSeen::StartL(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+	// check that current entry is a service
+	CMsvEntry& msvEntry = *(iTestUtils.iMsvEntry);	
+	
+	CTestActive* active = new (ELeave) CTestActive; CleanupStack::PushL(active);
+
+	LogCommentFormat(_L("[%4d] Unread mark Folder contains %d children"), iDebugInfo.LineNumber(), iSelection.Count());
+
+	TInt count=iSelection.Count();
+
+	//Check unseen and imap4 flag
+	TBool imapUnread, Seen, Answered, Flagged, Deleted, Draft, Recent;
+
+	TBool updateSeenflag = isaveSettings->UpdatingSeenFlags();
+	
+	if (updateSeenflag)
+	{
+		while(count--)
+			{
+			msvEntry.SetEntryL(iSelection.At(count));
+			TMsvEmailEntry emailmessage = msvEntry.Entry();
+
+			/* get seen flag */
+			emailmessage.GetIMAP4Flags(imapUnread, Seen, Answered, Flagged, Deleted, Draft, Recent);
+			
+			switch (iSeenflag)
+				{
+				case 0:	
+					/* unread test */
+					if(Seen)
+						{
+						LogCommentFormat(_L("[%4d] Error: seenImap4 flag set to true "), iDebugInfo.LineNumber());
+						err = KErrUnknown;
+						}		
+				break;
+				case 1:
+					/* read test */		
+					if(Seen)
+						{
+						LogCommentFormat(_L("[%4d] Error: seenImap4 flag set to false "), iDebugInfo.LineNumber());
+						err = KErrUnknown;
+						}		
+				break;	
+				}
+			}
+	}
+	else
+	{
+		LogCommentFormat(_L("[%4d] Error: this test should not be called when updateseenflag false "), iDebugInfo.LineNumber());
+		err = KErrUnknown;
+	}
+	
+	LogCommentFormat(_L("[%4d] all flags checked"), iDebugInfo.LineNumber());
+
+	CleanupStack::PopAndDestroy(active);
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}														
+
+
+CImapCheckSelectionSeen::~CImapCheckSelectionSeen()
+	{
+	}
+
+
+
+
+//
+//
+// CImapMarkSelectedMail
+//
+
+CImapMarkSelectedMail::CImapMarkSelectedMail(CMsvEntrySelection& aSelection, CMsvTestUtils& aTestUtils) 
+: iTestUtils(aTestUtils),
+  iSelection(aSelection)
+	{
+	}
+
+void CImapMarkSelectedMail::LogCommentFormat(TRefByValue<const TDesC> format,...)
+	{
+	// Build parameter list.
+	VA_LIST list;
+	VA_START(list, format);
+	TBuf<0x100> buf;
+	buf.FormatList(format, list);
+
+	// Log the debug buffer.
+	iTestUtils.WriteComment(buf);
+	}
+
+void CImapMarkSelectedMail::StartL(TRequestStatus& aStatus)
+	{
+	// check that current entry is a service
+	
+	CMsvEntry& msvEntry = *(iTestUtils.iMsvEntry);	
+	
+	CTestActive* active = new (ELeave) CTestActive; CleanupStack::PushL(active);
+
+	LogCommentFormat(_L("[%4d] Unread mark Folder contains %d children"), iDebugInfo.LineNumber(), iSelection.Count());
+
+	TInt count=iSelection.Count();
+
+	while(count--)
+		{
+		msvEntry.SetEntryL(iSelection.At(count));
+		TMsvEntry message = msvEntry.Entry();
+		
+		//Set every other message to read and unread!
+		if ((count & 1) == 0)
+			message.SetUnread(ETrue);
+		else
+			message.SetUnread(EFalse);	
+
+		CMsvOperation *op=msvEntry.ChangeL(message,active->iStatus);
+		CleanupStack::PushL(op);
+		active->StartL();
+		CActiveScheduler::Start();
+		CleanupStack::PopAndDestroy(op);
+
+		}
+	LogCommentFormat(_L("[%4d] Flag settings done"), iDebugInfo.LineNumber());
+
+	CleanupStack::PopAndDestroy(active);
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}														
+
+
+CImapMarkSelectedMail::~CImapMarkSelectedMail()
+	{
+	}
+
+
+
+//
+//
+// CImapCheckSelectedMail
+//
+
+CImapCheckSelectedMail::CImapCheckSelectedMail(CMsvEntrySelection& aSelection, CMsvTestUtils& aTestUtils) 
+: iTestUtils(aTestUtils),
+  iSelection(aSelection)
+	{
+	}
+
+void CImapCheckSelectedMail::LogCommentFormat(TRefByValue<const TDesC> format,...)
+	{
+	// Build parameter list.
+	VA_LIST list;
+	VA_START(list, format);
+	TBuf<0x100> buf;
+	buf.FormatList(format, list);
+
+	// Log the debug buffer.
+	iTestUtils.WriteComment(buf);
+	}
+void CImapCheckSelectedMail::StartL(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+	// check that current entry is a service
+	CMsvEntry& msvEntry = *(iTestUtils.iMsvEntry);	
+	
+	CTestActive* active = new (ELeave) CTestActive; CleanupStack::PushL(active);
+
+	LogCommentFormat(_L("[%4d] Selection test. Unread mark Folder contains %d children"), iDebugInfo.LineNumber(), iSelection.Count());
+
+	TInt count=iSelection.Count();
+
+	//Check unseen and imap4 flag
+	TBool imapUnread, Seen, Answered, Flagged, Deleted, Draft, Recent;
+	TBool Unreadflag;	
+	
+	TBool updateSeenflag = isaveSettings->UpdatingSeenFlags();
+
+	while(count--)
+		{
+		msvEntry.SetEntryL(iSelection.At(count));
+		
+		TMsvEmailEntry emailmessage = msvEntry.Entry();
+		emailmessage.GetIMAP4Flags(imapUnread, Seen, Answered, Flagged, Deleted, Draft, Recent);
+		
+		Unreadflag = emailmessage.Unread();
+
+		if ((count & 1) == 0)
+			{
+			if (Unreadflag)
+				{
+				LogCommentFormat(_L("[%4d] Error: Unread flag wrongly set to false, Message No. = %d  "), iDebugInfo.LineNumber(), count);
+				err = KErrUnknown;
+				}
+			if (updateSeenflag)
+				{
+				if(!Seen)
+					{
+					LogCommentFormat(_L("[%4d] Error: seenImap4 flag wrongly set to true, Message No. = %d  "), iDebugInfo.LineNumber(), count);
+					err = KErrUnknown;
+					}
+				}
+			}
+		else
+			{
+			if (!Unreadflag)
+				{
+				LogCommentFormat(_L("[%4d] Error: Unread flag wrongly set to true, Message No. = %d "), iDebugInfo.LineNumber(), count);
+				err = KErrUnknown;
+				}
+			if (updateSeenflag)
+				{
+				if(Seen)
+					{
+					LogCommentFormat(_L("[%4d] Error: seenImap4 flag wrongly set to true, Message No. = %d  "), iDebugInfo.LineNumber(), count);
+					err = KErrUnknown;
+					}
+				}		
+			}
+		}
+	
+	LogCommentFormat(_L("[%4d] all flags checked"), iDebugInfo.LineNumber());
+
+	CleanupStack::PopAndDestroy(active);
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}														
+
+
+CImapCheckSelectedMail::~CImapCheckSelectedMail()
+	{
+	}
+
+
+//
+//
+// CImapSetSyncRate
+//
+
+CImapSetSyncRate::CImapSetSyncRate(TInt aSyncRate, CImapClientTest& aTestHarness) : iTestHarness(aTestHarness), iSyncRate(aSyncRate)
+	{
+	}
+
+void CImapSetSyncRate::StartL(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+
+	CImImap4Settings* settings = new(ELeave) CImImap4Settings();
+	CleanupStack::PushL(settings);
+
+	CEmailAccounts* account = CEmailAccounts::NewLC();				
+		
+	TImapAccount imapAccountId;
+	account->GetImapAccountL(iTestHarness.EmailTestUtils().iMsvEntry->EntryId(),imapAccountId); 
+	account->LoadImapSettingsL(imapAccountId, *settings);
+		
+	settings->SetSyncRateL(iSyncRate);
+	account->SaveImapSettingsL(imapAccountId, *settings);
+
+	CleanupStack::PopAndDestroy(2, settings); // account, settings
+
+	TBuf<100> logString;
+	logString.Format(_L("Set sync rate: %d seconds"), iSyncRate);
+	iTestHarness.LogComment(logString);
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+//
+//
+// CImapGetSyncRate
+//
+
+CImapGetSyncRate::CImapGetSyncRate(TInt aSyncRate, CImapClientTest& aTestHarness) : iTestHarness(aTestHarness), iSyncRate(aSyncRate)
+	{
+	}
+
+void CImapGetSyncRate::StartL(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+
+	CImImap4Settings* settings = new(ELeave) CImImap4Settings();
+	CleanupStack::PushL(settings);
+
+	CEmailAccounts* account = CEmailAccounts::NewLC();				
+	
+	TImapAccount imapAccountId;
+	account->GetImapAccountL(iTestHarness.EmailTestUtils().iMsvEntry->EntryId(),imapAccountId); 
+	account->LoadImapSettingsL(imapAccountId, *settings);
+			
+	TUint syncRate = settings->SyncRate();
+	
+	account->SaveImapSettingsL(imapAccountId, *settings);
+
+	CleanupStack::PopAndDestroy(2, settings); // account, settings
+
+	TBuf<100> logString;
+	logString.Format(_L("Expected sync rate: %d seconds Obtained: %d"), iSyncRate,syncRate);
+	iTestHarness.LogComment(logString);
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+