diff -r 0818dd463d41 -r 924385140d98 appfw/apparchitecture/tef/t_forceregstep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/appfw/apparchitecture/tef/t_forceregstep.cpp Tue Aug 31 15:24:25 2010 +0300 @@ -0,0 +1,471 @@ +// Copyright (c) 2010 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 + @internalComponent - Internal Symbian test code +*/ + +#include "t_forceregstep.h" +#include +#include +#include "T_SisFileInstaller.h" +#include +#include +#include +#include +#include "testableapalssession.h" + +_LIT(KForceRegApp1SisFile, "z:\\apparctest\\apparctestsisfiles\\ForceRegApp1.sis"); +_LIT(KForceRegApp1Component, "ForceRegApp1"); + +_LIT(KForceRegMultipleAppsSisFile, "z:\\apparctest\\apparctestsisfiles\\ForceRegMultipleApps.sis"); +_LIT(KForceRegMultipleAppsComponent, "ForceRegMultipleApps"); + +_LIT(KForceRegApp2SisFile, "z:\\apparctest\\apparctestsisfiles\\ForceRegApp2.sis"); +_LIT(KForceRegApp2Component, "ForceRegApp2"); + +const TUint KForceRegistratioWaitTime=5000000; //5s +const TUid KUidForceRegApp2={0xA0001001}; +_LIT(KTestClientNotificationThreadName, "TestClientNotificationThreadName"); + + +CT_ForceRegStep::~CT_ForceRegStep() +/** + Destructor + */ + { + } + +CT_ForceRegStep::CT_ForceRegStep() +/** + Constructor + */ + { + // Call base class method to set up the human readable name for logging + SetTestStepName(KT_ForceRegStep); + } + +TVerdict CT_ForceRegStep::doTestStepPreambleL() +/** + @return - TVerdict code + Override of base class virtual + */ + { + + //Create property which is used for communication between test and force registered applications. + TInt error; + error=RProperty::Define(KPropertyCategory, KForceRegTestPropertyKey, RProperty::EInt); + if((error != KErrNone) && (error != KErrAlreadyExists)) + User::Leave(error); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +TVerdict CT_ForceRegStep::doTestStepPostambleL() +/** + @return - TVerdict code + Override of base class virtual + */ + { + RProperty::Delete(KPropertyCategory, KForceRegTestPropertyKey); + + return TestStepResult(); + } + + +TVerdict CT_ForceRegStep::doTestStepL() +{ + RunTestCases(); + return TestStepResult(); +} + + +void CT_ForceRegStep::RunTestCases() + { + RTestableApaLsSession ls; + User::LeaveIfError(ls.Connect()); + RPointerArray regFiles; + //Check the earlier force registration API is not supported + TEST(ls.ForceRegistration(regFiles) == KErrNotSupported); + + CSisFileInstaller sisFileInstaller; + TApaAppInfo info; + TUid uid1 = {0xA0001000}; + TInt err = ls.GetAppInfo(info, uid1); + if(err == KErrNone) + { + sisFileInstaller.UninstallSisL(KForceRegApp1Component); + } + + TUid uid2 = {0xA0001001}; + err = ls.GetAppInfo(info, uid2); + if(err == KErrNone) + { + sisFileInstaller.UninstallSisL(KForceRegApp2Component); + } + + //Wait if apparc updating the applist + TRequestStatus applistChangeStatus; + ls.SetNotify(ETrue, applistChangeStatus); + User::WaitForRequest(applistChangeStatus); + + //DONT_CHECK is used because when an application is installed the updated application + //information is added in the session objects. This causes increase of memory at server side. + //As there can be multiple applications registered with apparc for applist change notifications, + //its not possible to clear the information in all the session objects. + HEAP_TEST_LS_SESSION(ls, 0, DONT_CHECK, TestSingleForceRegistration(ls), NO_CLEANUP); + HEAP_TEST_LS_SESSION(ls, 0, DONT_CHECK, TestMultipleForceRegistration(ls), NO_CLEANUP); + HEAP_TEST_LS_SESSION(ls, 0, 0, TestForceRegistrationSecurity(ls), NO_CLEANUP); + //HEAP_TEST_LS_SESSION(ls, 0, 0, TestForceRegistrationWhenInstallationFailed(ls), NO_CLEANUP); + HEAP_TEST_LS_SESSION(ls, 0, DONT_CHECK, TestForceRegistrationAndNoClientNotification(ls), NO_CLEANUP); + ls.Close(); + } + + +/** + @SYMTestCaseID APPFWK-APPARC-0106 + + + @SYMTestCaseDesc Tests whether force registration works with a sis file which has single run on install + application. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions 1. Attaches to a property which will be set by force registered (or run on install) + application when it got executed. + 2. Installs sis file which has run on install application. + 3. Waits till the run on install application changes the propery or a timer expires. + 4. Checks the property is changed by run on install application. + + @SYMTestExpectedResults The property is changed by run on install application. + */ +void CT_ForceRegStep::TestSingleForceRegistration(RTestableApaLsSession &aLs) + { + INFO_PRINTF1(_L("TestSingleForceRegistration test started...........")); + RProperty forceRegStatus; + User::LeaveIfError(forceRegStatus.Attach(KPropertyCategory, KForceRegTestPropertyKey, EOwnerThread)); + CleanupClosePushL(forceRegStatus); + + TRequestStatus forceRegStatusChange; + TRequestStatus forceRegWait; //Timer expiration status + + //Timer to wait for definite time. + RTimer timerToWait; + User::LeaveIfError(timerToWait.CreateLocal()); + CleanupClosePushL(timerToWait); + timerToWait.After(forceRegWait, KForceRegistratioWaitTime); + + //The property value will be changed by forceregistered application when its executed. + forceRegStatus.Subscribe(forceRegStatusChange); + + INFO_PRINTF1(_L("Install forceregapp1 application")); + //Install the forceregapp1 + CSisFileInstaller sisFileInstaller; + INFO_PRINTF2(_L("Installing sis file from -> %S"), &KForceRegApp1SisFile); + sisFileInstaller.InstallSisL(KForceRegApp1SisFile); + + INFO_PRINTF1(_L("Wait till the timer expires or force registered application changes the property")); + //Wait till the property is changed by forceregapp1 or till timer expires + User::WaitForRequest(forceRegWait, forceRegStatusChange); + + TInt value; + forceRegStatus.Get(value); + INFO_PRINTF2(_L("Property value: %d"), value); + //Check the property value is changed by forceregapp1 + TEST(value == KForceRegApp1Executed); + + INFO_PRINTF1(_L("Uninstall forceregapp1 application")); + //Uninstall the forceregapp1 + sisFileInstaller.UninstallSisAndWaitForAppListUpdateL(KForceRegApp1Component); + CleanupStack::PopAndDestroy(2); //forceRegStatus, timerToWait + INFO_PRINTF1(_L("TestSingleForceRegistration test ended...........")); + } + + +/** + @SYMTestCaseID APPFWK-APPARC-0106 + + + @SYMTestCaseDesc Tests whether force registration works with a sis file which has multiple run on install + applications. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions 1. Attaches to a property which will be set by force registered (or run on install) + application when it got executed. + 2. Installs sis file which has multiple run on install applications. + 3. Waits till the run on install applications changes the propery or a timer expires. + 4. Checks the property is changed by run on install applications. + + @SYMTestExpectedResults The property is changed by run on install applications. + */ + +void CT_ForceRegStep::TestMultipleForceRegistration(RTestableApaLsSession &aLs) + { + INFO_PRINTF1(_L("TestMultipleForceRegistration test started...........")); + RProperty forceRegStatus; + User::LeaveIfError(forceRegStatus.Attach(KPropertyCategory, KForceRegTestPropertyKey, EOwnerThread)); + //Set the property to a KStopForceRegApp2 to make the forceregapp2 to exit. + forceRegStatus.Set(KStopForceRegApp2); + + TRequestStatus forceRegApp1Executed, forceRegApp2Executed; + TRequestStatus forceRegWait; + + //Timer to wait for definite time. + RTimer timeToWait; + User::LeaveIfError(timeToWait.CreateLocal()); + timeToWait.After(forceRegWait, KForceRegistratioWaitTime); + //The property value will be changed by forceregistered application. Subscribe to property change. + forceRegStatus.Subscribe(forceRegApp1Executed); + + INFO_PRINTF1(_L("Install forceregapp1 and forceregapp2 application")); + //Install the forceregapp1 + CSisFileInstaller sisFileInstaller; + INFO_PRINTF2(_L("Installing sis file from -> %S"), &KForceRegMultipleAppsSisFile); + sisFileInstaller.InstallSisL(KForceRegMultipleAppsSisFile); + + INFO_PRINTF1(_L("Wait till the timer expires or force registered applications changes the property")); + User::WaitForRequest(forceRegWait, forceRegApp1Executed); + + TInt value; + forceRegStatus.Get(value); + + //If the property value is not as expected, wait till the forceregapp2 is executed. + if(value != (KForceRegApp1Executed|KForceRegApp2Executed|KStopForceRegApp2)) + { + forceRegStatus.Subscribe(forceRegApp2Executed); + forceRegWait=KRequestPending; + timeToWait.After(forceRegWait, KForceRegistratioWaitTime); + User::WaitForRequest(forceRegWait, forceRegApp2Executed); + } + + forceRegStatus.Get(value); + INFO_PRINTF2(_L("Property value: %d"), value); + //Check whether both force registered applications executed. + TEST(value == (KForceRegApp1Executed|KForceRegApp2Executed|KStopForceRegApp2)); + + INFO_PRINTF1(_L("Uninstall forceregapp1 and forceregapp2 application")); + sisFileInstaller.UninstallSisAndWaitForAppListUpdateL(KForceRegMultipleAppsComponent); + forceRegStatus.Close(); + //Wait for time so that appac completes applist cache creation. + User::After(2000000); + } + + +/** + @SYMTestCaseID APPFWK-APPARC-0106 + + + @SYMTestCaseDesc Tests force registration security. Force registration can only be used by SWI. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions 1. Creates dummy application information. + 2. Call the force registration with this application info. + 3. Check return value is KErrNotSupported. + + @SYMTestExpectedResults ForceRegistration should return KErrNotSupported if other Software Installer + trying to use it. + */ + +void CT_ForceRegStep::TestForceRegistrationSecurity(RTestableApaLsSession &aLs) + { + INFO_PRINTF1(_L("TestForceRegistrationSecurity test started...........")); + Usif::CApplicationRegistrationData *appData=Usif::CApplicationRegistrationData::NewL(); + CleanupStack::PushL(appData); + RPointerArray appArray; + + INFO_PRINTF1(_L("Call ForceRegistration with empty TApaAppUpdate info array..........")); + TEST(aLs.ForceRegistration(appArray)==KErrNone); + appArray.AppendL(appData); + INFO_PRINTF1(_L("Call ForceRegistration with TApaAppUpdate info array..........")); + TEST(aLs.ForceRegistration(appArray)==KErrNotSupported); + + CleanupStack::PopAndDestroy(appData); + appArray.Close(); + INFO_PRINTF1(_L("TestForceRegistrationSecurity test ended...........")); + } + + +/** + @SYMTestCaseID APPFWK-APPARC-0106 + + @SYMTestCaseDesc Tests force registered applications information removed from the applist if + installation fails. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions 1. Install sis file which has force registered application. + 2. Cancel the installation. + 2. Check the force registered application is not available in the applist. + + @SYMTestExpectedResults Force registered application information is removed from the applist + */ + +void CT_ForceRegStep::TestForceRegistrationWhenInstallationFailed(RTestableApaLsSession &aLs) + { + INFO_PRINTF1(_L("TestForceRegistrationWhenInstallationFailed test started...........")); + TApaAppInfo appInfo; + TInt err; + + //Check whether the application is already in the applist. + err=aLs.GetAppInfo(appInfo, KUidForceRegApp2); + INFO_PRINTF2(_L("Error Code returned: %d"), err); + TEST(err==KErrNotFound); + + CSisFileInstaller sisFileInstaller; + RProperty forceRegStatus; + User::LeaveIfError(forceRegStatus.Attach(KPropertyCategory, KForceRegTestPropertyKey, EOwnerThread)); + TRequestStatus propertyStatus; + forceRegStatus.Subscribe(propertyStatus); + + //Install ForceRegApp2 asynchronously + TRequestStatus installStatus; + INFO_PRINTF1(_L("Install the sis file which eventually cancelled by test")); + err=KErrNone; + INFO_PRINTF2(_L("Installing sis file from -> %S"), &KForceRegApp2SisFile); + TRAP(err, sisFileInstaller.InstallSisAsynchronouslyL(KForceRegApp2SisFile, installStatus)); + TEST(err == KErrNone); + + //ForceRegApp2 is run on install application. The property is changed when the application executed. + User::WaitForRequest(propertyStatus); + + //Make ForceRegApp2 to exit by adding KStopForceRegApp2 to property. + TInt value; + forceRegStatus.Get(value); + value |= KStopForceRegApp2; + forceRegStatus.Set(value); + forceRegStatus.Close(); + + //Cancel the installation. + sisFileInstaller.CancelInstallation(); + User::WaitForRequest(installStatus); + sisFileInstaller.Close(); + + User::After(2000000); + INFO_PRINTF2(_L("Installation ended with error code: %d"), installStatus.Int()); + TEST(installStatus.Int() != KErrNone); + + //Check the force registered application is no longer exists in the applist. + err=aLs.GetAppInfo(appInfo, KUidForceRegApp2); + INFO_PRINTF2(_L("Error Code returned: %d"), err); + TEST(err==KErrNotFound); + INFO_PRINTF1(_L("TestForceRegistrationWhenInstallationFailed test ended...........")); + } + +TInt TestClientNotificationThread(TAny* aPtr); + +/** + @SYMTestCaseID APPFWK-APPARC-0106 + + + @SYMTestCaseDesc Tests if applist is changed due to force registration, apparc will not notify the + clients. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions 1. Start TestClientNotificationThread which registers with apparc for applist change + notification and waits till applist change notification occurs or a timer expires. + Once any of the event occurs, then changes the property to make the forceregapp2 to + exit and makes the status of applist change reflects in property. + 2. Installs a sis file which has run on install forcereg1 and forcereg2 applications + 3. Waits till the TestClientNotificationThread exits. + 4. Checks whether applist change notification recieved or not. + + @SYMTestExpectedResults Apparc does not notify clients about applist change which occur due to force registration. + */ + +void CT_ForceRegStep::TestForceRegistrationAndNoClientNotification(RTestableApaLsSession &aLs) + { + INFO_PRINTF1(_L("TestForceRegistrationAndNoClientNotification test started...........")); + RProperty forceRegStatus; + User::LeaveIfError(forceRegStatus.Attach(KPropertyCategory, KForceRegTestPropertyKey, EOwnerThread)); + forceRegStatus.Set(0); + + TBuf<0x100> threadName(KTestClientNotificationThreadName); + RThread thread; + + INFO_PRINTF1(_L("Start TestClientNotificationThread thread")); + User::LeaveIfError(thread.Create(threadName, TestClientNotificationThread, 0x1000, NULL, (TAny*) this)); + CleanupClosePushL(thread); + TRequestStatus status; + thread.Logon(status); + thread.Resume(); + + INFO_PRINTF1(_L("Install sis file")); + //Install the forceregapp1 + CSisFileInstaller sisFileInstaller; + INFO_PRINTF2(_L("Installing sis file from -> %S"), &KForceRegMultipleAppsSisFile); + sisFileInstaller.InstallSisL(KForceRegMultipleAppsSisFile); + + INFO_PRINTF1(_L("Waiting till TestClientNotificationThread thread exits")); + User::WaitForRequest(status); + + TInt value; + forceRegStatus.Get(value); + INFO_PRINTF2(_L("Property value: %d"), value); + TEST(!(value & KApplistChanged)); + INFO_PRINTF1(_L("Uninstall sis file")); + sisFileInstaller.UninstallSisL(KForceRegMultipleAppsComponent); + CleanupStack::PopAndDestroy(); + forceRegStatus.Close(); + INFO_PRINTF1(_L("TestForceRegistrationAndNoClientNotification test ended...........")); + } + +/* + * TestClientNotificationThread registers with apparc for applist change notification and waits till applist + * change notification occurs or a timer expires. Once any of the event occurs, then changes the property to + * make the forceregapp2 to exit and makes the status of applist change reflects in property. + */ + +TInt TestClientNotificationThread(TAny* aPtr) + { + RApaLsSession ls; + User::LeaveIfError(ls.Connect()); + TRequestStatus applistChangeStatus, timeOutStatus; + ls.SetNotify(EFalse, applistChangeStatus); + + //Timer to wait for definite time. + RTimer timeToWait; + User::LeaveIfError(timeToWait.CreateLocal()); + timeToWait.After(timeOutStatus, KForceRegistratioWaitTime); + User::WaitForRequest(applistChangeStatus, timeOutStatus); + + RProperty forceRegStatus; + User::LeaveIfError(forceRegStatus.Attach(KPropertyCategory, KForceRegTestPropertyKey, EOwnerThread)); + TInt status; + forceRegStatus.Get(status); + + if(applistChangeStatus.Int() == MApaAppListServObserver::EAppListChanged) + status |= KApplistChanged; + + status |= KStopForceRegApp2; + forceRegStatus.Set(status); + forceRegStatus.Close(); + + return(KErrNone); + }