mobilemessaging/smsmtm/test/src/T_SmsSendAs.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smsmtm/test/src/T_SmsSendAs.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,431 @@
+// Copyright (c) 1999-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_smssendas.h"
+#include "smscmds.h"
+#include "smuthdr.h"
+#include <txtrich.h>
+#include <txtfmlyr.h>
+#include "smsclnt.h"
+
+RTest test(_L("T_SmsSendAs Testrig"));
+CTrapCleanup* theCleanup;
+
+_LIT(KSmsScript, "sms.script");
+_LIT(KWapScript, "wap.script");
+_LIT(KNbsScript, "nbs.script");
+
+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;
+
+	smsTest->NotifySaPhoneOnL();
+
+	CSmsSendAsTest* asTest = CSmsSendAsTest::NewL(*smsTest, KNullDesC, nextTest);
+	CleanupStack::PushL(asTest);
+
+	smsTest->WaitForInitializeL();
+
+	asTest->StartL();
+
+	//CleanupStack::PopAndDestroy(3); //SmsTest, scheduler
+	CleanupStack::PopAndDestroy(asTest);
+	CleanupStack::PopAndDestroy(smsTest);
+	CleanupStack::PopAndDestroy(scheduler);
+	}
+
+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);
+	}
+
+
+CSmsSendAsTest::~CSmsSendAsTest()
+/**
+	destructor
+ */
+	{
+	iSocket.Close();
+	iSocketServ.Close();
+	}
+
+CSmsSendAsTest* CSmsSendAsTest::NewL(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest)
+	{
+	CSmsSendAsTest* self = new (ELeave) CSmsSendAsTest(aSmsTest, aScriptFile, aNextTest);
+	CleanupStack::PushL(self);
+
+	self->ConstructL();
+
+	CleanupStack::Pop();
+	return self;
+	}
+
+
+
+CSmsSendAsTest::CSmsSendAsTest(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest)
+: CSmsTestBase(aSmsTest, aScriptFile, aNextTest), iState(EStateWaiting)
+	{
+	}
+
+void CSmsSendAsTest::RunAutoL()
+/**
+	Runs tests in sequence, checks iStatus
+ */
+	{
+	iSmsTest.TestStart(++iNextTest, _L("Test SendAs"));
+	TestSendAsL();
+	User::LeaveIfError(iStatus.Int());
+	iSmsTest.TestFinish(iNextTest, KErrNone);
+	
+	iSmsTest.TestStart(++iNextTest, _L("Send the messages"));
+	TestSendingL();
+	User::LeaveIfError(iStatus.Int());
+	iSmsTest.TestFinish(iNextTest, KErrNone);
+	}
+
+void CSmsSendAsTest::ConstructL()
+	{
+	iSmsTest.SetLogToFile();
+	iSmsTest.DeleteServicesL();
+	iSmsTest.CreateServicesL();
+
+	iSelection = new (ELeave) CMsvEntrySelection();
+	iTimer = CTestTimer::NewL();
+
+	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));
+
+	CActiveScheduler::Add(this);
+	}
+
+void CSmsSendAsTest::ShowMenuL()
+/**
+	Shows menu
+ */
+	{
+	iSmsTest.ResetMenu();
+	iSmsTest.AppendToMenuL(_L("Test SendAs"));
+	iSmsTest.AppendToMenuL(_L("Send the messages"));
+	iSmsTest.AppendToMenuL(_L("Run auto"));
+
+	TInt result = iSmsTest.DisplayMenu(_L("SMS Service Centre Test"));
+
+	if (result <= 0)
+		return;
+
+	switch (result)
+		{
+		case 1:
+			TestSendAsL();
+			break;
+		case 2:
+			TestSendingL();
+			break;
+		case 3:
+			iSmsTest.SetRunAuto(ETrue);
+			RunAutoL();
+			break;
+		default:
+			User::Leave(KErrArgument);
+			break;
+		}
+
+	ShowMenuL();
+	}
+
+void CSmsSendAsTest::RunL()
+/**
+	Handles completed async operations
+ */
+	{
+	CActiveScheduler::Stop();
+
+	switch (iState)
+		{
+		case EStateSending:
+			{
+			DoRunSendingL();
+			break;
+			}
+		default:
+			{
+			break;
+			}
+		}
+	}
+
+void CSmsSendAsTest::DoRunSendingL()
+/**
+	Checks the status
+ */	
+	{
+	if (iOperation)
+		iSmsTest.SetProgressL(*iOperation);
+
+	if (iStatus == KErrNone)
+		iStatus = iSmsTest.iProgress.iError;
+
+	iSmsTest.Printf(_L("Printing completed with error %d\n"), iStatus.Int());
+
+	iSmsTest.DisplaySendingStatesL(*iSelection);
+	iState = EStateWaiting;
+
+	delete iOperation;
+	iOperation = NULL;
+	}
+
+void CSmsSendAsTest::DoCancel()
+/**
+	Cancels the async operation
+ */
+	{
+	if (iOperation)
+		{
+		iOperation->Cancel();
+		iSmsTest.Printf(_L("Operation Cancelled!\n"));
+		}
+	delete iOperation;
+	iOperation = NULL;
+	}
+
+void CSmsSendAsTest::TestSendAsL()
+/**
+	Tests SendAs  
+ */
+	{
+	DeleteChildrenL(KMsvGlobalOutBoxIndexEntryId);
+
+	TTime now;
+	now.HomeTime();
+
+	CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(sel);
+	iSelection->Reset();
+	
+	iSmsTest(iSmsTest.ReadScriptL(KSmsScript, KMsvGlobalOutBoxIndexEntryId, *sel, now));
+	iSmsTest(iSmsTest.ReadScriptL(KWapScript, KMsvGlobalOutBoxIndexEntryId, *sel, now));
+	iSmsTest(iSmsTest.ReadScriptL(KNbsScript, KMsvGlobalOutBoxIndexEntryId, *sel, now));
+	const TInt count = sel->Count();
+
+	iSmsTest(count);
+
+	CRichText* richOld = CRichText::NewL(iSmsTest.iParaFormat, iSmsTest.iCharFormat);
+	CleanupStack::PushL(richOld);
+
+	CRichText* richNew = CRichText::NewL(iSmsTest.iParaFormat, iSmsTest.iCharFormat);
+	CleanupStack::PushL(richNew);
+
+	CSmsHeader* headerOld = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *richOld);
+	CleanupStack::PushL(headerOld);
+
+	CSmsHeader* headerNew = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *richNew);
+	CleanupStack::PushL(headerNew);
+
+	for (TInt i = 0; i < count; i++) //order important
+		{
+		//Get the existing message
+		TMsvId id = sel->At(i);
+		iSmsTest.SetEntryL(id);
+
+		TUid bioType;
+		bioType.iUid = iSmsTest.Entry().iBioType;
+
+			iSmsTest.Printf(_L("%d/%d SendAs for BioType %d\n"), i + 1, count, bioType.iUid); 
+
+			CMsvStore* store = iSmsTest.ReadStoreL();
+			CleanupStack::PushL(store);
+			headerOld->RestoreL(*store);
+			store->RestoreBodyTextL(*richOld);
+			CleanupStack::PopAndDestroy(store);
+			
+			CSendAs* sendAs = CSendAs::NewL(*this);
+			CleanupStack::PushL(sendAs);
+			
+			sendAs->SetMtmL(KUidMsgTypeSMS);
+			iSmsTest(sendAs->AvailableServices().Count());
+			sendAs->SetService(0);
+			sendAs->CreateMessageL(KMsvGlobalOutBoxIndexEntryId);
+
+			for (TInt j = 0; j < headerOld->Recipients().Count(); j++)
+				{
+				CSmsNumber* number = headerOld->Recipients()[j];
+				TPtrC name(number->Name());
+				TPtrC addr(number->Address());
+				sendAs->AddRecipientL(addr, name);
+				}
+
+			sendAs->SetBodyL(*richOld);
+
+			if (bioType.iUid != 0)
+				sendAs->SetBioTypeL(bioType);
+
+			sendAs->SaveMessageL(ETrue);
+
+			//Get the new message
+			CSmsClientMtm* mtm = REINTERPRET_CAST(CSmsClientMtm*, &sendAs->ClientMtm());
+			CMsvEntry& entry = mtm->Entry();
+			store = entry.ReadStoreL();
+			CleanupStack::PushL(store);
+			headerNew->RestoreL(*store);
+			store->RestoreBodyTextL(*richNew);
+			CleanupStack::PopAndDestroy(store);
+
+			iSmsTest.Printf(_L("\tCreated %d\n"), entry.EntryId());
+			test(id != entry.EntryId());
+			CompareHeadersL(*headerOld, *headerNew);
+
+			CSmsSettings* msgSettings = CSmsSettings::NewL();
+			CleanupStack::PushL(msgSettings);
+
+			//Check the settings are the same (except charset)
+			headerNew->GetSmsSettingsL(*msgSettings);
+			CompareSettingsL(mtm->ServiceSettings(), *msgSettings);
+			CleanupStack::PopAndDestroy(msgSettings);
+
+			iSelection->AppendL(entry.EntryId());
+
+			CleanupStack::PopAndDestroy(sendAs);
+			}
+
+	CleanupStack::PopAndDestroy(5);
+	}
+
+void CSmsSendAsTest::CompareSettingsL(const CSmsMessageSettings& aS1, const CSmsMessageSettings& aS2)
+/**
+	Compares two sms message settings 
+
+	@param		aS1			A sms message setting
+	@param		aS2			A sms message setting	
+ */
+	{
+	RTest& t = iSmsTest.Test();
+	t(aS1.ValidityPeriod() == aS2.ValidityPeriod());
+	t(aS1.ValidityPeriodFormat() == aS2.ValidityPeriodFormat());
+	t(aS1.RejectDuplicate() == aS2.RejectDuplicate());
+	t(aS1.DeliveryReport() == aS2.DeliveryReport());
+	t(aS1.ReplyPath() == aS2.ReplyPath());
+	t(aS1.MessageConversion() == aS2.MessageConversion());
+	}
+
+void CSmsSendAsTest::CompareHeadersL(const CSmsHeader& aH1, const CSmsHeader& aH2) const
+/**
+	Compares two sms headers
+
+	@param		aH1			A sms message header
+	@param		aH2			A sms message header	
+ */
+	{
+	RTest& t = iSmsTest.Test();
+	t(aH1.Type() == aH2.Type());
+
+	t(aH1.Recipients().Count() == aH2.Recipients().Count());
+
+	for (TInt i = 0; i < aH1.Recipients().Count(); i++)
+		{
+		CSmsNumber* number1 = aH1.Recipients()[i];
+		CSmsNumber* number2 = aH2.Recipients()[i];
+
+		t(number1->Address().Compare(number2->Address()) == 0);
+		t(number1->Name().Compare(number2->Name()) == 0);
+		}
+
+	t(aH1.FromAddress().CompareF(aH2.FromAddress()) == 0);
+
+	TInt length = aH1.Message().Buffer().Length();
+	HBufC* hBuf1 = HBufC::NewLC(length);
+	TPtr buf1 = hBuf1->Des();
+	aH1.Message().Buffer().Extract(buf1, 0, length);
+	
+	length = aH2.Message().Buffer().Length();
+	HBufC* hBuf2 = HBufC::NewLC(length);
+	TPtr buf2 = hBuf2->Des();
+	aH2.Message().Buffer().Extract(buf2, 0, length);
+
+	t(buf1.Compare(buf2) == 0);
+
+	CleanupStack::PopAndDestroy(2); //hBuf1, hBuf2
+	}
+
+void CSmsSendAsTest::TestSendingL()
+/**
+	Tests sending
+ */
+	{
+	iSmsTest.Test().Next(_L("Test Sending"));
+
+	if (!iSelection->Count())
+		User::Leave(KErrNotFound);
+
+	delete iOperation;
+	iOperation = NULL;
+	iState = EStateSending;
+
+	MsvEntry().SetEntryL(KMsvGlobalOutBoxIndexEntryId);
+	iOperation = MsvEntry().CopyL(*iSelection, iSmsTest.iSmsServiceId, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	}
+
+
+void CSmsSendAsTest::DeleteChildrenL(TMsvId aParent)
+/**
+	Deletes children
+
+	@param		aParent			A Message Id
+ */
+	{
+	iSmsTest.SetEntryL(aParent);
+	CMsvEntrySelection* sel = iSmsTest.ChildrenWithMtmLC(KUidMsgTypeSMS);
+	TInt count = sel->Count();
+
+	while (count--)
+		{
+		iSmsTest.DeleteEntryL(sel->At(count));
+		}
+
+	CleanupStack::PopAndDestroy(sel);
+	}
+
+TBool CSmsSendAsTest::CapabilityOK(TUid /*aCapability*/, TBool /*aResponse*/)
+/**
+	This is required by MSendAsObserver
+ */
+	{
+	return ETrue;
+	}
+