appfw/apparchitecture/tef/t_forceregstep.cpp
branchRCL_3
changeset 62 924385140d98
--- /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 <e32base.h>
+#include <e32cmn.h>
+#include "T_SisFileInstaller.h"
+#include <apgtask.h>
+#include <apgnotif.h>
+#include <e32property.h>
+#include<usif/scr/appregentries.h>
+#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<TDesC> 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<Usif::CApplicationRegistrationData> 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);
+    }