--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/multimodetsy/test/Te_Echo/Te_EchoSingleTestStep.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,378 @@
+// 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:
+// This program is designed the test the data functionality of the Basic GsmTsy.
+// The files te_data and te_echo are designed as a Data and Echo server test and should
+// be run simultaneously on two EPOC machines.
+// The test scenario is outlined below:
+// Machine A (te_data.exe) Machine B (te_echo.exe)
+// 1. Dial
+// 2. Answer
+// 3. Transmit local tel. number
+// 4. Rx and log remote modem's tel. number
+// 5. Transmit Data
+// 6. Receive and then echo data
+// 7. Receive and Compare Data
+// 8. Hang up Hang up
+// 9. Pause Pause
+// 10. Dial remote modem's tel. number
+// 11. Answer
+// 13. Transmit Data
+// 14. Echo received data
+// 15. Receive and Compare Data
+// 16. Hang up Hang up
+//
+//
+
+/**
+ @file
+*/
+
+#include "Te_EchoSingleTestStep.h"
+
+_LIT(KMmtsyName,"MM");
+_LIT(KPhoneName,"GsmPhone1");
+_LIT(KCsyName, "ECUART.CSY");
+_LIT(KDataLineName,"Data");
+_LIT8(KWriteTestData,"GSM TSY Data and Echo Server Test is still in progress...");
+
+const TInt KTenSeconds=10000000;
+const TInt KTimeToWaitForRemoteEnd=2*KTenSeconds; // Twenty Seconds
+const TInt KTimeToWaitForRead=6*KTenSeconds; // Sixty Seconds
+
+CEchoTestStep::CEchoTestStep()
+ {
+ SetTestStepName(KEchoTestStepName);
+ }
+
+TVerdict CEchoTestStep::doTestStepPreambleL()
+ {
+ __UHEAP_MARK;
+
+ SetTestStepResult(EPass);
+
+ TInt ret = iTelServer.Connect();
+ if (ret!=KErrNone)
+ {
+ INFO_PRINTF1(_L("Failed to connect to telephony server"));
+ User::Leave(ret);
+ }
+ ret=iTelServer.LoadPhoneModule(KMmtsyName);
+ if (ret!=KErrNone)
+ {
+ INFO_PRINTF1(_L("Failed to load phone module"));
+ iTelServer.Close();
+ User::Leave(ret);
+ }
+ ret=iPhone.Open(iTelServer,KPhoneName) ;
+ if (ret!=KErrNone)
+ {
+ INFO_PRINTF1(_L("Failed to open phone module"));
+ iTelServer.UnloadPhoneModule(KMmtsyName);
+ iTelServer.Close();
+ User::Leave(ret);
+ }
+//
+// This test requires a mobile phone to be connected to the serial port
+// specified in the .cfg file for the initialise below to work
+//
+ ret=iPhone.Initialise();
+ if (ret!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Failed to initialise the phone (%d)"), ret);
+ iPhone.Close();
+ iTelServer.UnloadPhoneModule(KMmtsyName);
+ iTelServer.Close();
+ User::Leave(ret);
+ }
+ ret = iPhone.GetCaps(iPhoneCaps) ;
+ if ((KErrNone != ret) || !(iPhoneCaps.iFlags & RPhone::KCapsData))
+ {
+ INFO_PRINTF2(_L("This phone does not support data calls (caps=0x%x)"),iPhoneCaps.iFlags);
+ iPhone.Close();
+ iTelServer.UnloadPhoneModule(KMmtsyName);
+ iTelServer.Close();
+ User::Leave(ret);
+ }
+
+ return TestStepResult();
+ }
+
+TVerdict CEchoTestStep::doTestStepPostambleL()
+ {
+ iPhone.Close();
+ iTelServer.UnloadPhoneModule(KMmtsyName);
+ iTelServer.Close();
+
+ __UHEAP_MARKEND;
+ return TestStepResult();
+ }
+
+TVerdict CEchoTestStep::doTestStepL()
+ {
+ AnswerIncomingCallTestL();
+ User::After(KTimeToWaitForRemoteEnd);
+ DialRemoteModemTestL();
+
+ return TestStepResult();
+ }
+
+void CEchoTestStep::AnswerIncomingCallTestL()
+/**
+ * Answers an incoming data call.
+ * This method opens a data line and call, and retrieves the status of the call.
+ * It then answers an incoming call from a remote modem (initiated by t_data.exe),
+ * loans the Comm port, connects to the Comms Server, opens a serial port and proceeds
+ * to read data transmitted by the remote modem. It then echoes the received data
+ * closes the serial port, its connection to the Comms Server, the data port, call and
+ * line.
+ * Leaves if test fails
+ */
+ {
+ const TInt KExpectedBytes=51; // Number of bytes expected from remote end
+
+ RMobileLine line;
+ INFO_PRINTF1(_L("Answer incomming call"));
+ INFO_PRINTF1(_L("Opening Data Line"));
+ TEST_FOR_ERROR_L(line.Open(iPhone,KDataLineName));
+ CleanupClosePushL(line);
+
+ INFO_PRINTF1(_L("Opening New Data Call"));
+ RMobileCall dataCall;
+ TEST_FOR_ERROR_L(dataCall.OpenNewCall(line));
+ CleanupClosePushL(dataCall);
+
+ INFO_PRINTF1(_L("Get call status"));
+ RCall::TStatus callStatus;
+ TEST_FOR_ERROR_L(dataCall.GetStatus(callStatus));
+ INFO_PRINTF2(_L("Call Status = %d"),callStatus);
+
+ RMobileCall::TMobileDataCallParamsV1 callDataParams;
+ RMobileCall::TMobileDataCallParamsV1Pckg callDataParamsPckg(callDataParams);
+
+ callDataParams.iService = RMobileCall::EServiceDataCircuitAsync;
+ callDataParams.iSpeed = RMobileCall::ESpeed9600;
+ callDataParams.iProtocol = RMobileCall::EProtocolV32;
+ callDataParams.iQoS = RMobileCall::EQoSNonTransparent;
+
+ INFO_PRINTF1(_L("Answer incomming call"));
+ dataCall.AnswerIncomingCall(iStatus, callDataParamsPckg);
+ User::WaitForRequest(iStatus);
+ TEST_FOR_ERROR_L(iStatus.Int());
+
+ INFO_PRINTF1(_L("Get call status"));
+ TEST_FOR_ERROR_L(dataCall.GetStatus(callStatus));
+ INFO_PRINTF2(_L("Call Status = %d"),callStatus);
+
+ INFO_PRINTF1(_L("Loan comm port"));
+ RCall::TCommPort commPort;
+ dataCall.LoanDataPort(iStatus,commPort);
+ User::WaitForRequest(iStatus);
+ if (iStatus==KErrCommsLineFail)
+ {
+ INFO_PRINTF1(_L("This error is currently known to only happen with the Motorola"));
+ INFO_PRINTF1(_L("Time port. Please see the PhoneInfo.cpp file for more information."));
+ }
+ TEST_FOR_ERROR_L(iStatus.Int());
+
+ INFO_PRINTF1(_L("Connect to the Comms Server and load the CSY"));
+ RCommServ cs;
+ TEST_FOR_ERROR_L(cs.Connect());
+ CleanupClosePushL(cs);
+
+ TInt ret=cs.LoadCommModule(KCsyName);
+ if (!(ret==KErrNone || ret==KErrAlreadyExists))
+ {
+ FAIL_WITH_ERROR_L(ret);
+ }
+
+ INFO_PRINTF1(_L("Open a serial port"));
+ RComm port;
+ TEST_FOR_ERROR_L(port.Open(cs,commPort.iPort,ECommShared));
+ CleanupClosePushL(port);
+
+ INFO_PRINTF1(_L("Read 1st stream of data from the serial port"));
+
+ port.Read(iStatus,KTimeToWaitForRead,iRemoteNumber);
+ User::WaitForRequest(iStatus);
+ if (iStatus!=KErrNone)
+ {
+ if (iStatus==KErrTimedOut)
+ {
+ INFO_PRINTF1(_L("A Time out error occured during the read"));
+ }
+ FAIL_WITH_ERROR_L(iStatus.Int());
+ }
+ TBuf<KRemoteNum> convertTel; // Convert the 8-bit data read from serial port to
+ convertTel.Copy(iRemoteNumber); // 16-bit so that it can be displayed to the user
+ INFO_PRINTF2(_L("Data stream 1 = %S"), &convertTel);
+
+ INFO_PRINTF1(_L("Read 2nd stream of data from the serial port"));
+ TBuf8<KExpectedBytes> readData;
+ port.Read(iStatus,KTimeToWaitForRead,readData);
+ User::WaitForRequest(iStatus);
+
+ if (iStatus!=KErrNone)
+ {
+ if (iStatus==KErrTimedOut)
+ {
+ INFO_PRINTF1(_L("A Time out error occured during the read"));
+ }
+ FAIL_WITH_ERROR_L(iStatus.Int());
+ }
+ TBuf<KExpectedBytes> convertData; // Convert the 8-bit data read from serial port to
+ convertData.Copy(readData); // 16-bit so that it can be displayed to the screen
+ INFO_PRINTF2(_L("Data stream 2 = %S"),&convertData);
+
+ INFO_PRINTF1(_L("Echo the received data"));
+ port.Write(iStatus,readData);
+ User::WaitForRequest(iStatus);
+ TEST_FOR_ERROR_L(iStatus.Int());
+
+ CleanupStack::PopAndDestroy(); // closes cs
+ CleanupStack::PopAndDestroy(); // closes port
+
+ INFO_PRINTF1(_L("Recover data port"));
+ TEST_FOR_ERROR_L(dataCall.RecoverDataPort());
+
+ INFO_PRINTF1(_L("Hanging up the Data call"));
+ TEST_FOR_ERROR_L(dataCall.HangUp());
+
+ CleanupStack::PopAndDestroy(); // closes dataCall
+ CleanupStack::PopAndDestroy(); // closes line
+
+ return;
+ }
+
+void CEchoTestStep::DialRemoteModemTestL()
+/**
+ * Dials a data call.
+ * This method opens a data line and call, and retrieves the status of the call.
+ * It then dials a remote modem (initiated by t_data.exe), loans the Comm port,
+ * connects to the Comms Server, opens a serial port and proceeds to transmit data to
+ * the remote modem. It subsequently reads the data echoed back by the remote modem and
+ * compares the transmitted and received data. The serial port, the connection to the
+ * Comms Server, the data port, call and line are then closed.
+ * Leaves if test fails
+ */
+ {
+ const TInt KNumOfBytes=57; // Number of bytes to send to the remote end
+
+ RMobileLine line;
+ INFO_PRINTF1(_L("Dial remote modem"));
+ INFO_PRINTF1(_L("Opening Data Line"));
+ TEST_FOR_ERROR_L(line.Open(iPhone,KDataLineName));
+ CleanupClosePushL(line);
+
+ INFO_PRINTF1(_L("Opening New Data Call"));
+ RMobileCall dataCall;
+ TEST_FOR_ERROR_L(dataCall.OpenNewCall(line));
+ CleanupClosePushL(dataCall);
+
+ INFO_PRINTF1(_L("Get call status"));
+ RCall::TStatus callStatus;
+ TEST_FOR_ERROR_L(dataCall.GetStatus(callStatus));
+ INFO_PRINTF2(_L("Call Status = %d"),callStatus);
+
+ TBuf16<KRemoteNum> phoneNum; // Convert remote tel. no. to 16-bit data
+ phoneNum.Copy(iRemoteNumber);
+ INFO_PRINTF2(_L("Dialling %S...."), &phoneNum);
+
+ RMobileCall::TMobileDataCallParamsV1 callDataParams;
+ RMobileCall::TMobileDataCallParamsV1Pckg callDataParamsPckg(callDataParams);
+
+ callDataParams.iService = RMobileCall::EServiceDataCircuitAsync;
+ callDataParams.iSpeed = RMobileCall::ESpeed9600;
+ callDataParams.iProtocol = RMobileCall::EProtocolV32;
+ callDataParams.iQoS = RMobileCall::EQoSNonTransparent;
+
+ dataCall.Dial(iStatus, callDataParamsPckg, phoneNum);
+ User::WaitForRequest(iStatus);
+ TEST_FOR_ERROR_L(iStatus.Int());
+
+ INFO_PRINTF1(_L("Get call status"));
+ TEST_FOR_ERROR_L(dataCall.GetStatus(callStatus));
+ INFO_PRINTF2(_L("Call Status = %d"),callStatus);
+
+ INFO_PRINTF1(_L("Loan the Comm port"));
+ RCall::TCommPort commPort;
+ dataCall.LoanDataPort(iStatus,commPort);
+ User::WaitForRequest(iStatus);
+
+ if (iStatus==KErrCommsLineFail)
+ {
+ INFO_PRINTF1(_L("This error is currently known to only happen with the Motorola"));
+ INFO_PRINTF1(_L("Time port. Please see the PhoneInfo.cpp file for more information."));
+ }
+ TEST_FOR_ERROR_L(iStatus.Int());
+
+ INFO_PRINTF1(_L("Connect to the Comms Server and load the CSY"));
+ RCommServ cs;
+ TEST_FOR_ERROR_L(cs.Connect());
+ CleanupClosePushL(cs);
+
+ TInt ret=cs.LoadCommModule(KCsyName);
+ if (!(ret==KErrNone || ret==KErrAlreadyExists))
+ {
+ FAIL_WITH_ERROR_L(ret);
+ }
+
+ INFO_PRINTF1(_L("Open a serial port"));
+ RComm port;
+ TEST_FOR_ERROR_L(port.Open(cs,commPort.iPort,ECommShared));
+ CleanupClosePushL(port);
+
+ User::After(KTimeToWaitForRemoteEnd);
+
+ INFO_PRINTF1(_L("Write data stream"));
+ port.Write(iStatus,KWriteTestData);
+ User::WaitForRequest(iStatus);
+ TEST_FOR_ERROR_L(iStatus.Int());
+
+
+ INFO_PRINTF1(_L("Read Echoed data"));
+ TBuf8<KNumOfBytes> echoedData;
+ port.Read(iStatus,KTimeToWaitForRead,echoedData);
+ User::WaitForRequest(iStatus);
+ if (iStatus!=KErrNone)
+ {
+ if (iStatus==KErrTimedOut)
+ {
+ INFO_PRINTF1(_L("A Time out error occured during the read"));
+ }
+ FAIL_WITH_ERROR_L(iStatus.Int());
+ }
+
+ if (echoedData!=KWriteTestData)
+ {
+ INFO_PRINTF1(_L("Data does not match error"));
+ FAIL_WITH_ERROR_L(KErrCorrupt);
+ }
+
+ TBuf<KNumOfBytes> convertData; // Convert the 8-bit data read from serial port to 16-bit
+ convertData.Copy(echoedData); // so that it can be displayed to the user.
+ INFO_PRINTF2(_L("Echoed data stream = %S\n"),&convertData);
+
+ // Close the serial port, connection to Comms Server and recover the data port
+ CleanupStack::PopAndDestroy(); // closes cs
+ CleanupStack::PopAndDestroy(); // closes port
+
+ INFO_PRINTF1(_L("Recover data port"));
+ TEST_FOR_ERROR_L(dataCall.RecoverDataPort());
+
+ INFO_PRINTF1(_L("Hanging up the Data call"));
+ TEST_FOR_ERROR_L(dataCall.HangUp());
+
+ CleanupStack::PopAndDestroy(); // closes dataCall
+ CleanupStack::PopAndDestroy(); // closes line
+ }