authenticationservices/authenticationserver/test/tAuthSvr/src/step_multithreaded.cpp
changeset 19 ece3df019add
--- /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);
+    }
+