--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/ipupsplugins/test/te_ipups/src/te_ipups_ups_step.cpp Tue Aug 31 16:45:15 2010 +0300
@@ -0,0 +1,613 @@
+// Copyright (c) 2008-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
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "te_ipups_ups_step.h"
+#include "upstestnotifierproperties.h"
+#include <s32mem.h>
+
+static TInt ThreadFunction(TAny *)
+ {
+ return KErrNone;
+ }
+
+CIpUpsStep::~CIpUpsStep()
+/**
+ * Destructor
+ */
+ {
+ } // End of function
+
+
+CIpUpsStep::CIpUpsStep()
+/**
+ * Constructor
+ */
+ {
+ SetTestStepName(KIpUpsClientStep);
+ } // End of function
+
+
+TVerdict CIpUpsStep::doTestStepPreambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+ {
+ TSecurityPolicy nullPolicy(ECapability_None);
+ TInt err;
+
+ //Properties modified to be returned to test harness from test notifier
+ err = RProperty::Define(KUidPSUPSTestNotifCategory, KUnNotifyCount, KUnCountKeyType, nullPolicy, nullPolicy);
+ if (err != KErrAlreadyExists && err != KErrNone)
+ {
+ User::LeaveIfError(err);
+ }
+
+ err = RProperty::Define(KUidPSUPSTestNotifCategory, KUnNotifyValues, KUnNotifyValuesKeyType, nullPolicy, nullPolicy);
+ if (err != KErrAlreadyExists && err != KErrNone)
+ {
+ User::LeaveIfError(err);
+ }
+
+ //Properties test notifier requires from test harness about the button press and delay
+ err = RProperty::Define(KUidPSUPSTestNotifCategory, KUtButtonPress, KUtButtonPressKeyType, nullPolicy, nullPolicy);
+ if (err != KErrAlreadyExists && err != KErrNone)
+ {
+ User::LeaveIfError(err);
+ }
+
+ err = RProperty::Define(KUidPSUPSTestNotifCategory, KUtButtonPressDelay, KUtButtonPressDelayKeyType, nullPolicy, nullPolicy);
+ if (err != KErrAlreadyExists && err != KErrNone)
+ {
+ User::LeaveIfError(err);
+ }
+
+ //Get the testNotifier working mode, filemode or P&S mode
+ User::LeaveIfError(RProperty::Get(KUidPSUPSTestNotifCategory, KUtFileOverride, iTestNotifierMode));
+
+ //Set the property to override working of testNotifier in P&S mode instead of filemode
+ User::LeaveIfError(RProperty::Set(KUidPSUPSTestNotifCategory, KUtFileOverride, KFileOverride));
+
+ //Initialise optional data iNoOfAuthoriseCalls (should be '1' minimum).
+ iNoOfAuthoriseCalls = 1;
+
+ //Initialise optional data iPromptTriggerCount (Initialising with '-1' means no check if user not specfied in INI file).
+ iPromptTriggerCount = -1;
+
+ //Read data from INI file
+ GetHexFromConfig(ConfigSection(), KIpUpsServiceId, iServiceUID);
+ GetStringFromConfig(ConfigSection(),KIpUpsDestination, iDestination);
+ GetStringFromConfig(ConfigSection(),KIpUpsOpaqueData, iOpaqueData);
+ GetStringFromConfig(ConfigSection(),KIpUpsDialogOptionSelection, iDialogOption);
+ GetBoolFromConfig(ConfigSection(),KIpUpsPlatSecPass, iPlatSecPass);
+ GetStringFromConfig(ConfigSection(),KIpUpsExpectedDecision, iExpectedUpsDecision);
+ GetIntFromConfig(ConfigSection(),KIpUpsPromptTriggerCount, iPromptTriggerCount);
+ GetIntFromConfig(ConfigSection(),KIpUpsNoOfAuthoriseCalls, iNoOfAuthoriseCalls);
+ GetBoolFromConfig(ConfigSection(),KIpUpsCancelPromptCall, iCancelPromptCall);
+
+ GetBoolFromConfig(ConfigSection(),KIpUpsAlwaysOpenNewSession, iAlwaysOpenNewSession);
+
+ GetBoolFromConfig(ConfigSection(),KIpUpsUseSameSubSession, iUseSameSubSession);
+ GetBoolFromConfig(ConfigSection(),KIpUpsUseSameSubSessionAfterClose, iUseSameSubSessionAfterClose);
+ GetBoolFromConfig(ConfigSection(),KIpUpsAlwaysOpenNewSubSession, iAlwaysOpenNewSubSession);
+
+ //Keep the initial count of the notifier recorded, should be '0'
+ User::LeaveIfError(RProperty::Get(KUidPSUPSTestNotifCategory, KUnNotifyCount, iNotifyCount));
+
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ } // End of function.
+
+
+TVerdict CIpUpsStep::doTestStepL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+ {
+ UserPromptService::RUpsSession upsSession;
+ UserPromptService::RUpsSubsession upsSubSession[KMaxNoOfAuthoriseCalls];
+
+ RThread dummyThread[KMaxNoOfAuthoriseCalls];
+ TRequestStatus threadStatus;
+
+ TInt notifyCountBeforeTest = iNotifyCount;
+ TInt notifyCountAfterTest = 0;
+
+ TServiceId serviceId = TUid::Uid(iServiceUID);
+
+ TInt subSessionCntr = 0;
+
+ //Repeat call to Authorise as specified in INI file (through NoOfAuthoriseCalls data)
+ for (TInt cntr=0; cntr<iNoOfAuthoriseCalls && cntr<KMaxNoOfAuthoriseCalls; cntr++)
+ {
+ if (upsSession.Handle() == KNullHandle)
+ {
+ User::LeaveIfError(upsSession.Connect());
+ INFO_PRINTF1(_L("UPS Session Started."));
+ }
+
+ if (upsSubSession[subSessionCntr].SubSessionHandle() == KNullHandle)
+ {
+ //Create dummy thread with different names
+ TBuf<32> dummyThreadName;
+ dummyThreadName.Copy(_L("DummyThread_0123456789"));
+
+ User::LeaveIfError(dummyThread[subSessionCntr].Create(dummyThreadName.Right(dummyThreadName.Length()-subSessionCntr), ThreadFunction, 4096, 4096, 4096, 0, EOwnerThread));
+
+ dummyThread[subSessionCntr].Rendezvous(threadStatus);
+ dummyThread[subSessionCntr].Resume();
+ User::WaitForRequest(threadStatus);
+
+ upsSubSession[subSessionCntr] = UserPromptService::RUpsSubsession();
+ User::LeaveIfError(upsSubSession[subSessionCntr].Initialise(upsSession, dummyThread[subSessionCntr]));
+ INFO_PRINTF1(_L("UPS SubSession Initialised."));
+ }
+
+ //Get the dialog option for this iteration (specified in the INI file through
+ //DialogOptionSelection data, separated using KIniFileDelimeter).
+ TBuf<32> dialogOption;
+ GetValueAt(cntr, iDialogOption, KIniFileDelimeter, dialogOption);
+
+ UserPromptService::TPromptResult promptResult;
+ promptResult.iSelected = ButtonToOption(dialogOption);
+
+ TPckg<UserPromptService::TPromptResult> resultPckg(promptResult);
+
+ //Set the Dialog Option selection by user (specifies through DialogOptionSelection data value in INI file).
+ User::LeaveIfError(RProperty::Set(KUidPSUPSTestNotifCategory, KUtButtonPress, resultPckg));
+ User::LeaveIfError(RProperty::Set(KUidPSUPSTestNotifCategory, KUtButtonPressDelay, iCancelPromptCall?1:0));
+
+ INFO_PRINTF2(_L("Dialog Option Selection ( %S )."), &dialogOption);
+
+ //Get the Notify Count BEFORE call to Authorise
+ User::LeaveIfError(RProperty::Get(KUidPSUPSTestNotifCategory, KUnNotifyCount, notifyCountBeforeTest));
+
+ TUpsDecision upsDecision;
+ TRequestStatus status;
+
+ if ( iOpaqueData.Length() > 0 )
+ {
+ HBufC8* converter = HBufC8::NewLC(iOpaqueData.Length());
+ converter->Des().Copy(iOpaqueData);
+ iOpaqueDataStored = converter->Ptr();
+ CleanupStack::PopAndDestroy(); //converter
+
+ INFO_PRINTF1(_L("Opaque data present."));
+ upsSubSession[subSessionCntr].Authorise(iPlatSecPass, serviceId, iDestination, iOpaqueDataStored, upsDecision, status);
+ }
+ else
+ {
+ INFO_PRINTF1(_L("Opaque data NOT present."));
+ upsSubSession[subSessionCntr].Authorise(iPlatSecPass, serviceId, iDestination, upsDecision, status);
+ }
+
+
+ if (iCancelPromptCall)
+ {
+ upsSubSession[subSessionCntr].CancelPrompt();
+ INFO_PRINTF1(_L("CancelPrompt called on UPS SubSession."));
+ }
+
+ User::WaitForRequest(status);
+
+ SetTestStepError(status.Int());
+ User::LeaveIfError(status.Int());
+
+ //Get the Notify Count AFTER call to Authorise
+ User::LeaveIfError(RProperty::Get(KUidPSUPSTestNotifCategory, KUnNotifyCount, notifyCountAfterTest));
+
+ INFO_PRINTF3(_L("NotifyCount Before Authorise ( %d ) <> NotifyCount After Authorise ( %d )"), notifyCountBeforeTest, notifyCountAfterTest);
+
+ if ( iExpectedUpsDecision.Length() > 0 )
+ {
+ //Get the expected UPS decision for this iteration (specified in the INI file through
+ //ExpectedUpsDecision data, separated using KIniFileDelimeter).
+ TBuf<32> expectedUpsDecision;
+ GetValueAt(cntr, iExpectedUpsDecision, KIniFileDelimeter, expectedUpsDecision);
+
+ TPtrC upsDecisionString = TUpsDecisionToString(upsDecision);
+
+ INFO_PRINTF3(_L("UPS Decision Expected ( %S ) <> UPS Decision Returned ( %S )"), &expectedUpsDecision, &upsDecisionString);
+
+ //Compare the expected and returned UPS decision
+ TEST( expectedUpsDecision.Compare(TUpsDecisionToString(upsDecision)) == 0);
+ }
+
+ VerifyAndPrintPromptDataL();
+
+ //Check what user requested to do with SubSession for further iterations (if any).
+ if ( iUseSameSubSession )
+ {
+ INFO_PRINTF2(_L("Using UPS SubSession ( %d )."), subSessionCntr);
+ }
+ if ( iUseSameSubSessionAfterClose || iAlwaysOpenNewSession )
+ {
+ upsSubSession[subSessionCntr].Close();
+ INFO_PRINTF2(_L("UPS SubSession Closed ( %d )."), subSessionCntr);
+ dummyThread[subSessionCntr].Close();
+ }
+ else if ( iAlwaysOpenNewSubSession )
+ {
+ ++subSessionCntr;
+ }
+
+ if ( iAlwaysOpenNewSession )
+ {
+ upsSession.Close();
+ INFO_PRINTF1(_L("UPS Session Closed."));
+ }
+ } //End - for loop
+
+
+ //As with multiple clients , its better not to try to synchronize the calls which change the notify count.
+ //When all the concurrent calls are done , check the count finally through test step notifycount.
+ if (iPromptTriggerCount >= 0)
+ {
+ TEST( notifyCountAfterTest == (iNotifyCount+iPromptTriggerCount) );
+ }
+
+ //Ensure all sub sessions are closed
+ for (TInt cntr=0; cntr<subSessionCntr; cntr++)
+ {
+ if ( upsSubSession[cntr].SubSessionHandle() != KNullHandle )
+ {
+ INFO_PRINTF2(_L("UPS SubSession Closed ( %d )."), cntr);
+ upsSubSession[cntr].Close();
+ dummyThread[cntr].Close();
+ }
+ }
+
+ //Ensure session is closed
+ if ( upsSession.Handle() != KNullHandle )
+ {
+ upsSession.Close();
+ INFO_PRINTF1(_L("UPS Session Closed."));
+ }
+
+ return TestStepResult();
+ } // End of function
+
+
+TVerdict CIpUpsStep::doTestStepPostambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+ {
+ //ReSet the property to specify working of testNotifier in P&S or filemode
+ User::LeaveIfError(RProperty::Set(KUidPSUPSTestNotifCategory, KUtFileOverride, iTestNotifierMode));
+
+ return TestStepResult();
+ } // End of function.
+
+TBool CIpUpsStep::VerifyAndPrintPromptDataL()
+/**
+ * @return - TBool - ETrue of prompt data returned matched the data expected as specified in INI file, else EFalse.
+ *
+ */
+ {
+ //Get the Prompt Information
+ const TInt KMaxPromptDataLenght = 512;
+ HBufC8* buf=HBufC8::NewLC(KMaxPromptDataLenght);
+ TPtr8 bufPtr(buf->Des());
+
+ User::LeaveIfError(RProperty::Get(KUidPSUPSTestNotifCategory, KUnNotifyValues, bufPtr));
+
+ RDesReadStream promptDataStream(bufPtr);
+
+ iPromptData = UserPromptService::CPromptData::NewL();
+ CleanupStack::PushL(iPromptData);
+ iPromptData->InternalizeL(promptDataStream);
+
+ INFO_PRINTF2(_L("Client Name ( %S )"), &iPromptData->iClientName);
+ INFO_PRINTF2(_L("Vendor Name ( %S )"), &iPromptData->iVendorName);
+ INFO_PRINTF2(_L("Destination ( %S )"), &iPromptData->iDestination);
+ INFO_PRINTF2(_L("ClientSid ( %08x )"), iPromptData->iClientSid.iId);
+ INFO_PRINTF2(_L("ServerSid ( %08x )"), iPromptData->iServerSid.iId);
+ INFO_PRINTF2(_L("ServiceId ( %08x )"), iPromptData->iServiceId);
+
+ TInt count = iPromptData->iDescriptions.Count();
+ for (TInt cntr = 0; cntr < count; ++cntr)
+ {
+ INFO_PRINTF3(_L("Descriptions(%d) : %S "), cntr, iPromptData->iDescriptions[cntr]);
+ }
+
+ //Print Dialog Flags
+ TBuf<64> dialogFlags;
+
+ if ( iPromptData->iFlags & UserPromptService::ETrustedClient )
+ {
+ dialogFlags.Append(_L(" TrustedClient "));
+ }
+ if ( iPromptData->iFlags & UserPromptService::EBuiltInApp )
+ {
+ dialogFlags.Append(_L(" BuiltInApp "));
+ }
+ INFO_PRINTF2(_L("DialogFlags Set to ( %S )"), &dialogFlags);
+
+ TPtrC expectedDialogOptions;
+ TBuf<64> bufOptions;
+
+ GetStringFromConfig(ConfigSection(),KExpectedDialogOptions, iExpectedDialogOptions);
+
+ if (iExpectedDialogOptions.Length() > 0)
+ {
+ INFO_PRINTF2(_L("Options Expected ( %S )"), &iExpectedDialogOptions);
+
+ //Check if options presented are as expected
+ TBool result = OptionsFlagToString(iPromptData->iOptions, bufOptions);
+ TEST(result != EFalse);
+ }
+ else
+ {
+ OptionsFlagToString(iPromptData->iOptions, bufOptions, EFalse);
+ }
+
+ INFO_PRINTF2(_L("Options Presented ( %S )"), &bufOptions);
+
+ TEST(iPromptData->iServiceId.iUid == iServiceUID);
+ TEST(iPromptData->iDestination == iDestination);
+
+ CleanupStack::PopAndDestroy(2); //buf, iPromptData
+
+ return EFalse;
+ } // End of function.
+
+TBool CIpUpsStep::OptionsFlagToString(TUint aOptions, TDes& aOptionString, TBool aCheckAgainstExpectedOpt)
+/** OptionsFlagToString converts the dialog option(s) presented to string and check if the presented option
+ * is amongst the one which is expected(from INI file) or not if aCheckAgainstExpectedOpt is set to ETrue.
+ *
+ * @return - TBool - ETrue if presented options are the ones which are expected as specified in the INI file.
+ *
+ */
+ {
+ _LIT(KOptionYes, "Yes");
+ _LIT(KOptionNo, "No");
+ _LIT(KOptionSessionYes, "SessionYes");
+ _LIT(KOptionAlways, "Always");
+ _LIT(KOptionNever, "Never");
+ _LIT(KOptionSessionNo, "SessionNo");
+
+ const TPtrC policyOptions[] = {KOptionYes(), KOptionNo(), KOptionSessionYes(), KOptionAlways(),
+ KOptionNever(), KOptionSessionNo()};
+
+ TInt optionsCntr = 0;
+ TBool isOptionExpected = ETrue;
+
+ aOptionString.Append(_L("-"));
+
+ if (aOptions & UserPromptService::CPolicy::EYes)
+ {
+ aOptionString.Copy(policyOptions[optionsCntr]);
+ aOptionString.Append(_L("-"));
+
+ if (aCheckAgainstExpectedOpt)
+ {
+ if (iExpectedDialogOptions.FindF(policyOptions[optionsCntr]) == KErrNotFound)
+ {
+ isOptionExpected = EFalse;
+ }
+ }
+ }
+ ++optionsCntr;
+
+ if (aOptions & UserPromptService::CPolicy::ENo)
+ {
+ aOptionString.Append(policyOptions[optionsCntr]);
+ aOptionString.Append(_L("-"));
+
+ if (aCheckAgainstExpectedOpt)
+ {
+ if (iExpectedDialogOptions.FindF(policyOptions[optionsCntr]) == KErrNotFound)
+ {
+ isOptionExpected = EFalse;
+ }
+ }
+ }
+ ++optionsCntr;
+
+ if (aOptions & UserPromptService::CPolicy::ESessionYes)
+ {
+ aOptionString.Append(policyOptions[optionsCntr]);
+ aOptionString.Append(_L("-"));
+
+ if (aCheckAgainstExpectedOpt)
+ {
+ if (iExpectedDialogOptions.FindF(policyOptions[optionsCntr]) == KErrNotFound)
+ {
+ isOptionExpected = EFalse;
+ }
+ }
+ }
+ ++optionsCntr;
+
+ if (aOptions & UserPromptService::CPolicy::EAlways)
+ {
+ aOptionString.Append(policyOptions[optionsCntr]);
+ aOptionString.Append(_L("-"));
+
+ if (aCheckAgainstExpectedOpt)
+ {
+ if (iExpectedDialogOptions.FindF(policyOptions[optionsCntr]) == KErrNotFound)
+ {
+ isOptionExpected = EFalse;
+ }
+ }
+ }
+ ++optionsCntr;
+
+ if (aOptions & UserPromptService::CPolicy::ENever)
+ {
+ aOptionString.Append(policyOptions[optionsCntr]);
+ aOptionString.Append(_L("-"));
+
+ if (aCheckAgainstExpectedOpt)
+ {
+ if (iExpectedDialogOptions.FindF(policyOptions[optionsCntr]) == KErrNotFound)
+ {
+ isOptionExpected = EFalse;
+ }
+ }
+ }
+ ++optionsCntr;
+
+ if (aOptions & UserPromptService::CPolicy::ESessionNo)
+ {
+ aOptionString.Append(policyOptions[optionsCntr]);
+ aOptionString.Append(_L("-"));
+
+ if (aCheckAgainstExpectedOpt)
+ {
+ if (iExpectedDialogOptions.FindF(policyOptions[optionsCntr]) == KErrNotFound)
+ {
+ isOptionExpected = EFalse;
+ }
+ }
+ }
+
+ return isOptionExpected;
+ } // End of function.
+
+/** GetValueAt provides the value of data at a specific index (specified by aPos)
+* String containing the values is specified thorugh aArrayString and multiple values
+* are separated by delimeter aDelimeter.
+* aValue is returned.
+*/
+void CIpUpsStep::GetValueAt(const TInt aPos, const TPtrC& aArrayString, const TChar aDelimeter, TDes& aValue)
+ {
+ TInt posCntr=0;
+ TInt itemCntr = -1;
+
+ //Initialise it with blank string to avoid any previous copies
+ aValue.Copy(_L(""));
+
+ while (posCntr < aArrayString.Length() && itemCntr != aPos)
+ {
+ if (aArrayString[posCntr] != aDelimeter)
+ {
+ aValue.Append(aArrayString[posCntr]);
+ }
+ else
+ {
+ ++itemCntr;
+ //Is this the item we are looking for, if not, make space to next one
+ if (itemCntr != aPos)
+ {
+ aValue.Copy(_L(""));
+ }
+ }
+ ++posCntr;
+ }
+ }
+
+/* TUpsDecisionToString converts TUpsDecision to string.
+*/
+TPtrC CIpUpsStep::TUpsDecisionToString(TUpsDecision aDecision)
+ {
+ if(aDecision == EUpsDecYes)
+ {
+ return _L("Yes");
+ }
+ else if(aDecision == EUpsDecNo)
+ {
+ return _L("No");
+ }
+ else if(aDecision == EUpsDecSessionYes)
+ {
+ return _L("SessionYes");
+ }
+ else if(aDecision == EUpsDecSessionNo)
+ {
+ return _L("SessionNo");
+ }
+ else
+ {
+ ERR_PRINTF1(_L("Invalid UPS Descision, returning No by default."));
+ return _L("No");
+ }
+ } // End of function.
+
+/* TUpsDecisionFromString converts string value to TUpsDecision.
+*/
+TUpsDecision CIpUpsStep::TUpsDecisionFromString(const TPtrC& aDecision)
+ {
+ if(aDecision.CompareF(_L("Yes"))==0)
+ {
+ return EUpsDecYes;
+ }
+ else if(aDecision.CompareF(_L("No"))==0)
+ {
+ return EUpsDecNo;
+ }
+ else if(aDecision.CompareF(_L("SessionYes"))==0)
+ {
+ return EUpsDecSessionYes;
+ }
+ else if(aDecision.CompareF(_L("SessionNo"))==0)
+ {
+ return EUpsDecSessionNo;
+ }
+ else
+ {
+ ERR_PRINTF1(_L("Invalid UPS Descision, returning No by default."));
+ return EUpsDecNo;
+ }
+ } // End of function.
+
+/* ButtonToOption converts string value of button presented to CPolicy::TOptions.
+*/
+UserPromptService::CPolicy::TOptions CIpUpsStep::ButtonToOption(const TPtrC& aButton)
+ {
+ if(aButton.CompareF(_L("Yes"))==0)
+ {
+ return UserPromptService::CPolicy::EYes;
+ }
+ else if(aButton.CompareF(_L("No"))==0)
+ {
+ return UserPromptService::CPolicy::ENo;
+ }
+ else if(aButton.CompareF(_L("Session"))==0)
+ {
+ return UserPromptService::CPolicy::ESession;
+ }
+ else if(aButton.CompareF(_L("SessionYes"))==0)
+ {
+ return UserPromptService::CPolicy::ESessionYes;
+ }
+ else if(aButton.CompareF(_L("Always"))==0)
+ {
+ return UserPromptService::CPolicy::EAlways;
+ }
+ else if(aButton.CompareF(_L("Never"))==0)
+ {
+ return UserPromptService::CPolicy::ENever;
+ }
+ else if(aButton.CompareF(_L("SessionNo"))==0)
+ {
+ return UserPromptService::CPolicy::ESessionNo;
+ }
+ else
+ {
+ ERR_PRINTF1(_L("Invalid Button Option, returning Policy Option No by default."));
+ return UserPromptService::CPolicy::ENo;
+ }
+ } // End of function.