--- a/telephonyserverplugins/multimodetsy/test/Te_LoopBack/Te_LoopbackTestStepBase.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/multimodetsy/test/Te_LoopBack/Te_LoopbackTestStepBase.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,344 +1,344 @@
-// 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 file implements the main methods for the CTestBase class. Note that this class has
-// at least two pure virtual functions which must be implemented by classes which inherit or
-// derive from this class. The code in this file is responsible for starting the thread which
-// acts as the Modem Emulator. This thread then is responsible for starting the processing of
-// the proper script. The StartEmulator method is called by each test, typically in the RunTest
-// method of the test code.
-//
-//
-
-/**
- @file
-*/
-
-#if defined (__WINS__)
-#define PDD_NAME _L("ECDRV")
-#define LDD_NAME _L("ECOMM")
-#else
-#define PDD_NAME _L("EUART1")
-#define PDD2_NAME _L("EUART2")
-#define LDD_NAME _L("ECOMM")
-#endif
-
-#include "Te_LoopbackTestStepBase.h"
-#include "Te_LoopBackcrxmess.h"
-#include "Te_LoopBackCNoPduRxMess.h"
-#include "Te_LoopBackcsca.h"
-#include "Te_LoopBackctxmess.h"
-#include "Te_LoopBackcdatacall.h"
-#include "Te_LoopBackcoddinits.h"
-#include "Te_LoopBackcmessstor.h"
-#include "Te_Loopbackcfailinits.h"
-#include "Te_LoopBackcincall.h"
-#include "Te_LoopBackcsmscancel.h"
-#include "Te_LoopBackcshutdown.h"
-#include "Te_LoopBackCSmsdelete.h"
-#include "Te_LoopBackcssfax.h"
-#include "Te_LoopBackcdatacallcancel.h"
-#include "Te_Loopbackcfaxpremclose.h"
-#include "Te_LoopBackctwofaxrx.h"
-#include "Te_LoopBackcvoicecall.h"
-#include "Te_LoopBackCDataCallCallBack.h"
-#include "Te_LoopBackCDataCallRemoteHangupDial.h"
-#include "Te_LoopBackCDataCallRemoteTerm.h"
-#include "Te_LoopBackcphoneBook.h"
-#include "Te_LoopBackCNetwork.h"
-#include "Te_LoopBackCPhoneLine.h"
-#include "Te_LoopBackCCalls.h"
-#include "Te_LoopBackCNoCnmi.h"
-#include "Te_LoopBackcnocmgf.h"
-#include "Te_Loopbackcoomvoicecall.h"
-#include "Te_LoopBackCDataCallDiffParam.h"
-#include "Te_LoopBackCCbstParse.h"
-#include "Te_LoopBackccgqreq_responses.h"
-#include "Te_LoopBackCUnsolicited.h"
-
-#define MODEM_EMULATOR _L("ModemEmulator")
-
-TInt ResponderThread(TAny* aScriptNum);
-
-const TInt KModEmStackSize=0x8000;
-const TInt KModEmHeapSize=0x8000;
-const TInt KModEmMaxHeapSize=0x80000;
-
-
-CTestBase::CTestBase()
-/**
- * This method is the basic empty constructor for the CTestBase class.
- */
- {
- //
- // Change this process and thread to a higher priority so that we can be in control
- // when performing tests such as monitoring async request status values.
- //
- iOrgProcessPriority = RProcess().Priority();
- iOrgThreadPriority = RThread().Priority();
-
- RProcess().SetPriority(EPriorityHigh);
- RThread().SetPriority(EPriorityMuchMore);
- }
-
-
-CTestBase::~CTestBase()
- {
- //
- // Restore the process and thread priority...
- //
- RProcess().SetPriority(iOrgProcessPriority);
- RThread().SetPriority(iOrgThreadPriority);
-
- }
-
-TVerdict CTestBase::doTestStepPreambleL( void )
-/**
- * This method connects two
- * sessions to the RTelServer. It also loads the iPhone module (specified by the define
- * MODULE_NAME) and opens two iPhone objects, one from each server. If any of these operations
- * fail, this method leaves.
- *
- * @leave This method leaves if it is unable to connect to the RTelServer or if it is unable
- * to load and open the phones.
- */
-{
- __UHEAP_MARK;
-
- iTestScheduler=new (ELeave) CActiveScheduler;
- CActiveScheduler::Install(iTestScheduler);
-
- TInt ret = iServer.Connect();
- ERR_PRINTF2(TRefByValue<const TDesC>(_L("First Server Connect Status = %d\n")), ret);
- //User::LeaveIfError(ret);
- if (ret)
- {
- delete iTestScheduler;
- User::Leave(ret);
- }
-
- ret=iServer.LoadPhoneModule(MODULE_NAME);
- ERR_PRINTF2(TRefByValue<const TDesC>(_L("LoadPhoneModuleError = %d\n")), ret);
- //User::LeaveIfError(ret);
- if (ret)
- {
- iServer.Close();
- delete iTestScheduler;
- User::Leave(ret);
- }
-
- ret = iServer2.Connect();
- ERR_PRINTF2(TRefByValue<const TDesC>(_L("Second Server Connect Status = %d\n")), ret);
- //User::LeaveIfError(ret);
- if (ret)
- {
- iServer.UnloadPhoneModule(MODULE_NAME);
- iServer.Close();
- delete iTestScheduler;
- User::Leave(ret);
- }
-
-//
-// Open the "iPhone" object prior to the test
-//
- ret = iPhone.Open(iServer, PHONE_NAME);
- ERR_PRINTF2(TRefByValue<const TDesC>(_L("First Phone Error Code = %d\n")), ret);
- if (ret)
- {
- iPhone.Close();
- iServer2.Close();
- iServer.UnloadPhoneModule(MODULE_NAME);
- iServer.Close();
- delete iTestScheduler;
- User::Leave(ret);
- }
-
- ret = iPhone2.Open(iServer, PHONE_NAME);
- ERR_PRINTF2(TRefByValue<const TDesC>(_L("Second Phone Error Code = %d\n")), ret);
- if (ret)
- {
- iPhone.Close();
- iPhone2.Close();
- iServer2.Close();
- iServer.UnloadPhoneModule(MODULE_NAME);
- iServer.Close();
- delete iTestScheduler;
- User::Leave(ret);
- }
- return TestStepResult();
-}
-
-TVerdict CTestBase::doTestStepPostambleL( void )
-/**
- * This method unloads the iPhone module and closes the phones and servers opened by the
- * doTestStepPreambleL method.
- */
-{
- iPhone.Close();
- iPhone2.Close();
- iServer2.Close();
- iServer.UnloadPhoneModule(MODULE_NAME);
- iServer.Close();
- delete iTestScheduler;
-
- __UHEAP_MARKEND;
- return TestStepResult();
-}
-
-TVerdict CTestBase::doTestStepL( void )
-/**
- *This method just wrap over 'old' RunTestL()
- */
-{
-
- if(RunTestL() != KErrNone || TestStepResult() == EFail)
- SetTestStepResult(EFail);
- return TestStepResult();
-
-}
-
-
-TInt CTestBase::StartEmulatorL()
-//
-// Create modem emulator thread, call function to drive ETel API and then wait for thread
-// to complete.
-//
-/**
- * This method is used by specific tests to start the modem emulation. The method
- * starts a new thread in the current process with the entry point of ResponderThread. The
- * responder thread is passed a pointer to the current script (iCurrentScript). If the modem
- * emulator is already running, this code will attempt to wait and retry the thread
- * creation. If it exceeds it's maximum retry limit, the requested test will not be run
- * and an error code will be returned. A semaphore is created by StartEmulator for
- * synchronization with the newly created thread.
- *
- * After the thread is created and the synchronization is complete, this method issues a Logon
- * request to the thread to monitor for the death of the thread. If the Responder thread
- * dies, an event will be received by the current thread. Then, StartEmulator calls the
- * DriveETelAPI method associated with the specific test. DriveETelApiL is a pure virtual
- * function within CTestBase.
- *
- * After the called DriveETelApiL this method exits,
- *
- * @return KErrNone
- * @return KErrAlreadyExists is returned if the modem emulator exists and the retry limit
- * expires.
- * @return Variable depending on the return value from the test's DriveETelApiL method and
- * thread monitoring.
- */
- {
- //RSemaphore s;
- TInt res=KErrNone;
- TThreadData threadData;
-
- // setup data to pass to the Responder Thread when creating it.
- // Note: because "threadData" is an automatic, it is assumed when the Responder Thread
- // receives this data (passed by reference), is copied into thread specific storage
- // by the Responder Thread before the semaphore is given back to this function to
- // indicate the Responder Thread was created successfully.
- threadData.iVariableDelay= iVariableDelay;
- threadData.iScriptList = iCurrentScript;
- threadData.iRestartReqStat=&iRestartReqStat;
-
- res=iScriptThread.Create(MODEM_EMULATOR,ResponderThread,
- KModEmStackSize,KModEmHeapSize,KModEmMaxHeapSize,&threadData);
- if(res==KErrAlreadyExists)
- {
- for(TInt i=0;i<3;i++)
- {
- iScriptThread.Close();
- User::After(1000000L);
- res=iScriptThread.Create(MODEM_EMULATOR,ResponderThread,
- KModEmStackSize,KModEmHeapSize,KModEmMaxHeapSize,&threadData);
- if(res!=KErrAlreadyExists)
- {
- break;
- }
- }
- }
-
- TRequestStatus statusRequest;
-
- if(res==KErrNone)
- {
- // Create a Rendezvous with the thread. This will be used
- // to ensure that the thread has been started before continuing
- TRequestStatus stat;
- iScriptThread.Rendezvous(stat);
-
- if (stat!=KRequestPending)
- {
- iScriptThread.Kill(KErrGeneral);
- }
- else
- {
- // Make the thread eligible for execution
- iScriptThread.Logon(statusRequest);
- iScriptThread.Resume();
- }
-
- // Wait for thread to complete the rendezvous
- User::WaitForRequest(stat);
-
- if (stat != KErrNone)
- {
- res=stat.Int();
- return res;
- }
- }
- else
- {
- iScriptThread.Logon(statusRequest);
- }
-
- // Wait for the Restart Signal active object to be set.
- for(;;)
- {
- if(iRestartReqStat)
- {
- break;
- }
- User::After(500000L);
- }
-
- res=DriveETelApiL();
-
- if(res!=KErrNone)
- {
- iScriptThread.Close();
- return res;
- }
-
- User::WaitForRequest(statusRequest);
- iScriptThread.Close();
- res=statusRequest.Int();
- if(res==KErrCancel)
- {
- res=KErrNone; // Legitimate termination
- }
-
- return res;
- }
-
-void CTestBase::RestartScript()
- {
- __ASSERT_ALWAYS(iRestartReqStat!=NULL,User::Panic(_L("T_TsyLb Panic"),1));
- TRequestStatus* reqStatus=iRestartReqStat;
- iScriptThread.RequestComplete(reqStatus,KErrNone);
- }
-
-void CTestBase::TerminateScript()
- {
- iScriptThread.Terminate(KErrCancel);
- }
-
+// 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 file implements the main methods for the CTestBase class. Note that this class has
+// at least two pure virtual functions which must be implemented by classes which inherit or
+// derive from this class. The code in this file is responsible for starting the thread which
+// acts as the Modem Emulator. This thread then is responsible for starting the processing of
+// the proper script. The StartEmulator method is called by each test, typically in the RunTest
+// method of the test code.
+//
+//
+
+/**
+ @file
+*/
+
+#if defined (__WINS__)
+#define PDD_NAME _L("ECDRV")
+#define LDD_NAME _L("ECOMM")
+#else
+#define PDD_NAME _L("EUART1")
+#define PDD2_NAME _L("EUART2")
+#define LDD_NAME _L("ECOMM")
+#endif
+
+#include "Te_LoopbackTestStepBase.h"
+#include "Te_LoopBackcrxmess.h"
+#include "Te_LoopBackCNoPduRxMess.h"
+#include "Te_LoopBackcsca.h"
+#include "Te_LoopBackctxmess.h"
+#include "Te_LoopBackcdatacall.h"
+#include "Te_LoopBackcoddinits.h"
+#include "Te_LoopBackcmessstor.h"
+#include "Te_Loopbackcfailinits.h"
+#include "Te_LoopBackcincall.h"
+#include "Te_LoopBackcsmscancel.h"
+#include "Te_LoopBackcshutdown.h"
+#include "Te_LoopBackCSmsdelete.h"
+#include "Te_LoopBackcssfax.h"
+#include "Te_LoopBackcdatacallcancel.h"
+#include "Te_Loopbackcfaxpremclose.h"
+#include "Te_LoopBackctwofaxrx.h"
+#include "Te_LoopBackcvoicecall.h"
+#include "Te_LoopBackCDataCallCallBack.h"
+#include "Te_LoopBackCDataCallRemoteHangupDial.h"
+#include "Te_LoopBackCDataCallRemoteTerm.h"
+#include "Te_LoopBackcphoneBook.h"
+#include "Te_LoopBackCNetwork.h"
+#include "Te_LoopBackCPhoneLine.h"
+#include "Te_LoopBackCCalls.h"
+#include "Te_LoopBackCNoCnmi.h"
+#include "Te_LoopBackcnocmgf.h"
+#include "Te_Loopbackcoomvoicecall.h"
+#include "Te_LoopBackCDataCallDiffParam.h"
+#include "Te_LoopBackCCbstParse.h"
+#include "Te_LoopBackccgqreq_responses.h"
+#include "Te_LoopBackCUnsolicited.h"
+
+#define MODEM_EMULATOR _L("ModemEmulator")
+
+TInt ResponderThread(TAny* aScriptNum);
+
+const TInt KModEmStackSize=0x8000;
+const TInt KModEmHeapSize=0x8000;
+const TInt KModEmMaxHeapSize=0x80000;
+
+
+CTestBase::CTestBase()
+/**
+ * This method is the basic empty constructor for the CTestBase class.
+ */
+ {
+ //
+ // Change this process and thread to a higher priority so that we can be in control
+ // when performing tests such as monitoring async request status values.
+ //
+ iOrgProcessPriority = RProcess().Priority();
+ iOrgThreadPriority = RThread().Priority();
+
+ RProcess().SetPriority(EPriorityHigh);
+ RThread().SetPriority(EPriorityMuchMore);
+ }
+
+
+CTestBase::~CTestBase()
+ {
+ //
+ // Restore the process and thread priority...
+ //
+ RProcess().SetPriority(iOrgProcessPriority);
+ RThread().SetPriority(iOrgThreadPriority);
+
+ }
+
+TVerdict CTestBase::doTestStepPreambleL( void )
+/**
+ * This method connects two
+ * sessions to the RTelServer. It also loads the iPhone module (specified by the define
+ * MODULE_NAME) and opens two iPhone objects, one from each server. If any of these operations
+ * fail, this method leaves.
+ *
+ * @leave This method leaves if it is unable to connect to the RTelServer or if it is unable
+ * to load and open the phones.
+ */
+{
+ __UHEAP_MARK;
+
+ iTestScheduler=new (ELeave) CActiveScheduler;
+ CActiveScheduler::Install(iTestScheduler);
+
+ TInt ret = iServer.Connect();
+ ERR_PRINTF2(TRefByValue<const TDesC>(_L("First Server Connect Status = %d\n")), ret);
+ //User::LeaveIfError(ret);
+ if (ret)
+ {
+ delete iTestScheduler;
+ User::Leave(ret);
+ }
+
+ ret=iServer.LoadPhoneModule(MODULE_NAME);
+ ERR_PRINTF2(TRefByValue<const TDesC>(_L("LoadPhoneModuleError = %d\n")), ret);
+ //User::LeaveIfError(ret);
+ if (ret)
+ {
+ iServer.Close();
+ delete iTestScheduler;
+ User::Leave(ret);
+ }
+
+ ret = iServer2.Connect();
+ ERR_PRINTF2(TRefByValue<const TDesC>(_L("Second Server Connect Status = %d\n")), ret);
+ //User::LeaveIfError(ret);
+ if (ret)
+ {
+ iServer.UnloadPhoneModule(MODULE_NAME);
+ iServer.Close();
+ delete iTestScheduler;
+ User::Leave(ret);
+ }
+
+//
+// Open the "iPhone" object prior to the test
+//
+ ret = iPhone.Open(iServer, PHONE_NAME);
+ ERR_PRINTF2(TRefByValue<const TDesC>(_L("First Phone Error Code = %d\n")), ret);
+ if (ret)
+ {
+ iPhone.Close();
+ iServer2.Close();
+ iServer.UnloadPhoneModule(MODULE_NAME);
+ iServer.Close();
+ delete iTestScheduler;
+ User::Leave(ret);
+ }
+
+ ret = iPhone2.Open(iServer, PHONE_NAME);
+ ERR_PRINTF2(TRefByValue<const TDesC>(_L("Second Phone Error Code = %d\n")), ret);
+ if (ret)
+ {
+ iPhone.Close();
+ iPhone2.Close();
+ iServer2.Close();
+ iServer.UnloadPhoneModule(MODULE_NAME);
+ iServer.Close();
+ delete iTestScheduler;
+ User::Leave(ret);
+ }
+ return TestStepResult();
+}
+
+TVerdict CTestBase::doTestStepPostambleL( void )
+/**
+ * This method unloads the iPhone module and closes the phones and servers opened by the
+ * doTestStepPreambleL method.
+ */
+{
+ iPhone.Close();
+ iPhone2.Close();
+ iServer2.Close();
+ iServer.UnloadPhoneModule(MODULE_NAME);
+ iServer.Close();
+ delete iTestScheduler;
+
+ __UHEAP_MARKEND;
+ return TestStepResult();
+}
+
+TVerdict CTestBase::doTestStepL( void )
+/**
+ *This method just wrap over 'old' RunTestL()
+ */
+{
+
+ if(RunTestL() != KErrNone || TestStepResult() == EFail)
+ SetTestStepResult(EFail);
+ return TestStepResult();
+
+}
+
+
+TInt CTestBase::StartEmulatorL()
+//
+// Create modem emulator thread, call function to drive ETel API and then wait for thread
+// to complete.
+//
+/**
+ * This method is used by specific tests to start the modem emulation. The method
+ * starts a new thread in the current process with the entry point of ResponderThread. The
+ * responder thread is passed a pointer to the current script (iCurrentScript). If the modem
+ * emulator is already running, this code will attempt to wait and retry the thread
+ * creation. If it exceeds it's maximum retry limit, the requested test will not be run
+ * and an error code will be returned. A semaphore is created by StartEmulator for
+ * synchronization with the newly created thread.
+ *
+ * After the thread is created and the synchronization is complete, this method issues a Logon
+ * request to the thread to monitor for the death of the thread. If the Responder thread
+ * dies, an event will be received by the current thread. Then, StartEmulator calls the
+ * DriveETelAPI method associated with the specific test. DriveETelApiL is a pure virtual
+ * function within CTestBase.
+ *
+ * After the called DriveETelApiL this method exits,
+ *
+ * @return KErrNone
+ * @return KErrAlreadyExists is returned if the modem emulator exists and the retry limit
+ * expires.
+ * @return Variable depending on the return value from the test's DriveETelApiL method and
+ * thread monitoring.
+ */
+ {
+ //RSemaphore s;
+ TInt res=KErrNone;
+ TThreadData threadData;
+
+ // setup data to pass to the Responder Thread when creating it.
+ // Note: because "threadData" is an automatic, it is assumed when the Responder Thread
+ // receives this data (passed by reference), is copied into thread specific storage
+ // by the Responder Thread before the semaphore is given back to this function to
+ // indicate the Responder Thread was created successfully.
+ threadData.iVariableDelay= iVariableDelay;
+ threadData.iScriptList = iCurrentScript;
+ threadData.iRestartReqStat=&iRestartReqStat;
+
+ res=iScriptThread.Create(MODEM_EMULATOR,ResponderThread,
+ KModEmStackSize,KModEmHeapSize,KModEmMaxHeapSize,&threadData);
+ if(res==KErrAlreadyExists)
+ {
+ for(TInt i=0;i<3;i++)
+ {
+ iScriptThread.Close();
+ User::After(1000000L);
+ res=iScriptThread.Create(MODEM_EMULATOR,ResponderThread,
+ KModEmStackSize,KModEmHeapSize,KModEmMaxHeapSize,&threadData);
+ if(res!=KErrAlreadyExists)
+ {
+ break;
+ }
+ }
+ }
+
+ TRequestStatus statusRequest;
+
+ if(res==KErrNone)
+ {
+ // Create a Rendezvous with the thread. This will be used
+ // to ensure that the thread has been started before continuing
+ TRequestStatus stat;
+ iScriptThread.Rendezvous(stat);
+
+ if (stat!=KRequestPending)
+ {
+ iScriptThread.Kill(KErrGeneral);
+ }
+ else
+ {
+ // Make the thread eligible for execution
+ iScriptThread.Logon(statusRequest);
+ iScriptThread.Resume();
+ }
+
+ // Wait for thread to complete the rendezvous
+ User::WaitForRequest(stat);
+
+ if (stat != KErrNone)
+ {
+ res=stat.Int();
+ return res;
+ }
+ }
+ else
+ {
+ iScriptThread.Logon(statusRequest);
+ }
+
+ // Wait for the Restart Signal active object to be set.
+ for(;;)
+ {
+ if(iRestartReqStat)
+ {
+ break;
+ }
+ User::After(500000L);
+ }
+
+ res=DriveETelApiL();
+
+ if(res!=KErrNone)
+ {
+ iScriptThread.Close();
+ return res;
+ }
+
+ User::WaitForRequest(statusRequest);
+ iScriptThread.Close();
+ res=statusRequest.Int();
+ if(res==KErrCancel)
+ {
+ res=KErrNone; // Legitimate termination
+ }
+
+ return res;
+ }
+
+void CTestBase::RestartScript()
+ {
+ __ASSERT_ALWAYS(iRestartReqStat!=NULL,User::Panic(_L("T_TsyLb Panic"),1));
+ TRequestStatus* reqStatus=iRestartReqStat;
+ iScriptThread.RequestComplete(reqStatus,KErrNone);
+ }
+
+void CTestBase::TerminateScript()
+ {
+ iScriptThread.Terminate(KErrCancel);
+ }
+