diff -r 000000000000 -r 8e480a14352b messagingfw/msgtest/integration/sms/src/T_SmsSendRecv.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtest/integration/sms/src/T_SmsSendRecv.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,691 @@ +// 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_SmsSendRecv.h" +#include +#include +#include +#include +#include "biosmtm.h" +#include + +CEntryObserver* CEntryObserver::NewL(CSmsTestUtils& aTestUtils, const TInt& aCurrentMessageNum) + { + CEntryObserver* self = new (ELeave) CEntryObserver(aTestUtils, aCurrentMessageNum); + CleanupStack::PushL(self); + self->iReceived = new (ELeave) CMsvEntrySelection(); + CleanupStack::Pop(self); + return self; + } + +CEntryObserver::CEntryObserver(CSmsTestUtils& aTestUtils, const TInt& aCurrentMessageNum) +: CBase(), iCurrentMessageNum(aCurrentMessageNum), iSmsTest(aTestUtils) + { + } + + +CEntryObserver::~CEntryObserver() + { + delete iReceived; + } + +void CEntryObserver::HandleEntryEventL(TMsvEntryEvent aEvent, TAny* aArg1, TAny* /*aArg2*/, TAny* /*aArg3*/) + { + if (aEvent == EMsvNewChildren && iCurrentMessageNum > -1) + { + CMsvEntrySelection* msgs = (CMsvEntrySelection*)aArg1; + + TInt count = msgs->Count(); + + TInt msgRecv = 0; + + while (count--) + { + TMsvId id = (*msgs)[count]; + + CSmsHeader* header = iSmsTest.GetHeaderLC(id); + + if (header->Type() == CSmsPDU::ESmsDeliver) + { + iReceived->AppendL(id); + msgRecv++; + } + + CleanupStack::PopAndDestroy(header); + } + + if (msgRecv) + iSmsTest.Printf(_L("%d Messages Received in inbox\n"), msgRecv); + } + } + +CSmsSendRecvTest::~CSmsSendRecvTest() + { + delete iEntryObserver; + delete iEntryForObserver; + } + +CSmsSendRecvTest* CSmsSendRecvTest::NewLC(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest) + { + CSmsSendRecvTest* self = new (ELeave) CSmsSendRecvTest(aSmsTest, aScriptFile, aNextTest); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + + +void CSmsSendRecvTest::TestSendingL() + { + iSmsTest.Test().Next(_L("Sending")); + + TTime now; + now.HomeTime(); + now += (TTimeIntervalSeconds) 5; + + iSelection->Reset(); + + iSmsTest.DeleteSmsMessagesL(KMsvGlobalOutBoxIndexEntryId); + + TBool read = EFalse; + iSmsTest.Printf(_L("Creating msgs in outbox from script:")); + iSmsTest.Printf(iScriptFile); + TRAPD(err, read = iSmsTest.ReadScriptL(iScriptFile, KMsvGlobalOutBoxIndexEntryId, *iSelection, now)); + + iSmsTest.Test()(!err && read); + + iSmsTest.Printf(_L("Send and Receive %d messages...\n"), iSelection->Count()); + + TInt count = iSelection->Count(); + iTotal = 0; + iSent = 0; + while (count--) + { + iTotal += CountRecipientsL(iSelection->At(count)); + } + + iCurrentMessageNum = -1; + } + +TInt CSmsSendRecvTest::CountRecipientsL(TMsvId aId) + { + CSmsHeader* header = iSmsTest.GetHeaderLC(aId); + const TInt count = header->Recipients().Count(); + CleanupStack::PopAndDestroy(header); + return count; + } + +TBool CSmsSendRecvTest::SendNextMessageL() + { + iCurrentMessageNum++; + const TInt count = iSelection->Count(); + + if (iCurrentMessageNum < count) + { + iSmsTest.Printf(_L("Sending message %d of %d\n"), iCurrentMessageNum + 1, count); + + + delete iOperation; + iOperation = NULL; + + CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection(); + CleanupStack::PushL(sel); + const TMsvId id = iSelection->At(iCurrentMessageNum); + sel->AppendL(id); + iSent += CountRecipientsL(id); + iSmsTest.SetEntryL(KMsvGlobalOutBoxIndexEntryId); + iOperation = MsvEntry().CopyL(*sel, iSmsTest.iSmsServiceId, iStatus); + CleanupStack::PopAndDestroy(); //sel + + iState = EStateSending; + SetActive(); + CActiveScheduler::Start(); + return ETrue; + } + + return EFalse; + } + +void CSmsSendRecvTest::TestWaitForReceiveL() + { + iSmsTest.Test().Next(_L("Waiting to receive message")); + iState = EStateWaitingToReceive; + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + +CSmsSendRecvTest::CSmsSendRecvTest(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest) +: CSmsTestBase(aSmsTest, aScriptFile, aNextTest), iCurrentMessageNum(-1), iState(EStateWaiting) + { + TBuf<256> command; + User::CommandLine(command); + command.Trim(); + iParse = (command.FindF(KParseAfterReceive) != KErrNotFound); + iSaveToFile = (command.FindF(KSaveAfterReceive) != KErrNotFound); + iTestBifs = (command.FindF(KTestBifs) != KErrNotFound); + iWaitForever = (command.FindF(KWaitForever) != KErrNotFound); + } + +void CSmsSendRecvTest::RunAutoL() + { + if (!iSmsTest.iSmokeTest && iTestBifs) + { + iSmsTest.TestStart(++iNextTest, _L("Add Remove Bifs")); + TestBifsL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + } + + iSmsTest.TestStart(++iNextTest, _L("Read Script")); + TestSendingL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + FOREVER + { + iSmsTest.TestStart(++iNextTest, _L("Send Message")); + TBool sendNext = SendNextMessageL(); + if (sendNext) + { + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + } + else + { + iSmsTest.Printf(_L("No more messages to send!")); + iSmsTest.TestFinish(iNextTest, KErrNone); + break; + } + } + + iSmsTest.TestStart(++iNextTest, _L("Wait to receive extra message(s)")); + WaitForExtraL(); + User::LeaveIfError(iStatus.Int()); + iSmsTest.TestFinish(iNextTest, KErrNone); + + iSmsTest.Printf(_L("\nDisplay Final Log:\n")); + DisplayLogL(); + } + +void CSmsSendRecvTest::ConstructL() + { + SetTestNameL(KSmsSendRecvTestName); + iSmsTest.SetLogToFile(); + + TBuf<256> command; + User::CommandLine(command); + command.Trim(); + iSmsTest.Printf(_L("Command Line: \"%S\" (Parse %d, Save %d, Wait %d, Bifs %d)\n"), &command, iParse, iSaveToFile, iWaitForever, iTestBifs); + + iSelection = new (ELeave) CMsvEntrySelection(); + iTimer = CTestTimer::NewL(); + CActiveScheduler::Add(this); + + iSmsTest.SetCommDbServiceCenterFromScriptL(iScriptFile); + + iEntryObserver = CEntryObserver::NewL(iSmsTest, iCurrentMessageNum); + iEntryForObserver = Session().GetEntryL(KMsvGlobalInBoxIndexEntryId); + iEntryForObserver->AddObserverL(*iEntryObserver); + + ClearLogL(); + } + +void CSmsSendRecvTest::ShowMenuL() + { + iSmsTest.ResetMenu(); + + iSmsTest.AppendToMenuL(_L("Start")); + iSmsTest.AppendToMenuL(_L("Display Log")); + iSmsTest.AppendToMenuL(_L("Clear Log")); + + TInt result = iSmsTest.DisplayMenu(_L("SMS Send Receive Test")); + + if (result <= 0) + return; + + switch (result) + { + case 1: + RunAutoL(); + return; + case 2: + DisplayLogL(); + break; + case 3: + ClearLogL(); + break; + default: + User::Leave(KErrArgument); + break; + } + + ShowMenuL(); + } + +void CSmsSendRecvTest::RunComplete() + { + if (!IsActive()) + CActiveScheduler::Stop(); + } + +void CSmsSendRecvTest::RunL() + { + switch (iState) + { + case EStateSending: + { + DoRunSendingL(); + delete iOperation; + iOperation = NULL; + break; + } + case EStateWaitingToReceive: + { + DoRunWaitingToReceiveL(); + break; + } + case EStateWaitingToReceiveAnyExtra: + { + DoRunWaitForExtraL(); + break; + } + case EStateMessageReceived: + { + TestParseL(); + break; + } + case EStateParsing: + { + DoRunTestParseL(); + break; + } + default: + { + break; + } + } + + RunComplete(); + } + +TInt CSmsSendRecvTest::RunError(TInt aError) + { + aError = CSmsTestBase::RunError(aError); + RunComplete(); + return aError; + } + +void CSmsSendRecvTest::DoRunTestParseL() + { + TBioProgress progress; + TBioProgressBuf progressBuf; + progressBuf.Copy(iOperation->ProgressL()); + progress = progressBuf(); + + if (iStatus == KErrNone) + iStatus = progress.iErrorCode; + + delete iOperation; + iOperation = NULL; + } + +void CSmsSendRecvTest::TestParseL() + { + const TMsvId id = iEntryObserver->LastReceived(); + + iSmsTest.SetEntryL(id); + + if (iSaveToFile) + { + iSmsTest.Printf(_L("Saving BIO message to file\n")); + iSmsTest.SaveBodyToFileL(id); + } + + CSmsHeader* header = iSmsTest.GetHeaderLC(id); + CSmsDeliver& pdu = header->Deliver(); + + TBool found = EFalse; + TInt destination, originator, is16Bit; + destination = originator = is16Bit = 0; + if (pdu.UserDataPresent()) + { + const CSmsUserData& userData = pdu.UserData(); + TInt count = userData.NumInformationElements(); + iSmsTest.Printf(_L("Pdu contains %d information elements\n"), count); + while (!found && count--) + { + CSmsInformationElement& nextIE=userData.InformationElement(count); + switch(nextIE.Identifier()) + { + case CSmsInformationElement::ESmsIEIApplicationPortAddressing8Bit: + case CSmsInformationElement::ESmsIEIApplicationPortAddressing16Bit: + { + pdu.ApplicationPortAddressing(destination, originator, &is16Bit); + found = ETrue; + break; + } + default: + break; + } + } + } + + CleanupStack::PopAndDestroy(header); + + if (found) + iSmsTest.Printf(_L("Application Port Addressing: Dest %d, Origin %d, is16Bit %d\n"), destination, originator, is16Bit); + else + iSmsTest.Printf(_L("Application Port Addressing: Not Found\n")); + + if (!iParse) + return; + + if (!iSmsTest.Entry().iBioType) + return; + + iState = EStateParsing; + + iSmsTest.Printf(_L("Parsing BIO message\n")); + + CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection(); + CleanupStack::PushL(sel); + + sel->AppendL(id); + + delete iOperation; + iOperation = NULL; + + iOperation = Session().TransferCommandL(*sel, KBiosMtmParse, KNullDesC8, iStatus); + SetActive(); + + CleanupStack::PopAndDestroy(sel); + } + +void CSmsSendRecvTest::DoCancel() + { + if (iOperation) + { + iOperation->Cancel(); + iSmsTest.Printf(_L("Operation Cancelled!\n")); + } + delete iOperation; + iOperation = NULL; + } + +void CSmsSendRecvTest::DoRunSendingL() + { + if (iOperation) + iSmsTest.SetProgressL(*iOperation); + + TInt count = iSelection->Count(); + TBool wait = EFalse; + + while (iStatus == KErrNone && count--) + { + TRAPD(err, iSmsTest.SetEntryL(iSelection->At(count))); + + if (err == KErrNone) + { + TMsvEntry entry = MsvEntry().Entry(); + iSmsTest.SetEntryL(KMsvGlobalOutBoxIndexEntryId); + + TBuf<0x100> output; + TBuf<0x50> nowBuf; + + switch (entry.SendingState()) + { + case KMsvSendStateSending: + output.AppendFormat(_L("Message %d Sending with error %d\n"), entry.Id(), entry.iError); + wait = ETrue; + break; + case KMsvSendStateResend: + output.AppendFormat(_L("Message %d Resend at "), entry.Id()); + entry.iDate.FormatL(nowBuf, _L("%-B%:0%J%:1%T%:2%S%:3%+B")); + output.Append(nowBuf); + output.Append(_L("\n")); + wait = ETrue; + break; + case KMsvSendStateScheduled: + output.AppendFormat(_L("Message %d Scheduled at "), entry.Id()); entry.iDate.FormatL(nowBuf, _L("%-B%:0%J%:1%T%:2%S%:3%+B")); + entry.iDate.FormatL(nowBuf, _L("%-B%:0%J%:1%T%:2%S%:3%+B")); + output.Append(nowBuf); + output.Append(_L("\n")); + wait = ETrue; + break; + case KMsvSendStateFailed: + output.AppendFormat(_L("Message %d Failed with error %d\n"), entry.Id(), entry.iError); + if (entry.iError) + iStatus = entry.iError; + else + iStatus = KErrGeneral; + + break; + case KMsvSendStateWaiting: + output.AppendFormat(_L("Message %d Waiting with error %d\n"), entry.Id(), entry.iError); + wait = ETrue; + break; + case KMsvSendStateSent: + default: + break; + //nothing + } + + iSmsTest.Printf(output); + } + } + + if (wait) + { + iTimer->AfterReq(10000000, iStatus); + SetActive(); + iState = EStateSending; +// CActiveScheduler::Start(); + } + else + { + iSmsTest.Printf(_L("Sending completed with %d\n"), iStatus); + + if (iStatus == KErrNone) + { + TestWaitForReceiveL(); + } + else + { + iState = EStateWaiting; + } + } + } + +void CSmsSendRecvTest::WaitForExtraL() + { + iSmsTest.Printf(_L("Waiting for any extra to arrive...\n")); + iWaitForever = EFalse; + iCountWaits = 0; + iState = EStateWaitingToReceiveAnyExtra; + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + CActiveScheduler::Start(); + } + +void CSmsSendRecvTest::DoRunWaitForExtraL() + { + iCountWaits++; + + TInt recvCount = iEntryObserver->Count(); + + if (recvCount > iSent) + { + iSmsTest.Printf(_L("Too many messages received:\nSent %d Rcvd %d\n"), iSent, recvCount); + iStatus = KErrOverflow; + } + else + DoWaitL(); + } + +void CSmsSendRecvTest::DoRunWaitingToReceiveL() + { + iCountWaits++; + + const TInt recvCount = iEntryObserver->Count(); + + if (recvCount == iSent) + { + //Message received + if (!iSmsTest.AreMessagesSameTextL((*iSelection)[iCurrentMessageNum], iEntryObserver->Received(iSent - 1), ETrue)) + { + //Do something? + } + } + + if (recvCount > iSent) + { + iSmsTest.Printf(_L("Too many messages received:\nSent %d Rcvd %d\n"), iSent, recvCount); + iStatus = KErrOverflow; + } + else + { + if (iTotal == recvCount || recvCount == iSent) + { + if (iTotal == recvCount) + iSmsTest.Printf(_L("All Messages Received!!\n")); + + //Message received + iState = EStateMessageReceived; + iCountWaits = 0; + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + else + { + DoWaitL(); + } + } + } + +void CSmsSendRecvTest::DoWaitL() + { + TInt recvCount = iEntryObserver->Count(); + + TInt maxCount = KMaxWaitForMsg.Int() / KWaitForReceiveIteration.Int(); + TInt waitSecs = KWaitForReceiveIteration.Int() * (maxCount - iCountWaits) / 1000000; + + if (iWaitForever && iCountWaits <= 1) + { + iSmsTest.Printf(_L("Waiting forever to recv msg\n")); + } + else if (!iWaitForever) + { + iSmsTest.Printf(_L("Waiting %d secs to recv msg\n"), waitSecs); + } + + if (iWaitForever || iCountWaits < maxCount) + { + iTimer->AfterReq(KWaitForReceiveIteration, iStatus); + SetActive(); + } + else + { + if (iSent != recvCount) + { + iSmsTest.Printf(_L("Time Out: Message NOT Received\n")); + iStatus = KErrTimedOut; + } + } + } + +void CSmsSendRecvTest::TestBifsL() + { + iSmsTest.Printf(_L("Remove 2 Bifs if already exist\n")); + TestRemoveBifL(KTestBif1); + TestRemoveBifL(KTestBif2); + + //Test add bif + iSmsTest.Printf(_L("Test Add 2 Bifs\n")); + TestAddBifL(KTestBif1); + TestAddBifL(KTestBif2); + + //Test remove bif + iSmsTest.Printf(_L("Test Remove 2 Bifs\n")); + TestRemoveBifL(KTestBif1); + TestRemoveBifL(KTestBif2); + + //Test change bif + iSmsTest.Printf(_L("Test Change 2 Bifs\n")); + TestAddBifL(KTestBif1); + TestAddBifL(KTestBif2); + TestAddBifL(KTestBif1); + TestAddBifL(KTestBif2); + + //Test remove bif + iSmsTest.Printf(_L("Test Remove 2 Bifs\n")); + TestRemoveBifL(KTestBif1); + TestRemoveBifL(KTestBif2); + } + +void CSmsSendRecvTest::TestAddBifL(const TDesC& aBifName) + { + iSmsTest.Printf(_L("\tAdd BIF: %S\n"), &aBifName); + + RFs& fs = iSmsTest.FileSession(); + TInt err = fs.MkDir(KBifDir); + + if (err != KErrAlreadyExists) + User::LeaveIfError(err); + + TParse fileOut; + err = iSmsTest.ResolveFile(KSmsComponent, aBifName, fileOut); + + if (err) + { + iSmsTest.Printf(_L("Test BIF %S not found! Continuing without this test\n"), &aBifName); + return; + } + + CFileMan* fileMan = CFileMan::NewL(fs); + CleanupStack::PushL(fileMan); + + err = fileMan->Copy(fileOut.FullName(), KBifDir); + + if (err != KErrAlreadyExists) + User::LeaveIfError(err); + + CleanupStack::PopAndDestroy(fileMan); + + User::After(KBifWait); + } + +void CSmsSendRecvTest::TestRemoveBifL(const TDesC& aBifName) + { + iSmsTest.Printf(_L("\tRemove Bif: %S\n"), &aBifName); + + RFs& fs = iSmsTest.FileSession(); + TFileName fileName(KBifDir); + fileName.Append(aBifName); + + TInt err = fs.Delete(fileName); + + if (err) + { + iSmsTest.Printf(_L("\t\tfs.Delete() returned %d\n"), err); + + if (err != KErrNotFound && err != KErrPathNotFound) + User::Leave(err); + } + + User::After(KBifWait); + } +