diff -r 000000000000 -r 72b543305e3a mobilemessaging/smsmtm/test/src/t_SmsSpecialIndicationsStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/smsmtm/test/src/t_SmsSpecialIndicationsStep.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,449 @@ +// Copyright (c) 2005-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 +#include "t_smsspecialindicationsstep.h" +#include +#include +#include +#include +#include +#include "gsmuieoperations.h" +#include + +using namespace CommsDat; +LOCAL_D RTest test(_L("TestTextE_1_1")); +_LIT(KTestMessageDir,""); + +const TTimeIntervalMicroSeconds32 KWaitForWatchersToStart = 20000000; +const TTimeIntervalMicroSeconds32 KWaitForWatchersToStartDisplayInterval = 5000000; + +_LIT(KMessageData, "This is a simple text message"); +_LIT(KRecipientOk, "+44111111111"); // has to be valid number and switched on + + +void EntryObserver::HandleEntryEventL(TMsvEntryEvent aEvent, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) + { + switch (aEvent) + { + case EMsvEntryChanged: + { + break; + } + case EMsvNewChildren: + { + CActiveScheduler::Stop(); + break; + } + + default: + { + break; + } + } + } + +CSmsSpecialIndicationsStep::CSmsSpecialIndicationsStep() +:CTestStep() + { + } + +CSmsSpecialIndicationsStep::~CSmsSpecialIndicationsStep() + { + delete iTestUtils; + delete iEntry; + delete iScheduler; + delete iEntryObserver; + delete iSessionObserver; + delete iSession; + delete iWatchers; + delete iOperation; + delete iTestActive; + test.End(); + test.Close(); + __UHEAP_MARKEND; + } + +void CSmsSpecialIndicationsStep::InitialiseSpecialIndicationsStepL() + { + SetTestStepName(KSmsSpecialIndicationsStep1); + iScheduler = new (ELeave) CActiveScheduler; + CleanupStack::PushL(iScheduler); + CActiveScheduler::Install(iScheduler); + } + +void CSmsSpecialIndicationsStep::InitialiseTestL() + { + INFO_PRINTF1(_L("Initialising the test...")); + iTestUtils = CSmsTestUtils::NewL(test); + // Notify the system agent that the phone is on. + iTestUtils->NotifySaPhoneOnL(); + + // 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); + + // set up an opserver to observe the inbox + iEntryObserver = new (ELeave) EntryObserver(); + iSessionObserver = new (ELeave) SessionObserver(); + iSession = CMsvSession::OpenSyncL(*iSessionObserver); + TMsvSelectionOrdering ordering; + iEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryIdValue,ordering); + iEntry->AddObserverL(*iEntryObserver); + + //used for acynchronous calls + iTestActive=new(ELeave) CTestActive; + + INFO_PRINTF1(_L("Successfully initialised test")); + +} + +void CSmsSpecialIndicationsStep::InitialiseSimTsyL() + { + + INFO_PRINTF1(_L("Initialising the SimTsy...")); + + _LIT(KDefaultTsyName, "SIM"); + HBufC* tsyName =KDefaultTsyName().AllocLC(); + + //Initialize TSY using the System Agent + TInt testState; + TInt testNumber=1; + if(KErrNone != RProperty::Get(KUidPSSimTsyCategory, KPSSimTsyTestNumber, testState)) + { + User::LeaveIfError(RProperty::Define(KUidPSSimTsyCategory, KPSSimTsyTestNumber, RProperty::EInt)); + } + User::LeaveIfError(RProperty::Set(KUidPSSimTsyCategory, KPSSimTsyTestNumber, testNumber)); + if(KErrNone != RProperty::Get(KUidSystemCategory, KMsvTestUidPhonePwrValue, testState)) + { + User::LeaveIfError(RProperty::Define(KUidSystemCategory, KMsvTestUidPhonePwrValue, RProperty::EInt)); + } + User::LeaveIfError(RProperty::Set(KUidSystemCategory, KMsvTestUidPhonePwrValue, EMsvTestPhoneOn)); + + User::LeaveIfError(RProperty::Get(KUidPSSimTsyCategory, KPSSimTsyTestNumber, testNumber)); + + RTelServer etelServer; + User::LeaveIfError(etelServer.Connect()); + CleanupClosePushL(etelServer); + User::LeaveIfError(etelServer.LoadPhoneModule(tsyName->Des())); + + // Find the phone corresponding to this TSY and open a number of handles on it + TInt numPhones; + User::LeaveIfError(etelServer.EnumeratePhones(numPhones)); + TBool found=EFalse; + + RMobilePhone iPhone; + while (!found && numPhones--) + { + TName phoneTsy; + User::LeaveIfError(etelServer.GetTsyName(numPhones,phoneTsy)); + if (phoneTsy.CompareF(tsyName->Des())==KErrNone) + { + found = ETrue; + RTelServer::TPhoneInfo info; + User::LeaveIfError(etelServer.GetPhoneInfo(numPhones,info)); + CleanupClosePushL(iPhone); + User::LeaveIfError(iPhone.Open(etelServer,info.iName)); + User::LeaveIfError(iPhone.Initialise()); + //Required Pause to Allow SMSStack to Complete its Async Init call to the TSY and finish its StartUp. + TTimeIntervalMicroSeconds32 InitPause=9000000; + User::After(InitPause); + + CleanupStack::PopAndDestroy(&iPhone); + } + } + + CleanupStack::PopAndDestroy(&etelServer); + + CMDBSession* dbSession = CMDBSession::NewL(CMDBSession::LatestVersion()); + CleanupStack::PushL(dbSession); + CMDBRecordSet globalSettingsRecord(KCDTIdGlobalSettingsRecord); + TRAPD(err, globalSettingsRecord.LoadL(*dbSession)); + if(err != KErrNone) + { + User::Leave(KErrNotFound); + } + + CCDModemBearerRecord *modemRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord)); + CleanupStack::PushL(modemRecord); + modemRecord->SetRecordId(((CCDGlobalSettingsRecord*)globalSettingsRecord.iRecords[0])->iModemForPhoneServicesAndSMS); + modemRecord->LoadL(*dbSession); + modemRecord->iTsyName.SetMaxLengthL(tsyName->Des().Length()); + modemRecord->iTsyName = tsyName->Des(); + modemRecord->ModifyL(*dbSession); + CleanupStack::PopAndDestroy(3); //tsyName, dbSession, modemRecord + + INFO_PRINTF1(_L("Successfully initialised the Sim Tsy")); + } + +void CSmsSpecialIndicationsStep::StartWatcherL() + { + INFO_PRINTF1(_L("Start the Watcher")); + + if( WatchersAlreadyRunningL() ) + { + INFO_PRINTF1(_L("Watchers are already running\n")); + return; + } + + iWatchers = CTestUtilsWatcherStarter::NewL(); + + TTimeIntervalMicroSeconds32 wait = KWaitForWatchersToStart; + TBool started = EFalse; + while( !started && wait.Int() > 0 ) + { + INFO_PRINTF2(_L("Waiting %d secs for watchers to start..."), wait.Int() / 1000000); + wait = wait.Int() - KWaitForWatchersToStartDisplayInterval.Int(); + User::After(KWaitForWatchersToStartDisplayInterval); + started = WatchersAlreadyRunningL(); + } + + if( !WatchersAlreadyRunningL() ) + { + INFO_PRINTF1(_L("WARNING: NBS Watcher has not started yet\n")); + } + } + +TBool CSmsSpecialIndicationsStep::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 CSmsSpecialIndicationsStep::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 CSmsSpecialIndicationsStep::CreateMessageL() + { + INFO_PRINTF1(_L("Creating message...")); + + 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); + entry.SetSendingState(KMsvSendStateScheduled); + + // 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(*iTestUtils->iServiceSettings); + + // Set the service centre + TInt defaultIndex = iTestUtils->iServiceSettings->DefaultServiceCenter(); + header->SetServiceCenterAddressL(iTestUtils->iServiceSettings->GetServiceCenter(defaultIndex).Address()); + + // Set recipient - ask derived class + SetRecipientsL(*header); + + // Update entry description and details... + CArrayPtrFlat& recipient = header->Recipients(); + entry.iDetails.Set(recipient[0]->Address()); + entry.iDescription.Set(iTestUtils->iRichText->Read(0, iTestUtils->iServiceSettings->DescriptionLength())); + entry.SetInPreparation(EFalse); + + // Create the entry - set context to the global outbox. + iTestUtils->iMsvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId); + iTestUtils->iMsvEntry->CreateL(entry); + + // Create new store and save header information + iTestUtils->iMsvEntry->SetEntryL(entry.Id()); + CMsvStore* store = iTestUtils->iMsvEntry->EditStoreL(); + CleanupStack::PushL(store); + header->StoreL(*store); + store->StoreBodyTextL(*iTestUtils->iRichText); + store->CommitL(); + CleanupStack::PopAndDestroy(2, header); + + iMessageId = entry.Id(); + + } + +void CSmsSpecialIndicationsStep::SendMessageL() + { + INFO_PRINTF1(_L("Sending message...")); + + delete iOperation; + iOperation = NULL; + + CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection(); + CleanupStack::PushL(sel); + sel->AppendL(iMessageId); + iTestUtils->DisplayMessageL(iMessageId); + iTestUtils->iMsvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId); + iOperation = iTestUtils->iMsvEntry->CopyL(*sel, iTestUtils->iSmsServiceId,iTestActive->iStatus); + iTestActive->StartL(); + CActiveScheduler::Start(); + CleanupStack::PopAndDestroy(sel); + } + +TBool CSmsSpecialIndicationsStep::CheckMessageL() + { + + INFO_PRINTF1(_L("Received new message in Inbox - should be status report...")); + + TMsvSelectionOrdering ordering; + ordering.ShowInvisibleEntries(); + CMsvEntry* entry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId,ordering); + CleanupStack::PushL(entry); + + CMsvEntrySelection* msvEntrySelection; + msvEntrySelection=entry->ChildrenL(); + CleanupStack::PushL(msvEntrySelection); + + // Check how many mesasges there are - should be just 1 + TInt count = msvEntrySelection->Count(); + INFO_PRINTF3(_L("Number of new messages: %d, should be: %d"), count, 1); + + // Restore the message + CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, *iTestUtils->iRichText); + CleanupStack::PushL(header); + entry->SetEntryL((*msvEntrySelection)[0]); + + CMsvStore* store = entry->ReadStoreL(); + CleanupStack::PushL(store); + header->RestoreL(*store); + + if(store->HasBodyTextL()) + { + store->RestoreBodyTextL(*iTestUtils->iRichText); + } + + TBuf desc; + User::LeaveIfError(TSmsUtilities::GetDescription(header->Message(), desc)); + CleanupStack::PopAndDestroy(4,entry); + + INFO_PRINTF1(desc); + + _LIT(KMsg,"14 Messages Waiting"); + if(desc==KMsg) + { + return ETrue; + } + else + { + return EFalse; + } + } + +TVerdict CSmsSpecialIndicationsStep::doTestStepPreambleL() + { + __UHEAP_MARK; + SetTestStepResult(EPass); + test.Start(_L("sdf")); + InitialiseTestL(); + InitialiseSimTsyL(); + StartWatcherL(); + iTestUtils->DeleteSmsMessagesL(KMsvGlobalOutBoxIndexEntryId); + iTestUtils->DeleteSmsMessagesL(KMsvGlobalInBoxIndexEntryId); + iTestUtils->DeleteSmsMessagesL(KMsvSentEntryId); + CreateMessageL(); + SendMessageL(); + //wait for message to be received... + CActiveScheduler::Start(); + + return TestStepResult(); + } + + +TVerdict CSmsSpecialIndicationsStep::doTestStepL() + { + if(CheckMessageL()) + { + SetTestStepResult(EPass); + } + else + { + SetTestStepResult(EFail); + } + + return TestStepResult(); + } + +TVerdict CSmsSpecialIndicationsStep::doTestStepPostambleL() +/** + * @return - TVerdict code + * Override of base class virtual + */ + { + return TestStepResult(); + } + + + +