diff -r e8c1ea2c6496 -r 8758140453c0 lbs/lbsclient/src/ctlbsclientpostp257.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lbs/lbsclient/src/ctlbsclientpostp257.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,592 @@ +// 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 "ctlbsclientpostp257.h" + +// CONSTANTS +_LIT(KLastPosition, "c:\\private\\101f97b2\\LastKnownPos.dat"); + +// ================= MEMBER FUNCTIONS ======================= + + +// --------------------------------------------------------- +// Constructor. +// --------------------------------------------------------- +CT_LbsClientPosTp257::CT_LbsClientPosTp257(CT_LbsServer& aParent): CT_LbsPortedStepBase(aParent) + { + _LIT(KTestName, "Tp257-GetLastKnown Position, update options"); + SetTestStepName(KTestName); + } + +// --------------------------------------------------------- +// Destructor. +// --------------------------------------------------------- +CT_LbsClientPosTp257::~CT_LbsClientPosTp257() + { + } + +// --------------------------------------------------------- +// CT_LbsClientPosTp257::CloseTest +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CT_LbsClientPosTp257::CloseTest() + { + // Disconnect disconnects from "iPosServer" + Disconnect(); + } + +// --------------------------------------------------------- +// CT_LbsClientPosTp257::StartL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CT_LbsClientPosTp257::StartL() + { + + // make sure Server is closed + User::After(2100000); + + // Remove getlastknown data file + DeleteFileL(KLastPosition); + + SetupPsyL(iUidMultiPsy); + ConnectL(); + + TInt err = KErrNone; + + RPositioner positioner1; + RPositioner positioner2; + TRequestStatus status1; + TRequestStatus status2; + TPositionInfo moduleInfo1; + TPositionInfo moduleInfo2; + TPositionInfo moduleInfo3; + TPositionInfo moduleInfoMaxAge1; + TPositionInfo moduleInfoMaxAge2; + + // 1) Connect to server and open positioner + err = positioner1.Open(iPosServer); + CleanupClosePushL(positioner1); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not open positioner"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + _LIT(KKalleService, "KallesService"); + err = positioner1.SetRequestor(CRequestor::ERequestorService, + CRequestor::EFormatApplication, KKalleService); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not set requestor"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // 2) Request a position + positioner1.NotifyPositionUpdate(moduleInfo1, status1); + User::WaitForRequest(status1); + if (status1.Int() != KErrNone) + { + _LIT(KErrorAndLeave, "Wrong status1 returned: "); + LogErrorAndLeaveL(KErrorAndLeave, status1.Int()); + } + + // Not included in TC, just test that it is possible to get a lastknownposition + positioner1.GetLastKnownPosition(moduleInfo2, status1); + User::WaitForRequest(status1); + if (status1.Int() != KErrNone) + { + _LIT(KErrorAndLeave, "Wrong status3 returned: "); + LogErrorAndLeaveL(KErrorAndLeave, status1.Int()); + } + + if (!ComparePositionL(moduleInfo1, moduleInfo2)) + { + _LIT(KErrorAndLeave, "1. The old position1 was not returned!!!"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // 3) Set update interval to 5 seconds, if there are no ongoing + // position requests a GetLastKnown request is OK + TPositionUpdateOptions posOption; + posOption.SetUpdateInterval(TTimeIntervalMicroSeconds(5000000)); + + err = positioner1.SetUpdateOptions(posOption); + _LIT(KChange, "Error when setting update interval, error %d"); + AssertTrueL(err == KErrNone, KChange, err); + + positioner1.GetLastKnownPosition(moduleInfo2, status1); + User::WaitForRequest(status1); + + if (status1.Int() != KErrNone) + { + _LIT(KErrorAndLeave, "KErrNone should be returned from a tracking session"); + LogErrorAndLeaveL(KErrorAndLeave, status1.Int()); + } + + // Reset interval + posOption.SetUpdateInterval(TTimeIntervalMicroSeconds(0)); + err = positioner1.SetUpdateOptions(posOption); + + // Get last known position + positioner1.GetLastKnownPosition(moduleInfo3, status1); + User::WaitForRequest(status1); + if (status1.Int() != KErrNone) + { + _LIT(KErrorAndLeave, "Wrong status1 returned 2: "); + LogErrorAndLeaveL(KErrorAndLeave, status1.Int()); + } + + if (!ComparePositionL(moduleInfo1, moduleInfo3)) + { + _LIT(KErrorAndLeave, "2. The old position2 was not returned!!!"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // 5 ) Set maxage to five seconds + TPositionUpdateOptions posOption2; + posOption2.SetMaxUpdateAge(TTimeIntervalMicroSeconds(5000000)); + err = positioner1.SetUpdateOptions(posOption2); + _LIT(KChange1, "Error when setting max age in SetMaxUpdateAge, error %d"); + AssertTrueL(err == KErrNone, KChange1, err); + + //Wait for five seconds + User::After(5000000); + + // 6) Get last known position + positioner1.GetLastKnownPosition(moduleInfo3, status1); + User::WaitForRequest(status1); + if (status1.Int() != KErrNone) + { + _LIT(KErrorAndLeave, "Wrong status1 returned 3"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + if (!ComparePositionL(moduleInfo1, moduleInfo3)) + { + _LIT(KErrorAndLeave, "3. The old position was not returned from positioner!!!"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // 7) Open the maxage psy + SetupPsyL(iUidTestPsyMaxAge); + err = positioner2.Open(iPosServer, iUidTestPsyMaxAge); + CleanupClosePushL(positioner2); + _LIT(KKalleService2, "KallesService2"); + err = positioner2.SetRequestor(CRequestor::ERequestorService, + CRequestor::EFormatApplication, KKalleService2); + + _LIT(KErrOepnMaxAge, "Could not open the maxage psy"); + AssertTrueL(err == KErrNone, KErrOepnMaxAge, err); + + positioner2.NotifyPositionUpdate(moduleInfoMaxAge1, status2); + User::WaitForRequest(status2); + err = status2.Int(); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Wrong status2 returned"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // 8) + positioner1.NotifyPositionUpdate(moduleInfo1, status1); + User::WaitForRequest(status1); + err = status1.Int(); + + // 9) Set maxage to four seconds for positioner2 + posOption2.SetMaxUpdateAge(TTimeIntervalMicroSeconds(4000000)); + err = positioner2.SetUpdateOptions(posOption2); + _LIT(KErrSetMaxAge, "Error when setting max age in SetMaxUpdateAge, error %d"); + AssertTrueL(err == KErrNone, KErrSetMaxAge, err); + + positioner2.NotifyPositionUpdate(moduleInfoMaxAge2, status2); + User::WaitForRequest(status2); + err = status2.Int(); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Wrong status2 returned"); + LogErrorAndLeaveL(KErrorAndLeave); + } + // Check moduleInfoMaxAge2 and moduleInfoMaxAge1 here, should be the same + _LIT(KCheckMaxAge, "Check MaxAge position"); + INFO_PRINTF1(KCheckMaxAge); + if (!ComparePositionL(moduleInfoMaxAge1, moduleInfoMaxAge2)) + { + _LIT(KErrorAndLeave, "The maxage position was not returned from maxage positioner!!!"); + LogErrorAndLeaveL(KErrorAndLeave); + } + // Close maxage positioner + positioner2.Close(); + + // 10) Check moduleInfo2 and moduleInfo1 here, should be the same + positioner1.GetLastKnownPosition(moduleInfo2, status1); + User::WaitForRequest(status1); + if (!ComparePositionL(moduleInfo2, moduleInfo1)) + { + _LIT(KErrorAndLeave, "The same maxage position was not returned from positioner for client 1!!!"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // 11) + TPositionUpdateOptions posOption3; + posOption3.SetUpdateTimeOut(TTimeIntervalMicroSeconds(4000000)); + err = positioner1.SetUpdateOptions(posOption3); + _LIT(KErrSetTimeout, "Error when setting timeout in SetUpdateOptions, error %d"); + AssertTrueL(err == KErrNone, KErrSetTimeout, err); + + _LIT(KWaitForCancel, "Wait for cancel..."); + INFO_PRINTF1(KWaitForCancel); + + // 12) + positioner1.GetLastKnownPosition(moduleInfo2, status1); + + // Wait for five seconds + User::After(5000000); + _LIT(KWaitForRequest, "Wait for WaitForRequest(status1)..."); + INFO_PRINTF1(KWaitForRequest); + User::WaitForRequest(status1); + // Check moduleInfo2 and moduleInfo1 here, should be the same + if (!ComparePositionL(moduleInfo2, moduleInfo1)) + { + _LIT(KErrorAndLeave, "4. The same position was not returned from positioner for client 1!!!"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // 13 ) Check with partial update + SetupPsyL(iUidTestPsyPartialUpdate); + err = positioner2.Open(iPosServer, iUidTestPsyPartialUpdate); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not open PartialUpdate positioner"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + _LIT(KPellesService, "PellesService"); + err = positioner2.SetRequestor(CRequestor::ERequestorService, + CRequestor::EFormatApplication, KPellesService); + + // Get a position from partial update psy + positioner2.NotifyPositionUpdate(moduleInfo1, status2); + User::WaitForRequest(status2); + err = status2.Int(); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Wrong status returned from partial update psy"); + LogErrorAndLeaveL(KErrorAndLeave, err); + } + + TPositionUpdateOptions updateOptions; + updateOptions.SetAcceptPartialUpdates(ETrue); + err = positioner2.SetUpdateOptions(updateOptions); + _LIT(KErrSetPartialupdate, "Error when setting partialupdate in SetUpdateOptions, error %d"); + AssertTrueL(err == KErrNone, KErrSetPartialupdate, err); + + // 14) GetLastKnownPosition from partial update psy + positioner2.GetLastKnownPosition(moduleInfo2, status1); + User::WaitForRequest(status1); + // Check moduleInfo2 and moduleInfo1 here, should be the same + if (!ComparePositionL(moduleInfo2, moduleInfo1)) + { + _LIT(KErrorAndLeave, "5. The same partial update position was not returned from positioner!!!"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // 15) Get another position from partial update psy, this should be a partial update position + // and should not be saved as lastknownposition + positioner2.NotifyPositionUpdate(moduleInfo1, status2); + User::WaitForRequest(status2); + err = status2.Int(); + if (err != KPositionPartialUpdate) + { + _LIT(KErrorAndLeave, "Partial Update PSY did not return KPositionPartialUpdate"); + LogErrorAndLeaveL(KErrorAndLeave, err); + } + + // 16) GetLastKnownPosition from partial update psy + positioner2.GetLastKnownPosition(moduleInfo3, status1); + User::WaitForRequest(status1); + // Check moduleInfo2 and moduleInfo1 here, should NOT be the same + if (ComparePositionL(moduleInfo1, moduleInfo2)) + { + _LIT(KErrorAndLeave, "6. The partial update position should NOT have been returned"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // Check moduleInfo3 and moduleInfo2 here, should be the same + if (ComparePositionL(moduleInfo3, moduleInfo1)) + { + _LIT(KErrorAndLeave, "7. The old position was not returned"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // Close all connections + positioner1.Close(); + positioner2.Close(); + + // 17 ) Start a periodic update session + _LIT(KPeriodicUpdate, "Checking periodic update session"); + INFO_PRINTF1(KPeriodicUpdate); + posOption.SetUpdateInterval(TTimeIntervalMicroSeconds(5000000)); + + // Connect to server and open positioner + err = positioner1.Open(iPosServer); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not open positioner"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + _LIT(KKallesPeriodicService, "KallesPeriodicService"); + err = positioner1.SetRequestor(CRequestor::ERequestorService, + CRequestor::EFormatApplication, KKallesPeriodicService); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not set requestor"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + err = positioner1.SetUpdateOptions(posOption); + _LIT(KErrSetUpdateOption, "Could not set updateoptions"); + AssertTrueL(err == KErrNone, KErrSetUpdateOption, err); + + TRequestStatus status; + positioner1.NotifyPositionUpdate(moduleInfo1, status); + User::WaitForRequest(status); + + posOption.SetUpdateInterval(TTimeIntervalMicroSeconds(0)); + // Settings update interval to 0 should stop the periodic update + err = positioner1.SetUpdateOptions(posOption); + _LIT(KErrSetUpdateOption2, "Could not set updateoptions2"); + AssertTrueL(err == KErrNone, KErrSetUpdateOption2, err); + + // Get GetLastKnownPosition from the stopped periodic update session + positioner1.GetLastKnownPosition(moduleInfo2, status); + User::WaitForRequest(status); + // Check moduleInfo2 and moduleInfo1 here, should be the same + if (!ComparePositionL(moduleInfo1, moduleInfo2)) + { + _LIT(KErrorAndLeave, "1. The periodic update session position was not equal to getlastknown position"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + positioner1.Close(); + moduleInfo1 = TPositionInfo(); + moduleInfo2 = TPositionInfo(); + + // 18 ) Start a periodic update session + INFO_PRINTF1(KPeriodicUpdate); + posOption.SetUpdateInterval(TTimeIntervalMicroSeconds(5000000)); + + // Connect to server and open positioner + err = positioner1.Open(iPosServer); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not open positioner"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + err = positioner1.SetRequestor(CRequestor::ERequestorService, + CRequestor::EFormatApplication, KKallesPeriodicService); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not set requestor"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + // Connect to server and open positioner + err = positioner2.Open(iPosServer); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not open positioner2"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + err = positioner2.SetRequestor(CRequestor::ERequestorService, + CRequestor::EFormatApplication, KKallesPeriodicService); + if (err != KErrNone) + { + _LIT(KErrorAndLeave, "Could not set requestor"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + + err = positioner1.SetUpdateOptions(posOption); + AssertTrueL(err == KErrNone, KErrSetUpdateOption, err); + + positioner1.NotifyPositionUpdate(moduleInfo1, status); + User::WaitForRequest(status); + + posOption.SetUpdateInterval(TTimeIntervalMicroSeconds(0)); + // Settings update interval to 0 should stop the periodic update + err = positioner1.SetUpdateOptions(posOption); + AssertTrueL(err == KErrNone, KErrSetUpdateOption2, err); + + positioner2.GetLastKnownPosition(moduleInfo2, status1); + User::WaitForRequest(status1); + + // Check moduleInfo2 and moduleInfo1 here, should be the same + if (!ComparePositionL(moduleInfo1, moduleInfo2)) + { + _LIT(KErrorAndLeave, "2. The periodic update session position was not equal to getlastknown position"); + LogErrorAndLeaveL(KErrorAndLeave); + } + + positioner1.Close(); + positioner2.Close(); + + CleanupStack::PopAndDestroy(1); //positioner2 + CleanupStack::PopAndDestroy(1); //positioner1 + } + +// --------------------------------------------------------- +// CT_LbsClientPosTp257::ComparePositionL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CT_LbsClientPosTp257::ComparePositionL(TPositionInfo aPosInfo1, TPositionInfo aPosInfo2) + { + _LIT(KFunctionName, "We are inside ComparePositionL"); + INFO_PRINTF1(KFunctionName); + TBool result = ETrue; + TBuf<150> buf; + + TPosition pos1 = TPosition(); + TPosition pos2 = TPosition(); + aPosInfo1.GetPosition(pos1); + aPosInfo2.GetPosition(pos2); + + TTime time1 = pos1.Time(); + TTime time2 = pos2.Time(); + + if (time1 == time2) + { + _LIT(KTime, "Equal Time"); + INFO_PRINTF1(KTime); + } + else + { + _LIT(KTime, "NOT Equal Time"); + INFO_PRINTF1(KTime); + } + + if ((time1 != time2) || (pos1.Latitude() != pos2.Latitude()) || + (pos1.Longitude() != pos2.Longitude()) || + (pos1.Altitude() != pos2.Altitude()) ) + { + // Not equal + result = EFalse; + _LIT(KNotEqual, "Not equal"); + INFO_PRINTF1(KNotEqual); + _LIT(KPosition1, "Position1: Lat %f Long %f Alt %f"); + buf.Format(KPosition1, pos1.Latitude(), pos1.Longitude() ,pos1.Altitude()); + INFO_PRINTF1(buf); + _LIT(KPosition2, "Position2: Lat %f Long %f Alt %f"); + buf.Format(KPosition2, pos2.Latitude(), pos2.Longitude() ,pos2.Altitude()); + INFO_PRINTF1(buf); + } + else + { + _LIT(KEqual, "Equal"); + INFO_PRINTF1(KEqual); + result = ETrue; + _LIT(KPosition1, "Position1: Lat %f Long %f Alt %f"); + buf.Format(KPosition1, pos1.Latitude(), pos1.Longitude() ,pos1.Altitude()); + INFO_PRINTF1(buf); + } + return result; + } + +// --------------------------------------------------------- +// CT_LbsClientPosTp257::DeleteFileL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CT_LbsClientPosTp257::DeleteFileL(const TDesC& aFile) + { + RFs fs; + TInt err = fs.Connect(); + + err = fs.Delete(aFile); + fs.Close(); + if (err == KErrNone) + { + _LIT(KDebugText, "TP257: The specified file deleted"); + INFO_PRINTF1(KDebugText); + } + else + { + if (err == KErrInUse) + { + _LIT(KErrText, "TP257: The specified file could not be deleted it is already in use, errorcode %d"); + INFO_PRINTF1(aFile); + TBuf<100> buf; + buf.Format(KErrText, err); + AssertTrueL(err==0, KErrText, err); + } + else if (err == KErrNotFound) + { + _LIT(KDebugText, "TP257: The specified file could not be found ,errorcode %d"); + TBuf<100> buf; + buf.Format(KDebugText, err); + INFO_PRINTF1(buf); + } + else + { + _LIT(KErrText, "TP257: The specified file could not be deleted, errorcode %d"); + TBuf<100> buf; + buf.Format(KErrText, err); + AssertTrueL(err==0, KErrText, err); + } + } + } + +// --------------------------------------------------------- +// CT_LbsClientPosTp254::FileExistsL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CT_LbsClientPosTp257::FileExistsL(const TDesC& aFile) + { + TBool exist = EFalse; + RFs fs; + RFile file; + TInt err = fs.Connect(); + + err = file.Open(fs, aFile, EFileRead); + if (err==KErrNotFound) // file does not exist + { + fs.Close(); + _LIT(KErrText, "TP257: The specified file does not exist"); + INFO_PRINTF1(KErrText); + } + else + { + exist = ETrue; + _LIT(KErrText, "TP257: The specified file exists"); + INFO_PRINTF1(KErrText); + file.Close(); + fs.Close(); + } + return exist; + }