diff -r e8c1ea2c6496 -r 8758140453c0 lbs/lbsclient/src/ctlbsclientstepcellbasednpud.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lbs/lbsclient/src/ctlbsclientstepcellbasednpud.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,474 @@ +// 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 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: +// @file ctlbsclientstep_cellbasednpud.cpp +// This is the class implementation for the Notify Position Update Tests +// +// + +#include "ctlbsclientstepcellbasednpud.h" + +#include +#include + +#include "tlbsutils.h" +#include "ctlbsasyncwaiter.h" + + +// constant definitions + +_LIT(KLbsClientStepCellBasedNotifyPosUpdate, "LbsClientStepCellBasedNotifyPosUpdate"); + +// by default, a test case will abort after this time if all callbacks not completed: +// Note that this must be less than the TEF timeout in the script to be of any value +TTimeIntervalMicroSeconds32 KDefaultAbortTimerPeriod = 90*1000000; // 1.5 mins + +// by default, a test case running with real gps hardware will abort after this time +// Note that this must be less than the TEF timeout in the script to be of any value +TTimeIntervalMicroSeconds32 KDefaultAbortTimerPeriod_real = 100*1000000; // 5 mins + + +/** + * Destructor + */ +CT_LbsClientStep_CellBasedNotifyPosUpdate::~CT_LbsClientStep_CellBasedNotifyPosUpdate() + { + iDoPosUpdate->Cancel(); + delete iDoPosUpdate; + } + + +/** + * Constructor + */ +CT_LbsClientStep_CellBasedNotifyPosUpdate::CT_LbsClientStep_CellBasedNotifyPosUpdate(CT_LbsClientServer& aParent) : iParent(aParent) + { + SetTestStepName(KLbsClientStep_CellBasedNotifyPosUpdate); + } + + +/** +Static Constructor +*/ +CT_LbsClientStep_CellBasedNotifyPosUpdate* CT_LbsClientStep_CellBasedNotifyPosUpdate::New(CT_LbsClientServer& aParent) + { + // Can't leave, so return NULL if insufficient memory + CT_LbsClientStep_CellBasedNotifyPosUpdate* testStep = new CT_LbsClientStep_CellBasedNotifyPosUpdate(aParent); + if (testStep) + { + TInt err = KErrNone; + + TRAP(err, testStep->ConstructL()); + if (err) + { + delete testStep; + testStep = NULL; + } + } + return testStep; + + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::ConstructL() + { + // Create the base class object. + CT_LbsNetSimStep::ConstructL(); + + // Active object wrapper for the notify position update. + iDoPosUpdate = CT_LbsDoPosUpdate::NewL(this, TPositionModuleInfo::ETechnologyNetwork); + + } + +/** + * @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_CellBasedNotifyPosUpdate::doTestStepL() + { + // Generic test step used to test the LBS Client Notify position update API. + INFO_PRINTF1(_L(">>CT_LbsClientStep_CellBasedNotifyPosUpdate::doTestStepL()")); + + if (TestStepResult()==EPass) // TODO still don't see why we need this... + { + iNetworkUnavailable = FALSE; + iIsCancelTest = FALSE; + iCancel = FALSE; + iCancelOnPosUpdate = FALSE; + iCancelBeforePosUpdate = FALSE; + iMultiReq = EFalse; + iNumNPUDs = iParent.iSharedData->iVerifyPosInfoArr.Count(); // how many NPUDs to do + + // Expected callbacks flags + iFlagsToHaltOn = KLbsCallback_NetSim_Got_Connect | + KLbsCallback_NetworkBasedLocation | + KLbsCallback_Got_NotifyPositionUpdate; // notifypositionupdate completed. + + + TTimeIntervalMicroSeconds32 abortInterval; + if(iParent.iSharedData->iTestModuleInUse) + { + abortInterval = KDefaultAbortTimerPeriod; + } + else + { + abortInterval = KDefaultAbortTimerPeriod_real; + } + + // Carryout unique test actions. + TInt testCaseId; + if (GetIntFromConfig(ConfigSection(), KTestCaseId, testCaseId)) + { + switch (testCaseId) + { + case 1: // LBS-NotifyPosUpdateCellBased-0001 Request a cell-based location + { + // nothing to do + } + break; + + case 2: // LBS-NotifyPosUpdateCellBased-0002 Request a cell-based location and cancel before it completes + { + iCancel = ETrue; + iFlagsToHaltOn = KLbsCallback_NetSim_Got_Connect | + KLbsCallback_Got_NotifyPositionUpdate; + } + break; + + case 3: // LBS-NotifyPosUpdateCellBased-0003 Request a cell-based location, when network unavailable + { + iNetworkUnavailable = ETrue; + // TO DO - are these the right flags (get NO NetSIm callbacks while network unavailable)? + iFlagsToHaltOn &= ~KLbsCallback_NetworkBasedLocation; + } + break; + + case 4: // LBS-NotifyPosUpdateCellBased-0004 multiple sequential npuds + { + iMultiReq = ETrue; + } + break; + + case 5: // LBS-NotifyPosUpdateCellBased-0005 Request a cell-based location and attempt to cancel when the update is received + { + iCancelOnPosUpdate = ETrue; + iFlagsToHaltOn = KLbsCallback_NetSim_Got_Connect | + KLbsCallback_Got_NotifyPositionUpdate; + } + break; + + case 6: // LBS-NotifyPosUpdateCellBased-0006 Request a cell-based location and cancel before a position update is generated + { + iCancelBeforePosUpdate = ETrue; + iFlagsToHaltOn = KLbsCallback_NetSim_Got_Connect | + KLbsCallback_Got_NotifyPositionUpdate; + } + + break; + + default: + User::Panic(KLbsClientStepCellBasedNotifyPosUpdate, KErrUnknown); + } + } + else + { + User::Panic(KLbsClientStepCellBasedNotifyPosUpdate, KErrUnknown); + } + + iIsCancelTest = (iCancel || iCancelBeforePosUpdate || iCancelOnPosUpdate); + + // Steps common to all tests: + + // Connect to net sim + iNetSim.ConnectL(this); + + // Configure NetSim: + // Set reference location: + RPointerArray& srcPosInfoArr = iParent.iSharedData->iVerifyPosInfoArr; + TPositionInfo* srcPosInfo = reinterpret_cast(srcPosInfoArr[0]); + TPosition srcPos; + srcPosInfo->GetPosition(srcPos); + if (!iNetSim.SetReferenceLocation(srcPos)) + { + INFO_PRINTF1(_L("CT_LbsClientStep_CellBasedNotifyPosUpdate::doTestStepL() Failed: Can't set NetSim's reference location.")); + SetTestStepResult(EFail); + } + + // 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("Can't set NetSim's assistance data plugin uid.")); + SetTestStepResult(EFail); + } + + // make network unavailable if appropriate: + if(iNetworkUnavailable) + { + // Tell netsim to make network unavailable until further notice: + if(!iNetSim.SetResponseError(RLbsNetSimTest::KNetSimNetworkNotAvailable, ETrue)) //sticky + { + INFO_PRINTF1(_L("CT_LbsClientStep_CellBasedNotifyPosUpdate::doTestStepL() Failed: Can't set NetSim's response error.")); + SetTestStepResult(EFail); + } + } + + // Kick off the keep alive timer - do last to ensure NetSim is ready otherwise the + // timer callback may start a MO-LR if the NetSim connected too early. + TTimeIntervalMicroSeconds32 interval(KLbsKeepAlivePeriod); + + iKeepAliveTimer->SetTimer(interval); + + // don't wait for TEF to timeout and abort + iAbortTimer->SetTimer(abortInterval); + + // Kick off test. + CActiveScheduler::Start(); + + if(EDone != iState) + { + INFO_PRINTF2(_L("Failed test, finished in state %d"), iState); + INFO_PRINTF3(_L("Callback flags currently set = 0x%x. Expecting 0x%x"), iCallbackFlags, iFlagsToHaltOn); + SetTestStepResult(EFail); + } + else + { + INFO_PRINTF2(_L("Got all expected callbacks (0x%x)"), iCallbackFlags); + } + + iNetSim.Close(); + + } + + INFO_PRINTF1(_L("<<CT_LbsClientStep_CellBasedNotifyPosUpdate::doTestStepL()")); + + return TestStepResult(); + } + + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::Connected() + { + // Call base implementation. + CT_LbsNetSimStep::Connected(); + + if(iCancelBeforePosUpdate) + { + TPositionInfo* posInfo = new(ELeave) TPositionInfo(); + iDoPosUpdate->StartL(*posInfo); + + iNumNPUDs--; + + // Wait for all expected callback flags to be set: + iState = CT_LbsNetSimStep::EWaiting; + + // Cancel the request for the cancel test. + iDoPosUpdate->CancelRequest(); + delete posInfo; + } + else + { + T_LbsUtils utils; + // Create a posinfo and store in our shared array for later verification. + RPointerArray& posInfoArr = iParent.iSharedData->iCurrentPosInfoArr; + TPositionInfo* posInfo = new(ELeave) TPositionInfo(); + utils.ResetAndDestroy_PosInfoArr(posInfoArr); // Clear previous entries before new entry is appended. + posInfoArr.Append(posInfo); + + iDoPosUpdate->StartL(*posInfo); + + iNumNPUDs--; + + // Wait for all expected callback flags to be set: + iState = CT_LbsNetSimStep::EWaiting; + + // Cancel the request for the cancel test. + if(iCancel) + { + User::After((TTimeIntervalMicroSeconds32)100000); // arbitrary delay as workaround for DEF107349 + iDoPosUpdate->CancelRequest(); + } + } + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::Disconnected() + { + // Call base implementation. + CT_LbsNetSimStep::Disconnected(); + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyRegisterLcsMoLr(const TDesC& aData) + { + if (!iIsCancelTest) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyRegisterLcsMoLr(aData); + } + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyReleaseLcsMoLr(TInt aReason) + { + if (!iIsCancelTest) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyReleaseLcsMoLr(aReason); + } + } + +// Measurement Control has been received from Network: +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyMeasurementControlLocation(const TPositionInfo& aPosition, const RLbsAssistanceDataBuilderSet& aData, const TLbsNetPosRequestQuality& aQuality) + { + if (!iIsCancelTest) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyMeasurementControlLocation(aPosition, aData, aQuality); + } + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyReleaseLcsLocationNotification(const CLbsNetworkProtocolBase::TLbsPrivacyResponse& aResult) + { + if (!iIsCancelTest) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyReleaseLcsLocationNotification(aResult); + } + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyFacilityLcsMoLrResult(TInt aReason, const TPositionInfo& aPosition) + { + if (!iIsCancelTest) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyFacilityLcsMoLrResult(aReason, aPosition); + } + } + +// Our position has been reported to network +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyMeasurementReportLocation(const TPositionInfo& aPosition) + { + if(iCancelOnPosUpdate) + { + iDoPosUpdate->CancelRequest(); + } + if (!iIsCancelTest) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyMeasurementReportLocation(aPosition); + } + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyMeasurementReportRequestMoreAssistanceData(const TLbsAssistanceDataGroup& aFilter) + { + if (!iIsCancelTest) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyMeasurementReportRequestMoreAssistanceData(aFilter); + } + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyMeasurementReportControlFailure(TInt aReason) + { + if (!iIsCancelTest && !iMultiReq) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyMeasurementReportControlFailure(aReason); + } + else if (iMultiReq && ! ((aReason == KErrPositionHighPriorityReceive) || (aReason == KErrServerBusy))) + { + INFO_PRINTF2(_L("FAILED: NotifyMeasurementReportControlFailure with reason = %d"), aReason); + SetTestStepResult(EFail); + } + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::NotifyError(MLbsNetSimTestObserver::EFunction aFunction, int aError) + { + // Call base implementation. + CT_LbsNetSimStep::NotifyError(aFunction, aError); + } + +void CT_LbsClientStep_CellBasedNotifyPosUpdate::ProcessMeasurementControlLocationError(TInt aError) + { + // Call base implementation. + CT_LbsNetSimStep::ProcessMeasurementControlLocationError(aError); + } + +/** Notify position update callback. +*/ +void CT_LbsClientStep_CellBasedNotifyPosUpdate::MT_LbsDoPosUpdateCallback(TRequestStatus& aStatus) + { + TInt err = aStatus.Int(); + + INFO_PRINTF2(_L("CT_LbsClientStep_CellBasedNotifyPosUpdate::MT_LbsDoPosUpdateCallback: Got - Notify Update - Callback Event. Error = %d"), err); + + if(!iNumNPUDs) // only set the flag when we've got them all + { + SetCallbackFlag(KLbsCallback_Got_NotifyPositionUpdate); + } + + if(iNetworkUnavailable) + { + if(KErrTimedOut != err && KErrDisconnected != err) + { + INFO_PRINTF2(_L("FAILED: MT_LbsDoPosUpdateCallback with error %d, expecting KErrTimedOut"), err); + SetTestStepResult(EFail); + } + } + else + { + if(iCancel) + { + if(KErrCancel != err && KErrNone != err) + { + INFO_PRINTF2(_L("FAILED: MT_LbsDoPosUpdateCallback with error = %d"), err); + SetTestStepResult(EFail); + } + } + else + { + if(iCancelBeforePosUpdate) + { + if(KErrCancel != err) + { + INFO_PRINTF2(_L("FAILED: MT_LbsDoPosUpdateCallback with error = %d"), err); + SetTestStepResult(EFail); + } + } + else + { + if(KErrNone != err) + { + INFO_PRINTF2(_L("FAILED: MT_LbsDoPosUpdateCallback with error = %d"), err); + SetTestStepResult(EFail); + } + } + } + } + + if(iNumNPUDs--) + { + // Create another posinfo and store in our shared array for later verification. + RPointerArray& posInfoArr = iParent.iSharedData->iCurrentPosInfoArr; + TPositionInfo* posInfo = new(ELeave) TPositionInfo(); + posInfoArr.Append(posInfo); + + iDoPosUpdate->StartL(*posInfo); + } + }