diff -r 4697dfb2d7ad -r 238255e8b033 messagingappbase/smsmtm/test/src/T_smcm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/smsmtm/test/src/T_smcm.cpp Fri Apr 16 14:56:15 2010 +0300 @@ -0,0 +1,869 @@ +// Copyright (c) 2000-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 "T_smcm.h" +#include +#include +#include +#include +#include +#include + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + test.Start(_L("Setup")); + theCleanup = CTrapCleanup::New(); + TRAPD(ret,doMainL()); + test(ret==KErrNone); + delete theCleanup; + test.Console()->SetPos(0, 13); + test.End(); + test.Close(); + __UHEAP_MARKEND; + return(KErrNone); + } + +LOCAL_C void doMainL() + { + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + CSmsTestUtils* smsTest = CSmsTestUtils::NewL(test); + CleanupStack::PushL(smsTest); + TInt nextTest = 0; + + CSmcmTest* SmcmTest = CSmcmTest::NewLC(*smsTest, KNullDesC, nextTest); + + SmcmTest->StartL(); + + CleanupStack::PopAndDestroy(3); //SmcmTest. scheduler + + } + +CSmcmTest::CSmcmTest(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest) +: CSmsTestBase(aSmsTest, aScriptFile, aNextTest) + { + } + +void CSmcmTest::RunAutoL() + { + iSmsTest.TestStart(++iNextTest, _L("CSmsSettings")); + TestSettingsL(); + iSmsTest.TestFinish(iNextTest); + + iSmsTest.TestStart(++iNextTest, _L("CSmsClientMtm Capabilities")); + TestCapabilitiesL(); + iSmsTest.TestFinish(iNextTest); + + iSmsTest.TestStart(++iNextTest, _L("CSmsClientMtm Global Find")); + TestFindL(); + iSmsTest.TestFinish(iNextTest); + + iSmsTest.TestStart(++iNextTest, _L("CSmsClientMtm Find Alias")); + TestFindAliasL(); + iSmsTest.TestFinish(iNextTest); + + iSmsTest.TestStart(++iNextTest, _L("CSmsClientMtm Reply")); + TestReplyL(); + TestReplyEmailL(); + iSmsTest.TestFinish(iNextTest); + + iSmsTest.TestStart(++iNextTest, _L("CSmsClientMtm Forward")); + TestForwardL(); + TestForwardEmailL(); + iSmsTest.TestFinish(iNextTest); + + iSmsTest.TestStart(++iNextTest, _L("CSmsClientMtm Async Functions")); +// There are no async function in sms client mtm + iSmsTest.TestFinish(iNextTest); + + iSmsTest.TestStart(++iNextTest, _L("CSmsClientMtm Sync Functions")); + TestSyncFunctionsL(); + iSmsTest.TestFinish(iNextTest); + } + +CSmcmTest::~CSmcmTest() + { + delete iSmsHeader; + delete iRichText; + delete iParaLayer; + delete iCharLayer; + } + +void CSmcmTest::ConstructL() + { + iSmsTest.SetLogToFile(); // Lets log to a file + iSmsTest.InstantiateClientMtmsL(); + + iSelection = new (ELeave) CMsvEntrySelection(); + iTimer = CTestTimer::NewL(); + + iParaLayer =CParaFormatLayer::NewL(); // Rich Text for the body part of the message + iCharLayer = CCharFormatLayer::NewL(); + iRichText = CRichText::NewL(iParaLayer, iCharLayer, CEditableText::EFlatStorage,256); + + CActiveScheduler::Add(this); + } + +CSmcmTest* CSmcmTest::NewLC(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest) + { + CSmcmTest* self = new (ELeave) CSmcmTest(aSmsTest, aScriptFile, aNextTest); + CleanupStack::PushL(self); + + self->ConstructL(); + return self; + } + +void CSmcmTest::ShowMenuL() + { + iSmsTest.ResetMenu(); + + iSmsTest.AppendToMenuL(_L("Start")); + + TInt result = iSmsTest.DisplayMenu(_L("SMS Client MTM Test")); + + if (result <= 0) + return; + + switch (result) + { + case 1: + RunAutoL(); + break; + default: + User::Leave(KErrArgument); + break; + } + + if (!iSmsTest.RunAuto()) + { + iSmsTest.Printf(_L("Press any key to continue...\n")); + iSmsTest.Test().Getch(); + } + + ShowMenuL(); + } + +void CSmcmTest::TestSettingsL() + { + iSmsTest.Printf(_L("Testing Create Settings...\n")); + MsvEntry().SetEntryL(iSmsTest.iSmsServiceId); + +// Lets create sms settings (just in case it does not exist yet) + + CSmsSettings* settings = CSmsSettings::NewL(); + CleanupStack::PushL(settings); + CSmsAccount* account = CSmsAccount::NewLC(); + account->InitialiseDefaultSettingsL(*settings); + settings->AddServiceCenterL(_L("Radiolinja0"),_L("+358508771010")); + settings->AddServiceCenterL(_L("Radiolinja1"),_L("+358508771010")); + settings->AddServiceCenterL(_L("Nokia"),_L("+358454400050")); + settings->SetDefaultServiceCenter(2); + iSmsTest(settings->DefaultServiceCenter()==2); + settings->SetValidityPeriod(ESmsVPWeek); + settings->SetReplyQuoted(ETrue); + settings->SetRejectDuplicate(ETrue); + settings->SetDelivery(ESmsDeliveryImmediately); + settings->SetDeliveryReport(ETrue); + settings->SetReplyPath(EFalse); + settings->SetMessageConversion(ESmsConvPIDNone); + settings->SetCanConcatenate(ETrue); + settings->SetCharacterSet(TSmsDataCodingScheme::ESmsAlphabet8Bit); + settings->SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFSemiOctet); + settings->SetStatusReportHandling(CSmsSettings::EMoveReportToInboxVisible); + settings->SetSpecialMessageHandling(CSmsSettings::EMoveReportToInboxVisible); + + account->SaveSettingsL(*settings); + CleanupStack::PopAndDestroy(account); + + iSmsTest.iServiceSettings->CopyL(*settings); + CleanupStack::PopAndDestroy(settings); + } + +// Now we shall test the recipient handling, find and validate features + +void CSmcmTest::TestFindL() + { + iSmsTest.Test().Next(_L("Testing CSmsClientMtm Global Find")); + +// Before testing the find and validate we need a dummy message to play with + + TMsvPartList partList; + TMsvId id = iSmsTest.CreateDummyMessageToSendL(); + Client().SwitchCurrentEntryL(id); + +// Lets load the message we just created + Client().LoadMessageL(); + +// And add some recipients + Client().AddAddresseeL(_L("+358503367709"), _L("Mico3")); + Client().AddAddresseeL(_L("+358503367709"), _L("Mico4")); + Client().AddAddresseeL(_L("//\\"), _L("\n")); + Client().AddAddresseeL(_L("\n0"), _L("^")); + Client().AddAddresseeL(_L("1234"), _L("~¨")); + Client().AddAddresseeL(_L("äöåÖÅÖÖ¤"), _L("fdsa4324521{[]}")); + Client().AddAddresseeL(_L("äöåÖÅÖÖ¤"), _L("")); + Client().AddAddresseeL(_L("äöåÖÅÖÖ¤")); + +// Remove Recipient + Client().RemoveAddressee(2); + +// Validating Message + partList=KMsvMessagePartRecipient; + iSmsTest(Client().ValidateMessage(partList)); // All the addresses are not valid + + Client().RemoveAddressee(Client().AddresseeList().Count()-1); + Client().RemoveAddressee(Client().AddresseeList().Count()-1); + Client().RemoveAddressee(Client().AddresseeList().Count()-1); + Client().RemoveAddressee(Client().AddresseeList().Count()-2); + Client().RemoveAddressee(Client().AddresseeList().Count()-2); + + partList=KMsvMessagePartRecipient; // supported + iSmsTest(!Client().ValidateMessage(partList)); + partList=KMsvMessagePartBody; // not supported, returns 0 + iSmsTest(!Client().ValidateMessage(partList)); + partList=KMsvMessagePartOriginator; // not supported, returns 0 + iSmsTest(!Client().ValidateMessage(partList)); + partList=KMsvMessagePartDescription; // not supported, returns 0 + iSmsTest(!Client().ValidateMessage(partList)); + partList=KMsvMessagePartDate; // not supported, returns 0 + iSmsTest(!Client().ValidateMessage(partList)); + partList=KMsvMessagePartAttachments; // not supported, returns 0 + iSmsTest(!Client().ValidateMessage(partList)); + partList=KMsvMessagePartBody|KMsvMessagePartRecipient; + iSmsTest(!Client().ValidateMessage(partList)); + iSmsTest.Printf(_L("Test Validate Passed\n")); + +// Find in body and recipients + Client().AddAddresseeL(_L("+358503367709"), _L("Mr. Tester")); + partList=KMsvMessagePartRecipient; + iSmsTest(Client().Find(_L("est"),partList)==KMsvMessagePartRecipient); + partList=KMsvMessagePartBody; + iSmsTest(Client().Find(_L("end"),partList)==KMsvMessagePartBody); + partList=KMsvMessagePartOriginator; + iSmsTest(!Client().Find(_L("end"),partList)); + partList=KMsvMessagePartDescription; // not supported, returns 0 + iSmsTest(Client().Find(_L("end"),partList)); + partList=KMsvMessagePartDate; // not supported, returns 0 + iSmsTest(!Client().Find(_L("end"),partList)); + partList=KMsvMessagePartAttachments; // not supported, returns 0 + iSmsTest(!Client().Find(_L("end"),partList)); + partList=KMsvMessagePartBody|KMsvMessagePartRecipient; +// resultList=Client().Find(_L(""),partList); // crashes with empty string + iSmsTest(!Client().Find(_L("\n"),partList)); + iSmsTest(!Client().Find(_L("äöå"),partList)); + iSmsTest(!Client().Find(_L("{[}]"),partList)); + iSmsTest(!Client().Find(_L("\\"),partList)); + iSmsTest(!Client().Find(_L("4352316542631753dfgfdgs4t6543w563vsd4"),partList)); + iSmsTest( Client().Find(_L("~"),partList)); + iSmsTest(!Client().Find(_L("^"),partList)); + iSmsTest(!Client().Find(_L(" \"dsasaf¤;¨"),partList)); + iSmsTest(!Client().Find(_L("\\"),partList)); + iSmsTest(!Client().Find(_L(" "),partList)); // alt+255 + iSmsTest(Client().Find(_L("¨"),partList)); + iSmsTest(!Client().Find(_L("/\\"),partList)); + iSmsTest(!Client().Find(_L("\\ "),partList)); + iSmsTest.Printf(_L("Test Find Passed\n")); + } + +void CSmcmTest::TestCapabilitiesL() + { +// Query MTM's capabilities + TInt response; + iSmsTest(Client().QueryCapability(KUidMtmQueryMaxBodySize,response)==KErrNone); +// iSmsTest(response==KSmscMaxTotalMsgSize); + iSmsTest(Client().QueryCapability(KUidMtmQueryMaxTotalMsgSize,response)==KErrNone); +// iSmsTest(response==KSmcmMaxMessageNumber*KSmcmMaxCharsInMessageConcatenated7Bit); + iSmsTest(Client().QueryCapability(KUidMtmQuerySupportedBody,response)==KErrNone); + iSmsTest(response==KMtm7BitBody + KMtm8BitBody + KMtm16BitBody); + iSmsTest(Client().QueryCapability(KUidMtmQuerySupportAttachments,response)==KErrNotSupported); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMtmQuerySupportSubject,response)==KErrNotSupported); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMtmQuerySupportsFolder,response)==KErrNotSupported); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMtmQueryOffLineAllowed,response)==KErrNotSupported); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMtmQueryCanSendMsg,response)==KErrNone); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMtmQueryCanReceiveMsg,response)==KErrNone); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMtmQueryMaxRecipientCount,response)==KErrNone); + iSmsTest(response==-1); + iSmsTest(Client().QueryCapability(KUidMtmQuerySendAsRequiresRenderedImage,response)==KErrNotSupported); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMtmQuerySendAsRenderingUid,response)==KErrNotSupported); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMsvMtmQueryEditorUid,response)==KErrNone); + iSmsTest(response==268441151); // 0x1000163f in hex form + iSmsTest(Client().QueryCapability(KUidMsvQuerySupportsBioMsg,response)==KErrNone); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidMsvQuerySupportsScheduling,response)==KErrNone); + iSmsTest(response); + iSmsTest(Client().QueryCapability(KUidSmcmTestNonSense,response)==KErrNotSupported); + iSmsTest(response); + iSmsTest.Printf(_L("Test Query Capabilities Passed\n")); + } + +// Now testing find alias +void CSmcmTest::TestFindAliasL() + { + iSmsTest.Test().Next(_L("CSmsClientMtm Find Alias")); + iSmsTest.Printf(_L("This test is INCOMPLETE\n")); + + TMsvEntry entry; + entry.iType=KUidMsvMessageEntry; + entry.SetSendingState(KMsvSendStateNotApplicable); + + // Begin extracted code + iSmsTest.iRichText->Reset(); + iSmsTest.iRichText->InsertL(0,_L("Test message")); + CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, *iSmsTest.iRichText); + CleanupStack::PushL(header); + + header->SetFromAddressL(KScriptItemRecipientsDef); + header->Message().SetServiceCenterAddressL(KScriptItemSCDef); + + entry.iDetails.Set(_L("host")); //set alias + + TTime now; + now.HomeTime(); + iSmsTest.CreateMessageL(KMsvGlobalInBoxIndexEntryId, entry, *header, *iSmsTest.iRichText, now); + entry.SetReadOnly(ETrue); + iSmsTest.ChangeEntryL(entry); + TMsvId id = entry.Id(); + CleanupStack::PopAndDestroy(header); //header + + // End extracted code + + iSmsTest.SetEntryL(id); + + Client().SwitchCurrentEntryL(id); // Lets point at the received message + Client().LoadMessageL(); + + TMsvPartList partList; + partList=KMsvMessagePartOriginator; + //Find alias + iSmsTest(Client().Find(_L("host"),partList)==KMsvMessagePartOriginator); + iSmsTest.Printf(_L("Alias Found\n")); + iSmsTest.Printf(_L("Find Alias test passed\n")); + } + +// Now testing replying to received messages +void CSmcmTest::TestReplyL() + { + iSmsTest.Test().Next(_L("CSmsClientMtm Reply")); + iSmsTest.Printf(_L("This test is INCOMPLETE\n")); + + TMsvEntry entry; + entry.iType=KUidMsvMessageEntry; + entry.SetSendingState(KMsvSendStateNotApplicable); + + // Begin extracted code + iSmsTest.iRichText->Reset(); + iSmsTest.iRichText->InsertL(0,_L("This is a test message with formatting and pictures")); + CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, *iSmsTest.iRichText); + CleanupStack::PushL(header); + + // Add formatting and picture + CEmsFormatIE* object = CEmsFormatIE::NewL(); + CleanupStack::PushL(object); + object->SetStartPosition(10); + object->SetFormatLength(10); + object->SetBold(ETrue); + header->Message().AddEMSInformationElementL(*object); + CleanupStack::PopAndDestroy(object); + + CEmsPictureIE* pic = EmsTestUtils::CreatePictureL(0); + CleanupStack::PushL(pic); + pic->SetStartPosition(20); + header->Message().AddEMSInformationElementL(*pic); + CleanupStack::PopAndDestroy(pic); + + header->SetFromAddressL(KScriptItemRecipientsDef); + header->Message().SetServiceCenterAddressL(KScriptItemSCDef); + + TTime now; + now.HomeTime(); + iSmsTest.CreateMessageL(KMsvGlobalInBoxIndexEntryId, entry, *header, *iSmsTest.iRichText, now); + entry.SetReadOnly(ETrue); + iSmsTest.ChangeEntryL(entry); + TMsvId id = entry.Id(); + CleanupStack::PopAndDestroy(1); //header + + // End extracted code + + iSmsTest.SetEntryL(id); + + Client().SwitchCurrentEntryL(id); // Lets point at the received message + Client().LoadMessageL(); + + TMsvPartList part=0; + CMsvOperationWait* wait = CMsvOperationWait::NewLC(); + CMsvOperation* op=Client().ReplyL(KMsvDraftEntryId, part, wait->iStatus); + CleanupStack::PushL(op); + wait->Start(); + CActiveScheduler::Start(); + + TPckgBuf pkg; + pkg.Copy(op->ProgressL()); + TMsvId progress = pkg(); + + CleanupStack::PopAndDestroy(2); //op, wait + + // let's check to see if the inbox message and the reply are the same + // (this call will compare ems objects as well + if (!iSmsTest.AreMessagesSameTextL(id, progress, ETrue)) + { + iSmsTest.Printf(_L("EMS objects do not compare!!\n")); + } + else + { + iSmsTest.Printf(_L("EMS objects compare OK.\n")); + } + + Client().SwitchCurrentEntryL(progress); + Client().LoadMessageL(); + + Client().Body().InsertL(0,_L("This is reply")); + Client().SaveMessageL(); + } + +TMsvId CSmcmTest::CreateEmailSmsMessageL(const TDesC& aEmailMessageData) + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + CSmsMessage* message = CSmsMessage::NewL(fs, CSmsPDU::ESmsDeliver, CSmsEditorBuffer::NewL(*iRichText), EFalse); + CleanupStack::PushL(message); + + CSmsBufferBase& buffer = message->Buffer(); + buffer.Reset(); + buffer.InsertL(0, aEmailMessageData); + + // Set the PID for email. + CSmsPDU& pdu = message->SmsPDU(); + if( pdu.ProtocolIdentifierPresent() ) + { + pdu.SetPIDType(TSmsProtocolIdentifier::ESmsPIDTelematicInterworking); + pdu.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsTelematicDevice); + pdu.SetTelematicDeviceType(TSmsProtocolIdentifier::ESmsInternetElectronicMail); + } + + // Create a new SMS header + CSmsHeader* header = CSmsHeader::NewL(message); + CleanupStack::Pop(message); + CleanupStack::PushL(header); + + header->SetFromAddressL(KScriptItemRecipientsDef); + header->Message().SetServiceCenterAddressL(KScriptItemSCDef); + + // Set the entry data... + TMsvEntry entry; + entry.iType = KUidMsvMessageEntry; + entry.SetSendingState(KMsvSendStateNotApplicable); + TSmsUtilities::PopulateMsgEntry(entry, header->Message(), iSmsTest.iSmsServiceId); + TTime now; + now.HomeTime(); + entry.iDate = now; + + const CSmsEmailFields& fields = header->EmailFields(); + // Set the details fiels to the address field. + iSmsTest(fields.HasAddress()); + entry.iDetails.Set(fields.Addresses().MdcaPoint(0).Left(KSmsDetailsLength)); + + // Set the description to either the subject or the beginning part of the + // body text. + HBufC* desBuffer = HBufC::NewLC(Client().ServiceSettings().DescriptionLength()); + TPtr description(desBuffer->Des()); + if( fields.Subject().Length() > 0 ) + { + // There is a subject - use this as the description + description.Copy(fields.Subject().Left(description.MaxLength())); + } + else + { + // No subject - use the beginning part of the body text. + CSmsBufferBase& body = header->Message().Buffer(); + TInt length = body.Length(); + HBufC* buf = HBufC::NewLC(length); + TPtr ptr(buf->Des()); + body.Extract(ptr, 0, length); + + description.Copy(ptr.Left(description.MaxLength())); + CleanupStack::PopAndDestroy(buf); + } + entry.iDescription.Set(description); + + // Create the entry in the inbox. + iSmsTest.SetEntryL(KMsvGlobalInBoxIndexEntryId); + iSmsTest.CreateEntryL(entry); + Session().CleanupEntryPushL(entry.Id()); + + // Store the header... + iSmsTest.SetEntryL(entry.Id()); + CMsvStore* store = iSmsTest.EditStoreL(); + CleanupStack::PushL(store); + + header->StoreL(*store); + + // Store the body text - need to insert into rich text object. + iSmsTest.iRichText->Reset(); + TInt length = header->Message().Buffer().Length(); + HBufC* buf = HBufC::NewLC(length); + + TPtr ptr(buf->Des()); + header->Message().Buffer().Extract(ptr, 0, length); + iSmsTest.iRichText->InsertL(0, ptr); + + store->StoreBodyTextL(*iSmsTest.iRichText); + store->CommitL(); + + entry.iSize = store->SizeL(); + entry.SetReadOnly(ETrue); + iSmsTest.ChangeEntryL(entry); + + CleanupStack::PopAndDestroy(2, store); // store, buf + Session().CleanupEntryPop(); + CleanupStack::PopAndDestroy(3, &fs); // fs, header, desBuffer + + return entry.Id(); + } + +void CSmcmTest::DoTestReplyEmailL(const TDesC& aEmailMessageData, const TDesC& aAddress, const TDesC& aSubject) + { + // Create an email message and then a reply message to it. + TMsvId id = CreateEmailSmsMessageL(aEmailMessageData); + iSmsTest.SetEntryL(id); + Client().SwitchCurrentEntryL(id); + Client().LoadMessageL(); + + TMsvPartList part=0; + CMsvOperationWait* wait = CMsvOperationWait::NewLC(); + CMsvOperation* op=Client().ReplyL(KMsvDraftEntryId, part, wait->iStatus); + CleanupStack::PushL(op); + wait->Start(); + CActiveScheduler::Start(); + + TPckgBuf pkg; + pkg.Copy(op->ProgressL()); + TMsvId reply = pkg(); + + CleanupStack::PopAndDestroy(2, wait); // op, wait + + // Switch and load the reply message + Client().SwitchCurrentEntryL(reply); + Client().LoadMessageL(); + + // Check the reply message... + const CSmsHeader& replyHeader = Client().SmsHeader(); + + // 1. Email fields... + const CSmsEmailFields& fields = replyHeader.EmailFields(); + iSmsTest(fields.Addresses().MdcaCount() == 1); + iSmsTest(fields.Addresses().MdcaPoint(0).Compare(aAddress) == 0); + iSmsTest(fields.Subject().Compare(aSubject) == 0); + + // 2. PID... + CSmsSettings* smsset = CSmsSettings::NewL(); + CleanupStack::PushL(smsset); + replyHeader.GetSmsSettingsL(*smsset); + iSmsTest(smsset->MessageConversion()==ESmsConvMail); + CleanupStack::PopAndDestroy(smsset); + + // 3. Email <-> SMS gateway (i.e. the recipient) + const CArrayPtrFlat& rcpts = replyHeader.Recipients(); + iSmsTest(rcpts.Count() == 1); + const CSmsNumber& rcpt = *rcpts.At(0); + iSmsTest(rcpt.Address().Compare(KScriptItemRecipientsDef) == 0); + + // 4. Description - should be the same as the subject. + TMsvEntry replyEntry = Client().Entry().Entry(); + TInt maxDesLength = Client().ServiceSettings().DescriptionLength(); + iSmsTest(replyEntry.iDescription.Compare(fields.Subject().Left(maxDesLength)) == 0); + + // 5. Details - should be the same as the address. + iSmsTest(replyEntry.iDetails.Compare(fields.Addresses().MdcaPoint(0).Left(KSmsDetailsLength)) == 0); + } + +void CSmcmTest::TestReplyEmailL() + { + iSmsTest.Test().Next(_L("CSmsClientMtm Reply (Email SMS")); + + _LIT(KTestEmailAddress1, "user@domain1.domain2"); + _LIT(KTestEmailSubject1, "Re: a subject"); + _LIT(KTestEmailMessage1, "user@domain1.domain2##a subject#some body text"); + DoTestReplyEmailL(KTestEmailMessage1, KTestEmailAddress1, KTestEmailSubject1); + + _LIT(KTestEmailAddress2, "user@domain1.domain2"); + _LIT(KTestEmailSubject2, ""); + _LIT(KTestEmailMessage2, "user@domain1.domain2 some body text"); + DoTestReplyEmailL(KTestEmailMessage2, KTestEmailAddress2, KTestEmailSubject2); + } + +TBool CSmcmTest::TestForwardBodyL(const CRichText& aBody, const TDesC& aExpected) const + { + HBufC* body = HBufC::NewLC(aBody.DocumentLength()); + TPtr bodyPtr(body->Des()); + + aBody.Extract(bodyPtr); + + const TBool check = (*body == aExpected); + + CleanupStack::PopAndDestroy(body); + + return check; + } + +TBool CSmcmTest::TestForwardEntry(const TMsvEntry& aOriginalEntry, const TMsvEntry& aForwardEntry) const + { + TBool ret = (aOriginalEntry.SendingState() == aForwardEntry.SendingState()); + ret = ret && (aOriginalEntry.iBioType == aForwardEntry.iBioType); + ret = ret && (aOriginalEntry.iDescription == aForwardEntry.iDescription); + return ret; + } + +HBufC* CSmcmTest::CreateRandomLC(TInt aLen) const + { + HBufC* originalMsg = HBufC::NewLC(aLen); + TPtr originalPtr(originalMsg->Des()); + originalPtr.SetLength(aLen); + TUint16* ptr = &originalPtr[0]; + while (aLen--) + { + *ptr++ = TUint16(Math::Random() % (128 - 65) + 65); + } + + return originalMsg; + } + +void CSmcmTest::TestForwardL(const TMsvEntry& aEntry, TInt aBodyLength) + { + //Create new message + _LIT(KTestForwardAddress, "+445554444333"); + _LIT(KTestForwardName, "RonaldMcDonald"); + + TTime now; + now.HomeTime(); + TMsvEntry originalEntry(aEntry); + + //Set the body + HBufC* originalBody = CreateRandomLC(aBodyLength); + iSmsTest.iRichText->Reset(); + iSmsTest.iRichText->InsertL(0, *originalBody); + + CSmsHeader* originalHeader = CSmsHeader::NewL(CSmsMessage::NewL(iSmsTest.FileSession(), CSmsPDU::ESmsDeliver, CSmsEditorBuffer::NewL(*iSmsTest.iRichText))); + CleanupStack::PushL(originalHeader); + + // Add formatting and picture + CEmsFormatIE* object = CEmsFormatIE::NewL(); + CleanupStack::PushL(object); + object->SetStartPosition(0); + object->SetFormatLength(5); + object->SetBold(ETrue); + originalHeader->Message().AddEMSInformationElementL(*object); + CleanupStack::PopAndDestroy(object); + + CEmsPictureIE* pic = EmsTestUtils::CreatePictureL(0); + CleanupStack::PushL(pic); + pic->SetStartPosition(0); + originalHeader->Message().AddEMSInformationElementL(*pic); + CleanupStack::PopAndDestroy(pic); + + //Add a recipient + CSmsNumber* originalNumber = CSmsNumber::NewL(); + CleanupStack::PushL(originalNumber); + originalNumber->SetAddressL(KTestForwardAddress); + originalNumber->SetNameL(KTestForwardName); + originalHeader->Recipients().AppendL(originalNumber); + CleanupStack::Pop(originalNumber); + + //Create the new message + iSmsTest.CreateMessageL(KMsvGlobalOutBoxIndexEntryId, originalEntry, *originalHeader, *iSmsTest.iRichText, now); + Session().CleanupEntryPushL(originalEntry.Id()); + + MsvEntry().SetEntryL(originalEntry.Id()); + originalEntry = MsvEntry().Entry(); + // Need to secure the memory for the iDescription since the entry will change later on + HBufC* descBuf= originalEntry.iDescription.AllocLC(); + originalEntry.iDescription.Set(descBuf->Ptr(), descBuf->Length()); + + //Switch current entry and set the message body + Client().SwitchCurrentEntryL(originalEntry.Id()); + Client().LoadMessageL(); + + //Check body + iSmsTest(TestForwardBodyL(Client().Body(), *originalBody)); + //Forward the message + TMsvPartList part=0; + CMsvOperationWait* wait = CMsvOperationWait::NewLC(); + wait->Start(); + + CMsvOperation* op = Client().ForwardL(KMsvDraftEntryId, part, wait->iStatus); + CleanupStack::PushL(op); + + CActiveScheduler::Start(); + + iSmsTest(wait->iStatus.Int() == KErrNone); + + //Get the new message ID + TPckgBuf pkg; + pkg.Copy(op->ProgressL()); + const TMsvId progress = pkg(); + + CleanupStack::PopAndDestroy(op); + CleanupStack::PopAndDestroy(wait); + + op = NULL; + + Session().CleanupEntryPushL(progress); + + Client().SwitchCurrentEntryL(progress); + Client().LoadMessageL(); + + //Check the new message body + iSmsTest(TestForwardBodyL(Client().Body(), *originalBody)); + + //Check the entry + iSmsTest(TestForwardEntry(originalEntry, Client().Entry().Entry())); + + // let's check to see if the inbox message and the forward are the same + // (this call will compare ems objects as well + if (!iSmsTest.AreMessagesSameTextL(originalEntry.Id(), progress, ETrue)) + { + iSmsTest.Printf(_L("EMS objects do not compare!!\n")); + } + else + { + iSmsTest.Printf(_L("EMS objects compare OK.\n")); + } + + CleanupStack::PopAndDestroy(); //message + CleanupStack::PopAndDestroy(descBuf); + CleanupStack::PopAndDestroy(); //message + CleanupStack::PopAndDestroy(originalHeader); + CleanupStack::PopAndDestroy(originalBody); + } + +void CSmcmTest::TestForwardL() + { + iSmsTest.Test().Next(_L("CSmsClientMtm Forward")); + + TInt len=3000; + while (len > 0) + { + TMsvEntry entry = TMsvEntry(); + entry.iBioType = Math().Random(); + iSmsTest.Printf(_L("TestForward Len %d BioType %d\n"), len, entry.iBioType); + TestForwardL(entry, len); + len -= 25; + } + } + +void CSmcmTest::DoTestForwardEmailL(const TDesC& aEmailMessageData, const TDesC& aSubject, const TDesC& aBody) + { + // Create an email message and then a forward message to it. + TMsvId id = CreateEmailSmsMessageL(aEmailMessageData); + iSmsTest.SetEntryL(id); + Client().SwitchCurrentEntryL(id); + Client().LoadMessageL(); + + TMsvPartList part=0; + CMsvOperationWait* wait = CMsvOperationWait::NewLC(); + CMsvOperation* op=Client().ForwardL(KMsvDraftEntryId, part, wait->iStatus); + CleanupStack::PushL(op); + wait->Start(); + CActiveScheduler::Start(); + + TPckgBuf pkg; + pkg.Copy(op->ProgressL()); + TMsvId forward = pkg(); + + CleanupStack::PopAndDestroy(2, wait); // op, wait + + // Switch and load the forward message + Client().SwitchCurrentEntryL(forward); + Client().LoadMessageL(); + + // Check the forward message... + const CSmsHeader& forwardHeader = Client().SmsHeader(); + + // 1. Email fields...(address should be empty) + const CSmsEmailFields& fields = forwardHeader.EmailFields(); + iSmsTest(!fields.HasAddress()); + iSmsTest(fields.Addresses().MdcaCount()==0); + iSmsTest(fields.Subject().Compare(aSubject) == 0); + + // 2. PID... + CSmsSettings* smsset = CSmsSettings::NewL(); + CleanupStack::PushL(smsset); + forwardHeader.GetSmsSettingsL(*smsset); + iSmsTest(smsset->MessageConversion()==ESmsConvMail); + CleanupStack::PopAndDestroy(smsset); + + // 3. Email <-> SMS gateway (ie the recipient) + const CArrayPtrFlat& rcpts = forwardHeader.Recipients(); + iSmsTest(rcpts.Count() == 1); + const CSmsNumber& rcpt = *rcpts.At(0); + iSmsTest(rcpt.Address().Compare(KScriptItemRecipientsDef) == 0); + + // 4. Description - should be the same as the subject or body text. + TMsvEntry forwardEntry = Client().Entry().Entry(); + TInt maxDesLength = Client().ServiceSettings().DescriptionLength(); + if( fields.Subject().Length() ) + { + // Description should be same as subject. + iSmsTest(forwardEntry.iDescription.Compare(fields.Subject().Left(maxDesLength)) == 0); + } + else + { + // Description should be the same as the body text. + HBufC* body = HBufC::NewLC(Client().Body().DocumentLength()); + TPtr bodyPtr(body->Des()); + Client().Body().Extract(bodyPtr); + + iSmsTest(forwardEntry.iDescription.Compare(bodyPtr.Left(maxDesLength)) == 0); + CleanupStack::PopAndDestroy(body); + } + + // 5. Details - should be the same as the address (ie empty). + iSmsTest(forwardEntry.iDetails.Compare(KNullDesC())==0); + + // 6. Body data. + iSmsTest(TestForwardBodyL(Client().Body(), aBody)); + } + +void CSmcmTest::TestForwardEmailL() + { + iSmsTest.Test().Next(_L("CSmsClientMtm Forward (Email SMS)")); + + _LIT(KTestEmailSubject1, "Fw: a subject"); + _LIT(KTestEmailBody1, "some body text"); + _LIT(KTestEmailMessage1, "user@domain1.domain2##a subject#some body text"); + DoTestForwardEmailL(KTestEmailMessage1, KTestEmailSubject1, KTestEmailBody1); + + _LIT(KTestEmailSubject2, ""); + _LIT(KTestEmailBody2, "some body text"); + _LIT(KTestEmailMessage2, "user@domain1.domain2 some body text"); + DoTestForwardEmailL(KTestEmailMessage2, KTestEmailSubject2, KTestEmailBody2); + } + +void CSmcmTest::TestSyncFunctionsL() + { + iSmsTest.Test().Next(_L("Test CSmsClientMtm Sync Functions")); + iSmsTest.Printf(_L("This test is INCOMPLETE\n")); + }