lbstest/lbstestproduct/lbsclient/src/ctlbsclientstepconcurrent.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lbstest/lbstestproduct/lbsclient/src/ctlbsclientstepconcurrent.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,477 @@
+// 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 ctlbsclientstepconcurrent.cpp
+// 
+//
+
+// LBS includes.
+#include <lbspositioninfo.h>
+#include <lbsareainfo.h>
+#include <e32base.h>
+#include <lbs.h>
+
+#include <lbssatellite.h>
+
+#include <lbs/test/tlbsutils.h>
+
+#include <etel3rdparty.h>
+#include <simtsy.h>
+
+
+// LBS test includes.
+#include "ctlbsclientstepconcurrent.h"
+
+const TInt KSimTsyTransitionDelay = 4000000; // Currently it seems to take the SimTsy 3 seconds to change cell
+
+//Literals Used
+_LIT(KTestCaseId, "tc_id");
+_LIT(KPosInfosFile, "pos_infos_file");
+_LIT(KLbsModuleType, "module_type");
+_LIT(KLbsModuleType_Real, "real");
+
+/**
+ * Destructor
+ */
+CT_LbsClientStep_Concurrent::~CT_LbsClientStep_Concurrent()
+	{
+	// Delete this active scheduler
+	if (iScheduler)
+		delete iScheduler;
+
+	// Clear arrays.
+	for (TInt i = 0; i < iVerifyPosInfoArr.Count(); ++i)
+		delete iVerifyPosInfoArr[i];
+	iVerifyPosInfoArr.Close();
+
+	for (TInt i = 0; i < iCurrentPosInfoArr.Count(); ++i)
+		delete iCurrentPosInfoArr[i];
+	iCurrentPosInfoArr.Close();
+	}
+
+/**
+ * Constructor
+ */
+CT_LbsClientStep_Concurrent::CT_LbsClientStep_Concurrent()
+	{
+	iTestModuleInUse = ETrue;
+	SetTestStepName(KLbsClientStepConcurrent);
+	}
+
+/**
+Static Constructor
+*/
+CT_LbsClientStep_Concurrent* CT_LbsClientStep_Concurrent::New()
+	{
+	CT_LbsClientStep_Concurrent* testStep = new CT_LbsClientStep_Concurrent();
+	// Note the lack of ELeave.
+	// This means that having insufficient memory will return NULL;
+	if (testStep)
+		{
+		TInt err = KErrNone;
+
+		TRAP(err, testStep->ConstructL());
+		if (err)
+			{
+			delete testStep;
+			testStep = NULL;
+			}
+		}
+
+	return testStep;
+	}
+
+void CT_LbsClientStep_Concurrent::ConstructL()
+	{
+	
+	// Create this objects active scheduler in 
+	// case some tests needs it.
+	iScheduler = new (ELeave) CActiveScheduler();
+
+	CActiveScheduler::Install(iScheduler);
+	}
+
+/**
+ * @return - TVerdict code
+ */
+TVerdict CT_LbsClientStep_Concurrent::doTestStepL()
+	{
+	// Generic test step used to test the LBS Client Notify position update API.
+	INFO_PRINTF1(_L("   CT_LbsClientStep_Concurrent::doTestStepL()"));
+
+	if (TestStepResult() == EPass)
+		{
+		TPositionAreaExtendedInfo matchLevel, expectedMatchLevel;
+		// Connect to self locate server.
+		TInt err = iServer.Connect();
+		User::LeaveIfError(err);
+		CleanupClosePushL(iServer);
+		TPositionModuleId modId;
+		T_LbsUtils utils;
+		modId = utils.GetAGpsModuleIdL(iServer);
+		User::LeaveIfError(iPositioner.Open(iServer, modId));
+		CleanupClosePushL(iPositioner);
+		
+		
+		// Create the verifiable position info
+		// CreateVerifyPositionInfoL();
+
+		// Carry out actions required by each specific test (id).
+		if (GetIntFromConfig(ConfigSection(), KTestCaseId, iTestCaseId))
+			{
+			switch (iTestCaseId)
+				{
+				case 0:
+					{
+					// This test is for setting up the database. It is sometimes
+					// run sequentially before starting other concurrent tests.
+					
+					// First clear the DB.
+					TRequestStatus emptyStatus;
+					iServer.EmptyLastKnownPositionStore(emptyStatus);
+					User::WaitForRequest(emptyStatus);
+					
+					TPositionInfo* posInfo = new (ELeave) TPositionInfo();
+					//Move to next cell in sim tsy config file to ensure
+					// the Location Monitor DB has at least information about
+					// one area/cell Id.
+					RProperty::Set(KUidPSSimTsyCategory,
+							KPSSimTsyTimersReduceTime, KReduceSimTsyTimers);
+					User::After(KSimTsyTransitionDelay);
+
+					// Issue NPUD waiting for result to make sure a position
+					// has gone into the Location Monitor database before
+					// the real test starts
+					TRequestStatus status;
+					iPositioner.NotifyPositionUpdate(*posInfo, status);
+					User::WaitForRequest(status);
+					delete posInfo;
+					break;
+					}
+				case 1:
+					{
+					//
+					// This test requests an NPUD and a GLKPA from the
+					// same subsession
+					//
+					TPositionInfo* posInfo1 = new (ELeave) TPositionInfo();
+					TPositionInfo* posInfo2 = new (ELeave) TPositionInfo();
+					iCurrentPosInfoArr.Append(posInfo1);
+					iCurrentPosInfoArr.Append(posInfo2);
+					
+					//1. Move to next cell in sim tsy config file
+					//RProperty::Set(KUidPSSimTsyCategory,
+					//		KPSSimTsyTimersReduceTime, KReduceSimTsyTimers);
+					//User::After(KSimTsyTransitionDelay);
+
+					//2. NPUD waiting for result to make sure a position
+					// has gone into the Location Monitor database before
+					// the real test starts
+					TRequestStatus status1;
+					//iPositioner.NotifyPositionUpdate(*posInfo1, status1);
+					//User::WaitForRequest(status1);
+					
+					//3. NPUD that will be simultaneous to a GLKPA (step 4)
+					iPositioner.NotifyPositionUpdate(*posInfo1, status1);
+
+					//4. GLKPA that is simultaneous to the NPUD at step 3
+					TRequestStatus status2;
+					iPositioner.GetLastKnownPositionArea(*posInfo2 , matchLevel, status2);					
+
+					User::WaitForRequest(status1);
+					User::WaitForRequest(status2);
+					
+					// NOTE: in concurrent mode, this validation only makes sense when
+					// the integration module has been asked to reply always with the same
+					// position. This is because at this point there's no way to know if the
+					// posInfo2 will contain the position that went into the Location Monitor's
+					// Database after step 3 above or the value returned by the integration
+					// module after a concurrent step got its response
+					// to the NPUD in step 3 above. If the position returned by the integration
+					// module is always the same, then the validation should pass.
+					TESTL(KErrNone == status2.Int());
+					Validate(*posInfo1, *posInfo2, matchLevel, ETrue, ETrue, ETrue, ETrue);
+					break;
+					}
+					
+				case 2:
+					{
+					//
+					// This test requests an GLKP and a GLKPA from the
+					// same subsession
+					//
+					TPositionInfo* posInfo3 = new (ELeave) TPositionInfo();
+					TPositionInfo* posInfo4 = new (ELeave) TPositionInfo();
+					iCurrentPosInfoArr.Append(posInfo3);
+					iCurrentPosInfoArr.Append(posInfo4);
+
+					
+					
+					//1. Move to next cell in sim tsy config file
+					//RProperty::Set(KUidPSSimTsyCategory,
+					//		KPSSimTsyTimersReduceTime, KReduceSimTsyTimers);
+					//User::After(KSimTsyTransitionDelay);
+
+					//2. NPUD waiting for result to make sure a position
+					// has gone into the Location Monitor database before
+					// the real test starts
+					TRequestStatus status3;
+					//iPositioner.NotifyPositionUpdate(*posInfo3, status3);
+					//User::WaitForRequest(status3);
+					
+					//3. GLKP that will be simultaneous to a GLKPA (step 4)
+					iPositioner.GetLastKnownPosition(*posInfo3, status3);
+
+					//4. GLKPA that is simultaneous to the NPUD at step 3
+					TRequestStatus status4;
+					iPositioner.GetLastKnownPositionArea(*posInfo4 , matchLevel, status4);					
+
+					User::WaitForRequest(status3);
+					User::WaitForRequest(status4);
+					
+					// NOTE: in concurrent mode, this validation only makes sense when
+					// the integration module has been asked to reply always with the same
+					// position. This is because at this point there's no way to know if the
+					// posInfo2 will contain the position that went into the Location Monitor's
+					// Database after step 3 above or the value returned by the integration
+					// module after a concurrent step got its response
+					// to the NPUD in step 3 above. If the position returned by the integration
+					// module is always the same, then the validation should pass.
+					TESTL(KErrNone == status4.Int());
+					Validate(*posInfo3, *posInfo4, matchLevel, ETrue, ETrue, ETrue, ETrue);
+					break;
+					}
+					
+				case 3:
+					{
+					//
+					// This test only requests GLKPA (meant to be used 
+					// concurrently with other test cases in this file)
+					//
+					TPositionInfo* posInfo5 = new (ELeave) TPositionInfo();
+					TPositionInfo* posInfo6 = new (ELeave) TPositionInfo();
+					iCurrentPosInfoArr.Append(posInfo5);
+					iCurrentPosInfoArr.Append(posInfo6);
+
+					TRequestStatus status5;
+
+					iPositioner.GetLastKnownPositionArea(*posInfo6 , matchLevel, status5);					
+
+					User::WaitForRequest(status5);
+					
+					TESTL(KErrNone == status5.Int());
+					
+					break;
+					}
+					
+				case 31: 
+					{
+					//
+					// This test requests GLKPA then cancels it (meant to be used 
+					// concurrently with other test cases in this file)
+					//
+					TRequestStatus status6;
+
+					TPositionInfo* posInfo7 = new (ELeave) TPositionInfo();
+					TPositionInfo* posInfo8 = new (ELeave) TPositionInfo();
+					iCurrentPosInfoArr.Append(posInfo7);
+					iCurrentPosInfoArr.Append(posInfo8);
+					
+					//3. GLKPA 
+					iPositioner.GetLastKnownPositionArea(*posInfo8 , matchLevel, status6);
+					
+					//4. Cancel the above request
+					err = iPositioner.CancelRequest(RPositioner::EReqGetLastKnownPositionArea);
+
+					User::WaitForRequest(status6);
+					
+					// The cancel may either return KErrNone, in which case the GLKPA
+					// must complete with KErrCancel or the cancel may complete with
+					// KErrNotFound, in which case the GLKPA should complete normally
+					// with KErrNone
+					INFO_PRINTF2(_L("GLKPA completed with completion code %d"), status6.Int());
+					if(err != KErrNone && err != KErrNotFound)
+						{
+						ERR_PRINTF2(_L("Incorrect Cancel error: %d"), err);
+						SetTestStepResult(EFail);
+						}
+					else if ((err == KErrNone) && (status6.Int() != KErrCancel))
+						{
+						ERR_PRINTF2(_L("Incorrect GLKPA completion code: %d"), status6.Int());
+						SetTestStepResult(EFail);	
+						}
+					else if ((err == KErrNotFound) && (status6.Int() != KErrNone))
+						{
+						ERR_PRINTF2(_L("Incorrect GLKPA completion code: %d"), status6.Int());
+						SetTestStepResult(EFail);	
+						}
+					
+					break;
+					}
+
+				case 4:
+					{
+					TRequestStatus emptyStatus;
+					iServer.EmptyLastKnownPositionStore(emptyStatus);
+					User::WaitForRequest(emptyStatus);
+					if(emptyStatus.Int() != KErrNone)
+						{
+						ERR_PRINTF2(_L("Incorrect err %d returned"), emptyStatus.Int());
+						SetTestStepResult(EFail);
+						}
+					break;
+					}
+					
+				case 41: 
+					{
+					TRequestStatus emptyStatus;
+					iServer.EmptyLastKnownPositionStore(emptyStatus);
+					//5. Cancel Clear Database
+					iServer.CancelRequest(RPositionServer::EReqEmptyLastKnownPositionStore);
+					User::WaitForRequest(emptyStatus);
+					if(emptyStatus.Int() != KErrNone && emptyStatus.Int() != KErrCancel)
+						{
+						ERR_PRINTF2(_L("Incorrect err %d returned"), emptyStatus.Int());
+						SetTestStepResult(EFail);
+						}
+					break;
+					}
+				default:
+					{
+					INFO_PRINTF2(_L("<FONT><B>   Case number %d did not match any expected value</B></FONT>"),iTestCaseId);
+					User::Panic(KLbsClientStepConcurrent, KErrUnknown);
+					}
+    		    }	
+			}
+						
+			// Unless the testcase has been testcase 0000, whose only purpose is
+			// setting up the Location Monitor DB, delete the database after each
+			// test. Waiting two seconds before deleting the database gives
+			// concurrent testcases terminating later a chance to use the database.
+			// 
+			//if (iTestCaseId != 0)
+			//	{
+			//	User::After(2000000); // 2 seconds
+			//	TRequestStatus emptyStatus;
+			//	iServer.EmptyLastKnownPositionStore(emptyStatus);
+			//	User::WaitForRequest(emptyStatus);
+			//	}
+
+			
+			// All done, clean up.
+			CleanupStack::PopAndDestroy(&iPositioner);
+			CleanupStack::PopAndDestroy(&iServer);	
+		}
+	INFO_PRINTF1(_L("&lt;&lt;CT_LbsClientStep_Concurrent::doTestStepL()"));
+	return TestStepResult();
+	}
+
+
+void CT_LbsClientStep_Concurrent::CreateVerifyPositionInfoL()
+{
+		INFO_PRINTF1(_L("   CreateVerifyPositionInfoL"));
+
+		TPtrC configFileName;
+		GetStringFromConfig(ConfigSection(), KPosInfosFile, configFileName);
+
+		T_LbsUtils utils;
+
+		utils.GetConfigured_PosInfosL(configFileName, ConfigSection(), iVerifyPosInfoArr); // Note previous entries will be cleared.
+
+		// Notify the test module that it's required to update it's test data.
+		TPtrC modType;
+		GetStringFromConfig(ConfigSection(), KLbsModuleType, modType);
+		if (modType != KLbsModuleType_Real)
+			{
+
+			TModuleDataIn modDataIn;
+
+			modDataIn.iRequestType = TModuleDataIn::EModuleRequestConfig;
+			modDataIn.iConfigFileName = configFileName;
+			modDataIn.iConfigSection = ConfigSection();
+
+			// Now publish the ini file and section name to the test module - will block.
+			utils.NotifyModuleOfConfigChangeL(modDataIn);
+			}
+		else
+			{
+			iTestModuleInUse = EFalse;	// Indicate to test harness the real A-GPS integration module is being used.
+			}
+}
+
+void CT_LbsClientStep_Concurrent::VerifyPosInfo()
+{
+	INFO_PRINTF1(_L("   VerifyPosInfo"));
+
+	T_LbsUtils utils;
+	TBool res;
+	// Verify arrays are equal.
+	if(iTestModuleInUse)
+		res = utils.Compare_PosInfoArr(iVerifyPosInfoArr, iCurrentPosInfoArr, T_LbsUtils::EExactAccuracy);
+	else
+		res = utils.Compare_PosInfoArr(iVerifyPosInfoArr, iCurrentPosInfoArr, T_LbsUtils::ERoughAccuracy);
+
+	// Fail test if arrays do not match.
+	if (!res)
+    	{
+    	INFO_PRINTF1(_L("   Positions didnt match"));
+		SetTestStepResult(EFail);
+	    }
+}
+
+void CT_LbsClientStep_Concurrent::Validate(TPositionInfo& aExpectedPosition, TPositionInfo& aActualPosition, 
+		TPositionAreaExtendedInfo& aActualArea, TBool aMccExpected, TBool aMncExpected, TBool aLacExpected, TBool aCidExpected)
+	{
+	TPositionAreaExtendedInfo expectedArea;
+	expectedArea.SetMobileCountryCodeMatch(aMccExpected);
+	expectedArea.SetMobileNetworkCodeMatch(aMncExpected);
+	expectedArea.SetLocationAreaCodeMatch(aLacExpected);
+	expectedArea.SetCellIdMatch(aCidExpected);	
+	VerifyMatchLevel(expectedArea, aActualArea);
+	
+	T_LbsUtils utils;
+	TBool equality = utils.Compare_PosInfo(aExpectedPosition, aActualPosition);
+	if(!equality)
+		{
+		ERR_PRINTF1(_L("Position does not match"));
+		SetTestStepResult(EFail);
+		}
+	}
+
+
+TInt CT_LbsClientStep_Concurrent::VerifyMatchLevel(TPositionAreaExtendedInfo& aExpected, TPositionAreaExtendedInfo& aActual)
+	{
+	TInt err = KErrNone;
+	if (!(aExpected.MobileCountryCodeMatch() == aActual.MobileCountryCodeMatch() &&
+			aExpected.MobileNetworkCodeMatch() == aActual.MobileNetworkCodeMatch() &&
+			aExpected.LocationAreaCodeMatch() == aActual.LocationAreaCodeMatch() &&
+			aExpected.CellIdMatch() == aActual.CellIdMatch()))
+		{
+		ERR_PRINTF1(_L("Incorrect Match level"));
+		ERR_PRINTF5(_L("Expected: MCC:%d, MNC:%d, LAC:%d, CID:%d"), 
+				aExpected.MobileCountryCodeMatch(), 
+				aExpected.MobileNetworkCodeMatch(),
+				aExpected.LocationAreaCodeMatch(),
+				aExpected.CellIdMatch());
+		ERR_PRINTF5(_L("Actual: MCC:%d, MNC:%d, LAC:%d, CID:%d"), 
+				aActual.MobileCountryCodeMatch(), 
+				aActual.MobileNetworkCodeMatch(),
+				aActual.LocationAreaCodeMatch(),
+				aActual.CellIdMatch());
+		SetTestStepResult(EFail);
+		err = KErrGeneral;
+		}
+	return err;
+	}
+
+