diff -r cd501b96611d -r ece3df019add authenticationservices/authenticationserver/test/tAuthSvr/src/step_multithreaded.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/authenticationservices/authenticationserver/test/tAuthSvr/src/step_multithreaded.cpp Tue Nov 24 09:06:03 2009 +0200 @@ -0,0 +1,233 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Multi threaded tests on AuthServer. +* +*/ + + +#include "tAuthSvrStep.h" +#include "authserver/authclient.h" +#include "authserver/authmgrclient.h" + + + +using namespace AuthServer; + +//Active object for registration +class CMultiThreadedRegisterActive : public CActive + { + public: + CMultiThreadedRegisterActive(RAuthMgrClient& aClient, HBufC* aIdentityString, CIdentity*& aResult) : + CActive(EPriorityNormal), + iFirstTime(true), + iClient(aClient), + iResult(aResult), + iIdentityString(aIdentityString), + iErr(KErrNone) + { + CActiveScheduler::Add(this); + } + ~CMultiThreadedRegisterActive() + { + delete iIdentityString; + } + void doReg() + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + iFirstTime = ETrue; + } + void DoCancel() + { + } + void RunL() + { + iErr = iStatus.Int(); + if (iFirstTime) + { + SetActive(); + iStatus = KRequestPending; + iClient.RegisterIdentityL(iResult, *iIdentityString, iStatus); + iFirstTime = false; + } + else + { + iErr = iStatus.Int(); + RDebug::Printf("iErr = %d", iErr); + CActiveScheduler::Stop(); + } + } + + TBool iFirstTime; + RAuthMgrClient& iClient; + CIdentity*& iResult; + HBufC* iIdentityString; + TInt iErr; + }; + +CTMultiThreaded::~CTMultiThreaded() + {} + +CTMultiThreaded::CTMultiThreaded(CTAuthSvrServer& aParent): iParent(aParent) + + { + + SetTestStepName(KTMultiThreadedTest); + } + +TVerdict CTMultiThreaded::doTestStepPreambleL() + + { + CTStepActSch::doTestStepPreambleL(); + return TestStepResult(); + } + +TVerdict CTMultiThreaded::doTestStepPostambleL() + + { + + CTStepActSch::doTestStepPostambleL(); + return TestStepResult(); + } + +TVerdict CTMultiThreaded::doTestStepL() + { + SetTestStepResult(EPass); + Logger().ShareAuto(); + //Initialize AuthServer. + InitAuthServerFromFileL(); + + + //Setup two threads which request for registration concurrently. + //Create first thread. + RThread firstThread; + TInt err(0); + TThreadParams firstThreadParams; + err = firstThread.Create( _L("First Thread"), (TThreadFunction)runMultiThreadedTest, + KDefaultStackSize, KMinHeapSize, 1024*1024 /*Max heap size*/, &firstThreadParams); + if(err != KErrNone) + { + ERR_PRINTF2(_L("Couldn't start first thread. Error = %d"), err); + SetTestStepResult(EFail); + return TestStepResult(); + } + + // Setup the requeststatus for firstThread completion notification. + TRequestStatus firstThreadFinishStatus; + firstThread.Logon(firstThreadFinishStatus); + + + + //Setup the second thread similarly. + RThread secondThread; + TThreadParams secondThreadParams; + err = secondThread.Create( _L("Second Thread"), (TThreadFunction)runMultiThreadedTest, + KDefaultStackSize, KMinHeapSize, 1024*1024 /*Max heap size*/, &secondThreadParams); + if(err != KErrNone) + { + ERR_PRINTF2(_L("Couldn't start second thread. Error = %d"), err); + SetTestStepResult(EFail); + return TestStepResult(); + } + + // Setup the requeststatus for secondThread completion notification. + TRequestStatus secondThreadFinishStatus; + secondThread.Logon(secondThreadFinishStatus); + + //Resume both threads. + firstThread.Resume(); + secondThread.Resume(); + + //Wait for either request to complete. + User::WaitForRequest(firstThreadFinishStatus, secondThreadFinishStatus ); + + //Now, wait for the unfinished thread. + User::WaitForRequest(firstThreadFinishStatus == KRequestPending? firstThreadFinishStatus:secondThreadFinishStatus); + + INFO_PRINTF1(_L("Both Threads completed.")); + INFO_PRINTF2(_L("First thread completed with %d."), firstThreadParams.result); + INFO_PRINTF2(_L("Second thread completed with %d."), secondThreadParams.result); + + if((firstThreadParams.result != KErrServerBusy && secondThreadParams.result != KErrNone) && + (firstThreadParams.result != KErrNone && secondThreadParams.result != KErrServerBusy)) + { + SetTestStepResult(EFail); + } + firstThread.Close(); + secondThread.Close(); + return TestStepResult(); + } + + + +void CTMultiThreaded::runMultiThreadedTest(TThreadParams* aParams) + { + CTrapCleanup* cleanup = CTrapCleanup::New(); + CActiveScheduler* sched(0); + + TRAPD(err, sched = new (ELeave) CActiveScheduler); + if(err != KErrNone) + { + delete cleanup; + User::Exit(err); + } + CActiveScheduler::Install(sched); + + + /* Switch case can be added here to generalize this function to run any method. + * For now, only registration is called. + */ + + TRAPD(ret,doRegisterL(*aParams)); + + RDebug::Printf("doRegisterL returned %d", ret); + + delete cleanup; + delete sched; + } + + +void CTMultiThreaded::doRegisterL(TThreadParams& aParams) + { + _LIT(KIdString, "User1"); + + RAuthMgrClient client; + User::LeaveIfError(client.Connect()); + CleanupClosePushL(client); + + HBufC* identityString = KIdString().AllocLC(); + CIdentity* identity1 = 0; + + CMultiThreadedRegisterActive* active = new (ELeave)CMultiThreadedRegisterActive(client, identityString, identity1); + CleanupStack::PushL(active); + active->doReg(); + CActiveScheduler::Start(); + + //Store the error code in aParams. + aParams.result = active->iErr; + if(aParams.result == KErrNone) + { + RDebug::Printf("Registered new Identity! Id = %x", identity1->Id()); + } + else + { + RDebug::Printf("Registration Failed !"); + } + + delete identity1; + + CleanupStack::Pop(3, &client); + } +