diff -r 4697dfb2d7ad -r 238255e8b033 messagingappbase/smsmtm/test/src/T_SmsEnum.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/smsmtm/test/src/T_SmsEnum.cpp Fri Apr 16 14:56:15 2010 +0300 @@ -0,0 +1,1238 @@ +// 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 +#include +#include +#include +#include +#include +#include "T_SmsEnum.h" +#include +#include + +RTest test(_L("T_SmsEnum Testrig")); +CTrapCleanup* theCleanup; + +_LIT(KSmsScript, "smsenum.script"); + +#if defined (__WINS__) +_LIT(KPddName,"ECDRV"); +_LIT(KLddName,"ECOMM"); +#else //__WINS__ +_LIT(KPddSirName,"ESIR"); +_LIT(KPddUartName,"ECUART4"); +_LIT(KLddName,"ECOMM"); +#endif //__WINS__ + +_LIT(KMessageData, "This is a simple text message"); +_LIT(KRecipientOk, "+447973500446"); + +void CSmsEnumTest::TestCopyFromSimL(TMsvId aFolderId) +/** + Tests copying messages from SIM + */ + { + iSmsTest.Test().Next(_L("Copy From SIM")); + iState = EStateCopyFromSim; + + if (aFolderId == KErrNotFound) + MsvEntry().SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + else + MsvEntry().SetEntryL(aFolderId); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + iSelection->InsertL(0,iSmsTest.iSmsServiceId); + + TPckgBuf pkg(KMsvGlobalInBoxIndexEntryId); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandCopyFromPhoneStore, pkg, iStatus); + SetActive(); + CActiveScheduler::Start(); + } + +void CSmsEnumTest::TestMoveFromSimL(TMsvId aFolderId) +/** + Tests moving messages from SIM + */ + { + iSmsTest.Test().Next(_L("Move From SIM")); + iState = EStateMoveFromSim; + + if (aFolderId == KErrNotFound) + MsvEntry().SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + else + MsvEntry().SetEntryL(aFolderId); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + iSelection->InsertL(0,iSmsTest.iSmsServiceId); + + TPckgBuf pkg(KMsvGlobalInBoxIndexEntryId); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandMoveFromPhoneStore, pkg, iStatus); + SetActive(); + CActiveScheduler::Start(); + } + +void CSmsEnumTest::TestDeleteFromSimL() +/** + Tests deleting messages from SIM + */ + { + iSmsTest.Test().Next(_L("Delete From SIM")); + iState = EStateDeleteFromSim; + + MsvEntry().SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + iSelection->InsertL(0,iSmsTest.iSmsServiceId); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandDeleteFromPhoneStore, TPtrC8(), iStatus); + SetActive(); + CActiveScheduler::Start(); + } + +TInt CSmsEnumTest::GetInboxMsgsCountL() +/** + Count messages in Inbox + */ + { + MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + return iSelection->Count(); + } + +void CSmsEnumTest::ClearInboxL() +/** + Remove all messages from the Inbox + */ + { + iState = EStateClearInbox; + MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + + if (iSelection->Count() > 0) + { + delete iOperation; + iOperation = NULL; + iOperation = MsvEntry().DeleteL(*iSelection, iStatus); + SetActive(); + CActiveScheduler::Start(); + } + } + +void CSmsEnumTest::SaveClass2FolderIdL(TMsvId aFolderId) +/** + Set the class 2 folder in the service Id + so that it will be picked up correctly by SMSS + */ + { + MsvEntry().SetEntryL(iSmsTest.iSmsServiceId); + CSmsSettings *settings=CSmsSettings::NewL(); + CleanupStack::PushL(settings); + + CSmsAccount* account = CSmsAccount::NewLC(); + TRAPD(error, account->LoadSettingsL(*settings)); + if (error) + { + account->InitialiseDefaultSettingsL(*settings); + } + + settings->SetClass2Folder(aFolderId); + + account->SaveSettingsL(*settings); + CleanupStack::PopAndDestroy(account); + CleanupStack::PopAndDestroy(settings); + } + +TMsvId CSmsEnumTest::CreateEnumerateFolderLC(TMsvId aParent) + { + iSmsTest.SetEntryL(aParent); + + TMsvEntry entry; + entry.SetVisible(EFalse); + entry.iType = KUidMsvFolderEntry; + entry.iMtm = KUidMsgTypeSMS; + entry.iServiceId = iSmsTest.iSmsServiceId; + iSmsTest.CreateEntryL(entry); + + iSmsTest.iMsvSession->CleanupEntryPushL(entry.Id()); + return entry.Id(); + } + +void CSmsEnumTest::TestCopyToSimL() +/** + Tests copying messages to SIM + */ + { + iSmsTest.Test().Next(_L("Copy to SIM")); + iState = EStateCopyToSim; + + iSelection->Reset(); + + TTime now; + now.HomeTime(); + iSelection->Reset(); + + iSmsTest.ReadScriptL(iScriptFile, KMsvGlobalOutBoxIndexEntryId, *iSelection, now); + iSelection->InsertL(0,iSmsTest.iSmsServiceId); + iSmsTest(iSelection->Count()); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandCopyToPhoneStore, TPtrC8(), iStatus); + SetActive(); + CActiveScheduler::Start(); + } + +void CSmsEnumTest::TestMoveToSimL(TMsvId aSourceFolderId) +/** + Tests copying messages to SIM + */ + { + iSmsTest.Test().Next(_L("Move to SIM")); + iState = EStateMoveToSim; + + MsvEntry().SetEntryL(aSourceFolderId); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + iSelection->InsertL(0,iSmsTest.iSmsServiceId); + + iSmsTest(iSelection->Count()); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandMoveToPhoneStore, TPtrC8(), iStatus); + SetActive(); + CActiveScheduler::Start(); + } + +void CSmsEnumTest::TestEnumerateL(TMsvId aFolderId) +/** + Enumerates + */ + { + iSmsTest.Test().Next(_L("Enumerate SIM")); + iState = EStateEnumerating; + + iSmsTest.Printf(_L("TestEnumerateL(%d)\n"), aFolderId); + + if (aFolderId != KErrNotFound) + { + iLastEnumerateFolder() = aFolderId; + iLastEnumerateFolder.SetLength(4); + } + else + iLastEnumerateFolder.SetLength(0); + + iSelection->Reset(); + iSelection->AppendL(iSmsTest.iSmsServiceId); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandEnumeratePhoneStores, iLastEnumerateFolder, iStatus); + SetActive(); + CActiveScheduler::Start(); + } + +void CSmsEnumTest::TestEnumerateAndDescLengthL(TMsvId aFolderId) +/** + Tests both enumeration and changing the default description length. +*/ + { + iSmsTest.Test().Next(_L("Enumerate SIM and non-default description length")); + iState = EStateEnumeratingAndDescLength; + + iSmsTest.Printf(_L("TestEnumerateAndDescLength(%d)\n"), aFolderId); + + if (aFolderId != KErrNotFound) + { + iLastEnumerateFolder() = aFolderId; + iLastEnumerateFolder.SetLength(4); + } + else + iLastEnumerateFolder.SetLength(0); + + // Set the description length - first restore the sms settings + iSmsTest.SetEntryL(iSmsTest.iSmsServiceId); + + CSmsAccount* account = CSmsAccount::NewLC(); + account->LoadSettingsL(*iSmsTest.iServiceSettings); + + // Set the description length to 1 + iSmsTest.iServiceSettings->SetDescriptionLength(1); + + // Store the sms settings + account->SaveSettingsL(*iSmsTest.iServiceSettings); + CleanupStack::PopAndDestroy(account); + + iSelection->Reset(); + iSelection->AppendL(iSmsTest.iSmsServiceId); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandEnumeratePhoneStores, iLastEnumerateFolder, iStatus); + SetActive(); + CActiveScheduler::Start(); + } + +void CSmsEnumTest::TestEnumerateAndDetailsFieldL() + { + iSmsTest.Test().Next(_L("Enumerate SIM and test that details field is ok.")); + iState = EStateEnumeratingAndDetailsField; + + // First create deliver message in the inbox. + TMsvEntry entry; + entry.SetVisible(ETrue); + entry.SetInPreparation(ETrue); + entry.iServiceId = iSmsTest.iSmsServiceId; + entry.iType = KUidMsvMessageEntry; + entry.iMtm = KUidMsgTypeSMS; + entry.iDate.HomeTime(); + entry.iSize = 0; + entry.iDescription.Set(KNullDesC); + entry.iDetails.Set(KNullDesC); + entry.SetSendingState(KMsvSendStateNotApplicable); + + // Create the SMS header object... + CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, *iSmsTest.iRichText); + CleanupStack::PushL(header); + + // Set the body text... + iSmsTest.iRichText->Reset(); + iSmsTest.iRichText->InsertL(0, KMessageData); + + // Copy the message settings... + header->SetSmsSettingsL(*iSmsTest.iServiceSettings); + + // Set recipient - need to set directly in the CSmsMessage as this a Deliver PDU + header->Message().SetToFromAddressL(KRecipientOk); + + // Update entry description and details... + entry.iDetails.Set(header->Message().ToFromAddress()); + entry.iDescription.Set(iSmsTest.iRichText->Read(0, iSmsTest.iServiceSettings->DescriptionLength())); + entry.SetInPreparation(EFalse); + + // Create the entry - set context to the global outbox. + MsvEntry().SetEntryL(KMsvGlobalInBoxIndexEntryId); + 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(*iSmsTest.iRichText); + store->CommitL(); + CleanupStack::PopAndDestroy(2, header); + + // Move the message to the SIM + + delete iSelection; + iSelection = NULL; + iSelection = new (ELeave) CMsvEntrySelection(); + iSelection->AppendL(iSmsTest.iSmsServiceId); + iSelection->AppendL(entry.Id()); + + iSmsTest(iSelection->Count()); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandMoveToPhoneStore, TPtrC8(), iStatus); + SetActive(); + CActiveScheduler::Start(); + + // Enumerate the SIM - first create the folder into which to enumerate + TMsvId folder = CreateEnumerateFolderLC(KMsvGlobalInBoxIndexEntryId); + + iLastEnumerateFolder() = folder; + iLastEnumerateFolder.SetLength(4); + + iSelection->Reset(); + iSelection->AppendL(iSmsTest.iSmsServiceId); + + delete iOperation; + iOperation = NULL; + iOperation = Session().TransferCommandL(*iSelection, ESmsMtmCommandEnumeratePhoneStores, iLastEnumerateFolder, iStatus); + SetActive(); + CActiveScheduler::Start(); + + // Ok see if things are how it should be... + iSmsTest.SetEntryL(folder); + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + iSmsTest.Test()(iSelection->Count() == 1); + + iSmsTest.SetEntryL(iSelection->At(0)); + entry = MsvEntry().Entry(); + iSmsTest.Test()(entry.iDetails.Length() > 0); + + // Destroy the enumerate folder + CleanupStack::PopAndDestroy(); + } + +void CSmsEnumTest::TestMultipleRecipientEnumerateL() + { + // Clean the existing messages + ClearInboxL(); + TestEnumerateL(); + User::LeaveIfError(iStatus.Int()); + if (iSelection->Count()) + { + TestDeleteFromSimL(); + User::LeaveIfError(iStatus.Int()); + } + + // Copy to SIM + TestCopyToSimL(); + User::LeaveIfError(ErrorStatus()); + // Count the number of messages to be copied onto SIM, + // including multiple msgs for multiple recipients. + TInt msgCount = 0; + for (TInt index=1; index < (iSelection->Count()); index++) + { + CSmsHeader* smsHeader = iSmsTest.GetHeaderLC(iSelection->At(index)); + if (smsHeader->Message().Type() == CSmsPDU::ESmsSubmit) + { + msgCount += smsHeader->Recipients().Count(); + } + else + { + ++msgCount; + } + CleanupStack::PopAndDestroy(smsHeader); + } + + TestEnumerateL(); + User::LeaveIfError(iStatus.Int()); + //Count the number of messages copied onto SIM + TInt simMsgCount = iSmsTest.iProgress.iMsgCount; + + // Check msg count on SIM after copy + iSmsTest.Printf(_L("Count msgs on SIM: Expected msgs %d, Copied msgs %d\n"), msgCount, simMsgCount); + if (msgCount != simMsgCount) + { + User::LeaveIfError(KErrNotFound); + } + + // Clean local Inbox and copy msgs from sim + if (iSelection->Count()) + { + ClearInboxL(); + TestCopyFromSimL(); + User::LeaveIfError(ErrorStatus()); + } + msgCount = GetInboxMsgsCountL(); + + // Check msg count in local inbox after copy from SIM + iSmsTest.Printf(_L("Count msgs in Inbox: Expected msgs %d, Copied msgs %d\n"), simMsgCount, msgCount); + if (msgCount != simMsgCount) + { + User::LeaveIfError(KErrNotFound); + } + + } + + +CSmsEnumTest::CSmsEnumTest(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest) +: CSmsTestBase(aSmsTest, aScriptFile, aNextTest), iState(EStateWaiting) + { + CActiveScheduler::Add(this); + } + +LOCAL_C void doMainL() + { +#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); + + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; + CleanupStack::PushL(scheduler); + CActiveScheduler::Install( scheduler ); + + CSmsTestUtils* smsTest = CSmsTestUtils::NewL(test); + CleanupStack::PushL(smsTest); + TInt nextTest = 0; + + smsTest->NotifySaPhoneOnL(); + + CSmsEnumTest* enumTest = CSmsEnumTest::NewLC(*smsTest, KSmsScript, nextTest); + + smsTest->WaitForInitializeL(); + + enumTest->StartL(); + + //CleanupStack::PopAndDestroy(3); //SmsTest, scheduler + CleanupStack::PopAndDestroy(enumTest); + CleanupStack::PopAndDestroy(smsTest); + CleanupStack::PopAndDestroy(scheduler); + } + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + test.Start(_L("Setup")); + theCleanup = CTrapCleanup::New(); + TRAPD(ret,doMainL()); + test.Printf(_L("doMainL completed with %d\n"), ret); + test(ret==KErrNone); + delete theCleanup; + test.Console()->SetPos(0, 13); + test.End(); + test.Close(); + __UHEAP_MARKEND; + return(KErrNone); + } + +void CSmsEnumTest::RunAutoL() +/** + Runs tests in sequence, checks iStatus + */ + { + // Wait 5 seconds for everything to start up + User::After(5000000); + + // Initial clean-up + iSmsTest.TestStart(++iNextTest, _L("(Cleanup) Enumerate")); + TestEnumerateL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + if (iSelection->Count()) + { + iSmsTest.TestStart(++iNextTest, _L("(Cleanup) Delete from SIM")); + TestDeleteFromSimL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + } + + // Actual testing + ClearInboxL(); + iSmsTest.TestStart(++iNextTest, _L("Enumerate - check details field")); + TestEnumerateAndDetailsFieldL(); + User::LeaveIfError(ErrorStatus()); + iSmsTest.TestFinish(iNextTest, KErrNone); + ClearInboxL(); + + iSmsTest.TestStart(++iNextTest, _L("Copy to SIM")); + TestCopyToSimL(); + User::LeaveIfError(ErrorStatus()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Enumerate")); + TestEnumerateL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + +// iSmsTest.TestStart(++iNextTest, _L("Test UnRead Status - all messages un-read after 1st enumerate")); +// TestUnreadStatusL(); +// iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Enumerate and non-default description length")); + TestEnumerateAndDescLengthL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Test Read Status - all messages read after 2nd enumerate")); + TestReadStatusL(); + iSmsTest.TestFinish(iNextTest, KErrNone); + + SaveClass2FolderIdL(iSmsTest.iProgress.iEnumerateFolder); + TMsvId class2Folder = iSmsTest.iProgress.iEnumerateFolder; + ClearInboxL(); + + if (iSelection->Count()) + { + iSmsTest.TestStart(++iNextTest, _L("Move from SIM")); + TestMoveFromSimL(class2Folder); + User::LeaveIfError(ErrorStatus()); + iSmsTest.TestFinish(iNextTest, KErrNone); + } + + iSmsTest.TestStart(++iNextTest, _L("Copy to SIM")); + TestCopyToSimL(); + User::LeaveIfError(ErrorStatus()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Test SIM store status after copy to SIM")); + TestSimStoreStatusL(class2Folder); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Enumerate")); + TestEnumerateL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + if (iSelection->Count()) + { + iSmsTest.TestStart(++iNextTest, _L("Move from SIM")); + TestMoveFromSimL(class2Folder); + User::LeaveIfError(ErrorStatus()); + iSmsTest.TestFinish(iNextTest, KErrNone); + } + + iSmsTest.TestStart(++iNextTest, _L("Test phone store status after move from SIM")); + TestPhoneStoreStatusL(KMsvGlobalInBoxIndexEntryId); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Move to SIM")); + TestMoveToSimL(KMsvGlobalInBoxIndexEntryId); + User::LeaveIfError(ErrorStatus()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Test SIM store status after move to SIM")); + TestSimStoreStatusL(class2Folder); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Copy from SIM")); + TestCopyFromSimL(class2Folder); + User::LeaveIfError(ErrorStatus()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.TestStart(++iNextTest, _L("Test phone store status after copy from SIM")); + TestPhoneStoreStatusL(KMsvGlobalInBoxIndexEntryId); + iSmsTest.TestFinish(iNextTest, KErrNone); + + // Copy to SIM, multiple recipients + iSmsTest.TestStart(++iNextTest, _L("Copy to SIM, multiple recipients")); + TestMultipleRecipientEnumerateL(); + iSmsTest.TestFinish(iNextTest, KErrNone); + + TestAllEnumerateL(); + TMsvId folder = CreateEnumerateFolderLC(KMsvGlobalInBoxIndexEntryId); + TestAllEnumerateL(folder); + TestAllEnumerateL(folder); + folder = CreateEnumerateFolderLC(KMsvGlobalInBoxIndexEntryId); + TestAllEnumerateL(folder); + CleanupStack::PopAndDestroy(2); + + iSmsTest.TestStart(++iNextTest, _L("Enumerate before move")); + TestEnumerateL(KErrNotFound); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + if (iSelection->Count()) + { + iSmsTest.TestStart(++iNextTest, _L("Move from SIM")); + TestMoveFromSimL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + } + } + +void CSmsEnumTest::TestAllEnumerateL(TMsvId aFolderId) + { + iSmsTest.TestStart(++iNextTest, _L("Enumerate")); + TestEnumerateL(aFolderId); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + if (iSelection->Count()) + { + iSmsTest.TestStart(++iNextTest, _L("Copy from SIM")); + TestCopyFromSimL(aFolderId); + User::LeaveIfError(ErrorStatus()); + iSmsTest.TestFinish(iNextTest, KErrNone); + } + } + +void CSmsEnumTest::ConstructL() + { + SetTestNameL(KSmsEnumTestName); + iSmsTest.SetLogToFile(); + + 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)); + + iParaFormat = CParaFormatLayer::NewL(); + iCharFormat = CCharFormatLayer::NewL(); + iBody = CRichText::NewL(iParaFormat, iCharFormat); + iHeader = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, *iBody); + } + +void CSmsEnumTest::ShowMenuL() + { + iSmsTest.ResetMenu(); + + iSmsTest.AppendToMenuL(_L("Enumerate SIM")); + iSmsTest.AppendToMenuL(_L("Copy To SIM")); + iSmsTest.AppendToMenuL(_L("Display Log")); + iSmsTest.AppendToMenuL(_L("Clear Log")); + + TInt result = iSmsTest.DisplayMenu(_L("SMS Enumerate Sim Test")); + + if (result <= 0) + return; + + switch (result) + { + case 1: + TestEnumerateL(); + break; + case 2: + TestCopyToSimL(); + break; + case 3: + DisplayLogL(); + break; + case 4: + ClearLogL(); + break; + default: + User::Leave(KErrArgument); + break; + } + + ShowMenuL(); + } + +CSmsEnumTest::~CSmsEnumTest() + { + delete iBody; + delete iHeader; + delete iParaFormat; + delete iCharFormat; + + iSocket.Close(); + iSocketServ.Close(); + } + +CSmsEnumTest* CSmsEnumTest::NewLC(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest) + { + CSmsEnumTest* self = new (ELeave) CSmsEnumTest(aSmsTest, aScriptFile, aNextTest); + CleanupStack::PushL(self); + + self->ConstructL(); + return self; + } + +void CSmsEnumTest::RunL() +/** + Handles completed async operations + */ + { + CActiveScheduler::Stop(); + + iSmsTest(iStatus.Int() == KErrNone); + + iSmsTest.SetProgressL(*iOperation); + + switch (iState) + { + case EStateEnumerating: + { + DoRunEnumerateL(); + break; + } + case EStateEnumeratingAndDescLength: + { + DoRunEnumerateAndDescLengthL(); + } break; + case EStateCopyFromSim: + case EStateMoveFromSim: + case EStateDeleteFromSim: + { + DoRunCopyMoveDeleteFromSim(); + break; + } + case EStateCopyToSim: + { + DoRunCopyToSim(); + break; + } + case EStateClearInbox: + { + DoRunClearInbox(); + break; + } + default: + { + break; + } + } + + delete iOperation; + iOperation = NULL; + } + +TInt CSmsEnumTest::ErrorStatus() + { + if (iStatus.Int() == KErrNone) + return(iSmsTest.iProgress.iError); + else + return(iStatus.Int()); + } + +void CSmsEnumTest::DoRunClearInbox() +/** + Checks status + */ + { + TInt err = iStatus.Int(); + iSmsTest.Printf(_L("Clear Inbox completed with error %d\n"), err); + iState = EStateWaiting; + } + +void CSmsEnumTest::DoRunCopyToSim() +/** + Checks status + */ + { + iSmsTest.Printf(_L("Copy To SIM completed with error %d\n"), ErrorStatus()); + + iState = EStateWaiting; + + if (!iSmsTest.RunAuto()) + { + iSmsTest.Printf(_L("\nPress any key to continue...\n")); + iSmsTest.Test().Getch(); + } + } + +void CSmsEnumTest::DoRunMoveToSim() +/** + Checks status + */ + { + iSmsTest.Printf(_L("Move To SIM completed with error %d\n"), ErrorStatus()); + + iState = EStateWaiting; + + if (!iSmsTest.RunAuto()) + { + iSmsTest.Printf(_L("\nPress any key to continue...\n")); + iSmsTest.Test().Getch(); + } + } + +void CSmsEnumTest::DoRunCopyMoveDeleteFromSim() +/** + Checks status + */ + { + switch (iState) + { + case EStateCopyFromSim: + iSmsTest.Printf(_L("Copy From SIM completed with error %d\n"), ErrorStatus()); + break; + case EStateMoveFromSim: + iSmsTest.Printf(_L("Move From SIM completed with error %d\n"), ErrorStatus()); + break; + case EStateDeleteFromSim: + iSmsTest.Printf(_L("Delete From SIM completed with error %d\n"), ErrorStatus()); + break; + default: + break; + } + + iState = EStateWaiting; + + if (!iSmsTest.RunAuto()) + { + iSmsTest.Printf(_L("\nPress any key to continue...\n")); + iSmsTest.Test().Getch(); + } + } + +void CSmsEnumTest::DoRunEnumerateL() +/** + Checks status + */ + { + TInt err = iStatus.Int(); + + if (err == KErrNone) + { + err = iSmsTest.iProgress.iError; + iStatus = err; + + if (err == KErrNone) + { + MsvEntry().SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + + iSmsTest.Printf(_L("%d message(s) on SIM. %d message(s) now contained in folder %d.\n"), iSmsTest.iProgress.iMsgCount, iSelection->Count(), iSmsTest.iProgress.iEnumerateFolder); + iSmsTest.DisplayMessagesL(*iSelection); + } + } + + iSmsTest.Printf(_L("Enumerate SIM completed with %d\n"), err); + iState = EStateWaiting; + + CheckParentAfterEnumerateL(); + + delete iOperation; + iOperation = NULL; + + if (!iSmsTest.RunAuto()) + { + iSmsTest.Printf(_L("\nPress any key to continue...\n")); + iSmsTest.Test().Getch(); + + if (iSmsTest.iProgress.iMsgCount) + ShowMenuAfterEnumerateL(); + } + } + +void CSmsEnumTest::DoRunEnumerateAndDescLengthL() + { + // Print out messages and check that the description is only a char in length + TInt err = iStatus.Int(); + + if (err == KErrNone) + { + err = iSmsTest.iProgress.iError; + iStatus = err; + + if (err == KErrNone) + { + MsvEntry().SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + + iSmsTest.Printf(_L("%d message(s) on SIM. %d message(s) now contained in folder %d.\n"), iSmsTest.iProgress.iMsgCount, iSelection->Count(), iSmsTest.iProgress.iEnumerateFolder); + TInt count = iSelection->Count(); + + for (TInt i = 0; i < count && err==KErrNone; ++i) + { + // Display the message and then check the description + TMsvId id = (*iSelection)[i]; + iSmsTest.DisplayMessageL(id); + + iSmsTest.SetEntryL(id); + if( iSmsTest.Entry().iDescription.Length() != 1 ) + err = KErrCorrupt; + } + } + } + + iSmsTest.Printf(_L("Enumerate SIM completed with %d\n"), err); + iState = EStateWaiting; + + CheckParentAfterEnumerateL(); + + delete iOperation; + iOperation = NULL; + + if (!iSmsTest.RunAuto()) + { + iSmsTest.Printf(_L("\nPress any key to continue...\n")); + iSmsTest.Test().Getch(); + + if (iSmsTest.iProgress.iMsgCount) + ShowMenuAfterEnumerateL(); + } + + // Restore the description length + iSmsTest.SetEntryL(iSmsTest.iSmsServiceId); + + CSmsAccount* account = CSmsAccount::NewLC(); + account->LoadSettingsL(*iSmsTest.iServiceSettings); + + // Set the description length to default + iSmsTest.iServiceSettings->SetDescriptionLength(KSmsDescriptionLength); + + // Store the sms settings + account->SaveSettingsL(*iSmsTest.iServiceSettings); + CleanupStack::PopAndDestroy(account); + } + +void CSmsEnumTest::CheckParentAfterEnumerateL() + { + if (iLastEnumerateFolder.Length() == 0) + { + iSmsTest.SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + const TMsvId parent = iSmsTest.Entry().Parent(); + if (parent != iSmsTest.iSmsServiceId) + { + iSmsTest.Printf(_L("Parent of enum folder is not the SMS service [parent=%d folder=%d service=%d]\n"), + parent, iSmsTest.iProgress.iEnumerateFolder, iSmsTest.iSmsServiceId); + User::Leave(KErrGeneral); + } + } + else if (iSmsTest.iProgress.iEnumerateFolder != iLastEnumerateFolder()) + { + iSmsTest.Printf(_L("Folder does not match [folder=%d request=%d]\n"), + iSmsTest.iProgress.iEnumerateFolder, iLastEnumerateFolder()); + User::Leave(KErrGeneral); + } + } + +void CSmsEnumTest::ShowMenuAfterEnumerateL() +/** + Shows menu after enumerating + */ + { + iSmsTest.ResetMenu(); + + iSmsTest.AppendToMenuL(_L("Copy From Sim To Inbox")); + iSmsTest.AppendToMenuL(_L("Move From Sim To Inbox")); + iSmsTest.AppendToMenuL(_L("Delete From Sim")); + + TInt result = iSmsTest.DisplayMenu(_L("What to do with enumerated messages?")); + + if (result <= 0) + return; + + switch (result) + { + case 1: + TestCopyFromSimL(); + break; + case 2: + TestMoveFromSimL(); + break; + case 3: + TestDeleteFromSimL(); + break; + default: + User::Leave(KErrArgument); + break; + } + } + +void CSmsEnumTest::DoCancel() +/** + Cancels the async operation + */ + { + if (iOperation) + { + iOperation->Cancel(); + iSmsTest.Printf(_L("Operation Cancelled!\n")); + } + else + { + iSmsTest.Printf(_L("No operation to cancel!\n")); + } + + delete iOperation; + iOperation = NULL; + } + +void CSmsEnumTest::TestDeleteRemoteEntryL() +/** + Tests deleting remote entries + */ + { + iSmsTest.Test().Next(_L("Test Delete Remote Entry\n")); + + CMsvOperationWait* wait = CMsvOperationWait::NewLC(); + wait->Start(); + + iSmsTest.SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + iSmsTest.SetEntryL(iSmsTest.Entry().Parent()); + + CMsvOperation* op = iSmsTest.iMsvEntry->DeleteL(iSmsTest.iProgress.iEnumerateFolder, wait->iStatus); + CleanupStack::PushL(op); + + CActiveScheduler::Start(); + + iSmsTest.Printf(_L("Remote DeleteL() completed with %d\n"), wait->iStatus.Int()); + + User::LeaveIfError(wait->iStatus.Int()); + + iSmsTest.SetProgressL(*op); + + iSmsTest.Printf(_L("Operation completed with %d, msg count %d\n"), iSmsTest.iProgress.iError, iSmsTest.iProgress.iMsgCount); + User::LeaveIfError(iSmsTest.iProgress.iError); + + CleanupStack::PopAndDestroy(2); //wait, op + } + +void CSmsEnumTest::TestUnreadStatusL() +/** + Tests that the unread flag of any messaged on the SIM is propagated + to the entries created in the class 2 folder + + These should have the Unread() flag SET after the first enumeration. + */ + { + iSmsTest.Test().Next(_L("Test Unread Status\n")); + + MsvEntry().SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + + TInt count = iSelection->Count(); + TInt status = KErrNone; + + while (count--) + { + MsvEntry().SetEntryL(iSelection->At(count)); + if (!MsvEntry().Entry().Unread()) + { + status = KErrCorrupt; + break; + } + } + + iSmsTest.Printf(_L("TestUnreadStatusL() completed with %d\n"), status); + User::LeaveIfError(status); + } + +void CSmsEnumTest::TestReadStatusL() +/** + Tests that the unread flag of any messaged on the SIM is propagated + to the entries created in the class 2 folder + + These should have the Unread() flag UNSET after the second enumeration. + */ + { + iSmsTest.Test().Next(_L("Test Unread Status\n")); + + MsvEntry().SetEntryL(iSmsTest.iProgress.iEnumerateFolder); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + + TInt count = iSelection->Count(); + TInt status = KErrNone; + + while (count--) + { + MsvEntry().SetEntryL(iSelection->At(count)); + if (MsvEntry().Entry().Unread()) + { + status = KErrCorrupt; + break; + } + } + + iSmsTest.Printf(_L("TestReadStatusL() completed with %d\n"), status); + User::LeaveIfError(status); + } + +void CSmsEnumTest::TestPhoneStoreStatusL(TMsvId aFolderId) +/** + Tests that the messages in the specified folder have the storage + set to ESmsPhoneStorage and have no iSlotArray members. + */ + { + iSmsTest.Test().Next(_L("Test Phone Store Status\n")); + + MsvEntry().SetEntryL(aFolderId); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + + TInt count = iSelection->Count(); + TInt status = KErrNone; + + while (count--) + { + MsvEntry().SetEntryL(iSelection->At(count)); + CMsvStore* store = MsvEntry().ReadStoreL(); + CleanupStack::PushL(store); + iHeader->RestoreL(*store); + CSmsMessage& smsmessage = iHeader->Message(); + + if ((smsmessage.iSlotArray.Count() > 0) || + (smsmessage.Storage() != CSmsMessage::ESmsPhoneStorage)) + { + status = KErrCorrupt; + } + + CleanupStack::PopAndDestroy(store); + } + + iSmsTest.Printf(_L("TestPhoneStoreStatusL() completed with %d\n"), status); + User::LeaveIfError(status); + } + +void CSmsEnumTest::TestSimStoreStatusL(TMsvId aFolderId) +/** + Tests that the messages in the specified folder have the storage + set to ESmsSimStorage and have at least 1 iSlotArray member. + */ + { + iSmsTest.Test().Next(_L("Test Sim Store Status\n")); + + MsvEntry().SetEntryL(aFolderId); + + delete iSelection; + iSelection = NULL; + iSelection = MsvEntry().ChildrenL(); + + TInt count = iSelection->Count(); + TInt status = KErrNone; + + while (count--) + { + MsvEntry().SetEntryL(iSelection->At(count)); + CMsvStore* store = MsvEntry().ReadStoreL(); + CleanupStack::PushL(store); + iHeader->RestoreL(*store); + CSmsMessage& smsmessage = iHeader->Message(); + + if ((smsmessage.iSlotArray.Count() < 1) || + (smsmessage.Storage() != CSmsMessage::ESmsSIMStorage)) + { + status = KErrCorrupt; + } + + CleanupStack::PopAndDestroy(store); + } + + iSmsTest.Printf(_L("TestSimStoreStatusL() completed with %d\n"), status); + User::LeaveIfError(status); + }