common/tools/ats/smoketest/lbs/lbsclient/src/ctlbsclientpostp208.cpp
changeset 748 e13acd883fbe
child 872 17498133d9ad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/ats/smoketest/lbs/lbsclient/src/ctlbsclientpostp208.cpp	Tue Nov 10 13:50:58 2009 +0000
@@ -0,0 +1,556 @@
+// Copyright (c) 2001-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 "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+
+//  INCLUDES
+#include "ctlbsclientpostp208.h"
+#include <EPos_CPosModules.h>
+#include <EPos_CPosModuleUpdate.h>
+#include <EPos_CPosModuleIdList.h>
+
+// CONSTANTS
+static const TInt KNrOfClients = 5;
+static const TInt KNrOfRuns = 20;
+
+static const TInt KServerMinHeapSize =  4096;
+static const TInt KServerMaxHeapSize =  128000;
+
+
+_LIT(KThread2Name, "req_location1");
+_LIT(KThread3Name, "req_location2");
+_LIT(KErrMsgThreadCreation, "failed to create thread");
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Constructor.
+CT_LbsClientPosTp208::CT_LbsClientPosTp208(CT_LbsServer& aParent): CT_LbsPortedStepBase(aParent)
+    {  
+    _LIT(KTestName, "TP208-Multi Thread Connection");
+    SetTestStepName(KTestName); 
+    }
+
+// ---------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------
+CT_LbsClientPosTp208::~CT_LbsClientPosTp208()
+	{
+	}
+
+// ---------------------------------------------------------
+// CPosTp208::CloseTest
+// Always called after the test, even if the test leaves
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsClientPosTp208::CloseTest()
+    {
+    ClosePositioner();
+    Disconnect();
+    }
+
+// Struct passed to the thread in a TAny* 
+struct MyAnyData
+{
+    TBool     iFullTest; // If fulltest defined
+    TInt      iNrOfRuns; // number if requests to make for each thread
+};
+
+//
+// Performes the test by connecting to MLFW  
+// (and makes a number of Location requests if aFullTest is true
+//
+void DoTestL(TBool aFullTest, TInt aNumberOfRuns, TInt *aResult)
+    {
+    RPositionServer	posServer;
+	TInt errorCode = errorCode = posServer.Connect();
+
+    if (errorCode != KErrNone)
+        {
+        *aResult = KErrCouldNotConnect;
+        return;
+        }
+    CleanupClosePushL(posServer);
+
+    RPositioner positioner;
+
+
+    // Full test means requesting position updates
+    if (aFullTest)
+        {
+        TPositionInfo positionInfo = TPositionInfo();
+        const TInt32 KUidMultiPsy = 0x01010176;
+        TUid uidMultiPsy;
+        uidMultiPsy.iUid = KUidMultiPsy;
+        errorCode = positioner.Open(posServer, uidMultiPsy);
+        
+        if (errorCode != KErrNone) 
+        {
+            *aResult = errorCode;
+            return;
+        }
+        CleanupClosePushL(positioner);
+        
+        _LIT(KService ,"Service");
+        errorCode = positioner.SetRequestor(CRequestor::ERequestorService,
+            CRequestor::EFormatApplication, KService);
+        
+        if (errorCode != KErrNone)
+        {
+            *aResult = 1001;
+            return;
+        }
+        
+        TRequestStatus status;
+        TLocality loca(TCoordinate(0,0,0),0);
+        TPosition pos(loca, TTime(0));
+
+        for (TInt i = 0; i < aNumberOfRuns; i++)
+        {
+            positionInfo.SetPosition(pos);
+            positioner.NotifyPositionUpdate(positionInfo, status);
+            User::WaitForRequest(status);
+            TInt err = status.Int();
+            if (err != KErrNone)
+            {
+                *aResult = err;
+            }
+            TPosition result;
+            positionInfo.GetPosition(result);
+            
+            //sanity check
+            if (result.Latitude() == pos.Latitude() ||
+                result.Longitude() == pos.Longitude() ||
+                result.Altitude() == pos.Altitude())
+            {
+                //_LIT(KErrorPositon, "ERROR:: The postion was not updated");
+                errorCode = 1005;
+            }   
+        }
+        positioner.Close();
+        CleanupStack::PopAndDestroy(&positioner);
+    }
+    
+    posServer.Close();
+    CleanupStack::PopAndDestroy(&posServer);
+    }
+
+// ---------------------------------------------------------
+// LOCAL_C TInt MyThreadFunctionL(TAny* aData)
+// Runs the DoTestL in a TRAP nest
+// Panics this thread if any errors occurred
+// ---------------------------------------------------------
+//
+LOCAL_C TInt MyThreadFunctionL(TAny* aData)
+  {
+  __UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
+
+    // Read parameters from TAny*
+    MyAnyData* info = (MyAnyData*) aData;
+
+    TInt result = KErrNone;
+    TInt err = KErrNone;
+    // Why must this function be TRAPPED?
+    TRAP(err, DoTestL(info->iFullTest, info->iNrOfRuns, &result));
+
+    _LIT(KErrorConnect, "Error when connecting to RPositionServer");
+    __ASSERT_ALWAYS(!err, User::Panic(KErrorConnect, err));
+    __ASSERT_ALWAYS(result == KErrNone, User::Panic(KErrorConnect, result));
+
+	delete cleanup; // destroy clean-up stack
+	__UHEAP_MARKEND;
+  return 0;
+  }
+
+// ---------------------------------------------------------
+// CPosTp208::StartThreads
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CT_LbsClientPosTp208::StartThreads(TBool aFullTest)
+    {
+    TFixedArray<TRequestStatus, KNrOfClients> statusArray;
+    TFixedArray<RThread, KNrOfClients> threadArray;
+    TFixedArray<TInt, KNrOfClients> retArray;
+   
+    TBuf<150> buf;
+    TInt errorsFound = KErrNone;
+    _LIT(KInfoCreate, "Creating threads");
+    INFO_PRINTF1(KInfoCreate);
+    _LIT(KThreadName, "Thread %d");
+
+    // Introduce parameters for each thread.
+    MyAnyData info;
+
+    info.iNrOfRuns = KNrOfRuns;
+    info.iFullTest = aFullTest;
+    // Make sure that if one of the threads panic, whole emulator is not
+    // paniced (this has effect only in Wins).
+    TBool jit = User::JustInTime();
+    User::SetJustInTime(EFalse);
+
+    TInt i=0;
+    for (i=0; i<KNrOfClients; i++)
+        {
+        iThreadCount++;
+        buf.Zero();
+        buf.Format(KThreadName, iThreadCount);
+        retArray[i] = threadArray[i].Create(buf, MyThreadFunctionL, KDefaultStackSize, KServerMinHeapSize, KServerMaxHeapSize, &info);
+        if (retArray[i] != KErrNone)
+            {
+            _LIT(KErr, "Error when creating thread%d, errorcode %d");
+            buf.Format(KErr, i, retArray[i]);
+            INFO_PRINTF1(buf);
+            errorsFound++;
+            }
+        else 
+            {
+            _LIT(KErr, "Created thread %d");
+            buf.Format(KErr, i);
+            INFO_PRINTF1(buf);
+            threadArray[i].Logon(statusArray[i]); 
+            }
+        }
+ 
+    for (TInt j=0; j<KNrOfClients; j++)
+        {
+        if (retArray[j] == KErrNone) 
+            {
+            buf.Zero();
+            _LIT(KInfoResume, "Resuming thread %d");
+            buf.Format(KInfoResume, j);
+            //if (bDEBUG) 
+            INFO_PRINTF1(buf);
+            User::After(6000000);
+            threadArray[j].Resume();
+            }
+        }
+	for (i = KNrOfClients-1; i>=0; i--)
+        {
+
+        if (retArray[i] == KErrNone) User::WaitForRequest(statusArray[i]);
+        
+        buf.Zero();
+        buf.Format(KThreadName, i);
+
+        _LIT(KWaitForRequest, " User::WaitForRequest ");
+        buf.Append(KWaitForRequest);
+        INFO_PRINTF1(buf);
+
+        buf.Zero();
+        buf.Format(KThreadName, i);
+
+        if (threadArray[i].ExitType() == EExitPanic)
+            {
+            _LIT(KPanicExit, " EExitPanic ");
+            buf.Append(KPanicExit); 
+            INFO_PRINTF1(buf);
+            errorsFound++;
+            }
+        else if (threadArray[i].ExitType() == EExitKill)
+            {
+            _LIT(KKillExit, " EExitKill");
+            buf.Append(KKillExit); 
+            INFO_PRINTF1(buf);
+            }
+        else if (threadArray[i].ExitType() == EExitPending)
+            {
+            _LIT(KPendingExit, " EExitPending");
+            buf.Append(KPendingExit); 
+            INFO_PRINTF1(buf);
+            errorsFound++;
+            }
+        else
+            {
+            _LIT(KOtherExit, " other ");
+            buf.Append(KOtherExit);
+            INFO_PRINTF1(buf);
+            errorsFound++;
+            }
+        }
+
+      for (i=0; i<KNrOfClients; i++)
+        {
+         buf.Zero();
+         _LIT(KDEBUG, "Wrong reasoncode from Thread %d reasoncode %d");
+         buf.Format(KDEBUG, i, threadArray[i].ExitReason());
+         if (threadArray[i].ExitReason() != KErrNone) INFO_PRINTF1(buf);
+         threadArray[i].Close();
+        }
+
+    // Only affected on WINS emulator
+    User::SetJustInTime(jit);
+
+    return errorsFound;
+    }
+
+
+/**
+ * Connection is opened to location server,and closed
+ *
+ * If anything fails during the execution of this test, then function
+ * leaves with proper error code.
+ *
+ * Parameters:
+ **/
+void LocationRequestThreadMainPartL(TDes& aErrorBuf)
+    {
+    // Open connection to Location server
+    RPositionServer server;
+
+    TInt err = server.Connect(); 
+
+    if (err != KErrNone)
+        {
+        _LIT(KErrOpen, "Server open failed with code %d\r\n");
+        aErrorBuf.Format(KErrOpen, err);
+        }
+    else
+        {
+        _LIT(KOkOpen, "Server open ok\r\n");
+        aErrorBuf.Copy(KOkOpen);
+        }
+
+    User::LeaveIfError(err);
+
+    CleanupClosePushL(server);
+
+
+    CleanupStack::PopAndDestroy(1); // server, positioner
+
+    _LIT(KInfTestComplet, "Test completed ok for this thread\r\n");
+    aErrorBuf.Append(KInfTestComplet);
+    }
+
+/**
+ * This is the main function for threads that connects and
+ * disconnect from MLFW
+ *
+ * Function returns 0 if running of the test did not leave.
+ *Otherwise the leave code is returned.
+ **/
+LOCAL_C TInt LocationRequestThread(TAny* aData)
+{
+    // Create cleanupstack for this thread
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // No parameters to read, just start main function.
+
+    HBufC* buf = HBufC::NewL(1024);
+
+    TPtr ptr = buf->Des();
+
+    // Run the actual test, and trap possible leave
+    TRAPD(leave, LocationRequestThreadMainPartL(ptr));
+
+    // Open connection to file server
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+
+    TInt index = *((TInt*) aData);
+
+    TBuf<30> errorFile;
+    _LIT(KInfThread, "c:\\logs\\thread%derrinfo.txt");
+    errorFile.Format(KInfThread, index);
+
+    // Open log file
+    RFile file;
+
+    TInt err = file.Replace(fs,errorFile,EFileStreamText|EFileWrite);
+
+    if (err != KErrNone)
+        {
+        User::Leave(err);
+        }
+
+    _LIT(KErrLeave, "*** This thread (thread %d) leave code: %d\r\n");
+    ptr.AppendFormat(KErrLeave, index, leave);
+
+    TFileText fileText;
+    fileText.Set(file);
+
+    fileText.Write(ptr);
+
+    // Close log file
+    file.Close();
+    fs.Close();
+
+    // Delete cleanup stack
+    delete cleanup;
+
+    // Exit this thread with leave code (KErrNone in successful case)
+    User::Exit(leave);
+
+    return 0;
+}
+
+// ---------------------------------------------------------
+// CPosTp208::DoFastConnectionL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CT_LbsClientPosTp208::DoFastConnectionL()
+    {   
+    TInt err;
+
+    // Create two different threads. Each thread connects
+    // and disconnect from MLFW very fast.
+    const TInt KMinHeapSize =  4096;
+    const TInt KMaxHeapSize =  128000;
+
+    RThread thread2;
+    RThread thread3;
+
+    TInt thread2Id = 2;
+    TInt thread3Id = 3;
+
+    // Make sure that if one of the threads panic, whole emulator is not
+    // paniced (this has effect only in Wins).
+    User::SetJustInTime(EFalse);
+
+    _LIT(KInfo, "Create two threads");
+    INFO_PRINTF1(KInfo);
+
+    err = thread2.Create(KThread2Name, LocationRequestThread, KDefaultStackSize, 
+    KMinHeapSize, KMaxHeapSize, &thread2Id);
+
+    AssertTrueL(err == KErrNone, KErrMsgThreadCreation, err);   
+
+    err = thread3.Create(KThread3Name, LocationRequestThread, KDefaultStackSize, 
+    KMinHeapSize, KMaxHeapSize, &thread3Id);
+
+    AssertTrueL(err == KErrNone, KErrMsgThreadCreation, err);   
+
+    // Logon to each thread, so we can get a notification when they kill
+    // themselves.
+    TRequestStatus status2, status3;
+    thread2.Logon(status2);
+    thread3.Logon(status3);
+
+    _LIT(KStart, "Start the threads will connect to and disconnect to MLFW,");
+    INFO_PRINTF1(KStart);
+
+    // Start all treads.
+    thread2.Resume();
+    User::After(2000000);
+    thread3.Resume();
+
+
+    // Wait for all threads to exit 
+    User::WaitForRequest(status2); 
+    User::WaitForRequest(status3); 
+
+    // Actual test is now run.
+    _LIT(KInfoExit, "All threads have exited, exit reasons:");
+    INFO_PRINTF1(KInfoExit);
+
+    // Check that all threads had correct exit reason. Also log
+    // all the exit reasons into log file.
+    TInt exitReasonsCorrect = 0;
+
+    exitReasonsCorrect |= thread2.ExitReason();
+    exitReasonsCorrect |= thread3.ExitReason();
+
+    // Close all handles to threads.
+    thread2.Close();
+    thread3.Close();
+
+    // Return back to normal mode
+    User::SetJustInTime(ETrue);  
+    return exitReasonsCorrect;
+    }
+
+// ---------------------------------------------------------
+// CPosTp208::StartL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsClientPosTp208::StartL()
+    {
+    //first do a simple connection test
+    TInt fasterr = DoFastConnectionL();
+    _LIT(KFailConnect, "Fast connection failed");
+    AssertTrueL(fasterr == KErrNone, KFailConnect, fasterr);  
+
+    SetupPsyL(iUidMultiPsy);
+
+    TInt nrOfRounds = 1;
+    TBuf<100> buf;
+    
+    _LIT(KPsitionUpdate, 
+    		">>>>>>>>>>Running StartThreads(ETrue) requesting position updates<<<<<<<<");
+    INFO_PRINTF1(KPsitionUpdate);
+
+    _LIT(KEmptySpace, "");
+    _LIT(KRound, ">>>>>>Round nr %d :");
+    _LIT(KErrorsFound, "Errors found!!!");
+    
+    for (TInt i=0; i<nrOfRounds; i++)
+        {
+        INFO_PRINTF1(KEmptySpace);
+        buf.Format(KRound, i);
+        INFO_PRINTF1(buf);
+        TTime now, startTime;
+        TTimeIntervalMicroSeconds requestTime;
+        
+        startTime.UniversalTime();
+        TInt res = StartThreads(ETrue);
+        if (res != KErrNone) 
+        	LogErrorAndLeaveL(KErrorsFound, res);
+        now.UniversalTime();
+        
+        requestTime = now.MicroSecondsFrom(startTime);
+        _LIT(KDebug, "%d requests from %d threads took: %d microsecs.");
+        buf.Zero();
+        TInt64 reqTime = requestTime.Int64();
+        buf.Format(KDebug, KNrOfClients * KNrOfRuns, KNrOfClients, reqTime);
+        INFO_PRINTF1(buf);
+      
+        }
+
+    _LIT(KConnectDisconnect, 
+    		">>>>>>>>>>Running StartThreads(EFalse) connect/disconnect Epos<<<<<<<<");
+    INFO_PRINTF1(KConnectDisconnect);
+    nrOfRounds = 5;
+    for (TInt j=0; j<nrOfRounds; j++)
+        {
+        INFO_PRINTF1(KEmptySpace);
+        buf.Format(KRound, j);
+        INFO_PRINTF1(buf);
+        TTime now, startTime;
+        TTimeIntervalMicroSeconds requestTime;
+       
+        startTime.UniversalTime();
+
+        // Threads only connects to Epos server and then disconnect
+        TInt res = StartThreads(EFalse);
+        if (res != KErrNone) 
+        	LogErrorAndLeaveL(KErrorsFound, res);
+        now.UniversalTime();
+        
+        requestTime = now.MicroSecondsFrom(startTime);
+        _LIT(KDebug, "%d threads connecting and disconnecting to Epos server took: %d microsecs.");
+        buf.Zero();
+        TInt64 reqTime = requestTime.Int64();
+        buf.Format(KDebug, KNrOfClients, reqTime);
+        INFO_PRINTF1(buf);
+        }
+    }
+
+// End of File