telephonyserver/etelpacketdata/Te_EtelPacket/Te_EtelPacketTestMultipleClients.cpp
changeset 0 3553901f7fa8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserver/etelpacketdata/Te_EtelPacket/Te_EtelPacketTestMultipleClients.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,193 @@
+// Copyright (c) 2002-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:
+// EtelPacketTestMultipleClients.cpp
+// This file tests the scenario of Multiple Clients using the Packet API simultaneously.
+// It is primarily used to exercise the mutex in the methods RPacketContext::OpenNewContext()
+// and RPacketContext::OpenNewSecondaryContext().
+// 
+//
+
+
+// Symbian OS includes
+#include <e32base.h>
+#include <e32std.h>
+
+#include <etelpckt.h>
+#include <pcktcs.h>
+
+#include "Te_EtelPacketTestStepBase.h"
+
+#include "testdef.h"
+
+#include "Te_EtelPacketTestMultipleClients.h"
+#include "Te_etelpckt_defs.h"
+
+
+// constructor
+CEtelPacketTestMultipleClients::CEtelPacketTestMultipleClients()
+{
+	// store the name of this test case
+	SetTestStepName(_L("Multiple_Clients"));
+}
+
+// destructor
+CEtelPacketTestMultipleClients::~CEtelPacketTestMultipleClients()
+{
+}
+
+
+enum TVerdict CEtelPacketTestMultipleClients::doTestStepL( void )
+/**
+ * Test step Multiple_Clients tests simultaneous use of the API by Multiple clients.
+ */
+{
+// Allocate the size of the stack and heap objects
+	const TInt KStackSize=0x8000;
+	const TInt KHeapSize=0x8000;
+	const TInt KMaxHeapSize=0x80000;
+
+// Create 2 RThread objects
+	_LIT(KClientApp1ThreadName,"ClientApp1");
+	_LIT(KClientApp2ThreadName,"ClientApp2");
+
+	RThread thread1;
+	RThread thread2;
+
+	TInt res1=thread1.Create(KClientApp1ThreadName,ContextCreationFunction,
+					    KStackSize,KHeapSize,KMaxHeapSize,this);
+
+	TInt res2=thread2.Create(KClientApp2ThreadName,ContextCreationFunction,
+					    KStackSize,KHeapSize,KMaxHeapSize,this);
+
+	TRequestStatus thread1Status;
+	TRequestStatus thread2Status;
+	TBool req1Complete=EFalse;
+	TBool req2Complete=EFalse;
+	
+// If both threads have been created successfully, start their execution
+	if (res1==KErrNone && res2==KErrNone)
+		{
+		thread1.Logon(thread1Status);
+		thread2.Logon(thread2Status);
+		thread1.Resume();
+		thread2.Resume();
+	 
+		while ( req1Complete==EFalse || req2Complete==EFalse)
+			{
+			User::WaitForAnyRequest();
+			if (thread1Status != KRequestPending && req1Complete==EFalse)
+				{
+				CHECKPOINT(thread1Status.Int(),KErrNone,CHP_CNTXT_CASE("A.MC2"));
+				req1Complete=ETrue;
+				}
+			if (thread2Status != KRequestPending && req2Complete==EFalse)
+				{
+				CHECKPOINT(thread2Status.Int(),KErrNone,CHP_CNTXT_CASE("A.MC3"));
+				req2Complete=ETrue;
+				}
+			} // while statement
+		} // if statement
+	
+	thread1.Close();
+	thread2.Close();
+
+	return TestStepResult();
+}
+
+
+TInt CEtelPacketTestMultipleClients::ContextCreationFunction(TAny* /*aThread*/ )
+/**
+ * Static thread function. A primary and secondary context are created in this function.
+ * The following sequence is carried out in order to create a secondary context:
+ * Connect to the Telephony server, Load the Telephony module, open handles to a phone,
+ * packet service and primary context object. 
+ * Once the secondary context is created, all the handles are closed. Context 
+ * functionality is exercised in other test modules and is not repeated here.
+ * Note that logging is done explicitly in this function to the generated test result
+ * file. This is to enable a tester examine the behaviour of this test without having to 
+ * resort to checking the dummy TSY logs.
+ *
+ * Note The logging code has been temporarily commented out. This is because the logging
+ * used by the test harness, scheduletest is not thread safe for multithreaded calls.
+ * When the test harness has been modified (either by making it thread safe for multithreaded
+ * calls or by using FLOGGER, the logging for this test case should be updated.
+ * - 16/05/02
+ */
+{
+	// Create a cleanup stack object
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	if (cleanup==NULL)
+		return KErrNoMemory;
+
+
+// Use the 'this' pointer to access functionality available to the test step class.
+	//CEtelPacketTestMultipleClients* ptr = (CEtelPacketTestMultipleClients*) aThreadData;
+	//ptr->INFO_PRINTF1(_L("Thread %d finished Wait()."), RThread().Id());
+	
+
+// Establish a connection to the ETel Server and open handles for this thread.
+// An arbitrary value of 20 is assigned for the buffer size for the context names.
+// Using a TName object would incur a significant load on the stack, which is 
+// unnecessary for this test code.
+	RTelServer server;
+	RPhone pcktPhone;
+	RPacketService wcdmaService;
+	RPacketContext primaryContext;
+	RPacketContext wcdmaContext;
+	TBuf<20>  contextName;
+	TBuf<20> secondaryContextName;
+	
+	TInt ret= KErrNone;
+	
+	if ( (ret=server.Connect())==KErrNone)
+		{
+		//ptr->INFO_PRINTF1(_L("Thread %d: Connect to ETel server - Pass."), RThread().Id());
+		if ( (ret=server.LoadPhoneModule(DPCKTTSY_MODULE_NAME))==KErrNone)
+			{
+			//ptr->INFO_PRINTF1(_L("Thread %d: Load phone module - Pass."), RThread().Id());
+			if ( (ret=pcktPhone.Open(server,DPCKTTSY_PHONE_NAME))==KErrNone)
+				{
+				//ptr->INFO_PRINTF1(_L("Thread %d: Open Packet phone - Pass."), RThread().Id());
+				if ( (ret=wcdmaService.Open(pcktPhone))==KErrNone)
+					{
+					//ptr->INFO_PRINTF1(_L("Thread %d: Open Packet service - Pass."), RThread().Id());
+					if ( (ret=primaryContext.OpenNewContext(wcdmaService, contextName))==KErrNone)
+						{
+						//ptr->INFO_PRINTF1(_L("Thread %d: Open Primary context - Pass."), RThread().Id());
+						if ( (ret=wcdmaContext.OpenNewSecondaryContext(wcdmaService, contextName, secondaryContextName))==KErrNone)
+							{
+							//ptr->INFO_PRINTF1(_L("Thread %d: Open Secondary context - Pass."), RThread().Id());
+							wcdmaContext.Close();
+							//ptr->INFO_PRINTF1(_L("Thread %d: Close Secondary context - Pass."), RThread().Id());
+							}
+						primaryContext.Close();
+						//ptr->INFO_PRINTF1(_L("Thread %d: Close Primary context - Pass."), RThread().Id());
+						}
+					wcdmaService.Close();
+					//ptr->INFO_PRINTF1(_L("Thread %d: Close Packet service - Pass."), RThread().Id());
+					}
+				pcktPhone.Close();
+				//ptr->INFO_PRINTF1(_L("Thread %d: Close Packet phone - Pass."), RThread().Id());
+				}
+			server.UnloadPhoneModule(DPCKTTSY_MODULE_NAME);
+			//ptr->INFO_PRINTF1(_L("Thread %d: Unload phone module - Pass."), RThread().Id());
+			}
+		server.Close();
+		//ptr->INFO_PRINTF1(_L("Thread %d: Close ETel server - Pass."), RThread().Id());
+		}
+
+	delete cleanup;
+
+	return ret;	
+}