--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smsmtm/test/src/t_smsdeliver.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,2380 @@
+// Copyright (c) 2003-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_smsdeliver.h"
+
+#include <e32test.h>
+#include <smutset.h>
+#include <smuthdr.h>
+#include <txtrich.h>
+#include "smstestutils.h"
+#include <msvuids.h>
+#include <smsuaddr.h>
+#include <csmsaccount.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <tmsvsmsentry.h>
+#endif
+
+_LIT(KFailed,"Failed to complete tests.");
+_LIT(KRecipientOk, "+447747065438"); // has to be valid number and switched on
+_LIT(KRecipientBad, "+442071541467");
+_LIT(KRecipientFail, "+34933753717");
+_LIT(KMessageData, "This is a simple text message");
+_LIT(KTestDeliverOneRecipientOk, "Single recipient, deliver ok");
+_LIT(KTestDeliverOneRecipientFail, "Single recipient, deliver fail");
+_LIT(KTestDeliverMultiRecipientsOk_1, "Multi (2) recipients, deliver ok");
+_LIT(KTestDeliverMultiRecipientsOk_2, "Multi (2) recipients, deliver ok, but 1 fails to send");
+_LIT(KTestDeliverMultiRecipientsOk_3, "Multi (3) recipients, deliver ok, but 1 fails to send");
+_LIT(KTestDeliverNoMatching, "Single recipient, no matching");
+_LIT(KTestDeliverNoStatusReports, "Single recipient, no status reports");
+_LIT(KTestDeliverNotSent, "Single recipient, not sent");
+_LIT(KTestDeliverMultiRecipientsFail_1, "Multi (2) recipients, deliver failure");
+_LIT(KTestDeliverMultiRecipientsMixed_1,"Multi (2) recipients, 1 deliver ok, 1 deliver failure");
+_LIT(KTestDeliverMultiRecipientsMixed_2,"Multi (2) recipients, 2 deliver failures");
+
+#if defined (__WINS__)
+_LIT(KPddName,"ECDRV");
+_LIT(KLddName,"ECOMM");
+#else //__WINS__
+_LIT(KPddSirName,"ESIR");
+_LIT(KPddUartName,"ECUART4");
+_LIT(KLddName,"ECOMM");
+#endif //__WINS__
+
+RTest test(_L("T_SmsDeliver Test Harness"));
+
+const TTimeIntervalMicroSeconds32 KWaitForWatchersToStart = 20000000;
+const TTimeIntervalMicroSeconds32 KWaitForWatchersToStartDisplayInterval = 5000000;
+
+LOCAL_C void DoTestsL()
+ {
+#if defined (__WINS__)
+ User::LoadPhysicalDevice(KPddName);
+ User::LoadLogicalDevice(KLddName);
+#else //__WINS__
+ User::LoadPhysicalDevice(KPddSirName);
+ User::LoadPhysicalDevice(KPddUartName);
+ User::LoadLogicalDevice(KLddName);
+#endif //__WINS__
+
+ TInt r = StartC32();
+ if( (r != KErrNone) && (r != KErrAlreadyExists) )
+ test.Printf(_L("Failed to start C32 %d\n"), r);
+
+ // Create and install the active scheduler
+ CActiveScheduler* scheduler= new (ELeave) CActiveScheduler();
+ CleanupStack::PushL(scheduler);
+ CActiveScheduler::Install(scheduler);
+
+ // Create the test engine
+ CTestEngine* testEngine = CTestEngine::NewL();
+ CleanupStack::PushL(testEngine);
+
+ // Do tests...
+ testEngine->DoTestsL();
+
+ CleanupStack::PopAndDestroy(2, scheduler);
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ __UHEAP_MARK;
+ CTrapCleanup* tc=CTrapCleanup::New();
+ TRAPD(err,DoTestsL());
+ if (err!=KErrNone)
+ User::Panic(KFailed, err);
+ delete tc;
+ test.Close();
+ __UHEAP_MARKEND;
+ return KErrNone;
+ }
+
+/*
+ * CTestEngine
+ */
+
+CTestEngine* CTestEngine::NewL()
+ {
+ CTestEngine* self = new (ELeave) CTestEngine();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestEngine::~CTestEngine()
+ {
+ delete iTestUtils;
+ delete iWatchers;
+
+ iSocket.Close();
+ iSocketServ.Close();
+ }
+
+CTestEngine::CTestEngine()
+: CBase()
+ {
+ }
+
+void CTestEngine::DoTestsL()
+ {
+
+ CTestDeliverBase* testCase = NULL;
+
+ testCase = CTestDeliverOneRecipientOk::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverMultiRecipientsOk_1::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverMultiRecipientsOk_2::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverMultiRecipientsOk_3::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverNoMatching::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverNoStatusReports::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverNotSent::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverOneRecipientFail::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverMultiRecipientsFail_1::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverMultiRecipientsMixed_1::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+
+ testCase = CTestDeliverMultiRecipientsMixed_2::NewL(*iTestUtils);
+ RunTestCaseL(*testCase);
+ }
+
+void CTestEngine::RunTestCaseL(CTestDeliverBase& aTestCase)
+ {
+ CleanupStack::PushL(&aTestCase);
+ aTestCase.Start();
+ CActiveScheduler::Start();
+ CleanupStack::PopAndDestroy(&aTestCase);
+ }
+
+void CTestEngine::ConstructL()
+ {
+ // This should create the SMS service, including the service settings.
+ iTestUtils = CSmsTestUtils::NewL(test);
+
+ // Notify the system agent that the phone is on.
+ iTestUtils->NotifySaPhoneOnL();
+
+ // Tell the tests utils to log to file
+ iTestUtils->SetLogToFile();
+
+ // Restore the service settings.
+ iTestUtils->SetEntryL(iTestUtils->iSmsServiceId);
+ CSmsAccount* account = CSmsAccount::NewLC();
+ account->LoadSettingsL(*iTestUtils->iServiceSettings);
+
+ // Remove the default service centres from the service settings
+ TInt count = iTestUtils->iServiceSettings->ServiceCenterCount();
+ while( count-- )
+ {
+ iTestUtils->iServiceSettings->RemoveServiceCenter(count);
+ }
+
+ // Add the Vodafone service centre - store the settings.
+ iTestUtils->iServiceSettings->AddServiceCenterL(_L("Vodafone"), _L("+447785016005"));
+
+ // Set delivery options - do matching and make reports visible.
+ iTestUtils->iServiceSettings->SetDeliveryReport(ETrue);
+ iTestUtils->iServiceSettings->SetStatusReportHandling(CSmsSettings::EMoveReportToInboxVisibleAndMatch);
+
+ account->SaveSettingsL(*iTestUtils->iServiceSettings);
+ CleanupStack::PopAndDestroy(account);
+
+ // Create a session with the SMS stack - note order of the next few things
+ // is important.
+ User::LeaveIfError(iSocketServ.Connect());
+ TProtocolDesc protoinfo;
+ TProtocolName protocolname(KSmsDatagram);
+ User::LeaveIfError(iSocketServ.FindProtocol(protocolname,protoinfo));
+ User::LeaveIfError(iSocket.Open(iSocketServ,protoinfo.iAddrFamily,protoinfo.iSockType,protoinfo.iProtocol));
+
+ TSmsAddr smsaddr;
+ smsaddr.SetSmsAddrFamily(ESmsAddrSendOnly);
+ User::LeaveIfError(iSocket.Bind(smsaddr));
+
+ // Initialise phone...
+ iTestUtils->WaitForInitializeL();
+
+ // Start watchers...
+ StartWatcherL();
+ }
+
+TBool CTestEngine::WatchersAlreadyRunningL()
+ {
+ RSocketServ server;
+ RSocket socket;
+
+ User::LeaveIfError(server.Connect());
+ CleanupClosePushL(server);
+
+ // test if it's there...
+ TProtocolDesc protoInfo;
+ TProtocolName protocolname;
+ protocolname.Copy(KSmsDatagram);
+ User::LeaveIfError(server.FindProtocol(protocolname,protoInfo));
+
+ User::LeaveIfError(socket.Open(server,
+ protoInfo.iAddrFamily,
+ protoInfo.iSockType,
+ protoInfo.iProtocol));
+ CleanupClosePushL(socket);
+
+ TSmsAddr addr;
+ addr.SetSmsAddrFamily(ESmsAddrRecvAny);
+ TInt err = socket.Bind(addr);
+
+ CleanupStack::Pop(2, &server);
+ socket.CancelAll();
+ socket.Close();
+ server.Close();
+ return (err == KErrAlreadyExists);
+ }
+
+void CTestEngine::StartWatcherL()
+ {
+ iTestUtils->Printf(_L("Start the Watcher"));
+
+ if( WatchersAlreadyRunningL() )
+ {
+ iTestUtils->Printf(_L("Watchers are already running\n"));
+ return;
+ }
+
+ iWatchers = CTestUtilsWatcherStarter::NewL();
+
+ TTimeIntervalMicroSeconds32 wait = KWaitForWatchersToStart;
+ TBool started = EFalse;
+ while( !started && wait.Int() > 0 )
+ {
+ iTestUtils->Printf(_L("Waiting %d secs for watchers to start...\n"), wait.Int() / 1000000);
+ wait = wait.Int() - KWaitForWatchersToStartDisplayInterval.Int();
+ User::After(KWaitForWatchersToStartDisplayInterval);
+ started = WatchersAlreadyRunningL();
+ }
+
+ if( !WatchersAlreadyRunningL() )
+ {
+ iTestUtils->Printf(_L("WARNING: NBS Watcher has not started yet\n"));
+ }
+ }
+
+/*
+ * CTestDeliverBase
+ */
+
+CTestDeliverBase::~CTestDeliverBase()
+ {
+ delete iEntryForObserver;
+ delete iOperation;
+ }
+
+void CTestDeliverBase::Start()
+ {
+ iTestUtils.Printf(_L("Starting %S\n"), &TestName());
+ iState = EClearFolders;
+ CompleteSelf();
+ }
+
+CTestDeliverBase::CTestDeliverBase(CSmsTestUtils& aTestUtils)
+: CActive(CActive::EPriorityStandard), iTestUtils(aTestUtils)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CTestDeliverBase::ConstructL()
+ {
+ iEntryForObserver = Session().GetEntryL(KMsvGlobalInBoxIndexEntryId);
+ }
+
+void CTestDeliverBase::CompleteSelf()
+ {
+ TRequestStatus* pStat = &iStatus;
+ User::RequestComplete(pStat, KErrNone);
+ SetActive();
+ }
+
+CMsvSession& CTestDeliverBase::Session()
+ {
+ return *iTestUtils.iMsvSession;
+ }
+
+CMsvEntry& CTestDeliverBase::MsvEntry()
+ {
+ return *iTestUtils.iMsvEntry;
+ }
+
+CSmsClientMtm& CTestDeliverBase::Client()
+ {
+ return *iTestUtils.iSmsClientMtm;
+ }
+
+CSmsSettings& CTestDeliverBase::ServiceSettings()
+ {
+ return *iTestUtils.iServiceSettings;
+ }
+
+void CTestDeliverBase::ClearFoldersL()
+ {
+ iTestUtils.DeleteSmsMessagesL(KMsvGlobalOutBoxIndexEntryId);
+ iTestUtils.DeleteSmsMessagesL(KMsvGlobalInBoxIndexEntryId);
+ iTestUtils.DeleteSmsMessagesL(KMsvSentEntryId);
+ }
+
+void CTestDeliverBase::TestComplete()
+ {
+ iTestUtils.Printf(_L("Test Complete\n"));
+ CActiveScheduler::Stop();
+ }
+
+void CTestDeliverBase::CreateMessageL()
+ {
+ iTestUtils.Printf(_L("Creating message...\n"));
+
+ TMsvEntry entry;
+ entry.SetVisible(ETrue);
+ entry.SetInPreparation(ETrue);
+ entry.iServiceId = iTestUtils.iSmsServiceId;
+ entry.iType = KUidMsvMessageEntry;
+ entry.iMtm = KUidMsgTypeSMS;
+ entry.iDate.HomeTime();
+ entry.iSize = 0;
+ entry.iDescription.Set(KNullDesC);
+ entry.iDetails.Set(KNullDesC);
+
+ // Check send options...
+ TUint sendState = KMsvSendStateWaiting;
+ switch( ServiceSettings().Delivery() )
+ {
+ case ESmsDeliveryScheduled:
+ sendState = KMsvSendStateScheduled;
+ break;
+ case ESmsDeliveryUponRequest:
+ sendState = KMsvSendStateUponRequest;
+ break;
+ default:
+ sendState = KMsvSendStateWaiting;
+ break;
+ }
+ entry.SetSendingState(sendState);
+
+ // Create the SMS header object...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ // Set the body text...
+ iTestUtils.iRichText->Reset();
+ iTestUtils.iRichText->InsertL(0, KMessageData);
+
+ // Copy the message settings...
+ header->SetSmsSettingsL(ServiceSettings());
+
+ // Set the service centre
+ TInt defaultIndex = ServiceSettings().DefaultServiceCenter();
+ header->SetServiceCenterAddressL(ServiceSettings().GetServiceCenter(defaultIndex).Address());
+
+ // Set recipient - ask derived class
+ SetRecipientsL(*header);
+
+ // Update entry description and details...
+ CArrayPtrFlat<CSmsNumber>& recipient = header->Recipients();
+ entry.iDetails.Set(recipient[0]->Address());
+ entry.iDescription.Set(iTestUtils.iRichText->Read(0, ServiceSettings().DescriptionLength()));
+ entry.SetInPreparation(EFalse);
+
+ // Create the entry - set context to the global outbox.
+ MsvEntry().SetEntryL(KMsvGlobalOutBoxIndexEntryId);
+ MsvEntry().CreateL(entry);
+
+ // Create new store and save header information
+ MsvEntry().SetEntryL(entry.Id());
+ CMsvStore* store = MsvEntry().EditStoreL();
+ CleanupStack::PushL(store);
+ header->StoreL(*store);
+ store->StoreBodyTextL(*iTestUtils.iRichText);
+ store->CommitL();
+ CleanupStack::PopAndDestroy(2, header);
+
+ iMessageId = entry.Id();
+ }
+
+void CTestDeliverBase::SendMessageL()
+ {
+ iTestUtils.Printf(_L("Sending message %d\n"), iMessageId);
+
+ delete iOperation;
+ iOperation = NULL;
+
+ CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection();
+ CleanupStack::PushL(sel);
+ sel->AppendL(iMessageId);
+
+ iTestUtils.DisplayMessageL(iMessageId);
+
+ MsvEntry().SetEntryL(KMsvGlobalOutBoxIndexEntryId);
+ iOperation = MsvEntry().CopyL(*sel, iTestUtils.iSmsServiceId, iStatus);
+ CleanupStack::PopAndDestroy(sel);
+
+ SetActive();
+ }
+
+void CTestDeliverBase::ChangeServiceSettingsL()
+ {
+ // Restore the service settings.
+ iTestUtils.SetEntryL(iTestUtils.iSmsServiceId);
+ CSmsAccount* account = CSmsAccount::NewLC();
+ account->LoadSettingsL(*iTestUtils.iServiceSettings);
+
+ // Set the service settings
+ iTestUtils.iServiceSettings->SetValidityPeriod(TTimeIntervalMinutes(5));
+ iTestUtils.iServiceSettings->SetDeliveryReport(ETrue);
+ iTestUtils.iServiceSettings->SetStatusReportHandling(CSmsSettings::EMoveReportToInboxVisibleAndMatch);
+
+ // Store the new service settings
+ account->SaveSettingsL(*iTestUtils.iServiceSettings);
+ CleanupStack::PopAndDestroy(account);
+ }
+
+void CTestDeliverBase::CheckCreatedMessageL()
+ {
+ // Need to check the following -
+ // 1. All recipients have correct delivery status - ENoAckRequested.
+ // 2. The index summary is correct - ENoAckSummary
+ // 3. The index message IS is invalid.
+
+ iTestUtils.Printf(_L("Checking created message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ TInt rcptCount = header->Recipients().Count();
+ for( TInt ii = 0; ii < rcptCount; ++ii )
+ {
+ CSmsNumber* rcpt = header->Recipients()[ii];
+ iTestUtils.Printf(_L("--Recipient %d - Delivery status -> %d - should be %d (ENoAckRequested)\n"), ii, rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+ }
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (ENoAckSummary)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::ENoAckSummary);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::ENoAckSummary);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId == EFalse);
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+TMsvId CTestDeliverBase::GetObserverEntry()
+ {
+ return iMessageId;
+ }
+
+// methods from CActive
+
+void CTestDeliverBase::RunL()
+ {
+ User::LeaveIfError(iStatus.Int());
+
+ switch( iState )
+ {
+ case EClearFolders:
+ {
+ ClearFoldersL();
+ iState = EChangeServiceSettings;
+ CompleteSelf();
+ } break;
+ case EChangeServiceSettings:
+ {
+ ChangeServiceSettingsL();
+ iState = ECreateMessage;
+ CompleteSelf();
+ } break;
+ case ECreateMessage:
+ {
+ CreateMessageL();
+ iState = ECheckCreatedMessage;
+ CompleteSelf();
+ } break;
+ case ECheckCreatedMessage:
+ {
+ CheckCreatedMessageL();
+ iState = ESendMessage;
+ CompleteSelf();
+ } break;
+ case ESendMessage:
+ {
+ SendMessageL();
+ iState = ECheckSentMessage;
+ } break;
+ case ECheckSentMessage:
+ {
+ CheckSentMessageL();
+
+ TMsvId entryId = GetObserverEntry();
+
+ if( entryId != KMsvNullIndexEntryId )
+ {
+ // Need to observe something - move observer entry to specified entry
+ // and wait for it to be updated
+ iEntryForObserver->SetEntryL(entryId);
+ iEntryForObserver->AddObserverL(*this);
+
+ iState = EPendingDeliveryReport;
+ }
+ else
+ {
+ // Not observing anything - end of test.
+ TestComplete();
+ }
+ } break;
+ case EPendingDeliveryReport:
+ {
+ // End the test...
+ TestComplete();
+ } break;
+ default:
+ User::Invariant();
+ break;
+ }
+ }
+
+void CTestDeliverBase::DoCancel()
+ {
+ }
+
+TInt CTestDeliverBase::RunError(TInt /*aError*/)
+ {
+ return KErrNone;
+ }
+
+// methods from MMsvEntryObserver
+
+void CTestDeliverBase::HandleEntryEventL(TMsvEntryEvent aEvent, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
+ {
+ __ASSERT_DEBUG( iState == EPendingDeliveryReport, User::Invariant() );
+
+ if( aEvent == EMsvEntryChanged )
+ {
+ iTestUtils.Printf(_L("Message entry has been updated\n"));
+
+ // Check that the sent message has been updated.
+ CheckDeliveredMessageL();
+ }
+ }
+
+/*
+ * CTestDeliverOneRecipientOk
+ */
+
+ CTestDeliverOneRecipientOk* CTestDeliverOneRecipientOk::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverOneRecipientOk* self = new (ELeave) CTestDeliverOneRecipientOk(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverOneRecipientOk::~CTestDeliverOneRecipientOk()
+ {
+ }
+
+CTestDeliverOneRecipientOk::CTestDeliverOneRecipientOk(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverOneRecipientOk::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting single recipient\n"));
+
+ CSmsNumber* rcpt = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt);
+ rcpt->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt);
+ CleanupStack::Pop(rcpt);
+ }
+
+void CTestDeliverOneRecipientOk::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 1);
+ iTestUtils.Test()(header->Recipients().Count() == 1);
+
+ CSmsNumber* rcpt = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, rcpt->LogId());
+ iTestUtils.Test()(logId == rcpt->LogId());
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverOneRecipientOk::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 1);
+ iTestUtils.Test()(header->Recipients().Count() == 1);
+
+ CSmsNumber* rcpt = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EAllSuccessful)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EAllSuccessful);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EAllSuccessful);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverOneRecipientOk::TestName()
+ {
+ return KTestDeliverOneRecipientOk();
+ }
+
+/*
+ * CTestDeliverOneRecipientFail
+ */
+
+ CTestDeliverOneRecipientFail* CTestDeliverOneRecipientFail::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverOneRecipientFail* self = new (ELeave) CTestDeliverOneRecipientFail(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverOneRecipientFail::~CTestDeliverOneRecipientFail()
+ {
+ }
+
+CTestDeliverOneRecipientFail::CTestDeliverOneRecipientFail(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverOneRecipientFail::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting single recipient\n"));
+
+ CSmsNumber* rcpt = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt);
+ rcpt->SetAddressL(KRecipientFail);
+ aHeader.Recipients().AppendL(rcpt);
+ CleanupStack::Pop(rcpt);
+ }
+
+void CTestDeliverOneRecipientFail::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 1);
+ iTestUtils.Test()(header->Recipients().Count() == 1);
+
+ CSmsNumber* rcpt = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, rcpt->LogId());
+ iTestUtils.Test()(logId == rcpt->LogId());
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverOneRecipientFail::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 1);
+ iTestUtils.Test()(header->Recipients().Count() == 1);
+
+ CSmsNumber* rcpt = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Delivery status -> %d - should be %d (EAckError)\n"), rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("- Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("- Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EAllFailed)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EAllFailed);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EAllFailed);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverOneRecipientFail::TestName()
+ {
+ return KTestDeliverOneRecipientFail();
+ }
+
+/*
+ * CTestDeliverMultiRecipientsOk_1
+ */
+
+CTestDeliverMultiRecipientsOk_1* CTestDeliverMultiRecipientsOk_1::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverMultiRecipientsOk_1* self = new (ELeave) CTestDeliverMultiRecipientsOk_1(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverMultiRecipientsOk_1::~CTestDeliverMultiRecipientsOk_1()
+ {
+ }
+
+CTestDeliverMultiRecipientsOk_1::CTestDeliverMultiRecipientsOk_1(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverMultiRecipientsOk_1::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting multiple (2) recipients\n"));
+
+ CSmsNumber* rcpt0 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt0);
+ rcpt0->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt0);
+ CleanupStack::Pop(rcpt0);
+
+ CSmsNumber* rcpt1 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt1);
+ rcpt1->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt1);
+ CleanupStack::Pop(rcpt1);
+ }
+
+void CTestDeliverMultiRecipientsOk_1::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipients have delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId == EFalse);
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverMultiRecipientsOk_1::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status is correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set - round %d...\n"), iMessageId, ++iCheckCount);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ if( iCheckCount == 1 )
+ {
+ // At least one of the recipients has been delivered to ok - check the
+ // status of recipient 0 and make decisions based on that.
+ CSmsNumber* pendingRcpt = NULL;
+
+ if( rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck )
+ {
+ // Recipient 1 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ pendingRcpt = rcpt0;
+ }
+ else
+ {
+ // Recipient 0 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ pendingRcpt = rcpt1;
+ }
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, pendingRcpt->LogId());
+ iTestUtils.Test()(logId == pendingRcpt->LogId());
+ }
+ else
+ {
+ // Both recipients has been delivered to ok - check the status of both
+ // recipients
+ iTestUtils.Printf(_L("--Second check of flags -> both recipients have been delivered to\n"));
+
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EAllSuccessful)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EAllSuccessful);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EAllSuccessful);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+ }
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverMultiRecipientsOk_1::TestName()
+ {
+ return KTestDeliverMultiRecipientsOk_1();
+ }
+
+/*
+ * CTestDeliverMultiRecipientsOk_2
+ */
+
+CTestDeliverMultiRecipientsOk_2* CTestDeliverMultiRecipientsOk_2::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverMultiRecipientsOk_2* self = new (ELeave) CTestDeliverMultiRecipientsOk_2(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverMultiRecipientsOk_2::~CTestDeliverMultiRecipientsOk_2()
+ {
+ }
+
+CTestDeliverMultiRecipientsOk_2::CTestDeliverMultiRecipientsOk_2(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverMultiRecipientsOk_2::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting multiple (2) recipients\n"));
+
+ CSmsNumber* rcpt0 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt0);
+ rcpt0->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt0);
+ CleanupStack::Pop(rcpt0);
+
+ CSmsNumber* rcpt1 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt1);
+ rcpt1->SetAddressL(KRecipientBad);
+ aHeader.Recipients().AppendL(rcpt1);
+ CleanupStack::Pop(rcpt1);
+ }
+
+void CTestDeliverMultiRecipientsOk_2::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipients have delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (ENoAckRequested)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, rcpt0->LogId());
+ iTestUtils.Test()(logId == rcpt0->LogId());
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverMultiRecipientsOk_2::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status is correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (ENoAckRequested)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EAllSuccessful)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EAllSuccessful);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EAllSuccessful);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverMultiRecipientsOk_2::TestName()
+ {
+ return KTestDeliverMultiRecipientsOk_2();
+ }
+
+/*
+ * CTestDeliverMultiRecipientsOk_3
+ */
+
+CTestDeliverMultiRecipientsOk_3* CTestDeliverMultiRecipientsOk_3::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverMultiRecipientsOk_3* self = new (ELeave) CTestDeliverMultiRecipientsOk_3(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverMultiRecipientsOk_3::~CTestDeliverMultiRecipientsOk_3()
+ {
+ }
+
+CTestDeliverMultiRecipientsOk_3::CTestDeliverMultiRecipientsOk_3(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverMultiRecipientsOk_3::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting multiple (3) recipients\n"));
+
+ CSmsNumber* rcpt0 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt0);
+ rcpt0->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt0);
+ CleanupStack::Pop(rcpt0);
+
+ CSmsNumber* rcpt1 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt1);
+ rcpt1->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt1);
+ CleanupStack::Pop(rcpt1);
+
+ CSmsNumber* rcpt2 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt2);
+ rcpt2->SetAddressL(KRecipientBad);
+ aHeader.Recipients().AppendL(rcpt2);
+ CleanupStack::Pop(rcpt2);
+ }
+
+void CTestDeliverMultiRecipientsOk_3::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipients have delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 3);
+ iTestUtils.Test()(header->Recipients().Count() == 3);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ CSmsNumber* rcpt2 = header->Recipients()[2];
+
+ iTestUtils.Printf(_L("--Recipient 2 - Delivery status -> %d - should be %d (ENoAckRequested)\n"), rcpt2->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt2->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId == EFalse);
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverMultiRecipientsOk_3::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status is correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set - round %d...\n"), iMessageId, ++iCheckCount);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 3);
+ iTestUtils.Test()(header->Recipients().Count() == 3);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+ CSmsNumber* rcpt2 = header->Recipients()[2];
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ if( iCheckCount == 1 )
+ {
+ // At least one of the recipients has been delivered to ok - check the
+ // status of recipient 0 and make decisions based on that.
+ CSmsNumber* pendingRcpt = NULL;
+
+ if( rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck )
+ {
+ // Recipient 2 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Recipient 2 - Delivery status -> %d - should be %d (ENoAckRequested)\n"), rcpt2->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt2->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+
+ pendingRcpt = rcpt0;
+ }
+ else
+ {
+ // Recipient 0 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ iTestUtils.Printf(_L("--Recipient 2 - Delivery status -> %d - should be %d (ENoAckRequested)\n"), rcpt2->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt2->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+
+ pendingRcpt = rcpt1;
+ }
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, pendingRcpt->LogId());
+ iTestUtils.Test()(logId == pendingRcpt->LogId());
+ }
+ else
+ {
+ // Both recipients has been delivered to ok - check the status of both
+ // recipients
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Recipient 2 - Delivery status -> %d - should be %d (ENoAckRequested)\n"), rcpt2->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt2->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EAllSuccessful)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EAllSuccessful);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EAllSuccessful);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+ }
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverMultiRecipientsOk_3::TestName()
+ {
+ return KTestDeliverMultiRecipientsOk_3();
+ }
+
+/*
+ * CTestDeliverNoMatching
+ */
+
+ CTestDeliverNoMatching* CTestDeliverNoMatching::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverNoMatching* self = new (ELeave) CTestDeliverNoMatching(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverNoMatching::~CTestDeliverNoMatching()
+ {
+ }
+
+CTestDeliverNoMatching::CTestDeliverNoMatching(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from MMsvEntryObserver
+
+void CTestDeliverNoMatching::HandleEntryEventL(TMsvEntryEvent aEvent, TAny* aArg1, TAny* /*aArg2*/, TAny* /*aArg3*/)
+ {
+ if( aEvent == EMsvNewChildren )
+ {
+ iTestUtils.Printf(_L("Received new message in Inbox - should be status report...\n"));
+
+ CMsvEntrySelection* sel = static_cast<CMsvEntrySelection*>(aArg1);
+
+ // Check how many mesasges there are - should be just 1
+ TInt count = sel->Count();
+
+ iTestUtils.Printf(_L("--Number of new messages -> %d - should be %d\n"), count, 1);
+ iTestUtils.Test()(count == 1);
+
+ // Restore the message
+
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL((*sel)[0]);
+ CMsvStore* store = MsvEntry().ReadStoreL();
+ CleanupStack::PushL(store);
+
+ header->RestoreL(*store);
+ iTestUtils.iRichText->Reset();
+ store->RestoreBodyTextL(*iTestUtils.iRichText);
+
+ CleanupStack::PopAndDestroy(store);
+
+ // Check that it's a Status Report...
+ iTestUtils.Printf(_L("--Message type -> %d - should be %d\n"), header->Type(), CSmsPDU::ESmsStatusReport);
+ iTestUtils.Test()(header->Type() == CSmsPDU::ESmsStatusReport);
+
+ // Check the message reference
+ TLogId logId = header->Message().LogServerId();
+ iTestUtils.Printf(_L("--Log Server Id -> %d - should be %d\n"), logId, iLogId);
+ iTestUtils.Test()(logId == iLogId);
+
+ // Check the deliver status
+ CSmsStatusReport& report = header->StatusReport();
+ iTestUtils.Printf(_L("--Deliver status -> %d - should be %d (ESmsShortMessageReceivedBySME)\n"), report.Status(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(report.Status() == TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ CleanupStack::PopAndDestroy(header);
+
+ // Check that the sent message has been updated.
+ CheckDeliveredMessageL();
+ }
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverNoMatching::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting single recipient\n"));
+
+ CSmsNumber* rcpt = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt);
+ rcpt->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt);
+ CleanupStack::Pop(rcpt);
+ }
+
+void CTestDeliverNoMatching::ChangeServiceSettingsL()
+ {
+ // Restore the service settings.
+ iTestUtils.SetEntryL(iTestUtils.iSmsServiceId);
+ CSmsAccount* account = CSmsAccount::NewLC();
+ account->LoadSettingsL(*iTestUtils.iServiceSettings);
+
+ // Set the service settings
+ iTestUtils.iServiceSettings->SetValidityPeriod(TTimeIntervalMinutes(5));
+ iTestUtils.iServiceSettings->SetDeliveryReport(ETrue);
+ iTestUtils.iServiceSettings->SetStatusReportHandling(CSmsSettings::EMoveReportToInboxVisible);
+
+ // Store the new service settings
+ account->SaveSettingsL(*iTestUtils.iServiceSettings);
+ CleanupStack::PopAndDestroy(account);
+ }
+
+TMsvId CTestDeliverNoMatching::GetObserverEntry()
+ {
+ return KMsvGlobalInBoxIndexEntryId;
+ }
+
+void CTestDeliverNoMatching::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 1);
+ iTestUtils.Test()(header->Recipients().Count() == 1);
+
+ CSmsNumber* rcpt = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, rcpt->LogId());
+ iTestUtils.Test()(logId == rcpt->LogId());
+
+ iLogId = rcpt->LogId();
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverNoMatching::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 1);
+ iTestUtils.Test()(header->Recipients().Count() == 1);
+
+ CSmsNumber* rcpt = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverNoMatching::TestName()
+ {
+ return KTestDeliverNoMatching();
+ }
+
+/*
+ * CTestDeliverNoStatusReports
+ */
+
+ CTestDeliverNoStatusReports* CTestDeliverNoStatusReports::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverNoStatusReports* self = new (ELeave) CTestDeliverNoStatusReports(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverNoStatusReports::~CTestDeliverNoStatusReports()
+ {
+ }
+
+CTestDeliverNoStatusReports::CTestDeliverNoStatusReports(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverNoStatusReports::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting single recipient\n"));
+
+ CSmsNumber* rcpt = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt);
+ rcpt->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt);
+ CleanupStack::Pop(rcpt);
+ }
+
+void CTestDeliverNoStatusReports::ChangeServiceSettingsL()
+ {
+ // Restore the service settings.
+ iTestUtils.SetEntryL(iTestUtils.iSmsServiceId);
+ CSmsAccount* account = CSmsAccount::NewLC();
+ account->LoadSettingsL(*iTestUtils.iServiceSettings);
+
+ // Set the service settings
+ iTestUtils.iServiceSettings->SetValidityPeriod(TTimeIntervalMinutes(5));
+ iTestUtils.iServiceSettings->SetDeliveryReport(EFalse);
+ iTestUtils.iServiceSettings->SetStatusReportHandling(CSmsSettings::EMoveReportToInboxVisibleAndMatch);
+
+ // Store the new service settings
+ account->SaveSettingsL(*iTestUtils.iServiceSettings);
+ CleanupStack::PopAndDestroy(account);
+ }
+
+TMsvId CTestDeliverNoStatusReports::GetObserverEntry()
+ {
+ return KMsvNullIndexEntryId;
+ }
+
+void CTestDeliverNoStatusReports::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 1);
+ iTestUtils.Test()(header->Recipients().Count() == 1);
+
+ CSmsNumber* rcpt = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Delivery status -> %d - should be %d (ENoAckRequested)\n"), rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (ENoAckSummary)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::ENoAckSummary);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::ENoAckSummary);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId == EFalse);
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverNoStatusReports::CheckDeliveredMessageL()
+ {
+ User::Invariant();
+ }
+
+const TDesC& CTestDeliverNoStatusReports::TestName()
+ {
+ return KTestDeliverNoStatusReports();
+ }
+
+/*
+ * CTestDeliverNotSent
+ */
+
+ CTestDeliverNotSent* CTestDeliverNotSent::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverNotSent* self = new (ELeave) CTestDeliverNotSent(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverNotSent::~CTestDeliverNotSent()
+ {
+ }
+
+CTestDeliverNotSent::CTestDeliverNotSent(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverNotSent::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting single recipient\n"));
+
+ CSmsNumber* rcpt = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt);
+ rcpt->SetAddressL(KRecipientBad);
+ aHeader.Recipients().AppendL(rcpt);
+ CleanupStack::Pop(rcpt);
+ }
+
+TMsvId CTestDeliverNotSent::GetObserverEntry()
+ {
+ return KMsvNullIndexEntryId;
+ }
+
+void CTestDeliverNotSent::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 1);
+ iTestUtils.Test()(header->Recipients().Count() == 1);
+
+ CSmsNumber* rcpt = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Delivery status -> %d - should be %d (ENoAckRequested)\n"), rcpt->AckStatus(ESmsAckTypeDelivery), CSmsNumber::ENoAckRequested);
+ iTestUtils.Test()(rcpt->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::ENoAckRequested);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (ENoAckSummary)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::ENoAckSummary);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::ENoAckSummary);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId == EFalse);
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverNotSent::CheckDeliveredMessageL()
+ {
+ User::Invariant();
+ }
+
+const TDesC& CTestDeliverNotSent::TestName()
+ {
+ return KTestDeliverNotSent();
+ }
+
+/*
+ * CTestDeliverMultiRecipientsFail_1
+ */
+
+CTestDeliverMultiRecipientsFail_1* CTestDeliverMultiRecipientsFail_1::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverMultiRecipientsFail_1* self = new (ELeave) CTestDeliverMultiRecipientsFail_1(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverMultiRecipientsFail_1::~CTestDeliverMultiRecipientsFail_1()
+ {
+ }
+
+CTestDeliverMultiRecipientsFail_1::CTestDeliverMultiRecipientsFail_1(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverMultiRecipientsFail_1::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting multiple (3) recipients\n"));
+
+ CSmsNumber* rcpt0 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt0);
+ rcpt0->SetAddressL(KRecipientFail);
+ aHeader.Recipients().AppendL(rcpt0);
+ CleanupStack::Pop(rcpt0);
+
+ CSmsNumber* rcpt1 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt1);
+ rcpt1->SetAddressL(KRecipientFail);
+ aHeader.Recipients().AppendL(rcpt1);
+ CleanupStack::Pop(rcpt1);
+ }
+
+void CTestDeliverMultiRecipientsFail_1::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipients have delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId == EFalse);
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverMultiRecipientsFail_1::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status is correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set - round %d...\n"), iMessageId, ++iCheckCount);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ if( iCheckCount == 1 )
+ {
+ // At least one of the recipients has been delivered to ok - check the
+ // status of recipient 0 and make decisions based on that.
+ CSmsNumber* pendingRcpt = NULL;
+
+ if( rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck )
+ {
+ // Recipient 2 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt1->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt1->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt1->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt1->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ pendingRcpt = rcpt0;
+ }
+ else
+ {
+ // Recipient 0 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt0->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt0->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt0->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt0->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ pendingRcpt = rcpt1;
+ }
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, pendingRcpt->LogId());
+ iTestUtils.Test()(logId == pendingRcpt->LogId());
+ }
+ else
+ {
+ // Both recipients has been delivered to ok - check the status of both
+ // recipients
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt0->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt0->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt0->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt0->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt1->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt1->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt1->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt1->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EAllFailed)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EAllFailed);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EAllFailed);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+ }
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverMultiRecipientsFail_1::TestName()
+ {
+ return KTestDeliverMultiRecipientsFail_1();
+ }
+
+/*
+ * CTestDeliverMultiRecipientsMixed_1
+ */
+
+CTestDeliverMultiRecipientsMixed_1* CTestDeliverMultiRecipientsMixed_1::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverMultiRecipientsMixed_1* self = new (ELeave) CTestDeliverMultiRecipientsMixed_1(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverMultiRecipientsMixed_1::~CTestDeliverMultiRecipientsMixed_1()
+ {
+ }
+
+CTestDeliverMultiRecipientsMixed_1::CTestDeliverMultiRecipientsMixed_1(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverMultiRecipientsMixed_1::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting multiple (3) recipients\n"));
+
+ CSmsNumber* rcpt0 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt0);
+ rcpt0->SetAddressL(KRecipientFail);
+ aHeader.Recipients().AppendL(rcpt0);
+ CleanupStack::Pop(rcpt0);
+
+ CSmsNumber* rcpt1 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt1);
+ rcpt1->SetAddressL(KRecipientOk);
+ aHeader.Recipients().AppendL(rcpt1);
+ CleanupStack::Pop(rcpt1);
+ }
+
+void CTestDeliverMultiRecipientsMixed_1::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipients have delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId == EFalse);
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverMultiRecipientsMixed_1::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status is correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set - round %d...\n"), iMessageId, ++iCheckCount);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ if( iCheckCount == 1 )
+ {
+ // At least one of the recipients has been delivered to ok - check the
+ // status of recipient 0 and make decisions based on that.
+ CSmsNumber* pendingRcpt = NULL;
+
+ if( rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck )
+ {
+ // Recipient 2 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ pendingRcpt = rcpt0;
+ }
+ else
+ {
+ // Recipient 0 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt0->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt0->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt0->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt0->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ pendingRcpt = rcpt1;
+ }
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, pendingRcpt->LogId());
+ iTestUtils.Test()(logId == pendingRcpt->LogId());
+ }
+ else
+ {
+ // Status-reports for both recipients have been received - check the
+ // status of both recipients.
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt0->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt0->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt0->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt0->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckSuccessful)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckSuccessful);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EMixed)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EMixed);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EMixed);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+ }
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverMultiRecipientsMixed_1::TestName()
+ {
+ return KTestDeliverMultiRecipientsMixed_1();
+ }
+
+/*
+ * CTestDeliverMultiRecipientsMixed_2
+ */
+
+CTestDeliverMultiRecipientsMixed_2* CTestDeliverMultiRecipientsMixed_2::NewL(CSmsTestUtils& aTestUtils)
+ {
+ CTestDeliverMultiRecipientsMixed_2* self = new (ELeave) CTestDeliverMultiRecipientsMixed_2(aTestUtils);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestDeliverMultiRecipientsMixed_2::~CTestDeliverMultiRecipientsMixed_2()
+ {
+ }
+
+CTestDeliverMultiRecipientsMixed_2::CTestDeliverMultiRecipientsMixed_2(CSmsTestUtils& aTestUtils)
+: CTestDeliverBase(aTestUtils)
+ {
+ }
+
+// methods from CTestDeliverBase
+
+void CTestDeliverMultiRecipientsMixed_2::SetRecipientsL(CSmsHeader& aHeader)
+ {
+ iTestUtils.Printf(_L("--Setting multiple (2) recipients\n"));
+
+ CSmsNumber* rcpt0 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt0);
+ rcpt0->SetAddressL(KRecipientFail);
+ aHeader.Recipients().AppendL(rcpt0);
+ CleanupStack::Pop(rcpt0);
+
+ CSmsNumber* rcpt1 = CSmsNumber::NewL();
+ CleanupStack::PushL(rcpt1);
+ rcpt1->SetAddressL(KRecipientFail);
+ aHeader.Recipients().AppendL(rcpt1);
+ CleanupStack::Pop(rcpt1);
+ }
+
+void CTestDeliverMultiRecipientsMixed_2::CheckSentMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipients have delivery status correctly set
+ // 3. The index summary is correctly set
+ // 4. The index message ID is valid.
+ // 5. The index message ID matches that of the recipient
+
+ iTestUtils.Printf(_L("Checking sent message %d has correct flags set...\n"), iMessageId);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EPendingAcks)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EPendingAcks);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EPendingAcks);
+
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId == EFalse);
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+void CTestDeliverMultiRecipientsMixed_2::CheckDeliveredMessageL()
+ {
+ // Need to check the following -
+ // 1. Correct number of recipients
+ // 2. The recipient has delivery status is correctly set
+ // 3. The index summary is correctly set
+
+ iTestUtils.Printf(_L("Checking delivered message %d has correct flags set - round %d...\n"), iMessageId, ++iCheckCount);
+
+ // Restore the recipient...
+ CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iTestUtils.iRichText);
+ CleanupStack::PushL(header);
+
+ MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId);
+ MsvEntry().SetEntryL(iMessageId);
+ CMsvStore* store = iTestUtils.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ iTestUtils.Printf(_L("--Number of recipients -> %d - should be %d\n"), header->Recipients().Count(), 2);
+ iTestUtils.Test()(header->Recipients().Count() == 2);
+
+ CSmsNumber* rcpt0 = header->Recipients()[0];
+ CSmsNumber* rcpt1 = header->Recipients()[1];
+
+ TMsvSmsEntry entry = MsvEntry().Entry();
+
+ if( iCheckCount == 1 )
+ {
+ // At least one of the recipients has been delivered to ok - check the
+ // status of recipient 0 and make decisions based on that.
+ CSmsNumber* pendingRcpt = NULL;
+
+ if( rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck )
+ {
+ // Recipient 2 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt1->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt1->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt1->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt1->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+
+ pendingRcpt = rcpt0;
+ }
+ else
+ {
+ // Recipient 0 delivered to first...
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt0->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt0->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt0->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt0->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EPendingAck)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EPendingAck);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
+
+ pendingRcpt = rcpt1;
+ }
+ TLogId logId = 0;
+ TBool validId = entry.MessageId(logId);
+
+ iTestUtils.Printf(_L("--Index message Id validity -> %d - should NOT be %d\n"), validId, EFalse);
+ iTestUtils.Test()(validId != EFalse);
+
+ iTestUtils.Printf(_L("--Index message Id -> %d - should be %d\n"), logId, pendingRcpt->LogId());
+ iTestUtils.Test()(logId == pendingRcpt->LogId());
+ }
+ else
+ {
+ // Status-reports for both recipients have been received - check the
+ // status of both recipients.
+ iTestUtils.Printf(_L("--Recipient 0 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt0->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt0->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt0->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt0->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 0 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt0->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt0->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Delivery status -> %d - should be %d (EAckError)\n"), rcpt1->AckStatus(ESmsAckTypeDelivery), CSmsNumber::EAckError);
+ iTestUtils.Test()(rcpt1->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Recipient status -> %d - should be %d (EFailedToSend)\n"), rcpt1->Status(), CMsvRecipient::EFailedToSend);
+ iTestUtils.Test()(rcpt1->Status()==CMsvRecipient::EFailedToSend);
+
+ iTestUtils.Printf(_L("--Recipient 1 - Error status -> %d - should not be %d (ESmsShortMessageReceivedBySME)\n"), rcpt1->Error(), TSmsStatus::ESmsShortMessageReceivedBySME);
+ iTestUtils.Test()(rcpt1->Error()!= TSmsStatus::ESmsShortMessageReceivedBySME);
+
+ iTestUtils.Printf(_L("--Index summary -> %d - should be %d (EAllFailed)\n"), entry.AckSummary(ESmsAckTypeDelivery), TMsvSmsEntry::EAllFailed);
+ iTestUtils.Test()(entry.AckSummary(ESmsAckTypeDelivery) == TMsvSmsEntry::EAllFailed);
+
+ // Test is no ended - complete self to stop.
+ CompleteSelf();
+ }
+
+ CleanupStack::PopAndDestroy(header);
+ }
+
+const TDesC& CTestDeliverMultiRecipientsMixed_2::TestName()
+ {
+ return KTestDeliverMultiRecipientsMixed_2();
+ }