diff -r 000000000000 -r 3553901f7fa8 telephonyserver/etelpacketdata/Te_EtelPacket/Te_EtelPacketTestMultipleClients.cpp --- /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 +#include + +#include +#include + +#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; +}