--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lbstest/lbstestproduct/lbsclient/src/ctlbsclientstepmodselect.cpp Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,604 @@
+// Copyright (c) 2006-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:
+// @file ctlbsclientstepmodselect.cpp
+// This is the class implementation for the Module Selection Tests
+//
+//
+
+#include "ctlbsclientstepmodselect.h"
+
+#include <lbs/test/tlbsutils.h>
+
+/**
+ * Destructor
+ */
+CT_LbsClientStep_ModSelect::~CT_LbsClientStep_ModSelect()
+ {
+ }
+
+
+/**
+ * Constructor
+ */
+CT_LbsClientStep_ModSelect::CT_LbsClientStep_ModSelect(CT_LbsClientServer& aParent) : CT_LbsClientStep(aParent)
+ {
+ iModuleId=TUid::Null();
+ SetTestStepName(KLbsClientStep_ModSelect);
+ }
+
+/**
+Static Constructor
+*/
+CT_LbsClientStep_ModSelect* CT_LbsClientStep_ModSelect::New(CT_LbsClientServer& aParent)
+ {
+ return new CT_LbsClientStep_ModSelect(aParent);
+ // Note the lack of ELeave.
+ // This means that having insufficient memory will return NULL;
+ }
+
+
+/**
+ * Verifies that the last position retrieved was from the a-gps module
+ */
+TBool CT_LbsClientStep_ModSelect::VerifyLastModuleIdWasAGpsL()
+ {
+ TPositionInfo* posInfo = static_cast<TPositionInfo*>(iParent.iSharedData->iCurrentPosInfoArr[iParent.iSharedData->iCurrentPosInfoArr.Count()-1]);
+ TPositionModuleId checkModId = posInfo->ModuleId();
+ TPositionModuleId verifyModId;
+
+ T_LbsUtils utils;
+
+ verifyModId = utils.GetAGpsModuleIdL(iServer);
+
+ if(checkModId == verifyModId)
+ {
+ INFO_PRINTF2(_L("Module IDs Match: Get AGPS Module Id %d"), checkModId.iUid);
+ return ETrue;
+ }
+ else
+ {
+ INFO_PRINTF3(_L("Module IDs Do Not Match: Expected %d, Receive %d"), verifyModId.iUid, checkModId.iUid);
+ return EFalse;
+ }
+ }
+
+/**
+ * Verifies that the last position retrieved was from the network module
+ */
+TBool CT_LbsClientStep_ModSelect::VerifyLastModuleIdWasNetworkL()
+ {
+ TPositionInfo* posInfo = static_cast<TPositionInfo*>(iParent.iSharedData->iCurrentPosInfoArr[iParent.iSharedData->iCurrentPosInfoArr.Count()-1]);
+ TPositionModuleId checkModId = posInfo->ModuleId();
+ TPositionModuleId verifyModId;
+
+ T_LbsUtils utils;
+ verifyModId = utils.GetNetworkModuleIdL(iServer);
+
+ if(checkModId == verifyModId)
+ {
+ INFO_PRINTF2(_L("Module IDs Match: Get Network Module Id %d"), checkModId.iUid);
+ return ETrue;
+ }
+ else
+ {
+ INFO_PRINTF3(_L("Module IDs Do Not Match: Expected %d, Receive %d"), verifyModId, checkModId);
+ return EFalse;
+ }
+
+ }
+
+TInt CT_LbsClientStep_ModSelect::Blocking_NotifyUpdateL()
+ {
+
+ TInt err;
+
+ User::LeaveIfError(iPositioner.Open(iServer));
+ INFO_PRINTF1(_L("Opened RPositioner successfully with RPositionServer"));
+ CleanupClosePushL(iPositioner);
+
+ err = Blocking_NotifyUpdateCommonL();
+
+ CleanupStack::PopAndDestroy(&iPositioner);
+
+ return err;
+ }
+
+TInt CT_LbsClientStep_ModSelect::Blocking_NotifyUpdateWithModuleIdL(TPositionModuleId aModuleId)
+ {
+ TInt err;
+
+ User::LeaveIfError(iPositioner.Open(iServer, aModuleId));
+ INFO_PRINTF1(_L("Opened RPositioner successfully with RPositionServer and TPositionModuleId"));
+ CleanupClosePushL(iPositioner);
+
+ err = Blocking_NotifyUpdateCommonL();
+
+ CleanupStack::PopAndDestroy(&iPositioner);
+
+ return err;
+ }
+
+
+/**
+ * Opens a subsession with the requested criteria and retrieves a location update
+ * which it appends to the current array of positions
+ */
+TInt CT_LbsClientStep_ModSelect::Blocking_NofifyUpdateWithCriteriaL(TPositionCriteria aCriteria)
+ {
+ TInt err;
+
+ User::LeaveIfError(iPositioner.Open(iServer, aCriteria));
+ INFO_PRINTF1(_L("Opened RPositioner successfully with RPositionServer and TPositionCriteria"));
+ CleanupClosePushL(iPositioner);
+
+ err = Blocking_NotifyUpdateCommonL();
+
+ CleanupStack::PopAndDestroy(&iPositioner);
+
+ return err;
+ }
+
+
+TInt CT_LbsClientStep_ModSelect::Blocking_NotifyUpdateCommonL()
+ {
+ TInt err = KErrNone;
+
+ // Create a posinfo and store in our shared array for later verification.
+ RPointerArray<TAny>& posInfoArr = iParent.iSharedData->iCurrentPosInfoArr;
+ TPositionInfo* posInfo = new(ELeave) TPositionInfo();
+
+ T_LbsUtils utils;
+ utils.ResetAndDestroy_PosInfoArr(posInfoArr); // Clear previous entries before new entry is appended.
+
+ posInfoArr.Append(posInfo);
+
+ err = DoNotifyUpdateL(*posInfo);
+
+ return err;
+ }
+
+/**
+ * Connect to netsim and set up reference position
+ * return KErrNone if successful
+ */
+TInt CT_LbsClientStep_ModSelect::SetupNetSimL()
+ {
+ TInt err = iNetSim.ConnectL(NULL); //connect to netsim but ingnore the callbacks
+ if (err != KErrNone)
+ {
+ INFO_PRINTF2(_L("Cannot connect to netsim, return with error %d"), err);
+ return err;
+ }
+ else
+ {
+ //set up reference position
+ RPointerArray<TAny>& srcPosInfoArr = iParent.iSharedData->iVerifyPosInfoArr;
+ TPositionInfo* srcPosInfo = reinterpret_cast<TPositionInfo*>(srcPosInfoArr[0]);
+ TPosition srcPos;
+ srcPosInfo->GetPosition(srcPos);
+
+ if (!iNetSim.SetReferenceLocation(srcPos))
+ {
+ INFO_PRINTF1(_L("Test Failed: can't set NetSim's reference location."));
+ iNetSim.Close();
+ return KErrGeneral;
+ }
+ // Set plugin to use for getting assistance data:
+ TUid pluginUid;
+ if(iParent.iSharedData->iTestModuleInUse)
+ {
+ pluginUid = TUid::Uid(KSimpleAssistanceDataProviderPluginUidValue);
+ }
+ else
+ {
+ pluginUid = TUid::Uid(KSuplAssistanceDataProviderPluginUidValue);
+ }
+ if (!iNetSim.SetAssistanceDataProvider(pluginUid))
+ {
+ INFO_PRINTF1(_L("Test Failed: Can't set NetSim's assistance data plugin uid."));
+ SetTestStepResult(EFail);
+ iNetSim.Close();
+ return KErrGeneral;
+ }
+ }
+ return KErrNone;
+ }
+
+/**
+ * do notify position update with required postion criteria and verify the position
+ * received is from expected module
+ */
+void CT_LbsClientStep_ModSelect::DoModuleSelectionL(TOpenSesstionMethod aMethod, TModuleType aModuleType)
+ {
+ TInt err = KErrNone;
+
+ //do netsim connection and configure reference position
+ err = SetupNetSimL();
+ if (err !=KErrNone)
+ {
+ SetTestStepResult(EFail);
+ return;
+ }
+
+ switch (aMethod)
+ {
+ case EWithCriteria:
+ err = Blocking_NofifyUpdateWithCriteriaL(iCriteria);
+ break;
+
+ case EWithModuleId:
+ err = Blocking_NotifyUpdateWithModuleIdL(iModuleId);
+ break;
+
+ case ENone:
+ err = Blocking_NotifyUpdateL();
+ break;
+
+ default:
+ break;
+ }
+
+
+ if(KErrNone == err)
+ {
+ // Verify that the last position was
+ // retrieved by the expected module: module ids not defined yet
+ switch (aModuleType)
+ {
+ case EAGPSModule:
+ if(!VerifyLastModuleIdWasAGpsL())
+ {
+ SetTestStepResult(EFail);
+ }
+ break;
+
+ case ENetworkModule:
+ if (!VerifyLastModuleIdWasNetworkL())
+ {
+ SetTestStepResult(EFail);
+ break;
+ }
+ break;
+
+ case ERandomModule:
+ if (!VerifyLastModuleIdWasNetworkL() && !VerifyLastModuleIdWasAGpsL())
+ {
+ SetTestStepResult(EFail);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ }
+ else
+ {
+ SetTestStepResult(EFail);
+ }
+
+ iNetSim.Close();
+ }
+
+/**
+ * @return - TVerdict code
+ * Override of base class pure virtual
+ * Our implementation only gets called if the base class doTestStepPreambleL() did
+ * not leave. That being the case, the current test result value will be EPass.
+ */
+TVerdict CT_LbsClientStep_ModSelect::doTestStepL()
+ {
+ // Generic test step used to test the LBS Client Notify position update API.
+ INFO_PRINTF1(_L(">>CT_LbsClientStep_ModSelect::doTestStepL()"));
+
+ if (TestStepResult()==EPass)
+ {
+
+ TInt err = KErrNone;
+
+ // Connect to self locate server.
+ User::LeaveIfError(iServer.Connect());
+ CleanupClosePushL(iServer);
+
+ //reset the default value
+ iCriteria.ClearCriteria();
+ iQuality = TPositionQuality();
+ iSelectOrder.ClearSelectionOrder();
+
+ TInt testCaseId;
+ if (GetIntFromConfig(ConfigSection(), KTestCaseId, testCaseId))
+ {
+ switch (testCaseId)
+ {
+ case 01: // test module selection by capabilities
+ // LBS-Capability-0001
+ {
+ iCriteria.AddRequiredCapabilities(TPositionModuleInfo::ECapabilitySatellite);
+ DoModuleSelectionL(EWithCriteria, EAGPSModule);
+ }
+ break;
+
+ case 03: // test module selection by unsupported capabilities
+ // LBS-Capability-0003
+ {
+ // Set capabilities not supported by either (gps/network) module:
+ iCriteria.AddRequiredCapabilities(TPositionModuleInfo::ECapabilityMedia);
+ err = iPositioner.Open(iServer, iCriteria);
+ if(KErrNotFound != err)
+ {
+ INFO_PRINTF2(_L("Test failed: wrong error returned %d"), err);
+ SetTestStepResult(EFail);
+ if(KErrNone == err)
+ {
+ iPositioner.Close();
+ }
+ }
+
+ iCriteria.ClearCriteria();
+ User::LeaveIfError(iPositioner.Open(iServer, iCriteria));
+ iPositioner.Close();
+ }
+ break;
+
+ case 04: //required more than one capability
+ //LBS-Capability-0004
+ {
+ iCriteria.AddRequiredCapabilities(TPositionModuleInfo::ECapabilityHorizontal);
+ iCriteria.AddRequiredCapabilities(TPositionModuleInfo::ECapabilitySatellite);
+ DoModuleSelectionL(EWithCriteria, EAGPSModule);
+ }
+ break;
+
+ case 11: // test module selection by horizontal/vertical accuracy
+ // LBS-Quality-0001
+ {
+ // set up the required accuracy
+ iQuality.SetHorizontalAccuracy(AGPS_MODINFO_HORIZONTAL_ACCURACY);
+ iQuality.SetVerticalAccuracy(AGPS_MODINFO_VERTICAL_ACCURACY);
+
+ iCriteria.SetRequiredQuality(iQuality);
+
+ DoModuleSelectionL(EWithCriteria, EAGPSModule);
+ }
+ break;
+
+ case 12: // test module selection by time to first fix
+ // LBS-Quality-0002
+ {
+ TTimeIntervalMicroSeconds timetofirstfix(NETWORK_MODINFO_TIME_TO_FIRST_FIX);
+
+ // set up the required TTFF
+ iQuality.SetTimeToFirstFix(timetofirstfix);
+
+ iCriteria.SetRequiredQuality(iQuality);
+
+ DoModuleSelectionL(EWithCriteria, ENetworkModule);
+ }
+ break;
+
+ case 13: // test module selection by power consumption
+ // LBS-Quality-0003
+ // this test case can only be run in test module
+ // in xtestmodule.ini powerconsumption need to be changed to 1
+ {
+ if (!iParent.iSharedData->iTestModuleInUse)
+ {
+ INFO_PRINTF1(_L("This test case can ONLY be run with Test A-GPS Module"));
+ User::Panic(_L("Client Module Selection"), 1);
+ }
+ iQuality.SetPowerConsumption(TPositionQuality::EPowerLow);
+ iCriteria.SetRequiredQuality(iQuality);
+
+ //because both modules have the same power consumption value
+ //agps module will be selected by default
+ DoModuleSelectionL(EWithCriteria, ENetworkModule);
+ }
+ break;
+
+ case 14: // test module selection by cost limit
+ // LBS-Quality-0004
+ {
+ iQuality.SetCostIndicator(AGPS_MODINFO_COST_INDICATOR);
+ iCriteria.SetRequiredQuality(iQuality);
+
+ DoModuleSelectionL(EWithCriteria, EAGPSModule);
+ }
+ break;
+
+ case 15: // setting a higher accuracy than all existing modules for module selection
+ // LBS-Quality-0005
+ {
+ //set an required horizontal accuracy as 1 meter
+ iQuality.SetHorizontalAccuracy(1);
+ iCriteria.SetRequiredQuality(iQuality);
+ err = iPositioner.Open(iServer, iCriteria);
+ if(KErrNotFound != err)
+ {
+ INFO_PRINTF2(_L("Test failed: wrong error returned %d"), err);
+ SetTestStepResult(EFail);
+ if(KErrNone == err)
+ {
+ iPositioner.Close();
+ }
+ }
+ }
+ break;
+
+ case 16:
+ // LBS-Quality-0006 - TTFF lower than module's and H-Acc lower (more accurate) than module's. Specified V-Acc is met by module.
+ {
+ //set required TTFF=20s, TTNF=1, H-Acc=10m, V-Acc=200m
+ iQuality.SetTimeToFirstFix(10000000);
+ iQuality.SetTimeToNextFix(1000000);
+ iQuality.SetHorizontalAccuracy(10);
+ iQuality.SetVerticalAccuracy(200);
+
+ iCriteria.SetRequiredQuality(iQuality);
+ err = iPositioner.Open(iServer, iCriteria);
+ if(KErrNotFound != err)
+ {
+ INFO_PRINTF2(_L("Test failed: wrong error returned %d"), err);
+ SetTestStepResult(EFail);
+ if(KErrNone == err)
+ {
+ iPositioner.Close();
+ }
+ }
+ }
+ break;
+
+ case 17:
+ // LBS-Quality-0007 - TTFF lower than module's and H-Acc/V-Acc lower than module's. Power and Cost match module's
+ {
+ //set required TTFF=20s, TTNF=1, H-Acc=10m, V-Acc=10m
+ iQuality.SetTimeToFirstFix(10000000);
+ iQuality.SetTimeToNextFix(1000000);
+ iQuality.SetHorizontalAccuracy(10);
+ iQuality.SetVerticalAccuracy(10);
+
+ iQuality.SetCostIndicator(TPositionQuality::ECostCharge);
+ iQuality.SetPowerConsumption(TPositionQuality::EPowerMedium);
+
+ iCriteria.SetRequiredQuality(iQuality);
+ err = iPositioner.Open(iServer, iCriteria);
+ if(KErrNotFound != err)
+ {
+ INFO_PRINTF2(_L("Test failed: wrong error returned %d"), err);
+ SetTestStepResult(EFail);
+ if(KErrNone == err)
+ {
+ iPositioner.Close();
+ }
+ }
+ }
+ break;
+
+ case 21: // Request Location update with default request ordering
+ // LBS-SelectionOrder-0001
+ {
+ DoModuleSelectionL(ENone,EAGPSModule);
+ }
+ break;
+
+ case 22: // Request location update with cost/time/accuracy/power mgmt in order of importance
+ { // LBS-SelectionOrder-0002
+ User::LeaveIfError(iSelectOrder.SetOrderCostIndicator(TPositionSelectionOrder::EOrderVeryHigh));
+ User::LeaveIfError(iSelectOrder.SetOrderTimeToFirstFix(TPositionSelectionOrder::EOrderHigh));
+ User::LeaveIfError(iSelectOrder.SetOrderHorizontalAccuracy(TPositionSelectionOrder::EOrderFairlyHigh));
+ User::LeaveIfError(iSelectOrder.SetOrderPowerConsumption(TPositionSelectionOrder::EOrderMedium));
+
+ iCriteria.SetSelectionOrder(iSelectOrder);
+
+ DoModuleSelectionL(EWithCriteria, EAGPSModule);
+ }
+ break;
+
+ // Test requires test A-GPS module to have accuracy of <100m. This must be better than Network Module.
+ case 32: // Check that we can fall back on the selection order process (stage 3) when capabilities and qualities of both modules are equal.
+ { // LBS-ModuleSelection-0002
+ iQuality.SetHorizontalAccuracy(500);
+ iCriteria.SetRequiredQuality(iQuality);
+
+ DoModuleSelectionL(EWithCriteria, EAGPSModule);
+ }
+ break;
+
+ // Test requires test A-GPS module and Network Module to have equal horizontal accuracy
+ case 33: // Check that we can ack on the Rpositioner Framework when both modules appear identical.
+ { // LBS-ModuleSelection-0003
+ if (!iParent.iSharedData->iTestModuleInUse)
+ {
+ INFO_PRINTF1(_L("This test case can ONLY be run with Test A-GPS Module"));
+ User::Panic(_L("Client Module Selection"), 1);
+ }
+ iQuality.SetHorizontalAccuracy(100);
+ iCriteria.SetRequiredQuality(iQuality);
+
+ User::LeaveIfError(iSelectOrder.SetOrderHorizontalAccuracy(TPositionSelectionOrder::EOrderVeryHigh));
+ iCriteria.SetSelectionOrder(iSelectOrder);
+
+ DoModuleSelectionL(EWithCriteria, ERandomModule);
+ }
+ break;
+
+ case 34: // Select default module on connecting to the RPositioner
+ { // LBS-ModuleSelection-0004
+ DoModuleSelectionL(EWithCriteria, EAGPSModule);
+ }
+ break;
+
+
+ case 35: // Select A-GPS module by its ID
+ { // LBS-ModuleSelection-0005
+ iModuleId.iUid = APGS_MODINFO_MODULE_ID;
+ DoModuleSelectionL(EWithModuleId, EAGPSModule);
+ }
+ break;
+
+
+ case 36: // Select Network module by its ID
+ { // LBS-ModuleSelection-0006
+ iModuleId.iUid = NETWORK_MODINFO_MODULE_ID;
+ DoModuleSelectionL(EWithModuleId, ENetworkModule);
+ }
+ break;
+
+ case 37: // Test requires test A-GPS module and Network Module to have equal power consumption
+ // when both modules match the iCriteria, check default module is used for position update
+ // LBS-ModuleSelection-0007
+ {
+ iQuality.SetPowerConsumption(TPositionQuality::EPowerLow);
+ iCriteria.SetRequiredQuality(iQuality);
+
+ User::LeaveIfError(iSelectOrder.SetOrderPowerConsumption(TPositionSelectionOrder::EOrderVeryHigh));
+ iCriteria.SetSelectionOrder(iSelectOrder);
+
+ DoModuleSelectionL(EWithCriteria, ERandomModule);
+ }
+ break;
+
+ case 38:
+ //LBS-ModuleSelection-0008
+ {
+ if (!iParent.iSharedData->iTestModuleInUse)
+ {
+ INFO_PRINTF1(_L("This test case can ONLY be run with Test A-GPS Module"));
+ User::Panic(_L("Client Module Selection"), 1);
+ }
+ iQuality.SetHorizontalAccuracy(100);
+ iCriteria.SetRequiredQuality(iQuality);
+
+ User::LeaveIfError(iSelectOrder.SetOrderHorizontalAccuracy(TPositionSelectionOrder::EOrderVeryHigh));
+ User::LeaveIfError(iSelectOrder.SetOrderPowerConsumption(TPositionSelectionOrder::EOrderVeryHigh));
+ iCriteria.SetSelectionOrder(iSelectOrder);
+
+ // Verify that the last position was retrieved by a-gps module, which has lower power consumption.
+ DoModuleSelectionL(EWithCriteria, ENetworkModule);
+ }
+ break;
+
+ default:
+ {
+ INFO_PRINTF1(_L("Invalid Test Case"));
+ User::Leave(KErrArgument);
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy(&iServer);
+ } // end if TestStepResult
+ INFO_PRINTF1(_L("<<CT_LbsClientStep_ModSelect::doTestStepL()"));
+
+ return TestStepResult();
+ }
+