email/pop3andsmtpmtm/imapservermtm/test/src/T_PARSE_UTC_IMAPStep.cpp
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/imapservermtm/test/src/T_PARSE_UTC_IMAPStep.cpp	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,307 @@
+// Copyright (c) 2005-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:
+// The sever contains emails with multiple or missing date header fields to ensure that the IAMP
+// parser correctly parses the data. The first received header should be used where present, 
+// the date header when its not. The current UTC time should be used if neither are present.
+// 2. The client connects to the server and request a sync.
+// 3. The server reads the protocol information from a file specified in the ini file (mapUTCTest.ini).
+// 4. The client disconnects.
+// 5. The message store is traversed to see if the correct timestamps have been given to the 
+// message entries.
+// 
+//
+
+/**
+ @SYMTestCaseID MSG-IMAP-0243
+ @SYMTestType UT
+ @SYMTestPriority High
+ @SYMPREQ 234
+ @SYMTestCaseDesc Implements an IMAP server to facilitate offline testing of imap parsing. 
+ @SYMTestActions  1. The Server is started and listens on port 143.
+ @SYMTestExpectedResults The timestamps of the message entries should be the same as in the ini file.
+*/
+
+#include <testexecutelog.h>
+#include "t_parse_utc_imapstep.h"
+
+
+_LIT(KUTCTest,"UTC-TIME");
+_LIT(KTestMessageDir,"rfc822\\parse\\");
+RTest test(_L("UTC Parse Test"));
+
+ 
+LOCAL_C void FormatDateTime(TDes& aBuffer, const TTime& aTime)
+	{ 
+	aBuffer.Zero();
+	_LIT(KFormat4,"%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%:3%+B");
+	aTime.FormatL(aBuffer,KFormat4); 
+	}
+		
+CTestUTCParse::~CTestUTCParse()
+	{
+	delete iConsole;
+	delete iImapServer;	
+	delete iTestUtils;
+	delete iImapClient;	
+	delete iScheduler;
+	iSession->CloseMessageServer();
+	delete iSession;
+	delete iSessionObserver;
+	}
+
+CTestUTCParse::CTestUTCParse()
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KTestUTCParse);
+	}
+	
+
+
+void CTestUTCParse::HandleEvent(TInt aEventCode)
+	{
+	CActiveScheduler::Stop();	
+	
+	if(aEventCode!=KErrNone && aEventCode!=KErrEof)
+		{
+		ERR_PRINTF2(_L("Error: %d"),aEventCode);	
+		}
+	
+	}
+
+		
+void CTestUTCParse::PrintEntryTime(TTime* aTIme)
+	{
+	TBuf<45> lDateTimeString;
+	FormatDateTime(lDateTimeString,*aTIme); 
+	INFO_PRINTF2(_L("%S"),&lDateTimeString);	
+	}
+		
+		
+void CTestUTCParse::GetDetailsFromIniFileL()
+	{
+	
+	//get the script file path
+	if(!GetStringFromConfig(ConfigSection(),_L("ScriptFile"),iScriptFile))
+	
+		{
+		ERR_PRINTF1(_L("Error reading script file path from ini file"));
+		User::Leave(KErrArgument);	
+		}
+
+	TPtrC16 expectedTime;
+	//get the expected time stamp
+	if(!GetStringFromConfig(ConfigSection(),_L("ExpectedTime"),expectedTime))
+	
+		{
+		ERR_PRINTF1(_L("Error reading expected time stamp file path from ini file"));
+		User::Leave(KErrArgument);	
+		}
+	else
+		{
+		TInt pos=expectedTime.Find(KUTCTest);
+		
+		if(pos!=KErrNotFound)
+			{
+			iExpectedTimeStampIsNow=ETrue;
+			iExpectedTimeStamp.UniversalTime();
+			}
+		else
+			{
+			iExpectedTimeStampIsNow=EFalse;
+			iExpectedTimeStamp.Set(expectedTime);			
+			}
+		
+		}
+		
+	//get the script file path
+	if(!GetBoolFromConfig(ConfigSection(),_L("FetchWholeMessage"),iFetchWholeMessage))
+	
+		{
+		ERR_PRINTF1(_L("Error reading script file path from ini file"));
+		User::Leave(KErrArgument);	
+		}
+	//if the test contains an embedded test then get the expected timestamp for the 
+	//embedded message
+	if(iFetchWholeMessage==1)
+		{		
+		if(!GetStringFromConfig(ConfigSection(),_L("ExpectedTime2"),expectedTime))
+			{
+			ERR_PRINTF1(_L("Error reading expected time stamp file path from ini file"));
+			User::Leave(KErrArgument);	
+			}
+		else
+			{
+			TInt pos=expectedTime.Find(KUTCTest);
+		
+			if(pos!=KErrNotFound)
+				{
+				iExpectedTimeStampIsNow2=ETrue;
+				iExpectedTimeStamp2.UniversalTime();
+				}
+			else
+				{
+				iExpectedTimeStampIsNow2=EFalse;
+				iExpectedTimeStamp2.Set(expectedTime);			
+				}				
+			}
+		}
+		
+	}
+	
+
+void CTestUTCParse::WriteStoreL()
+	{
+	//create the entry_structure file
+	TParse parsedFileName;
+	TFileName lName(KTestMessageDir);
+	iTestUtils->ResolveLogFile(lName, parsedFileName);
+	iTestUtils->FindChildrenL(KMsvRootIndexEntryIdValue, parsedFileName.FullName(), ETrue, EFalse);	
+	}
+ 	
+void CTestUTCParse::TraverseL(const TMsvId aTMsvId)
+	{
+	//open the entry, dont sort
+	TMsvSelectionOrdering ordering;	
+	ordering.SetSorting(EMsvSortByNone);
+	CMsvEntry* entry = CMsvEntry::NewL(*iSession, aTMsvId,ordering);
+	CleanupStack::PushL(entry);
+	
+	//retrieve the entries children
+	CMsvEntrySelection* msvEntrySelection;
+	msvEntrySelection=entry->ChildrenL();
+	CleanupStack::PushL(msvEntrySelection);
+	TInt count = entry->Count();
+	
+	CMsvEntry* child;
+	TMsvEntry childDetails;
+
+	//for each child test if its a message entry
+	for(TInt i=0;i<count;i++)
+		{
+		child=iSession->GetEntryL((*msvEntrySelection)[i]);
+		childDetails=child->Entry();
+		
+		if(childDetails.iType==KUidMsvMessageEntry)
+			{
+			iMessageEntryCount++;
+			//if this is the first timestamp the us iActualTimeStamp, else use iActualTimeStamp2
+			if(iActualTimeStamp==0)
+				{
+				iActualTimeStamp=childDetails.iDate;
+				PrintEntryTime(&childDetails.iDate);	
+				}
+			else
+				{
+				iActualTimeStamp2=childDetails.iDate;
+				PrintEntryTime(&childDetails.iDate);	
+				}
+			}
+		//recursive call
+		TraverseL(childDetails.Id());
+		
+		delete child;
+		}
+			
+	CleanupStack::PopAndDestroy(msvEntrySelection);
+	CleanupStack::PopAndDestroy(entry);
+		
+	}
+	
+
+TVerdict CTestUTCParse::doTestStepPreambleL()
+	{
+	
+	SetTestStepResult(EPass);
+	iScheduler = new (ELeave) CActiveScheduler;
+	CActiveScheduler::Install(iScheduler);
+	
+	iTestUtils = CEmailTestUtils::NewL(test);
+	iTestUtils->FileSession().SetSessionPath(_L("C:\\"));
+	iTestUtils->CleanMessageFolderL();
+	iTestUtils->ClearEmailAccountsL();
+	
+	iTestUtils->GoClientSideL();
+	
+	//start the imap server
+	GetDetailsFromIniFileL();
+	iConsole=Console::NewL(_L("IMAP UTC Parse Test"),TSize(KConsFullScreen,KConsFullScreen));
+	iImapServer = CImapSpoofServer::NewL(this,iScriptFile);
+	iImapServer->StartL();
+		
+	//start the imap client
+	iImapClient = CActiveImapClient::NewL(this,iFetchWholeMessage);
+	iImapClient->StartL();
+	
+	CActiveScheduler::Start();
+
+	return TestStepResult();
+	}
+
+	
+TVerdict CTestUTCParse::CheckTimeStamps()
+	{
+	TVerdict lResult;
+	
+	if(iExpectedTimeStampIsNow==EFalse)
+		{
+		lResult = (iActualTimeStamp==iExpectedTimeStamp? EPass:EFail);
+		}
+	else
+		{
+		TTimeIntervalMicroSeconds difference;
+		difference=iExpectedTimeStamp.MicroSecondsFrom(iActualTimeStamp);
+		lResult = (difference<5000000? EPass:EFail);	
+		}
+		
+	// If there is an embedded message, check the times on that as well
+	if ((lResult == EPass) && (iFetchWholeMessage))
+		{
+		if(iExpectedTimeStampIsNow2==EFalse)
+			{
+			lResult = (iActualTimeStamp2==iExpectedTimeStamp2 ? EPass:EFail);
+			}
+		else
+			{
+			TTimeIntervalMicroSeconds difference;
+			difference=iExpectedTimeStamp2.MicroSecondsFrom(iActualTimeStamp2);
+			lResult = (difference<5000000? EPass:EFail);
+			}
+		}
+
+	return lResult;	
+	}
+		
+TVerdict CTestUTCParse::doTestStepL()
+	{
+	TVerdict result;
+	// Session observer. Needed to create a session
+	iSessionObserver = new (ELeave) TDummySessionObserver;
+	// Session. Needed to create a client registry.
+	iSession=CMsvSession::OpenSyncL(*iSessionObserver);
+	// Client registry. Needed to get the MTM component
+	TraverseL(iImapClient->GetAccount().iImapService);
+	WriteStoreL();
+	
+	result=CheckTimeStamps();
+
+	SetTestStepResult(result);
+	
+	return TestStepResult();
+	}
+	
+
+TVerdict CTestUTCParse::doTestStepPostambleL()
+	{
+	return TestStepResult();
+	}