messagingappbase/smsmtm/test/src/T_SmsSendText.cpp
changeset 23 238255e8b033
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/smsmtm/test/src/T_SmsSendText.cpp	Fri Apr 16 14:56:15 2010 +0300
@@ -0,0 +1,443 @@
+// 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_SmsSendText.h"
+#include <smuthdr.h>
+#include <txtrich.h>
+
+#include <testconfigfileparser.h>
+#include <simtsy.h>
+#include <smsuaddr.h>
+#include <e32property.h>
+#include <msvtestutils.h>
+RTest test(_L("T_SmsSendText Testrig"));
+CTrapCleanup* theCleanup;
+
+CSmsSendTextTest::~CSmsSendTextTest()
+/**
+	destructor
+ */
+	{
+          //	delete iTextSession;
+	}
+
+void CSmsSendTextTest::TestSendingL()
+/**
+	Tests Sending
+ */
+	{
+	DoTestSendingL(iScriptFile);
+	}
+
+void SetTestNumberL(TInt aTestNumber)
+  	{
+  	test.Printf(_L("Changing the Test Number to %d\n"), aTestNumber);
+	TInt testState;
+	TInt error = RProperty::Get(KUidSystemCategory, KUidSASimTsyTestNumberValue, testState);
+	if(KErrNone != error)
+		{
+		User::LeaveIfError(RProperty::Define(KUidSystemCategory, KUidSASimTsyTestNumberValue, RProperty::EInt));
+		}
+	User::LeaveIfError(RProperty::Set(KUidSystemCategory, KUidSASimTsyTestNumberValue, aTestNumber));
+  	}
+
+void CSmsSendTextTest::RunAutoL()
+/**
+	Runs tests in sequence, checks iStatus
+ */
+	{
+	SetTestNumberL(0);
+
+	iSmsTest.TestStart(++iNextTest);
+	TestSendNoRecipientsL();
+	User::LeaveIfError(iStatus.Int());
+	iSmsTest.TestFinish(iNextTest, KErrNone);
+
+	CSmsSendTestBase::RunAutoL();
+	}
+
+void CSmsSendTextTest::RunL()
+/**
+	Handles completed async operations
+ */
+	{
+	if (iOperation)
+		iSmsTest.SetProgressL(*iOperation);
+
+	switch (iSendTextTestState)
+		{
+		case EStateSendNoRecipients:
+			DoRunSendNoRecipientsL();
+			break;
+		default:
+			CSmsSendTestBase::RunL();
+			break;
+		}
+	}
+
+void CSmsSendTextTest::TestSendNoRecipientsL()
+/**
+	Tests sending with no receipients.
+	The error -1 (KErrNotFound) is expected.
+ */
+	{
+	iState = EStateOther;
+	iSendTextTestState = EStateSendNoRecipients;
+
+	iSmsTest.Test().Next(_L("Sending No Recipients"));
+
+	iSmsTest.DeleteSmsMessagesL(KMsvGlobalOutBoxIndexEntryId);
+
+	TTime now;
+	now.HomeTime();
+	now += (TTimeIntervalSeconds) 5;
+
+	iSelection->Reset();
+
+	TBool read = EFalse;
+	TRAPD(err, read = iSmsTest.ReadScriptL(iScriptFile, KMsvGlobalOutBoxIndexEntryId, *iSelection, now));
+
+	iSmsTest.Test()(!err && read);
+
+
+	//Remove Recipients
+	TInt count = iSelection->Count();
+
+	CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *iSmsTest.iRichText);
+	CleanupStack::PushL(header);
+
+	while (count--)
+		{
+		iSmsTest.SetEntryL(iSelection->At(count));
+		CMsvStore* store = iSmsTest.EditStoreL();
+		CleanupStack::PushL(store);
+
+		header->RestoreL(*store);
+
+		header->Recipients().ResetAndDestroy();
+
+		header->StoreL(*store);
+		store->CommitL();
+
+		CleanupStack::PopAndDestroy(); //store
+		}
+
+	CleanupStack::PopAndDestroy(); //header
+
+	iSmsTest.SetEntryL(KMsvGlobalOutBoxIndexEntryId);
+
+	delete iOperation;
+	iOperation = NULL;
+	iOperation = MsvEntry().CopyL(*iSelection, iSmsTest.iSmsServiceId, iStatus);
+		
+	SetActive();
+	CActiveScheduler::Start();
+	}
+
+void CSmsSendTextTest::DoRunSendNoRecipientsL()
+/**
+	Checks the status and error.
+	The error -1 (KErrNotFound) is expected
+ */
+	{
+	CActiveScheduler::Stop();
+
+	TSmsProgress prog = iSmsTest.iProgress;
+
+	test(prog.iError == KErrNone || iStatus.Int() == KErrNone);
+	iStatus = KErrNone;
+
+	TInt error = KErrNone;
+
+	iSmsTest.DisplaySendingStatesL(*iSelection);
+	test(iSmsTest.SendingCompleteL(*iSelection, error));
+	test(error == KErrNotFound);
+
+	iState = CSmsSendTestBase::EStateWaiting;
+	iSendTextTestState = EStateWaiting;
+
+	delete iOperation;
+	iOperation = NULL;
+	}
+
+void CSmsSendTextTest::TestSchedulingL()
+/**
+	Tests schedule sending
+ */
+	{
+	DoTestSchedulingL(iScriptFile);
+	}
+
+
+CSmsSendTextTest::CSmsSendTextTest(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aCurrentTest)
+: CSmsSendTestBase(aSmsTest, aScriptFile, aCurrentTest)
+/**
+	Constructor
+ */
+	{
+	}
+
+LOCAL_C void doMainL()
+	{
+	// Copying the config file to the root directory
+
+	_LIT(KFileName,"config.txt");
+	_LIT(KFileName2,"\\msgtest\\sms\\sms.script");
+	
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+
+	fs.SetSessionPath(_L("c:\\"));
+	fs.Delete(KFileName);					//< Ignore Error
+
+	CFileMan* fileMan = CFileMan::NewL(fs);
+	CleanupStack::PushL(fileMan);
+
+	User::LeaveIfError(fileMan->Copy(KFileName2, KFileName));
+
+	CleanupStack::PopAndDestroy(fileMan);
+	CleanupStack::PopAndDestroy(&fs);
+
+	// Open the socket server
+
+	RSocketServ serv;
+	RSocket socket;
+
+	User::LeaveIfError(serv.Connect());
+	CleanupClosePushL(serv);
+	
+	TProtocolDesc protoinfo;
+	TProtocolName protocolname(KSmsDatagram);
+	User::LeaveIfError(serv.FindProtocol(protocolname,protoinfo));
+	User::LeaveIfError(socket.Open(serv,protoinfo.iAddrFamily,protoinfo.iSockType,protoinfo.iProtocol));
+
+	TSmsAddr smsaddr;
+	smsaddr.SetSmsAddrFamily(ESmsAddrSendOnly);
+	User::LeaveIfError(socket.Bind(smsaddr));
+
+	CleanupClosePushL(socket);
+
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+	CleanupStack::PushL(scheduler);
+	CActiveScheduler::Install( scheduler );
+
+	CSmsTestUtils* smsTest = CSmsTestUtils::NewL(test);
+	CleanupStack::PushL(smsTest);
+	TInt nextTest = 0;
+
+	smsTest->NotifySaPhoneOnL();
+	smsTest->WaitForInitializeL();
+
+	CSmsSendTextTest* textTest = CSmsSendTextTest::NewL(*smsTest, KSmsScript, nextTest);
+	CleanupStack::PushL(textTest);
+
+	textTest->StartL();
+
+	CleanupStack::PopAndDestroy(3); //SmsTest, scheduler, textTest
+
+	CleanupStack::PopAndDestroy(&socket);
+	CleanupStack::PopAndDestroy(&serv);
+	}
+
+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);
+	}
+
+CSmsSendTextTest* CSmsSendTextTest::NewL(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aCurrentTest)
+	{
+	CSmsSendTextTest* self = new (ELeave) CSmsSendTextTest(aSmsTest, aScriptFile, aCurrentTest);
+	CleanupStack::PushL(self);
+
+	self->ConstructL();
+
+	CleanupStack::Pop();
+	return self;
+	}
+
+/*void CSmsSendTextTest::TestSendWithDataCallL()
+	{
+	TestConnectingL();
+	DoTestSendingL(KSmsScript);
+
+	iTextSession->Disconnect();
+	WaitForEndOfDataCallL();
+	test.Printf(_L("  Waiting 10s\n"));
+	User::After(10000000);
+	delete iTextSession;
+	iTextSession = NULL;
+	}
+
+
+ void CSmsSendTextTest::WaitForEndOfDataCallL()
+	{
+	// Connect to etel
+	RTelServer etel;
+	User::LeaveIfError(etel.Connect());
+	CleanupClosePushL(etel);
+
+	// Get tsy name
+	TName tsy;
+	FaxUtils::GetTsyNameL(tsy);
+
+	// Load the TSY
+	User::LeaveIfError(etel.LoadPhoneModule(tsy));
+
+	// Get phone for the TSY
+	RTelServer::TPhoneInfo info;
+	test(FaxUtils::GetPhoneInfoForTsyL(etel, tsy, info));
+
+	// Load the phone
+	RPhone phone;
+	User::LeaveIfError(phone.Open(etel, info.iName));
+	CleanupClosePushL(phone);
+
+	// Get data line info
+	RPhone::TLineInfo data;
+	test(GetDataLineInfoForPhoneL(phone, data));
+
+	// Open the phone line
+	RLine line;
+	User::LeaveIfError(line.Open(phone, data.iName));
+	CleanupClosePushL(line);
+
+	// Get line hook status
+	RCall::THookStatus hook;
+	User::LeaveIfError(line.GetHookStatus(hook));
+
+	// Wait until the line is on hook
+	if (hook == RCall::EHookStatusOff)
+		{
+		test.Printf(_L("  Waiting for data call to end\n"));
+		TRequestStatus status;
+		line.NotifyHookChange(status, hook);
+		User::WaitForRequest(status);
+		}
+
+	// Unload everything
+	CleanupStack::PopAndDestroy(2); // line, phone
+	User::LeaveIfError(etel.UnloadPhoneModule(tsy));
+	CleanupStack::PopAndDestroy(); // etel
+	}
+
+void CSmsSendTextTest::TestConnectingL()
+	{
+	// Create a waiter
+	CMsvOperationWait* wait = CMsvOperationWait::NewLC();
+
+	// Create text sever session
+	iTextSession = CImTextServerSession::NewL();
+
+	// Create a timer
+	CTestTimer* timer = CTestTimer::NewL();
+	CleanupStack::PushL(timer);
+
+	// Connect to the internet
+	const TInt maxCount = 5;
+	TInt count = maxCount;
+
+	CImIAPPreferences* pref = CImIAPPreferences::NewLC();
+
+	do
+		{
+		test.Printf(_L("  Connecting to the internet (attempt %d of %d, last error %d)\n"), maxCount - count + 1, maxCount, wait->iStatus.Int());
+		iTextSession->QueueConnectL(wait->iStatus,_L("pop3.demon.co.uk"), 110, *pref);
+		wait->Start();
+		CActiveScheduler::Start();
+		} while (wait->iStatus != KErrNone && count--);
+
+	CleanupStack::PopAndDestroy(pref);
+
+	// Receive stuff
+	while (wait->iStatus == KErrNone)
+		{
+		// Receive some text
+		test.Printf(_L("  Receiving data\n"));
+		iTextSession->QueueReceiveNextTextLine(wait->iStatus);
+		wait->Start();
+
+		// Start a timer - so we give up eventually - 10s
+		timer->After(10000000);
+		CActiveScheduler::Start();
+
+		// Did the timer complete?
+		if (!timer->IsActive())
+			{
+			// Cancel the outstanding request
+			iTextSession->Cancel();
+			CActiveScheduler::Start();
+			}
+		else
+			{
+			// Get the data
+			timer->Cancel();
+			TBuf8<1020> textLineNarrow;
+			TBuf<1024> textLineWide;
+			iTextSession->GetCurrentTextLine(textLineNarrow);
+			textLineWide.Copy(textLineNarrow);
+
+			// Make it look nice!
+			if (textLineWide.Length() > 0)
+				{
+				textLineWide.Insert(0, _L("  "));
+				textLineWide.Append(_L("\n"));
+				test.Printf(textLineWide);
+				}
+			}
+		}
+	
+	// Tidy up
+	test(wait->iStatus == KErrNone || wait->iStatus == KErrCancel);
+	CleanupStack::PopAndDestroy(2); // timer, wait
+	}
+
+
+
+TBool CSmsSendTextTest::GetDataLineInfoForPhoneL(RPhone& aPhone, RPhone::TLineInfo& aLineInfo)
+	{
+	// Get number of lines
+	TInt line;
+	User::LeaveIfError(aPhone.EnumerateLines(line));
+
+	// Iterate through all the lines
+	while(line--)
+		{
+		// Get line info
+		RPhone::TLineInfo lineInfo;
+		User::LeaveIfError(aPhone.GetLineInfo(line, lineInfo));
+
+		// Does it support fax?
+		if ((lineInfo.iLineCapsFlags & RLine::KCapsData) != 0)
+			{
+			aLineInfo = lineInfo;
+			break;
+			}
+		}
+
+	// Did we find a fax line on the phone?
+	return line >= 0;
+	}
+*/