diff -r 000000000000 -r 8e480a14352b messagingfw/msgtestfw/TestActions/SendAs/src/CMtfTestActionCompareEmails.cpp --- /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 : Reference to the session. +// CMsvEntrySelection& MailSelection1 : Reference to the +// first mail selection +// CMsvEntrySelection& MailSelection2 : 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 +#include + +//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 + (TestCase(),ActionParameters().Parameter(0)); + + + // Get the first selection object of messages + CMsvEntrySelection* msgSelectionList1 = + ObtainParameterReferenceL + (TestCase(), ActionParameters().Parameter(1)); + + // Get the second selection object of messages + CMsvEntrySelection* msgSelectionList2 = + ObtainParameterReferenceL + (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 *ignoreCharList = new (ELeave) + CArrayFixFlat(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; + }