lbs/lbsclient/src/ctlbsclientpostp189.cpp
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lbs/lbsclient/src/ctlbsclientpostp189.cpp	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,343 @@
+// 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 "ctlbsclientpostp189.h"
+#include <EPos_CPosModules.h>
+#include <EPos_CPosModuleUpdate.h>
+
+// CONSTANTS
+const TInt32 KUidNonExistingPsy = 0x01111111;
+const TInt KMaxMessageSize = 200;
+const TInt KNrOfDeviceStatusChanges = 8; // 9 since some are ignored
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------
+CT_LbsClientPosTp189::CT_LbsClientPosTp189(CT_LbsServer& aParent): CT_LbsPortedStepBase(aParent)
+	{  
+	_LIT(KTestName, "Tp189 - Status Events");
+	SetTestStepName(KTestName); 
+	}
+
+// ---------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------
+CT_LbsClientPosTp189::~CT_LbsClientPosTp189()
+	{
+	}
+
+// ---------------------------------------------------------
+// CT_LbsClientPosTp189::StartL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsClientPosTp189::StartL()
+    {
+   _LIT(KDeviceStatusValues, "Device Status Values (Unknown = 0, Error = 1, Disabled = 2, Inactive = 3, Initialising = 4, StandBy = 5,  Ready = 6, Active = 7)");
+   INFO_PRINTF1(KDeviceStatusValues);
+    _LIT(KDataQualityValue, "Data Quality Status (Unknown = 0, Loss = 1, Partial = 2, Normal = 3)");
+    INFO_PRINTF1(KDataQualityValue);
+
+    _LIT(KSetTestStatusPsy, "Setting up TestStatusPsy");
+    INFO_PRINTF1(KSetTestStatusPsy);
+
+	SetupPsyL(iUidTestStatusPsy);
+
+    TPositionModuleStatusEvent statusEvent2;
+    statusEvent2.SetRequestedEvents(TPositionModuleStatusEvent::EEventDeviceStatus); 
+	TRequestStatus status2 = KErrNone;
+    RPositionServer client2;
+	CleanupClosePushL(client2);
+	TInt err = client2.Connect();
+	_LIT(KConnectError, "TP18 Unable to open connection to Epos, return code %d");
+	AssertTrueL(err == KErrNone, KConnectError, err);
+    
+    // Synchronous request to start server.
+    ConnectL();
+
+	// 1. Request to be notified about Module Status Events.
+	TPositionModuleStatusEvent statusEvent;
+	TRequestStatus status = KErrNone;
+
+	// Open a subsession to PSY.1
+	_LIT(KOpenPSY, "Calling OpenPositionerByName");
+	INFO_PRINTF1(KOpenPSY);
+	err = OpenPositionerByName(iUidTestStatusPsy);
+	_LIT(KErrOpen, "1. Error when opening subsession to PSY , error code = %d");
+	AssertTrueL(err == KErrNone, KErrOpen, err);
+
+	
+	for(TInt i = 0; i < (KNrOfDeviceStatusChanges - 1); i++) //Iterate through different device statuses. Skip first and last
+		{
+		RequestWaitAndLogEventL(TPositionModuleStatusEvent::EEventDeviceStatus);
+		}
+	
+	RequestWaitAndLogEventL(TPositionModuleStatusEvent::EEventDataQualityStatus); //Test to be notified about data quality changes
+	
+	// Renew request before proceeding
+	statusEvent.SetRequestedEvents(TPositionModuleStatusEvent::EEventDeviceStatus); 
+	iPosServer.NotifyModuleStatusEvent(statusEvent, status, iUidTestStatusPsy);
+	
+	// 2. Disable PSY1.
+	CPosModules* db = CPosModules::OpenL();
+    CleanupStack::PushL(db);
+    CPosModuleUpdate* moduleUpdate = CPosModuleUpdate::NewLC();
+
+    moduleUpdate->SetUpdateAvailability(EFalse);
+    db->UpdateModuleL(iUidTestStatusPsy, *moduleUpdate);
+    _LIT(KWaitStatus, "Waiting for status after UpdateModuleL1");
+	INFO_PRINTF1(KWaitStatus);
+	User::WaitForRequest(status);
+	
+    _LIT(KWait, "Error when request completed, error code = %d");
+    iExpectedStatus.SetDeviceStatus(TPositionModuleStatus::EDeviceDisabled);
+    iExpectedStatus.SetDataQualityStatus(TPositionModuleStatus::EDataQualityNormal);
+
+    TPositionModuleStatus getStatus;
+    statusEvent.GetModuleStatus(getStatus);
+
+    if (iExpectedStatus.DeviceStatus() != getStatus.DeviceStatus() ||
+        iExpectedStatus.DataQualityStatus() != getStatus.DataQualityStatus())
+        {
+        TBuf<100> buf;
+        if (iExpectedStatus.DeviceStatus() != getStatus.DeviceStatus())
+        {
+        	_LIT(KError, "Status is not correct, Status returned %d Status expected %d");
+        	buf.Format(KError, getStatus.DeviceStatus(), iExpectedStatus.DeviceStatus());
+        	LogErrorAndLeaveL(buf);	
+        }
+        else
+        {
+        	_LIT(KError , "Quality is not correct, Quality returned %d Quality expected");
+        	buf.Format(KError, getStatus.DataQualityStatus(), iExpectedStatus.DataQualityStatus());
+        	LogErrorAndLeaveL(KError);	
+        }
+        }
+
+	// 3. Renew request
+	iPosServer.NotifyModuleStatusEvent(statusEvent, status, iUidTestStatusPsy);
+	_LIT(KNotifyModuleStatusEvent, "Called NotifyModuleStatusEvent");
+	INFO_PRINTF1(KNotifyModuleStatusEvent);
+	
+	// 4. Enable PSY1
+	moduleUpdate->SetUpdateAvailability(ETrue);
+    db->UpdateModuleL(iUidTestStatusPsy, *moduleUpdate);
+    _LIT(KWaitUpdateModuleL2, "Waiting for status after UpdateModuleL2");
+	INFO_PRINTF1(KWaitUpdateModuleL2);
+	
+	User::WaitForRequest(status);
+	AssertTrueL(status.Int() == KErrNone, KWait, status.Int());
+
+    // 5. Renew request
+	iPosServer.NotifyModuleStatusEvent(statusEvent, status, iUidTestStatusPsy);
+	client2.NotifyModuleStatusEvent(statusEvent2, status2, iUidMultiPsy);
+
+	// 7. Disable PSY1
+	_LIT(KDisable, "Disabling TestStatusPsy");
+	INFO_PRINTF1(KDisable);
+	moduleUpdate->SetUpdateAvailability(EFalse);
+    db->UpdateModuleL(iUidTestStatusPsy, *moduleUpdate);
+
+	// 9. Enable PSY2
+    _LIT(KEnable, "Enabling MultiPsy");
+	INFO_PRINTF1(KEnable);
+	moduleUpdate->SetUpdateAvailability(ETrue);
+    db->UpdateModuleL(iUidMultiPsy, *moduleUpdate);
+
+    _LIT(KStatus, "Waiting for status & status2");
+	INFO_PRINTF1(KStatus);
+	User::WaitForRequest(status, status2);
+    if (status == KRequestPending)
+        {
+        User::WaitForRequest(status);
+        }
+    else
+        {
+        User::WaitForRequest(status2);
+        }
+
+
+    AssertTrueL(status.Int() == KErrNone, KWait, status.Int());
+    AssertTrueL(status2.Int() == KErrNone, KWait, status2.Int());
+	
+	// 10. Renew request for all PSYs
+	iPosServer.NotifyModuleStatusEvent(statusEvent, status, iUidTestStatusPsy);
+	
+	// 11. Enable PSY1
+	moduleUpdate->SetUpdateAvailability(ETrue);
+    db->UpdateModuleL(iUidTestStatusPsy, *moduleUpdate);
+    _LIT(KWaitUpdateModuleL3, "Waiting for status after UpdateModuleL3");
+	INFO_PRINTF1(KWaitUpdateModuleL3);
+
+	User::WaitForRequest(status);
+	AssertTrueL(status.Int() == KErrNone, KWait, status.Int());
+
+	// Open a subsession to PSY.1
+	err = iPositioner2.Open(iPosServer, iUidTestStatusPsy);
+	_LIT(KErrOpenOther, "7. Error when opening subsession to PSY , error code = %d");
+	AssertTrueL(err == KErrNone, KErrOpenOther, err);
+
+    User::After(10000000); //wait for all psy event to timeout
+	// Renew request for all PSYs
+	iPosServer.NotifyModuleStatusEvent(statusEvent, status);
+    User::After(1000000);
+	// 14. Close subsession to PSY1. All events execept close event has happen
+	iPositioner2.Close();
+	_LIT(KStatusClose, "Waiting for status after Close");
+	INFO_PRINTF1(KStatusClose);
+
+	User::WaitForRequest(status);
+	err = status.Int();
+	_LIT(KStatusErr, "status: %d");
+	INFO_PRINTF2(KStatusErr, err);
+	AssertTrueL(err == KErrNone, KWait, err);
+
+
+	// 15. Renew request for PSY1
+	iPosServer.NotifyModuleStatusEvent(statusEvent, status, iUidTestStatusPsy);
+
+    User::After(600000);
+	// 16. Cancel request
+	TInt cancelErr = iPosServer.CancelRequest(EPositionServerNotifyModuleStatusEvent);
+	_LIT(KCancel, "7. Error canceling request, error code = %d");
+	AssertTrueL(cancelErr == KErrNone, KCancel, cancelErr);
+	_LIT(KStatusCancelRequest, "Waiting for status after CancelRequest");
+	INFO_PRINTF1(KStatusCancelRequest);
+
+	User::WaitForRequest(status);
+	AssertTrueL(status.Int() == KErrCancel, KCancel, status.Int());
+	
+	// 17. Cancel request again
+	cancelErr = iPosServer.CancelRequest(EPositionServerNotifyModuleStatusEvent);
+	AssertTrueL(cancelErr == KErrNotFound, KCancel, cancelErr);
+
+	// 18. Request for non-existing PSY.
+	_LIT(KNonExistingPSY, "Request for non-existing PSY");
+	INFO_PRINTF1(KNonExistingPSY);
+	TUid aNonExistingUid;
+	aNonExistingUid.iUid = KUidNonExistingPsy;
+	iPosServer.NotifyModuleStatusEvent(statusEvent, status, aNonExistingUid);
+	_LIT(KStatusWaiting, "Waiting for status");
+	INFO_PRINTF1(KStatusWaiting);
+	
+	User::WaitForRequest(status);
+	AssertTrueL(status.Int() == KErrNotFound, KWait, status.Int());
+	
+    
+	CleanupStack::PopAndDestroy(moduleUpdate);
+    CleanupStack::PopAndDestroy(db);
+    CleanupStack::PopAndDestroy(&client2);
+	
+    _LIT(KClosePositioner, "Calling ClosePositioner");
+	INFO_PRINTF1(KClosePositioner);
+	ClosePositioner();
+	
+	Disconnect();
+	}
+
+// ---------------------------------------------------------
+// CT_LbsClientPosTp189::CheckModuleStatus
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsClientPosTp189::RequestWaitAndLogEventL(const TInt aEventToListenFor)
+	{
+	TPositionModuleStatusEvent statusEvent;
+	TRequestStatus status = KErrNone;
+
+	if(aEventToListenFor == TPositionModuleStatusEvent::EEventDataQualityStatus)
+		{
+		statusEvent.SetRequestedEvents(TPositionModuleStatusEvent::EEventDataQualityStatus);
+		}
+	else
+		{
+		statusEvent.SetRequestedEvents(TPositionModuleStatusEvent::EEventDeviceStatus);
+		}
+
+	// Renew request
+	iPosServer.NotifyModuleStatusEvent(statusEvent, status, iUidTestStatusPsy);
+	
+	User::WaitForRequest(status);
+	_LIT(KErrLoopOpen, "Error in loop when opening subsession to PSY , error code = %d");
+	AssertTrueL(status.Int() == KErrNone, KErrLoopOpen, status.Int());
+	
+	// Get status information for PSY.
+	TPositionModuleStatus moduleStatus = TPositionModuleStatus();
+	TInt err = iPosServer.GetModuleStatus(moduleStatus, iUidTestStatusPsy);
+	_LIT(KGet, "Error when getting module status from PSY , error code = %d");
+	AssertTrueL(err == KErrNone, KGet, err);
+	CheckModuleStatusL(moduleStatus);
+	}
+// ---------------------------------------------------------
+// CT_LbsClientPosTp189::CheckModuleStatus
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsClientPosTp189::CheckModuleStatusL(const TPositionModuleStatus& aStatus , const TBool /*aCheckStatus*/)
+	{
+	TBuf<KMaxMessageSize> buf;	
+	_LIT(KStatus,"Checking module status");
+	INFO_PRINTF1(KStatus);
+	_LIT(KErrBoundary, "The value on status/quaity is out of range");
+
+    _LIT(KDevSta, "Device Status  =  %d");
+    TInt status = aStatus.DeviceStatus();
+    buf.Format(KDevSta, status);
+	INFO_PRINTF1(buf);
+	buf.Zero();
+	//check that status value is not out of range
+    switch(status)
+        {
+        case TPositionModuleStatus::EDeviceUnknown:
+        case TPositionModuleStatus::EDeviceError:
+        case TPositionModuleStatus::EDeviceInitialising:
+        case TPositionModuleStatus::EDeviceStandBy:
+        case TPositionModuleStatus::EDeviceReady:
+        case TPositionModuleStatus::EDeviceActive:
+        case TPositionModuleStatus::EDeviceInactive: //the psy should not be able to report this
+            break;
+        case TPositionModuleStatus::EDeviceDisabled: //the psy should not be able to report this
+        default:
+            LogErrorAndLeaveL(KErrBoundary);
+        }
+
+    
+
+	_LIT(KDatQual, "Data Quality Status =  %d");
+	TInt quality = aStatus.DataQualityStatus();
+    buf.Format(KDatQual, quality);
+	INFO_PRINTF1(buf);
+	buf.Zero();
+    //check that qauality value is not out of range
+    switch(quality)
+        {
+        case TPositionModuleStatus::EDataQualityUnknown:
+        case TPositionModuleStatus::EDataQualityLoss:
+        case TPositionModuleStatus::EDataQualityPartial:
+        case TPositionModuleStatus::EDataQualityNormal:
+            break;
+        default:
+            LogErrorAndLeaveL(KErrBoundary);
+        }
+	}
+
+// End of file