messagingfw/msgtestfw/TestActions/SendAs/src/CMtfTestActionCompareEmails.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgtestfw/TestActions/SendAs/src/CMtfTestActionCompareEmails.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,581 @@
+// Copyright (c) 2004-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:
+// __ACTION_INFO_BEGIN__
+// [Action Name]
+// CompareEmailMessages
+// [Action Parameters]
+// CMsvSession&			session   <input>			: Reference to the session.
+// CMsvEntrySelection&	MailSelection1 <input>	: Reference to the
+// first mail selection
+// CMsvEntrySelection&	MailSelection2 <input>	: Reference to the
+// second mail selection
+// [Action Description]
+// Compares the email messages for size, subject, body text , html text and attachment.
+// [APIs Used]
+// CMsvEntry::SetEntry()
+// __ACTION_INFO_END__
+// 
+//
+
+/**
+ @file
+*/
+
+
+// User include
+#include "CMtfTestActionCompareEmails.h"
+#include "CMtfTestActionParameters.h"
+#include "TestFrameworkActionsUtils.h"
+
+#include "CMsvAttachment.h"
+#include <miutset.h>
+#include <mmsvattachmentmanager.h>
+
+//Granularity for CArrayFixFlat arrays
+const TInt KArrayGranularity = 8;
+
+/**
+  NewL()
+  Constructs a CMtfTestActionCompareEmails object.
+  Uses two phase construction and leaves nothing on the CleanupStack.
+  @internalTechnology
+  @param  aTestCase          Test Case to which the Test Action belongs
+  @param  aActionParameters  Action parameters, must not be NULL
+  @return Created object of type CMtfTestAction
+  @pre    None
+  @post   None
+*/
+CMtfTestAction* CMtfTestActionCompareEmails::NewL(CMtfTestCase& aTestCase,
+												  CMtfTestActionParameters* aActionParameters)
+	{
+	CMtfTestActionCompareEmails* self = 
+					new (ELeave) CMtfTestActionCompareEmails(aTestCase);
+
+	CleanupStack::PushL(self);
+	self->ConstructL(aActionParameters);
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+/**
+  Constructor
+  Constructs a CMtfTestActionCompareEmails object and initialises the member variables.
+  @internalTechnology
+  @param  aTestCase  Test Case to which the Test Action belongs
+  @pre    None
+  @post   None
+*/
+CMtfTestActionCompareEmails::CMtfTestActionCompareEmails(CMtfTestCase& aTestCase)
+	: CMtfSynchronousTestAction(aTestCase), iParamSession(NULL), iMessageInfo1(NULL), 
+		iMessageInfo2(NULL)
+	{
+	}
+
+/**
+  Destructor
+  Destructor of the class CMtfTestActionCompareEmails.
+  Deletes the message information stored in the CMtfTestActionUtilsEmailMessage
+  objects
+  @internalTechnology
+  @param  None
+  @pre    None
+  @post   None
+*/
+CMtfTestActionCompareEmails::~CMtfTestActionCompareEmails()
+	{
+	delete 	iMessageInfo1;
+	delete 	iMessageInfo2;
+	}
+
+
+/**
+  ExecuteActionL
+  Obtains the parameters for the test action and then calls CompareEmailMessagesL()
+  function to compare the sent and the received messages, based on the download
+  limits set.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/
+void CMtfTestActionCompareEmails::ExecuteActionL()
+	{
+	TestCase().INFO_PRINTF2(_L("Test Action %S start..."), &KTestActionCompareEmails);
+
+	// Get the session object 
+	iParamSession = ObtainParameterReferenceL<CMsvSession>
+									(TestCase(),ActionParameters().Parameter(0));
+	
+		
+	// Get the first selection object of messages
+	CMsvEntrySelection*	msgSelectionList1 = 
+									ObtainParameterReferenceL<CMsvEntrySelection>
+									(TestCase(), ActionParameters().Parameter(1)); 
+
+	// Get the second selection object of messages
+	CMsvEntrySelection*	msgSelectionList2 = 
+									ObtainParameterReferenceL<CMsvEntrySelection>
+									(TestCase(), ActionParameters().Parameter(2)); 
+	
+
+	if( (iParamSession == NULL) || (msgSelectionList1 == NULL) || (msgSelectionList2 == NULL) )
+		{
+		// Invalid input parameter value
+		TestCase().ERR_PRINTF1(_L("Invalid session or message selection object found"));
+		TestCase().SetTestStepResult(EFail);
+		}
+	else
+		{		
+		CompareEmailsL(*msgSelectionList1, *msgSelectionList2);		
+		}
+	// Test Action is complete
+	TestCase().INFO_PRINTF2(_L("Test Action %S completed."), &KTestActionCompareEmails);
+	TestCase().ActionCompletedL(*this);
+	}	
+
+/**
+  CompareEmailsL
+  Compares body text, html text and attachments.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/
+void CMtfTestActionCompareEmails::CompareEmailsL(
+										 const CMsvEntrySelection& aMsgSelection1,
+										 const CMsvEntrySelection& aMsgSelection2)
+	{
+	// Verify the input parameters
+	if( (!&aMsgSelection1) || (!&aMsgSelection2))	
+		{
+		TestCase().ERR_PRINTF1(_L("Invalid Message selection"));
+		User::LeaveIfError(KErrArgument);
+		}
+
+	// Get the count of messages in both the selection object.
+	TInt msgCount1 = aMsgSelection1.Count();
+	TInt msgCount2 = aMsgSelection2.Count();
+
+	TestCase().INFO_PRINTF2(_L("Message count 1 = %d"),msgCount1);
+	TestCase().INFO_PRINTF2(_L("Message count 2 = %d"),msgCount2);
+	
+	if(msgCount1 != msgCount2)
+		{
+		// Number of messages is not equal in the selections passed
+		TestCase().ERR_PRINTF1(_L("Message count in the selections not equal"));
+		TestCase().SetTestStepResult(EFail);
+		}
+
+	if(IsTestCaseStatusPass())
+		{
+		CMsvEntry* msvEntry1 = iParamSession->GetEntryL(KMsvRootIndexEntryId);
+		CleanupStack::PushL(msvEntry1);
+
+		CMsvEntry* msvEntry2 = iParamSession->GetEntryL(KMsvRootIndexEntryId);
+		CleanupStack::PushL(msvEntry2);
+
+		if((!msvEntry1) || (!msvEntry2))
+			{
+			TestCase().ERR_PRINTF1(_L("Invalid Message Entry"));
+			User::LeaveIfError(KErrGeneral);
+			}
+	
+		// Loop through the first list of messages
+		for ( TInt msgIndex1 = 0 ; (msgIndex1 < msgCount1) &&
+									  (IsTestCaseStatusPass());
+									   msgIndex1 ++)
+			{			
+			TMsvId msgId1 = aMsgSelection1.At(msgIndex1);
+			// Set the context to the first message entry
+			msvEntry1->SetEntryL(msgId1);
+			
+			TBool found = EFalse;
+
+			TestCase().INFO_PRINTF3(_L("Comparison of Message: %d,  Subject: %S"),
+							(msgIndex1 + 1), &(msvEntry1->Entry().iDescription));
+			
+			for(TInt msgIndex2 = 0; msgIndex2 < msgCount2 && !found
+														    ; msgIndex2++)	
+				{
+				TMsvId msgId2 = aMsgSelection2.At(msgIndex2);
+
+				// Set the context to the second message entry
+				msvEntry2->SetEntryL(msgId2);
+				
+				// Compare the subject field of the two messages
+				if (msvEntry1->Entry().iDescription.
+								Compare(msvEntry2->Entry().iDescription) == 0)
+					{
+					TestCase().INFO_PRINTF2(_L("Message with Subject field in the selection 1: %S found "),
+												  &(msvEntry1->Entry().iDescription));
+
+					found = ETrue;
+					
+					SetEmailMessageInfoL(*msvEntry1, *msvEntry2);
+					}
+				}	
+	
+			if ( found )
+				{
+				if(IsTestCaseStatusPass())
+					{
+					ComparePlainBodyTextL();
+					}
+				if(IsTestCaseStatusPass())
+					{
+					CompareHtmlL();
+					}
+				if(IsTestCaseStatusPass())
+					{
+					CompareAttachmentsL(*msvEntry1, *msvEntry2);
+					}
+				if(IsTestCaseStatusPass())
+					{
+					DeleteEmailMessageInfo();
+					}				
+				}
+			else{
+				TestCase().ERR_PRINTF2(_L("Email with subject %S is not found"), &msvEntry1->Entry().iDescription);
+				TestCase().SetTestStepResult(EFail);
+				}
+			}
+		// Cleanup the stack
+		CleanupStack::PopAndDestroy(msvEntry2);
+		CleanupStack::PopAndDestroy(msvEntry1);
+		}
+	}
+
+/**
+  ComparePlainBodyTextL
+  Compares body text.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/
+void CMtfTestActionCompareEmails::ComparePlainBodyTextL()
+	{
+
+	TestCase().INFO_PRINTF1(_L("Comparing Plain text part of the message"));
+	
+	if( iMessageInfo1->GetBodyTextSize() > 0)
+		{
+		if( iMessageInfo2->GetBodyTextSize() > 0)
+			{			
+			CParaFormatLayer*	paraFormatLayer1 = CParaFormatLayer::NewL();
+			CleanupStack::PushL(paraFormatLayer1);
+
+			CCharFormatLayer*	charFormatLayer1 = CCharFormatLayer::NewL(); 
+			CleanupStack::PushL(charFormatLayer1);
+
+			CRichText*	plainBodyText1  = CRichText::NewL( paraFormatLayer1,
+															charFormatLayer1,
+															CEditableText::EFlatStorage, 256);
+			CleanupStack::PushL(plainBodyText1);
+			
+			iMessageInfo1->GetBodyTextL(*plainBodyText1, *paraFormatLayer1,
+															*charFormatLayer1);	
+
+			// Get message body text for 2nd message
+			CParaFormatLayer*	paraFormatLayer2 = CParaFormatLayer::NewL();
+			CleanupStack::PushL(paraFormatLayer2);
+
+			CCharFormatLayer*	charFormatLayer2 = CCharFormatLayer::NewL(); 
+			CleanupStack::PushL(charFormatLayer2);
+
+			CRichText*	plainBodyText2 = CRichText::NewL( paraFormatLayer2, 
+															charFormatLayer2, 
+															CEditableText::EFlatStorage, 256);
+
+			CleanupStack::PushL(plainBodyText2);
+			
+			iMessageInfo2->GetBodyTextL(*plainBodyText2, *paraFormatLayer2,
+															*charFormatLayer2);
+			
+			// If the body text buffer is not available, fail the test case
+			if(plainBodyText1 == NULL || plainBodyText2 == NULL)
+				{
+				// Error : Body text buffer not available
+				TestCase().ERR_PRINTF1(_L("Body text buffer not available"));
+				TestCase().SetTestStepResult(EFail);
+				}			
+
+			if(IsTestCaseStatusPass())
+				{
+				TPtrC bodyText1 = plainBodyText1->Read(0);
+				TPtrC bodyText2 = plainBodyText2->Read(0);
+
+				TestCase().INFO_PRINTF3(_L("Body text size of 1st message = %d, Body text size of 2nd messaage= %d"),
+											bodyText1.Length(), bodyText2.Length());
+								
+				if( (bodyText1.Compare(bodyText2)) != 0)
+					{
+					// Error : Comparison of body text failed
+					TestCase().ERR_PRINTF1(_L("Comparison of body text failed"));
+					TestCase().SetTestStepResult(EFail);
+					}
+
+				else
+					{
+					TestCase().INFO_PRINTF1(_L("Comparison of Body text was successful"));					
+					}				
+				}
+			CleanupStack::PopAndDestroy(6, paraFormatLayer1);
+			}
+		else
+			{			
+			TestCase().ERR_PRINTF1(_L("Message 1 conntains body text, but body text was not received for 2nd message"));
+			TestCase().SetTestStepResult(EFail);
+			}
+		}
+	else
+		{
+		TestCase().INFO_PRINTF1(_L("1st message does not contain Body text part"));		
+		}
+	}
+
+
+/**
+  DeleteEmailMessageInfo
+  Deletes the email message info created earlier.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/
+void CMtfTestActionCompareEmails::DeleteEmailMessageInfo()
+	{	
+	delete 	iMessageInfo1;
+	iMessageInfo1 = NULL;
+		
+	delete 	iMessageInfo2 ;
+	iMessageInfo2 = NULL;
+	}
+
+/**
+  SetEmailMessageInfoL
+  Sets the email message for the entry specified.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/
+void CMtfTestActionCompareEmails::SetEmailMessageInfoL(CMsvEntry& aMsvEntry1, CMsvEntry& aMsvEntry2)
+	{	
+	TestCase().INFO_PRINTF1(_L("Setting information for 1st message"));
+	iMessageInfo1 = CMtfTestActionUtilsEmailMessage::NewL(aMsvEntry1, TestCase());
+		
+	TestCase().INFO_PRINTF1(_L("Setting information for 2nd message"));	
+	iMessageInfo2 = CMtfTestActionUtilsEmailMessage::NewL(aMsvEntry2, TestCase());
+	}
+
+/**
+  CompareHtmlL
+  Compares html text.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/
+void CMtfTestActionCompareEmails::CompareHtmlL()
+	{	
+	TPtrC htmlFileName1;
+	TInt err1 = iMessageInfo1->HtmlFileName(htmlFileName1);
+	TPtrC htmlFileName2;
+	TInt err2 = iMessageInfo2->HtmlFileName(htmlFileName2);
+	
+	if((iMessageInfo1->GetHtmlSize() > 0) && (err1 == KErrNone))
+		{
+		if( err2 == KErrNone)
+			{
+			TInt errorVal;
+			TBool diffFlag = EFalse;
+
+			// Compare the html files
+			CompareFilesL(htmlFileName1, htmlFileName2, errorVal, diffFlag);
+			
+			if (errorVal == KErrNone )
+				{
+				if ( diffFlag == EFalse )
+					{
+					TestCase().INFO_PRINTF1(_L("Comparison of Html files was successful"));
+					TestCase().INFO_PRINTF2(_L("Html file for message 1: %S"),&htmlFileName1 );
+					TestCase().INFO_PRINTF2(_L("Html file for message 2: %S"),&htmlFileName2 );					
+					}
+				else
+					{
+					// Comparison of Html files failed
+					TestCase().ERR_PRINTF1(_L("Comparison of Html files failed"));
+					TestCase().SetTestStepResult(EFail);
+					}
+				}
+			else
+				{
+				// An error occured while comparing the html files
+				TestCase().ERR_PRINTF1(_L("Error occurred while comparing Html files"));
+				TestCase().SetTestStepResult(EFail);
+				}
+			}
+		else
+			{
+			// Received message's html path was not found
+			TestCase().ERR_PRINTF1(_L("Html file path not found in the 2nd message"));
+			TestCase().SetTestStepResult(EFail);
+			}
+		}
+	else
+		{
+		TestCase().INFO_PRINTF1(_L("Html file path not found for the 1st message"));
+		}
+	}
+
+/**
+  CompareFilesL
+  Compares files.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/			
+void CMtfTestActionCompareEmails::CompareFilesL(const TPtrC afilePath1,
+													   const TPtrC afilePath2,
+													   TInt& aError, TBool& aDiffFlag)
+	{
+	aDiffFlag = EFalse;
+	CArrayFixFlat<TUint16> *ignoreCharList = new (ELeave)
+											CArrayFixFlat<TUint16>(KArrayGranularity);
+	CleanupStack::PushL(ignoreCharList);
+
+	// Compare the content of the attachment files
+	aError = TestFrameworkActionsUtils::CompareFilesL(afilePath1, afilePath2,
+														 EFalse, ignoreCharList, aDiffFlag);
+						
+	CleanupStack::PopAndDestroy(ignoreCharList);
+	}
+
+/**
+  CompareAttachmentsL
+  Compares the attachments associated with specified entries.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/
+void CMtfTestActionCompareEmails::CompareAttachmentsL(CMsvEntry& aMsvEntry1, CMsvEntry& aMsvEntry2)
+	{
+	TestCase().INFO_PRINTF1(_L("Comparing Attachments"));
+		
+	CImEmailMessage* emailMessage1 = CImEmailMessage::NewL(aMsvEntry1);
+	CleanupStack::PushL(emailMessage1);
+	
+	CImEmailMessage* emailMessage2 = CImEmailMessage::NewL(aMsvEntry2);
+	CleanupStack::PushL(emailMessage2);
+	
+	MMsvAttachmentManager& manager1 = emailMessage1->AttachmentManager();
+	MMsvAttachmentManager& manager2 = emailMessage2->AttachmentManager();
+
+	TInt msgAttachmentCount1 = manager1.AttachmentCount();
+	TInt msgAttachmentCount2 = manager2.AttachmentCount();
+
+	TestCase().INFO_PRINTF3(_L("1st message attachment count : %d, 2nd message attachment count : %d"),
+								msgAttachmentCount1,msgAttachmentCount2);
+
+	if(msgAttachmentCount1 == msgAttachmentCount2)
+		{
+		TInt index1 = 0;
+		TInt index2 = 0;
+		
+		TBool	attachmentFound = EFalse;
+		
+		for (index1 = 0, index2 = 0 ; ( IsTestCaseStatusPass()) && 
+					(index1 < msgAttachmentCount1) ; index1++)
+			{
+			attachmentFound = EFalse;
+			CMsvAttachment* attachInfo1 = manager1.GetAttachmentInfoL(index1);
+			CleanupStack::PushL(attachInfo1);
+			
+			for (index2 = 0; index2 < msgAttachmentCount2 && attachmentFound == EFalse; index2++ )
+				{
+				CMsvAttachment* attachInfo2 = manager2.GetAttachmentInfoL(index2);
+				CleanupStack::PushL(attachInfo2);
+
+				if ( attachInfo2->AttachmentName().Compare(attachInfo1->AttachmentName()) == 0 )
+					{
+					attachmentFound = ETrue;
+					
+					if (
+						(attachInfo1->Type() == CMsvAttachment::EMsvFile || attachInfo1->Type() == CMsvAttachment::EMsvLinkedFile) &&
+						(attachInfo2->Type() == CMsvAttachment::EMsvFile || attachInfo2->Type() == CMsvAttachment::EMsvLinkedFile) 
+					   )
+						{							
+						TBool comaprisonFlag = CompareAttachmentFilesL(manager1.GetAttachmentFileL(index1), manager2.GetAttachmentFileL(index2));
+						if (!comaprisonFlag)
+							{
+							 TestCase().SetTestStepResult(EFail);
+							}
+						
+						}
+					}
+				CleanupStack::PopAndDestroy(attachInfo2);
+				}
+			CleanupStack::PopAndDestroy(attachInfo1);
+			}
+			if ( !attachmentFound )
+				{
+				TestCase().ERR_PRINTF1(_L("Attachments are not identical."));
+				TestCase().SetTestStepResult(EFail);
+				}
+		}
+		else
+			{
+			TestCase().ERR_PRINTF1(_L("Attachments count not identical."));
+			TestCase().SetTestStepResult(EFail);	
+			}
+		CleanupStack::PopAndDestroy(2, emailMessage1);
+	}
+
+/**
+  CompareAttachmentFiles
+  Compares the file associated with the attachments.
+  @internalTechnology 
+  @pre    None
+  @post   None
+*/
+TBool CMtfTestActionCompareEmails::CompareAttachmentFilesL(RFile aFile1, RFile aFile2)
+	{
+	//Do the byte by byte comparison
+	TBool ret = ETrue;
+	TInt sz1, sz2;
+
+	User::LeaveIfError( aFile1.Size(sz1) );
+	User::LeaveIfError( aFile2.Size(sz2) );
+
+	if( sz1 != sz2 )
+		{
+		TestCase().INFO_PRINTF3( _L("File size mismatch 1(%d)   2(%d)"), sz1, sz2 );
+		ret = EFalse;
+		}
+	else
+		{
+		TBuf8<1> char1;
+		TBuf8<1> char2;
+		TInt len1, len2;
+		do
+			{
+			aFile1.Read(char1);
+			aFile2.Read(char2);
+			len1 = char1.Length();
+			len2 = char2.Length();
+			if( char1.Compare( char2 ) != 0 )
+				{
+				ret = EFalse;
+				break;
+				}
+			}
+		while( len1 && len2 );
+		}
+	return ret;
+	}