diff -r 000000000000 -r 72b543305e3a mobilemessaging/smsmtm/test/src/T_SmsSendAs.cpp --- /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 +#include +#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; + } +