You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Test Cases

  • Source: tests_selected_filtered_2_27_2026_11_30_06_AM.xlsx
  • Generated: 2026-02-27 12:14:49


AppManager

clearAppData

clearAppData - Called for Loaded App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I create an empty file in an app's storage directory touch /opt/persistent/storageManager/YouTube/testFile
  5. And I send a clearAppData call for the loaded app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAppData", "params":{"appId": "YouTube"}}
  6. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  7. And I validate that the app data for the app was successfully cleared 2025-08-21T14:37:37.350Z WPEFramework[4693]: [4704] INFO [StorageManagerImplementation.cpp:199] Clear: Cleared storage successfully for appId: YouTube
  8. And I validate that the YouTube storage directory is empty ls /opt/persistent/storageManager/YouTube/
  9. And I validate that the app remains loaded and displayed on screen
  10. And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  11. And I launch the app again
  12. And I validate that the app successfully launches

clearAppData - Called for App That is Not Loaded

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I create an empty file in an app's storage directory touch /opt/persistent/storageManager/YouTube/testFile
  3. And I send a clearAppData call for an app that is not loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAppData", "params":{"appId": "YouTube"}}
  4. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  5. And I validate that the app data for the app was successfully cleared 2025-08-21T14:37:37.350Z WPEFramework[4693]: [4704] INFO [StorageManagerImplementation.cpp:199] Clear: Cleared storage successfully for appId: YouTube
  6. And I validate that the YouTube storage directory is empty ls /opt/persistent/storageManager/YouTube/
  7. And I launch the app
  8. And I validate that the app successfully launches

clearAppData - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a clearAppData call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAppData", "params":{}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

clearAppData - appId of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a clearAppData call with an appId of type other than String {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAppData", "params":{"appId": YouTube}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

isInstalled

isInstalled - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I call isInstalled without an appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.isInstalled", "params":{}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

isInstalled - appId of Type Other Than string

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I call isInstalled with an appId param of type other than string {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.isInstalled", "params":{"appId": 1234}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

isInstalled - Called for Not Installed App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I call isInstalled and pass an appId of an app which is not currently installed {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.isInstalled", "params":{"appId": "NetflixApp"}}
  3. Then I validate that the result in the response is false {"jsonrpc":"2.0","id":3,"result":false}

isInstalled - Called for Installed App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I call isInstalled and pass an appId of an app which is currently installed {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.isInstalled", "params":{"appId": "xumo"}}
  3. Then I validate that the result in the response is true {"jsonrpc":"2.0","id":3,"result":true}

isInstalled - Called for Uninstalled App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I uninstall an app that is currently installed {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"xumo"} }
  3. And I call isInstalled and pass an appId of an app which was just uninstalled {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.isInstalled", "params":{"appId": "xumo"}}
  4. Then I validate that the result in the response is false {"jsonrpc":"2.0","id":3,"result":false}

launchApp

launchApp - appId of Type Other Than string

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a launchApp call with an appId of type other than string {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": uktv, "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  4. And I validate that no app is launched

launchApp - No launchArgs Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a launchApp call with no launchArgs {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": uktv, "intent": "{"action":"launch","context":{"source":"voice"}}"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I wait for the app to finish launching
  5. And I validate that the app is successfully launched on screen

launchApp - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a launchApp call with no appId {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  4. And I validate that no app is launched

launchApp - No intent Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a launchApp call with no intent {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I wait for the app to finish launching
  5. And I validate that the app is successfully launched on screen

launchApp - Called Without intent or launchArgs

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a launchApp call without intent or launchArgs params {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I wait for the app to finish launching
  5. And I validate that the app is successfully launched on screen

launchApp - Called for Installed App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I wait for the app to finish launching
  5. And I validate that the app is successfully launched on screen

launchApp - Called for Suspended App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
  3. And I preload an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
  4. And I wait for the app to transition to suspended state
  5. And I remove the AI2.0Suspendable file from /tmp rm /tmp/AI2.0Suspendable
  6. And I launch the app that is currently in suspended state {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  7. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  8. And I wait for the app to finish launching
  9. And I validate that the app is successfully launched on screen

launchApp - Called for Uninstalled App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I uninstall an app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"xumo"} }
  3. And I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "xumo", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  4. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

launchApp - Called for Hibernated App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to launch
  4. And I create an empty AI2.0Suspendable and AI2.0Hibernatable file to /tmp to force app closures to go to hibernated state touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
  5. And I close the recently launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  6. And I wait for the app to transition to hibernated state
  7. And I remove the AI2.0Suspendable and AI2.0Hibernatable files from /tmp rm /tmp/AI2.0Suspendable rm /tmp/AI2.0Hibernatable
  8. And I launch the hibernated app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  9. And I wait for the app to transition to active state
  10. Then I validate that the app successfully launches and is displayed on screen

preloadApp

preloadApp - appId of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a preloadApp call with an appId of type other than string {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": uktv, "launchArgs":"{}"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  4. And I validate that an app is not loaded

preloadApp - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a preloadApp call without an appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"launchArgs":"{}"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  4. And I validate that no app is loaded

preloadApp - launchArgs of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a preloadApp with launchArgs of type other than string {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": uktv, "launchArgs":"{}"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  4. And I validate that no app is loaded

preloadApp - No launchArgs Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a preloadApp call with no launchArgs param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I wait for the app to finish preloading
  5. And I validate that if there is already some UI displayed on screen then the preloaded app will not be displayed on screen. If there is no other UI displayed then the preloaded app will be displayed.

preloadApp - Called for Installed App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I wait for the app to finish preloading
  5. And I validate that if there is already some UI displayed on screen then the preloaded app will not be displayed on screen. If there is no other UI displayed then the preloaded app will be displayed.

preloadApp - Called for Uninstalled App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I uninstall an app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"xumo"} }
  3. And I preload an uninstalled app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
  4. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

terminateApp

terminateApp - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a terminateApp call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  6. And I validate that the app is not terminated

terminateApp - appId of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a terminateApp call with an appId of type other than string {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": YouTube}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  6. And I validate that the app is not terminated

terminateApp - Called for App That is Not Loaded

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a terminateApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "uktv"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

terminateApp - Called for Active App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a terminateApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that the app is no longer displayed on screen
  7. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  8. And I validate that the closed app is not returned in the response {"jsonrpc":"2.0","id":3,"result":"[]"}

terminateApp - Called for Suspended App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I create an empty AI2.0Suspendable file to /tmp to force app closures to go to suspended state touch /tmp/AI2.0Suspendable
  3. And I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  4. And I wait for the app to transition to SUSPENDED state
  5. And I remove the empty AI2.0Suspendable file from /tmp rm /tmp/AI2.0Suspendable
  6. And I send a terminateApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  7. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  8. And I validate that the app is unloaded
  9. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  10. And I validate that the app for which terminateApp was called is not returned in the response {"jsonrpc":"2.0","id":3,"result":"[]"}

terminateApp - Called for Hibernated App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I create an empty AI2.0Suspendable and AI2.0Hibernatable file to /tmp to force app closures to go to hibernated state touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
  5. And I send a closeApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  6. And I wait for the app to transition to hibernated state
  7. And I send a terminateApp call for the hibernated app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  8. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  9. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  10. And I validate that the app for which terminateApp was called is not returned in the response {"jsonrpc":"2.0","id":3,"result":"[]"}

startSystemApp

startSystemApp - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a startSystemApp call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.startSystemApp", "params":{}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  4. And I validate that no app is launched

startSystemApp - Called for Valid App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I call startSystemApp for an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.startSystemApp", "params":{"appId": "YouTube"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I wait for the app to finish launching
  5. And I validate that the app is successfully launched on screen

startSystemApp - appId of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I call startSystemApp with an appId of type other than string {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.startSystemApp", "params":{"appId": YouTube}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  4. And I validate that the app is not launched

activateSystemApp

activateSystemApp - Called for App Not in Active State

Steps

  • No steps found

activateSystemApp - Called for App in Active State

Steps

  • No steps found

activateSystemApp - appId of Type Other Than String

Steps

  • No steps found

activateSystemApp - No appId Passed

Steps

  • No steps found

deactivateSystemApp

activateSystemApp - Called for App in Active State

Steps

  • No steps found

activateSystemApp - appId of Type Other Than String

Steps

  • No steps found

activateSystemApp - Called for App Not in Active State

Steps

  • No steps found

activateSystemApp - No appId Passed

Steps

  • No steps found

hibernateSystemApp

hibernateSystemApp - Called for Loaded App

Steps

  • No steps found

hibernateSystemApp - Called for App That is Not Loaded

Steps

  • No steps found

hibernateSystemApp - No appId Passed

Steps

  • No steps found

hibernateSystemApp - appId of Type Other Than String

Steps

  • No steps found

sendIntent

sendIntent - No Intent Passed

Steps

  • No steps found

sendIntent - No appId Passed

Steps

  • No steps found

sendIntent - Called for App Not in Active State

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I preload an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish loading
  4. And I send a sendIntent call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.sendIntent", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that no onAppLifecycleStateChanged event is emitted to Ripple

sendIntent - Called for App in Active State

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a sendIntent call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.sendIntent", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that an onAppLifecycleStateChanged event is emitted to Ripple with the intent that was passed in sendIntent {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"9173a57d-f89c-4592-9d78-553d9641338d","oldState":"ACTIVE","newState":"ACTIVE","navigationIntent":"{"action":"launch","context":{"source":"voice"}}"}}

setAppProperty

setAppProperty - Property Successfully Set

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
  3. Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I send a getAppProperty call with the appId & key that was just set in the previous step {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube", "key": "test1"}}
  5. And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"testProperty"}

setAppProperty - value of Type Boolean

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with a value of type boolean {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": true}}
  3. Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I send a getAppProperty call with the appId & key that was just set in the previous step {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube", "key": "test1"}}
  5. And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"true"}

setAppProperty - value of Type Number

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with a value of type number {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": 33}}
  3. Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I send a getAppProperty call with the appId & key that was just set in the previous step {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube", "key": "test1"}}
  5. And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"33"}

setAppProperty - No value Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with no value param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1"}}
  3. Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

setAppProperty - No key Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with no key param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "value": "testProperty"}}
  3. Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

setAppProperty - appId of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with an appId of type other than String {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": YouTube, "key": "test1", "value": "testProperty"}}
  3. Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

setAppProperty - value of Type String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with a value of type string {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
  3. Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I send a getAppProperty call with the appId & key that was just set in the previous step {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube", "key": "test1"}}
  5. And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"testProperty"}

setAppProperty - value of Type Object

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with a value of type object {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": {"objectName": "objectValue"}}}
  3. Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I send a getAppProperty call with the appId & key that was just set in the previous step {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube", "key": "test1"}}
  5. And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result": "{"objectName":"objectValue"}"}

setAppProperty - key of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with a key param of type other than String {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": test1, "value": "testProperty"}}
  3. Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

setAppProperty - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"key": "test1", "value": "testProperty"}}
  3. Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getAppProperty

getAppProperty - Property Returned Successfully

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
  3. Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  4. And I send a getAppProperty call with the appId & key that was just set in the previous step {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube", "key": "test1"}}
  5. And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"testProperty"}

getAppProperty - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a getAppProperty call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"key": "test1"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getAppProperty - key of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
  3. And I send a getAppProperty call with a key of type other than String {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube", "key": test1}}
  4. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getAppProperty - appId of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a setAppProperty call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
  3. And I send a getAppProperty call with an appid of type other than String {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": YouTube, "key": "test1"}}
  4. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getAppProperty - No key Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a getAppProperty call with no key param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube"}}
  3. And I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

onAppUninstalled

onAppUninstalled - App Successfully Uninstalled

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and an app is installed
  2. When I send an onAppUninstalled call to register for onAppUninstalled events {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppUninstalled", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"uktv"}}
  5. Then I validate that an onAppUninstalled event is emitted

onAppUninstalled - App Uninstall Failed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and an app is installed
  2. When I send an onAppUninstalled call to register for onAppUninstalled events {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppUninstalled", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I send an uninstall call with a packageId of an app that is not currently installed {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"notInstalled"}}
  5. Then I validate that an onAppUninstalled event is not emitted

onAppUnloaded

onAppUnloaded - App Closed with killApp

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a call to register for onAppUnloaded events {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppUnloaded", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait for the app to finish launching
  6. And I send a killApp call to close the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "YouTube"}}
  7. And I validate that an onAppUnloaded event is emitted {"jsonrpc":"2.0","method":"client.events.1.onAppUnloaded","params":{"appId":"YouTube","appInstanceId":"a76fedf1-12a2-4012-9209-279af27bbddb"}}
  8. And I validate that the event contains an appId and appInstanceId

onAppUnloaded - App Closed With terminateApp

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a call to register for onAppUnloaded events {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppUnloaded", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait for the app to finish launching
  6. And I send a terminateApp call to close the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  7. And I validate that an onAppUnloaded event is emitted {"jsonrpc":"2.0","method":"client.events.1.onAppUnloaded","params":{"appId":"YouTube","appInstanceId":"a76fedf1-12a2-4012-9209-279af27bbddb"}}
  8. And I validate that the event contains an appId and appInstanceId

stopSystemApp

stopSystemApp - appId of Type Other Than String

Steps

  • No steps found

stopSystemApp - Called for Loaded App

Steps

  • No steps found

stopSystemApp - Called for App That is Not Loaded

Steps

  • No steps found

stopSystemApp - No appId Passed

Steps

  • No steps found

killApp

killApp - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I call killApp with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a killApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  6. And I validate that the app is not killed

killApp - appId of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a killApp call with an appId of type other than String {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": YouTube}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  6. And I validate that the app is not killed

killApp - Called for a Suspended App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I create an empty AI2.0Suspendable file to /tmp to force app launches to go to suspended state touch /tmp/AI2.0Suspendable
  3. And I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  4. And I wait for the app to transition to SUSPENDED state
  5. And I remove the empty AI2.0Suspendable file from /tmp rm /tmp/AI2.0Suspendable
  6. And I send a killApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "YouTube"}}
  7. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  8. And I validate that the app is unloaded
  9. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  10. And I validate that the app for which killApp was called is not returned in the response {"jsonrpc":"2.0","id":3,"result":"[]"}

killApp - Called for App in Active State

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a killApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "YouTube"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that the app is no longer displayed on screen
  7. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  8. And I validate that the killed app is not returned in the response {"jsonrpc":"2.0","id":3,"result":"[]"}

killApp - Called for App That is Not Loaded

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a killApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "uktv"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

killApp - Called for a Hibernated App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I create an empty AI2.0Suspendable and AI2.0Hibernatable file to /tmp to force app closures to go to hibernated state touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
  5. And I send a closeApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  6. And I wait for the app to transition to hibernated state
  7. And I send a killApp call for the hibernated app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "YouTube"}}
  8. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  9. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  10. And I validate that the app for which killApp was called is not returned in the response {"jsonrpc":"2.0","id":3,"result":"[]"}

onAppInstalled

onAppInstalled - App Installed Successfully

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send an onAppInstalled call to register for onAppInstalled events {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppInstalled", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/uktv/3502058284/0.8.1.2100/package.wgt"}}
  5. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  6. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"uktv", "version":"0.8.1.2100", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  7. Then I validate that an onAppInstalled event is emitted

onAppInstalled - App Install Failed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send an onAppInstalled call to register for onAppInstalled events {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppInstalled", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I send an install call with a fileLocator that doesn't exist {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"uktv", "version":"0.8.1.2100", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package9999"}}
  5. Then I validate that an onAppInstalled event is not emitted

onAppLifecycleStateChanged

onAppLifecycleStateChanged - App Launched to Suspend

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a call to register for onAppLifecycleStateChanged events from AppManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
  5. And I preload an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
  6. And I validate that an onAppLifecycleStateChanged event is emitted to AppManager for the transition to the LOADING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"6587e44b-a56e-4da4-a09c-f7731897f160","newState":"APP_STATE_LOADING","oldState":"APP_STATE_UNLOADED","errorReason":"APP_ERROR_NONE"}}
  7. And I validate that on onAppLifecycleStateChanged event is emitted to AppManager for the transition to the INITIALIZING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"6587e44b-a56e-4da4-a09c-f7731897f160","newState":"APP_STATE_INITIALIZING","oldState":"APP_STATE_LOADING","errorReason":"APP_ERROR_NONE"}}
  8. And I validate that on onAppLifecycleStateChanged event is emitted to AppManager for the transition to the SUSPENDED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"6587e44b-a56e-4da4-a09c-f7731897f160","newState":"APP_STATE_SUSPENDED","oldState":"APP_STATE_INITIALIZING","errorReason":"APP_ERROR_NONE"}}

onAppLifecycleStateChanged - App Launched to Active

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a call to register for onAppLifecycleStateChanged events from AppManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I validate that an onAppLifecycleStateChanged event is emitted from AppManager for the transition to the LOADING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"6587e44b-a56e-4da4-a09c-f7731897f160","newState":"APP_STATE_LOADING","oldState":"APP_STATE_UNLOADED","errorReason":"APP_ERROR_NONE"}}
  6. And I validate that on onAppLifecycleStateChanged event is emitted from AppManager for the transition to the INITIALIZING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"6587e44b-a56e-4da4-a09c-f7731897f160","newState":"APP_STATE_INITIALIZING","oldState":"APP_STATE_LOADING","errorReason":"APP_ERROR_NONE"}}
  7. And I validate that on onAppLifecycleStateChanged event is emitted from AppManager for the transition to the Paused state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"6587e44b-a56e-4da4-a09c-f7731897f160","newState":"APP_STATE_PAUSED","oldState":"APP_STATE_INITIALIZING","errorReason":"APP_ERROR_NONE"}}
  8. And I validate that an onAppLifecycleStateChanged event is emitted from AppManager for the transition to the ACTIVE state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"6587e44b-a56e-4da4-a09c-f7731897f160","newState":"APP_STATE_ACTIVE","oldState":"APP_STATE_PAUSED","errorReason":"APP_ERROR_NONE"}}

onAppLifecycleStateChanged - Suspendable App Closed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a call to register for onAppLifecycleStateChanged events from AppManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait until the app is finished launching
  6. And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
  7. And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  8. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager to AppManager for the transition to the PAUSED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"693bd0e4-e77e-481f-9f00-1aa9ecd8ce6f","newState":"APP_STATE_PAUSED","oldState":"APP_STATE_ACTIVE","errorReason":"APP_ERROR_NONE"}}
  9. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager to AppManager for the transition to the SUSPENDED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"693bd0e4-e77e-481f-9f00-1aa9ecd8ce6f","newState":"APP_STATE_SUSPENDED","oldState":"APP_STATE_PAUSED","errorReason":"APP_ERROR_NONE"}}

onAppLifecycleStateChanged - Hibernateable App Closed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a call to register for onAppLifecycleStateChanged events from AppManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait until the app is finished launching
  6. And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
  7. And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
  8. And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  9. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager to AppManager for the transition to the PAUSED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"693bd0e4-e77e-481f-9f00-1aa9ecd8ce6f","newState":"APP_STATE_PAUSED","oldState":"APP_STATE_ACTIVE","errorReason":"APP_ERROR_NONE"}}
  10. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager to AppManager for the transition to the SUSPENDED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"693bd0e4-e77e-481f-9f00-1aa9ecd8ce6f","newState":"APP_STATE_SUSPENDED","oldState":"APP_STATE_PAUSED","errorReason":"APP_ERROR_NONE"}}
  11. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager to AppManager for the transition to the HIBERNATED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"693bd0e4-e77e-481f-9f00-1aa9ecd8ce6f","newState":"APP_STATE_HIBERNATED","oldState":"APP_STATE_SUSPENDED","errorReason":"APP_ERROR_NONE"}}

onAppLifecycleStateChanged - Non-Suspendable App Closed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a call to register for onAppLifecycleStateChanged events from AppManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.AppManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait until the app is finished launching
  6. And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  7. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager to AppManager for the transition to the PAUSED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"34f8632c-dd31-42c3-b12e-44c79b8dfc14","newState":"APP_STATE_PAUSED","oldState":"APP_STATE_ACTIVE","errorReason":"APP_ERROR_NONE"}}
  8. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager to AppManager for the transition to the TERMINATING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"34f8632c-dd31-42c3-b12e-44c79b8dfc14","newState":"APP_STATE_TERMINATING","oldState":"APP_STATE_PAUSED","errorReason":"APP_ERROR_NONE"}}

closeApp

closeApp - No appId Passed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a closeApp call without an appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  6. And I validate that the loaded app is not closed

closeApp - appId of Type Other Than String

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a closeApp call with an appId of type other than string {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": uktv}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  6. And I validate that the app is not closed

closeApp - Called for Suspendable App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I create an empty AI2.0Suspendable file to /tmp to force app closures to go to suspended state touch /tmp/AI2.0Suspendable
  5. And I send a closeApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  6. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  7. And I validate that the app is no longer displayed on screen
  8. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  9. And I validate that the app for which closeApp was called is returned in the response {"jsonrpc":"2.0","id":3,"result":"[{"appId":"YouTube","appInstanceId":"46a4a191-b0b9-45d0-8dbf-1c962f67b278","activeSessionId":"","targetLifecycleState":7,"lifecycleState":7}]"}
  10. And I validate that the targetLifecycleState and lifecycleState are both 7

closeApp - Called for Hibernateable App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I create an empty AI2.0Suspendable and AI2.0Hibernatable file to /tmp to force app closures to go to hibernated state touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
  5. And I send a closeApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  6. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  7. And I validate that the app is no longer displayed on screen
  8. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  9. And I validate that the app for which closeApp was called is returned in the response {"jsonrpc":"2.0","id":3,"result":"[{"appId":"YouTube","appInstanceId":"46a4a191-b0b9-45d0-8dbf-1c962f67b278","activeSessionId":"","targetLifecycleState":8,"lifecycleState":8}]"}
  10. And I validate that the targetLifecycleState and lifecycleState are both 8

closeApp - Called for App That is in Paused State

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
  3. And I wait for the app to finish preloading
  4. And I send a closeApp call for the preloaded app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that the app remains in the Paused state

closeApp - Called for Non-Suspendable App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that the app transitions to the Paused state

closeApp - Called for App That is Not Loaded

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{ }}

clearAllAppData

clearAllAppData - Called for App That is Not Loaded

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled and no apps are currently loaded
  2. When I create an empty file in an app's storage directory touch /opt/persistent/storageManager/YouTube/testFile
  3. And I send a clearAllAppData call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAllAppData", "params":{}}
  4. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  5. And I validate that the app data for all apps was successfully cleared 2025-08-21T18:07:18.152Z WPEFramework[4693]: [4710] INFO [StorageManagerImplementation.cpp:220] ClearAll: Cleared all storage successfully, except for exempted app ids
  6. And I validate that the YouTube storage directory is empty ls /opt/persistent/storageManager/YouTube/
  7. And I launch YouTube
  8. And I validate that the app successfully launches

clearAllAppData - Called While App is Loaded

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I create an empty file in an app's storage directory touch /opt/persistent/storageManager/YouTube/testFile
  5. And I send a clearAllAppData call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAllAppData", "params":{}}
  6. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  7. And I validate that the app data for all apps was successfully cleared 2025-08-21T18:07:18.152Z WPEFramework[4693]: [4710] INFO [StorageManagerImplementation.cpp:220] ClearAll: Cleared all storage successfully, except for exempted app ids
  8. And I validate that the YouTube storage directory is empty ls /opt/persistent/storageManager/YouTube/
  9. And I validate that the app remains loaded and displayed on screen
  10. And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  11. And I launch the app again
  12. And I validate that the app successfully launches

Integration

AppManager Call PackageManager.lock After App Launch

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate that AppManager checks if the package is installed 2025-07-17T19:14:58.174Z WPEFramework[4698]: [4705] INFO [AppManagerImplementation.cpp:987] checkIsInstalled: uktv is installed
  4. And I validate that AppManager calls PackageManager.lock 2025-07-17T19:14:58.174Z WPEFramework[4698]: [4705] INFO [AppManagerImplementation.cpp:490] packageLock: packageData call lock 0.8.1.2100 2025-07-17T19:14:58.174Z WPEFramework[4698]: [8120] DEBUG [PackageManagerImplementation.cpp:537] Lock: id: uktv ver: 0.8.1.2100 reason=1 2025-07-17T19:14:58.174Z WPEFramework[4698]: [8120] DEBUG [PackageManagerImplementation.cpp:545] Lock: id: uktv ver: 0.8.1.2100 locked: 0

AppManager Calls PackageManager.unlock After App is Closed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  5. And I wait for the app to be closed
  6. Then I validate that AppManager calls PackageManager.unlock 2025-08-25T19:36:21.774Z WPEFramework[4757]: [8479] DEBUG [PackageManagerImplementation.cpp:659] Unlock: id: uktv ver: 0.8.1.2100

AppManager Calls PackageManager.unlock After App is Killed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a killApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "uktv"}}
  5. And I wait for the app to be killed
  6. Then I validate that AppManager calls PackageManager.unlock 2025-08-25T19:36:21.774Z WPEFramework[4757]: [8479] DEBUG [PackageManagerImplementation.cpp:659] Unlock: id: uktv ver: 0.8.1.2100

AppManager Calls PackageManager.unlock After App is Terminated

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a terminateApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "uktv"}}
  5. And I wait for the app to be closed
  6. Then I validate that AppManager calls PackageManager.unlock 2025-08-25T19:36:21.774Z WPEFramework[4757]: [8479] DEBUG [PackageManagerImplementation.cpp:659] Unlock: id: uktv ver: 0.8.1.2100

getLoadedApps

getLoadedApps - No Apps Loaded

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  3. Then I validate that the result is an empty array {"jsonrpc":"2.0","id":3,"result":"[]"}

getLoadedApps - App Loaded in Suspended State

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
  3. And I preload an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "YouTube", "launchArgs":"{}"}}
  4. And I wait for the app to transition to suspended state
  5. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  6. Then I validate the recently preloaded app is returned in the response array {"jsonrpc":"2.0","id":3,"result":"[{"appId":"YouTube","appInstanceId":"2d4c9463-ed3c-40ba-9718-5ae5e60ce563","activeSessionId":"","targetLifecycleState":7,"lifecycleState":7}]"}
  7. And I validate that the app object includes appId, type, lifecycleState, targetLifecycleState, activeSessionId, appInstanceId
  8. And I validate that targetLifecycleState and lifecycleState value is 7
  9. And I remove the AI2.0Suspendable and AI2.0Hibernatable files rm /tmp/AI2.0Suspendable

getLoadedApps - App Loaded in Active State

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
  2. When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "xumo", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to launch
  4. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  5. Then I validate the recently launched app is returned in the response array {"jsonrpc":"2.0","id":3,"result":"[{"appId":"xumo","appInstanceId":"2d4c9463-ed3c-40ba-9718-5ae5e60ce563","activeSessionId":"","targetLifecycleState":6,"lifecycleState":6}]"}
  6. And I validate that the app object includes appId, type, lifecycleState, targetLifecycleState, activeSessionId, appInstanceId
  7. And I validate that targetLifecycleState and lifecycleState value is 6

getLoadedApps - App Loaded in Hibernated State

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to launch
  4. And I create an empty AI2.0Suspendable and AI2.0Hibernatable file to /tmp to force app closures to go to hibernated state touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
  5. And I close the recently launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  6. And I wait for the app to transition to hibernated state
  7. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
  8. Then I validate the recently launched app is returned in the response array {"jsonrpc":"2.0","id":3,"result":"[{"appId":"uktv","appInstanceId":"2d4c9463-ed3c-40ba-9718-5ae5e60ce563","activeSessionId":"","targetLifecycleState":8,"lifecycleState":8}]"}
  9. And I validate that the app object includes appId, type, lifecycleState, targetLifecycleState, activeSessionId, appInstanceId
  10. And I validate that targetLifecycleState and lifecycleState value is 8
  11. And I remove the AI2.0Suspendable and AI2.0Hibernatable files rm /tmp/AI2.0Suspendable rm /tmp/AI2.0Hibernatable

getInstalledApps

getInstalledApps - Uninstalled Apps Not Returned

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a getInstalledApps call to AppManager {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getInstalledApps", "params":{}}
  3. Then I validate that the currently installed apps are returned in the response {"jsonrpc":"2.0","id":3,"result":[{"appId":"com.bskyb.epgui","versionString":"2.9.4","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"com.sky.rdkbrowser","versionString":"2.7.4-kirkstone","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"comcast_warehouse_testing_app","versionString":"2.2.0","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"xumo","versionString":"100.70.1.1010","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""}]}
  4. And I uninstall an app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"xumo"} }
  5. And I make another getInstalledApps call
  6. And I validate that the response does not include the recently uninstalled app {"jsonrpc":"2.0","id":3,"result":[{"appId":"com.bskyb.epgui","versionString":"2.9.4","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"com.sky.rdkbrowser","versionString":"2.7.4-kirkstone","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"comcast_warehouse_testing_app","versionString":"2.2.0","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""}]}

getInstalledApps - Installed Apps Returned

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I send a getInstalledApps call to AppManager {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getInstalledApps", "params":{}}
  3. Then I validate that the currently installed apps are returned in the response {"jsonrpc":"2.0","id":3,"result":[{"appId":"com.bskyb.epgui","versionString":"2.9.4","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"com.sky.rdkbrowser","versionString":"2.7.4-kirkstone","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"comcast_warehouse_testing_app","versionString":"2.2.0","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""}]}
  4. And I install a new app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/xumo/3171759197/100.70.1.1010/package.wgt"}} {"jsonrpc": "2.0","id": 1001, "method": "org.rdk.PackageManagerRDKEMS.install", "params": {"packageId":"xumo", "version":"100.70.1.1010", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"} }
  5. And I make another getInstalledApps call
  6. And I validate that the response includes the recently installed app {"jsonrpc":"2.0","id":3,"result":[{"appId":"com.bskyb.epgui","versionString":"2.9.4","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"com.sky.rdkbrowser","versionString":"2.7.4-kirkstone","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"comcast_warehouse_testing_app","versionString":"2.2.0","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""},{"appId":"xumo","versionString":"100.70.1.1010","type":"APPLICATION_TYPE_INTERACTIVE","lastActiveTime":"","lastActiveIndex":""}]}

PackageManager

delete

Delete Called With Invalid fileLocator Param

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a delete call with a fileLocator that does not match a locator of a downloaded widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.delete","params": {"fileLocator": "/opt/CDL/package9999"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Delete Called Without fileLocator Param

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a delete call without a fileLocator param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.delete","params": {}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Delete Called with fileLocator of Type Other Than String

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a delete call with a fileLocator of type other than String {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.delete","params": {"fileLocator": /opt/CDL/package1001}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

delete Donwnloaded App

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I wait until the download completes
  4. And I send a delete call to delete the downloaded widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.delete","params": {"fileLocator": "/opt/CDL/package1001"}}
  5. Then I validate that the downloaded widget is deleted (response of ls command should not show the widget ls /opt/CDL

progress

Progress Called with Invalid downloadId

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a progress call with a downloadId that does not match an in-progress download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {"downloadId": "9999"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Progress Called Without downloadId

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a progress call without a downloadId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Progress Called With downloadId Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a progress call with a downloadId of type other than String {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {"downloadId": 1002}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Subsequent Progress Calls Return Updated progress Value

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a progress call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {"downloadId": "1002"}}
  5. Then I validate that the response contains the current progress of the download as a value of a "progress" field {"jsonrpc":"2.0","id":1001,"result":{"progress":37}}
  6. And I wait a few seconds
  7. And I send another progress call
  8. And I validate that the progress returned in this response is greater than the progress value returned for the previous progress call

Progress Call Returns progress Value in Response

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a progress call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {"downloadId": "1002"}}
  5. And I validate that the response contains the current progress of the download as a value of a "progress" field {"jsonrpc":"2.0","id":1001,"result":{"progress":37}}

progress Called For Paused Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  5. And I send a progress call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {"downloadId": "1002"}}
  6. And I validate that the response contains the current progress of the download as a value of a "progress" field {"jsonrpc":"2.0","id":1001,"result":{"progress":37}}

install

install Failed - packageMismatchFailure

Steps

  • No steps found

install Failed - invalidMetadataFailure

Steps

  • No steps found

install Failed - persistenceFailure

Steps

  • No steps found

install Called Without packageId Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call without a packageId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called Without additionalMetadata Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call without a additionalMetadata param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53","fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called With Invalid version Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call with a version param that does not match a downloaded widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"9.9.9.9", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called Without fileLocator Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call without a fileLocator param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}]}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called With packageId Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call with a packageId param of type other than String {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":NetflixApp, "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called Without version Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call without a version param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called with fileLocator Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call with a fileLocator param of type other than String {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":/opt/CDL/package1001}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Failed - signatureVerificationFailure

Steps

  • No steps found

install Called With version Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call with a versioni param of type other than String {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":2.2.7.53, "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called With additionalMetadata Param of Type Other Than Name Value Pairs

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call with an additionalMetadata param of type other than name value pairs {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":["test"],"fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called With Invalid packageId Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call with a packageId param that does not match a downloaded widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"testInvalidPackageId", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

install Called With Invalid fileLocator Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a install call without a packageId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  3. Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

StorageManager.createStorage Not Called After Unsuccessful App Install

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I modify the widget to remove signature1.xml Or config.xml
  5. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  6. And I wait until install successfully completes
  7. Then I validate that a call was made to StorageManager to create storage

install Called with Different Version of Currently Installed Locked App

Steps

  1. Given I am using an RDKE device and RDK App Managers are enabled
  2. And YouTube is currently installed and has a version other than 100.2.12 url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/1478162808/100.1.59+hibernate/package.wgt
  3. When I launch the currently installed YouTube app, causing the app to be locked
  4. And I download YouTube version 100.2.12 {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/3836224974/100.2.12+hibernate/package.wgt"}}
  5. And I send an install call to attempt to install YouTube version 100.2.12 {"jsonrpc": "2.0","id": 1001, "method": "org.rdk.PackageManagerRDKEMS.install", "params": {"packageId":"YouTUbe", "version":"100.2.12+hibernate", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"} }
  6. Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed (version 100.1.59+hibernate)

install Completed Successfully

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  5. Then I result a successful response is returned {"jsonrpc":"2.0","id":1001,"result":"NONE"}

StorageManager.createStorage Called After Installing App

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  5. And I wait until install successfully completes
  6. Then I validate that a call was made to StorageManager to create storage 2025-05-20T15:00:42.853Z WPEFramework[5008]: [5039] INFO [StorageManagerImplementation.cpp:615] CreateStorage: Entered CreateStorage Implementation appId: NetflixApp 2025-05-20T15:00:42.853Z WPEFramework[5008]: [5039] WARN [StorageManagerImplementation.cpp:496] retrieveAppStorageInfoByAppID: AppId[NetflixApp] storage entry not found/created 2025-05-20T15:00:42.853Z WPEFramework[5008]: [5039] INFO [StorageManagerImplementation.cpp:554] hasEnoughStorageFreeSpace: path: /opt/persistent/storageManager f_bsize:1024 f_frsize:1024, blockSize is set to 1024 2025-05-20T15:00:42.853Z WPEFramework[5008]: [5039] INFO [StorageManagerImplementation.cpp:584] hasEnoughStorageFreeSpace: Enough space available. Required: 1024 KB, Available: 27452 KB 2025-05-20T15:00:42.853Z WPEFramework[5008]: [5039] INFO [StorageManagerImplementation.cpp:444] createAppStorageInfoByAppID: Created new storage entry for appId: NetflixApp userId: -1 groupId: -1 quotaKB: 1024 usedKB: 0 path: /opt/persistent/storageManager/NetflixApp 2025-05-20T15:00:42.854Z WPEFramework[5008]: [5039] INFO [StorageManagerImplementation.cpp:691] CreateStorage: Created storage at appDir: /opt/persistent/storageManager/NetflixApp 2025-05-20T15:00:42.869Z WPEFramework[5008]: [5039] INFO [StorageManagerImplementation.cpp:316] appQuotaSizeProperty: SetValue: appId[NetflixApp] Key[quotaSize] value[1024]
  7. And I validate that CreateStorage was successful 2025-05-20T15:00:42.869Z WPEFramework[5008]: [5039] INFO [StorageManagerImplementation.cpp:711] CreateStorage: appQuotaSizeProperty: SET success for appId[NetflixApp]

uninstall

Uninstall Called With packageId Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send an uninstall call with a packageId param of type other than String {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":NetflixApp}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Uninstall Called While App is Locked

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/uktv/3502058284/0.8.1.2100/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"uktv", "version":"0.8.1.2100", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  5. And I wait for the app to finish installing
  6. And I launch the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  7. And I wait for the app to finish launching
  8. And I register for onAppInstallationStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppInstallationStatus", "id": "client.events.1"}}
  9. And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"uktv"}}
  10. Then I validate an error is returned {"jsonrpc":"2.0","id":1002,"error":{"code":1,"message":"ERROR_GENERAL"}}
  11. And I validate that an onAppInstallationStatus event is emitted with UNINSTALL_BLOCKED {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"uktv","version":"0.8.1.2100","state":"UNINSTALL_BLOCKED","failReason":"NONE"}]"}}
  12. And I validate that the app is still loaded and functions as normal
  13. And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "uktv"}}
  14. And I validate that onAppInstallationStatus events are emitted with UNINSTALLING & UNINSTALLED {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"uktv","version":"0.8.1.2100","state":"UNINSTALLING"}]"}} {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"uktv","version":"0.8.1.2100","state":"UNINSTALLED"}]"}}
  15. And I send a packageState call for the uninstalled app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"uktv", "version": "0.8.1.2100"} }
  16. And I validate that the result is UNISTALLED {"jsonrpc":"2.0","id":1002,"result":"UNINSTALLED"}

Uninstall Called With Invalid packageId Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send an uninstall call with a packageId that does not match an installed app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"testUninstall"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Uninstall Called Without packageId Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send an uninstall call without a packageId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

StorageManager.deleteStorage Not Called After Unsuccessful Uninstall

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send an uninstall call to attempt to uninstall an app that is not installed {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"testUninstall"}}
  3. Then I validate a StorageManager.deleteStorage call is NOT made

StorageManager.deleteStorage Called After Uninstalling App

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  5. And I wait for the app to finish installing
  6. And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
  7. Then I validate that StorageManager.deleteStorage is called and storage is successfully deleted 2025-08-26T17:14:48.350Z WPEFramework[4674]: [4679] INFO [StorageManagerImplementation.cpp:174] DeleteStorage: Storage deleted successfully for appId: xumo

Uninstall Successful

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  5. And I wait for the app to finish installing
  6. And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
  7. Then I validate a successful response is returned and the app is successfully uninstalled {"jsonrpc":"2.0","id":1002,"result":""}

packageState

packageState Called While State is Installing

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  5. And I send a packageState call while the app is still installing {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp", "version": "2.2.7.53"} }
  6. Then I validate that a successful response is returned and the result shows "Installing" {"jsonrpc":"2.0","id":1002,"result":"Installing"}

packageState Called While State is InstallationBlocked

Steps

  • No steps found

packageState Called While State is UnInstalling

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  5. And I wait for the app to finish installing
  6. And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
  7. And I send a packageState call while the app is still uninstalling {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp", "version": "2.2.7.53"} }
  8. Then I validate that a successful response is returned and the result shows "Uninstalling" {"jsonrpc":"2.0","id":1002,"result":"Uninstalling"}

packageState Called With packageId of Type Other Than String

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a packageState call with a packageId value of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {packageId":"NetflixApp, "version": "2.2.7.53"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

packageState Called With Invalid packageId Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a packageState call with a packageId value that does not match a currently installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"testPackageState", "version": "2.2.7.53"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

packageState Called With Version Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a packageState call with a version param of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp", "version": 2.2.7.53} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

packageState Called Without version Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a packageState call without a verison param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

packageState Called With Invalid version Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a packageState call with a version value that does not match the version of the installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp", "version": "9.9.9.9"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

packageState Called Without packageId

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a packageState call without a packageId param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"version": "2.2.7.53"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

packageState Called While State is Installed

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  5. And I wait for the app to be installed
  6. And I send a packageState call {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp", "version": "2.2.7.53"} }
  7. Then I validate that a successful response is returned and the result shows "Installed" {"jsonrpc":"2.0","id":1002,"result":"Installed"}

packageState Called While State is UnInstalled

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  5. And I wait for the app to finish installing
  6. And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
  7. And I wait
  8. And I send a packageState call {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp", "version": "2.2.7.53"} }
  9. Then I validate that a successful response is returned and the result shows "Uninstalled" {"jsonrpc":"2.0","id":1002,"result":"Uninstalled"}

lock

Lock Called With lockReason Other Than System App or Launch

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call with a lockReason other than LAUNCH or SYSTEM_APP {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate", "lockReason": "testReason"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Lock Called Without packageId

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call without a packageId param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"version": "100.1.59+hibernate", "lockReason": "Launch"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Lock Called With packageId Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call with a packageId param of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":YouTube, "version": "100.1.59+hibernate", "lockReason": "Launch"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Lock Called With Invalid version Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call with a version value that does not match the version of the installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": "9.9.9.9", "lockReason": "Launch"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Lock Called With Invalid packageId

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call with a packageId value that does not match an installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"TestLockApp", "version": "100.1.59+hibernate", "lockReason": "Launch"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Lock Called Without version Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call without a version param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "lockReason": "Launch"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Lock Called With version Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call with a version value of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": 100.1.59+hibernate, "lockReason": "Launch"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Lock Called Without lockReason

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call without a lockReason param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Lock Called With System App lockReason

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call for an installed app that is not locked {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate", "lockReason": "SYSTEM_APP"} }
  3. Then I validate that a successful response is returned and includes lockId, unpackedPath, configMetadata and appMetadata {"jsonrpc":"2.0","id":1002,"result":{"lockId":1,"unpackedPath":"/media/apps/sky/packages/YouTube/data.img","configMetadata":{"dial":true,"wanLanAccess":true,"thunder":true,"systemMemoryLimit":524288000,"gpuMemoryLimit":-1,"envVariables":"[]","userId":30004,"groupId":30000,"dataImageSize":205520896,"resourceManagerClientEnabled":false,"dialId":"","command":"SkyBrowserLauncher","appType":"INTERACTIVE","appPath":"/var/run/sky/extracted/YouTube.3kScX1","runtimePath":"/var/run/sky/extracted/com.sky.cobalt.VkGvW2","logFilePath":"","logFileMaxSize":0,"logLevels":"","mapi":false,"fkpsFiles":"["0381000003810001.key","0381000003810001.keyinfo","0381000003810001.sha","0381000003810002.key","0381000003810002.keyinfo","0381000003810003.key","0381000003810003.keyinfo","0611000006110004.bin","0681000006810001.bin","fffffffffffffff7.key","fffffffffffffff7.keyinfo","fffffffffffffff8.key","fffffffffffffff8.keyinfo"]","fireboltVersion":"","enableDebugger":false},"appMetadata":[{"packageId":"com.sky.cobalt","version":"100.1.59+hibernate"}]}}

Lock Called for Unlocked App

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call for an installed app that is not locked {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate", "lockReason": "Launch"} }
  3. Then I validate that a successful response is returned and includes lockId, unpackedPath, configMetadata and appMetadata {"jsonrpc":"2.0","id":1002,"result":{"lockId":1,"unpackedPath":"/media/apps/sky/packages/YouTube/data.img","configMetadata":{"dial":true,"wanLanAccess":true,"thunder":true,"systemMemoryLimit":524288000,"gpuMemoryLimit":-1,"envVariables":"[]","userId":30004,"groupId":30000,"dataImageSize":205520896,"resourceManagerClientEnabled":false,"dialId":"","command":"SkyBrowserLauncher","appType":"INTERACTIVE","appPath":"/var/run/sky/extracted/YouTube.3kScX1","runtimePath":"/var/run/sky/extracted/com.sky.cobalt.VkGvW2","logFilePath":"","logFileMaxSize":0,"logLevels":"","mapi":false,"fkpsFiles":"["0381000003810001.key","0381000003810001.keyinfo","0381000003810001.sha","0381000003810002.key","0381000003810002.keyinfo","0381000003810003.key","0381000003810003.keyinfo","0611000006110004.bin","0681000006810001.bin","fffffffffffffff7.key","fffffffffffffff7.keyinfo","fffffffffffffff8.key","fffffffffffffff8.keyinfo"]","fireboltVersion":"","enableDebugger":false},"appMetadata":[{"packageId":"com.sky.cobalt","version":"100.1.59+hibernate"}]}}

Lock Called For Locked App

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call for an installed app that is not locked {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate", "lockReason": "Launch"} }
  3. Then I validate that a successful response is returned
  4. And I send another lock call for the same app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate", "lockReason": "Launch"} }
  5. And I validate that a successful response is returned and has "lockId":2 {"jsonrpc":"2.0","id":1002,"result":{"lockId":2,"unpackedPath":"/media/apps/sky/packages/YouTube/data.img","configMetadata":{"dial":true,"wanLanAccess":true,"thunder":true,"systemMemoryLimit":524288000,"gpuMemoryLimit":-1,"envVariables":"[]","userId":30004,"groupId":30000,"dataImageSize":205520896,"resourceManagerClientEnabled":false,"dialId":"","command":"SkyBrowserLauncher","appType":"INTERACTIVE","appPath":"/var/run/sky/extracted/YouTube.3kScX1","runtimePath":"/var/run/sky/extracted/com.sky.cobalt.VkGvW2","logFilePath":"","logFileMaxSize":0,"logLevels":"","mapi":false,"fkpsFiles":"["0381000003810001.key","0381000003810001.keyinfo","0381000003810001.sha","0381000003810002.key","0381000003810002.keyinfo","0381000003810003.key","0381000003810003.keyinfo","0611000006110004.bin","0681000006810001.bin","fffffffffffffff7.key","fffffffffffffff7.keyinfo","fffffffffffffff8.key","fffffffffffffff8.keyinfo"]","fireboltVersion":"","enableDebugger":false},"appMetadata":[{"packageId":"com.sky.cobalt","version":"100.1.59+hibernate"}]}}

Lock Called With Launch lockReason

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a lock call for an installed app that is not locked {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.lock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate", "lockReason": "Launch"} }
  3. Then I validate that a successful response is returned and includes lockId, unpackedPath, configMetadata and appMetadata {"jsonrpc":"2.0","id":1002,"result":{"lockId":1,"unpackedPath":"/media/apps/sky/packages/YouTube/data.img","configMetadata":{"dial":true,"wanLanAccess":true,"thunder":true,"systemMemoryLimit":524288000,"gpuMemoryLimit":-1,"envVariables":"[]","userId":30004,"groupId":30000,"dataImageSize":205520896,"resourceManagerClientEnabled":false,"dialId":"","command":"SkyBrowserLauncher","appType":"INTERACTIVE","appPath":"/var/run/sky/extracted/YouTube.3kScX1","runtimePath":"/var/run/sky/extracted/com.sky.cobalt.VkGvW2","logFilePath":"","logFileMaxSize":0,"logLevels":"","mapi":false,"fkpsFiles":"["0381000003810001.key","0381000003810001.keyinfo","0381000003810001.sha","0381000003810002.key","0381000003810002.keyinfo","0381000003810003.key","0381000003810003.keyinfo","0611000006110004.bin","0681000006810001.bin","fffffffffffffff7.key","fffffffffffffff7.keyinfo","fffffffffffffff8.key","fffffffffffffff8.keyinfo"]","fireboltVersion":"","enableDebugger":false},"appMetadata":[{"packageId":"com.sky.cobalt","version":"100.1.59+hibernate"}]}}

unlock

Unlock Called With packageId Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send an unlock call with a packageId param of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"packageId":YouTube, "version": "100.1.59+hibernate"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Unlock Called Without packageId Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send an unlock call without a packageId param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"version": "100.1.59+hibernate"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Unlock Called Without version Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send an unlock call without a version param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"packageId":"YouTube"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Unlock Called With Invalid packageId Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send an unlock call with a packageId value that does not match a currently installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"packageId":"testUnlock", "version": "100.1.59+hibernate"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Unlock Called With Invalid version Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send an unlock call with a version value that does not match the version of the currently installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"packageId":"YouTube", "version": "9.9.9.9"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Unlock Called With version Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send an unlock call with a version param of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"packageId":"YouTube", "version": 100.1.59+hibernate} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Unlock Called For Locked App

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send an unlock call for a locked app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate"} }
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1002,"result":null}

Unlock Called For Unlocked App

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send an unlock call for an unlocked app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getLockedInfo

getLockedInfo Called Without packageId Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a getLockedInfo call without a packageId param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"version": "100.1.59+hibernate"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getLockedInfo Called With Invalid version Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a getLockedInfo call with a version param that does not match the version of the installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"packageId":"YouTube", "version": "9.9.9.9"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getLockedInfo Called With Invalid packageId Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a getLockedInfo call with a packageId param that does not match a currently installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"packageId":"testLockedInfo", "version": "100.1.59+hibernate"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getLockedInfo Called With version Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a getLockedInfo call with a version param of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"packageId":"YouTube", "version": 100.1.59+hibernate} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getLockedInfo Called Without version Param

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a getLockedInfo call without a version param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"packageId":"YouTube"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getLockedInfo Called with packageId Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a getLockedInfo call with a packageId of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"packageId":YouTube, "version": "100.1.59+hibernate"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getLockedInfo Called For Unlocked App

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a getLockedInfo call for an unlocked app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate"} }
  3. Then I validate that a successful response is returned and has unpackedPath, configMetadata, appMetadataPath, gatewayMetadataPath and locked {"jsonrpc":"2.0","id":1002,"result":{"unpackedPath":"","configMetadata":{"dial":true,"wanLanAccess":true,"thunder":true,"systemMemoryLimit":524288000,"gpuMemoryLimit":-1,"envVariables":"[]","userId":30004,"groupId":30000,"dataImageSize":205520896,"resourceManagerClientEnabled":false,"dialId":"","command":"SkyBrowserLauncher","appType":"INTERACTIVE","appPath":"/var/run/sky/extracted/YouTube.3kScX1","runtimePath":"/var/run/sky/extracted/com.sky.cobalt.VkGvW2","logFilePath":"","logFileMaxSize":0,"logLevels":"","mapi":false,"fkpsFiles":"["0381000003810001.key","0381000003810001.keyinfo","0381000003810001.sha","0381000003810002.key","0381000003810002.keyinfo","0381000003810003.key","0381000003810003.keyinfo","0611000006110004.bin","0681000006810001.bin","fffffffffffffff7.key","fffffffffffffff7.keyinfo","fffffffffffffff8.key","fffffffffffffff8.keyinfo"]","fireboltVersion":"","enableDebugger":false},"gatewayMetadataPath":"","locked":false}}
  4. And I validate that the returned locked value is false

getLockedInfo Called For Locked App

Steps

  1. Given I am using an RDK-E build with AI2.0 plugins enabled and activated
  2. When I send a getLockedInfo call for a locked app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"packageId":"YouTube", "version": "100.1.59+hibernate"} }
  3. Then I validate that a successful response is returned and has unpackedPath, configMetadata, appMetadataPath, gatewayMetadataPath and locked {"jsonrpc":"2.0","id":1002,"result":{"unpackedPath":"/media/apps/sky/packages/YouTube/data.img","configMetadata":{"dial":true,"wanLanAccess":true,"thunder":true,"systemMemoryLimit":524288000,"gpuMemoryLimit":-1,"envVariables":"[]","userId":30004,"groupId":30000,"dataImageSize":205520896,"resourceManagerClientEnabled":false,"dialId":"","command":"SkyBrowserLauncher","appType":"INTERACTIVE","appPath":"/var/run/sky/extracted/YouTube.3kScX1","runtimePath":"/var/run/sky/extracted/com.sky.cobalt.VkGvW2","logFilePath":"","logFileMaxSize":0,"logLevels":"","mapi":false,"fkpsFiles":"["0381000003810001.key","0381000003810001.keyinfo","0381000003810001.sha","0381000003810002.key","0381000003810002.keyinfo","0381000003810003.key","0381000003810003.keyinfo","0611000006110004.bin","0681000006810001.bin","fffffffffffffff7.key","fffffffffffffff7.keyinfo","fffffffffffffff8.key","fffffffffffffff8.keyinfo"]","fireboltVersion":"","enableDebugger":false},"gatewayMetadataPath":"","locked":true}}

download

Download - No Retry When Download Fails With Code 404

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/testFail/9999/9.9.9.9/package.wgt"}}
  3. Then I validate that a response is returned: {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And the download attempt fails with a 404 error
  5. And I validate that the download attempt is NOT retried

Download - Download Added to Front of Queue Based on Priority Param

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send 2 download calls which do not include a priority param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
    {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. And I send a 3rd download call which contains a priority param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/amazonPrime/3171759197/100.270.1.21000/package.wgt","options":{"rateLimit": 40000,"priority": true}}}
  4. Then I validate that the 3rd download is placed in the queue ahead of the 2nd download
  5. And I send a 4th download call which does not contain a priority param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  6. And I validate that the 4th download is placed in the queue behind the 3rd download

Download - No retries Param Passed - Default Retry number Used

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call which does not include a retries param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that a response is returned: {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And the download attempt fails with an http error other than 404
  5. And I validate that the download attempt is retried 2 times before the download fails

Download - Download Called With No Network Connection

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated and the device is not connected to the internet
  2. When I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that an error is returned: {"jsonrpc": "2.0","id": 1010,"error": {"code": 1,"message": "ERROR_GENERAL"}}

Download - Download Called While In Unsupported Power State

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated and the device is in DEEPSLEEP PowerState To put the device in DEEPSLEEP PowerState use the following command: SetPowerState DEEPSLEEP
  2. When I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that an error is returned: {"jsonrpc": "2.0","id": 1010,"error": {"code": 1,"message": "ERROR_GENERAL"}}

Download - retries Param Honored

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call which includes a retries param with a value other than the default {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"retries": 4}}}
  3. Then I validate that a response is returned: {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And the download attempt fails with an http error other than 404
  5. And I validate that the download attempt is retried 4 times before the download fails

Download - No priority Param Passed in download call

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call without the priority Param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}

Download - rateLimit Param Not Passed

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call without the rateLimit Param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}

Download - Download Called For App That is Already Downloaded

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that a successful response is returned
  4. And I send another download call to download the same widget
  5. And I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}

Download - downloadId Returned in download Response

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that the response includes downloadId which is of type String {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}

Download - rateLimit Param Honored

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call that contains rateLimit param of type long which represents Bytes per second {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. Then I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And I validate that the rateLimit param is being honored

Download - Download Call Successful

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that a successful response is returned
  4. And I validate that the response includes downloadId {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}

Download - No retries Param Passed in download call

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call without the retries Param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. Then I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}

pause

Pause Called Without downloadId Param

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download without including a downloadId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Pause Called With Invalid dowloadId

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a pause call with a downloadId that does not match an in-progress download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "99999"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Pause Called with downloadId of Type Other Than String

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download, passing the downloadId as an integer and not a string {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": 1002}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

pause Called For In-Progress Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
  6. And I validate that the download is successfully paused 2025-04-24T13:16:43.044Z WPEFramework[15747]: [7200] DEBUG [PackageManagerImplementation.cpp:160] Pause: 1002 paused

pause Called For Paused Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
  6. And I validate that the download is successfully paused 2025-04-24T13:16:43.044Z WPEFramework[15747]: [7200] DEBUG [PackageManagerImplementation.cpp:160] Pause: 1002 paused
  7. And I send another pause call to pause the download that was already paused {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  8. And I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

pause Called For Completed Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I wait for the download to finish 2025-04-24T13:57:55.856Z WPEFramework[8389]: [16337] DEBUG [HttpClient.cpp:69] downloadFile: Download /opt/CDL/package1001.wgt Success
  5. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  6. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

rateLimit

rateLimit Called with limit of Type Other Than Long

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call that contains rateLimit param of type long which represents Bytes per second {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And send a rateLimit call with a limit param of type string {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"downloadId": "1005", "limit": "40000"}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

rateLimit Called Without downloadId Param

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call that contains rateLimit param of type long which represents Bytes per second {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And send a rateLimit call without the downloadId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"limit": 40000}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

rateLimit Called With Invalid dowloadId

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call that contains rateLimit param of type long which represents Bytes per second {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And send a rateLimit call with a downloadId that does not correspond to any download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"downloadId": "9999", "limit": 40000}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

rateLimit Called with downloadId of Type Other Than String

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call that contains rateLimit param of type long which represents Bytes per second {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And send a rateLimit call with a downloadId param of type integer {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"downloadId": 1005, "limit": "40000"}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

rateLimit Called Without limit Param

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call that contains rateLimit param of type long which represents Bytes per second {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And send a rateLimit call without the limit param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"downloadId": "1005"}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

rateLimit Called For Paused Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call that contains rateLimit param of type long which represents Bytes per second {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1005"}}
  5. And send a rateLimit call with the downloadId of the paused download from the last step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"downloadId": "1005", "limit": 1000000}}
  6. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
  7. And I send a resume call to resume the paused download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1005"}}
  8. And I validate that the rateLimit param is being honored
  9. And I wait for the download to complete
  10. And I validate that the download completed successfully 2025-04-24T16:50:29.797Z WPEFramework[8389]: [16337] DEBUG [HttpClient.cpp:69] downloadFile: Download /opt/CDL/package1005.wgt Success 2025-04-24T16:50:29.797Z WPEFramework[8389]: [16337] TRACE [PackageManagerImplementation.cpp:455] downloader: Download status=0 code=200 time=32123 ms

rateLimit Called For In-Progress Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call that contains rateLimit param of type long which represents Bytes per second {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","options":{"rateLimit": 1000000}}}
  3. And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
  4. And send a rateLimit call with the downloadId of the in-progress download from the last step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"downloadId": "1005", "limit": 1000000}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
  6. And I validate that the rateLimit param is being honored
  7. And I wait for the download to complete
  8. And I validate that the download completed successfully 2025-04-24T16:50:29.797Z WPEFramework[8389]: [16337] DEBUG [HttpClient.cpp:69] downloadFile: Download /opt/CDL/package1005.wgt Success 2025-04-24T16:50:29.797Z WPEFramework[8389]: [16337] TRACE [PackageManagerImplementation.cpp:455] downloader: Download status=0 code=200 time=32123 ms

config

Config Called With Invalid version Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a config call with a version value that does not match the current version of the installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.config", "params": {"packageId":"NetflixApp", "version": "9.9.9.9"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Config Called With packageId Param of Type Other Than String

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a config call with a packageId param value of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.config", "params": {"packageId":NetflixApp, "version": "2.2.7.53"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Config Called With Invalid packageId Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a config call with a packageId that does not match a currently installed app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.config", "params": {"packageId":"testConfig", "version": "2.2.7.53"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Config Called Without packageId Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a config call without a packageId param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.config", "params": {"version": "2.2.7.53"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Config Called With Version of Type Other Than String

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a config call with a version value of type other than String {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.config", "params": {"packageId":"NetflixApp", "version": 2.2.7.53} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Config Called Without version Param

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a config call without a version param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.config", "params": {"packageId":"NetflixApp"} }
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

config Successful

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  5. And I wait for the app to be installed
  6. And I send a config call with "packageId":"NetflixApp" & "version": "2.2.7.53" {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.config", "params": {"packageId":"NetflixApp", "version": "2.2.7.53"} }
  7. Then I validate that a successful response is returned and the result is a configObject {"jsonrpc":"2.0","id":1002,"result":{"dial":false,"wanLanAccess":false,"thunder":false,"systemMemoryLimit":0,"gpuMemoryLimit":0,"envVars":"","userId":0,"groupId":0,"dataImageSize":0,"resourceManagerClientEnabled":false,"dialId":"","command":"","appType":0,"appPath":"","runtimePath":"","fireboltVersion":"","enableDebugger":false}}

onAppInstallationStatus

onAppInstallationStatus Emitted When State Changes to uninstallFailure

Steps

  • No steps found

onAppInstallationStatus Emitted When State Changes to Installed

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a call to register for onAppInstallationStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppInstallationStatus", "id": "client.events.1"}}
  3. And I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  4. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  5. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  6. Then I validate that an onAppInstallationStatus event is emitted with a state of INSTALLING {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"INSTALLING"}]"}}
  7. And I wait for the app to finish installing
  8. And I validate that an onAppInstallationStatus event is emitted with a state of INSTALLED {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"INSTALLED"}]"}}

onAppInstallationStatus Emitted When State Changes to uninstalled

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a call to register for onAppInstallationStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppInstallationStatus", "id": "client.events.1"}}
  3. And I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  4. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  5. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  6. And I wait for the app to finish installing
  7. And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
  8. Then I validate an onAppInstallationStatus event is emitted with a state of UNINSTALLING {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"UNINSTALLING"}]"}}
  9. And I wait for the app to finish uninstalling
  10. And I validate that an onAppInstallationStatus event is emitted with a state of UNINSTALLED {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"UNINSTALLED"}]"}}

onAppInstallationStatus Emitted When State Changes to installFailure

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a call to register for onAppInstallationStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppInstallationStatus", "id": "client.events.1"}}
  3. And I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  4. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  5. And I check the space remaining in /media/apps/sky/packages df -h /media/apps/sky/packages
  6. And I create a test file that has a size of the free space returned by the above command ex: fallocate -l 1.1G /media/apps/sky/packages/PMTest
  7. And I send an install call to attempt to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  8. Then I validate that an onAppInstallationStatus event is emitted with a state of INSTALLING {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"INSTALLING"}]"}}
  9. And I wait for the app to finish installing
  10. And I validate that an onAppInstallationStatus event is emitted with a state of INSTALL_FAILURE and a failReason of PERSISTENCE_FAILURE {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"INSTALL_FAILURE","failReason":"PERSISTENCE_FAILURE"}]"}}

listPackages

listPackages Successful

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/1478162808/100.1.59+hibernate/package.wgt"}}
  3. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"YouTube", "version":"100.1.59+hibernate", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  5. And I wait for the app to be installed
  6. And I send a listPackages call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.listPackages","params": {}}
  7. Then I validate that a successful response is returned and that it includes an array of packages, each containing packageId, version, packageState, digest & sizeKb.
  8. And I validate that the array includes NetflixApp (version 2.2.7.53) {"jsonrpc":"2.0","id":1001,"result":[...{"packageId":"YouTube","version":"100.1.59+hibernate","packageState":"INSTALLED","digest":"","sizeKb":0},...]}

resume

Resume Called With Invalid dowloadId

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a resume call with a downloadId that does not match any downloads {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "99999"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Resume Called Without downloadId Param

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  5. Then I validate that the download is successfully paused 2025-04-24T15:31:51.758Z WPEFramework[8389]: [16333] DEBUG [PackageManagerImplementation.cpp:160] Pause: 1002 paused
  6. And I send a resume call to resume the paused download without a downloadId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {}}
  7. And I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Resume Pause Called with downloadId of Type Other Than String

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  5. Then I validate that the download is successfully paused 2025-04-24T15:31:51.758Z WPEFramework[8389]: [16333] DEBUG [PackageManagerImplementation.cpp:160] Pause: 1002 paused
  6. And I send a resume call to resume the paused download with a downloadId param of type integer {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": 1002}}
  7. And I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

resume Called For App That is Not Paused

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a resume call for the in-progress download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1002"}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  6. And I wait for the in-progress download to complete
  7. And I validate that the download successfully completes 2025-04-24T15:32:16.240Z WPEFramework[8389]: [16337] DEBUG [HttpClient.cpp:69] downloadFile: Download /opt/CDL/package1002.wgt Success 2025-04-24T15:32:16.241Z WPEFramework[8389]: [16337] TRACE [PackageManagerImplementation.cpp:455] downloader: Download status=0 code=200 time=32122 ms

resume Called for In-Progress Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a resume call for the in-progress download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1002"}}
  5. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
  6. And I wait for the in-progress download to complete
  7. And I validate that the download successfully completes 2025-04-24T15:32:16.240Z WPEFramework[8389]: [16337] DEBUG [HttpClient.cpp:69] downloadFile: Download /opt/CDL/package1002.wgt Success 2025-04-24T15:32:16.241Z WPEFramework[8389]: [16337] TRACE [PackageManagerImplementation.cpp:455] downloader: Download status=0 code=200 time=32122 ms

resume Called For Paused Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  5. Then I validate that the download is successfully paused 2025-04-24T15:31:51.758Z WPEFramework[8389]: [16333] DEBUG [PackageManagerImplementation.cpp:160] Pause: 1002 paused
  6. And I send a resume call to resume the paused download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1002"}}
  7. And I validate that a successul response is returned {"jsonrpc":"2.0","id":1001,"result":null}
  8. And I validate that the download is successfully resumed 2025-04-24T15:32:01.753Z WPEFramework[8389]: [16333] DEBUG [PackageManagerImplementation.cpp:174] Resume: 1002 resumed
  9. And I wait for the download to complete
  10. And I validate that the download successfully completes 2025-04-24T15:32:16.240Z WPEFramework[8389]: [16337] DEBUG [HttpClient.cpp:69] downloadFile: Download /opt/CDL/package1002.wgt Success 2025-04-24T15:32:16.241Z WPEFramework[8389]: [16337] TRACE [PackageManagerImplementation.cpp:455] downloader: Download status=0 code=200 time=32122 ms

resume Called for Completed Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I wait for the download to finish 2025-04-24T13:57:55.856Z WPEFramework[8389]: [16337] DEBUG [HttpClient.cpp:69] downloadFile: Download /opt/CDL/package1001.wgt Success
  5. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1002"}}
  6. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

cancel

Cancel Called Without downloadId Param

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send cancel without a downloadId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.cancel","params": {}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Cancel Called With Invalid dowloadId

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send cancel with a downloadId that does not match an in-progress or paused download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.cancel","params": {"downloadId": "1"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

Cancel Called with downloadId of Type Other Than String

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send cancel with a downloadId of type other than String {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.cancel","params": {"downloadId": 1001}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

cancel Paused Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a pause call to PackageManagerRDKEMS to pause the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.pause","params": {"downloadId": "1002"}}
  5. And I send a cancel call to PackageManagerRDKEMS to cancel the paused download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.cancel","params": {"downloadId": "1002"}}
  6. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
  7. And I validate that the download is successfully canceled 2025-04-24T19:27:05.685Z WPEFramework[8389]: [16333] DEBUG [PackageManagerImplementation.cpp:188] Cancel: 1002 cancelled

cancel In-Progress Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt","rateLimit": 1000000}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
  4. And I send a cancel call to PackageManagerRDKEMS to cancel the in-progress download, passing the downloadId returned in the previous step {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.cancel","params": {"downloadId": "1002"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
  6. And I validate that the download is successfully canceled 2025-04-24T19:27:05.685Z WPEFramework[8389]: [16333] DEBUG [PackageManagerImplementation.cpp:188] Cancel: 1012 cancelled

cancel Completed Download

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  3. And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  4. And I wait for the download to finish 2025-04-24T13:57:55.856Z WPEFramework[8389]: [16337] DEBUG [HttpClient.cpp:69] downloadFile: Download /opt/CDL/package1001.wgt Success
  5. And I send a cancel call to attempt to cancel the completed download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.cancel","params": {"downloadId": "1003"}}
  6. Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}

getStorageDetails

quotaKb & usedKb Returned in getStorageDetails Response

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.getStorageDetails"}
  3. Then I validate that a successful response is returned
  4. And I validate that the response includes downloadId {"jsonrpc": "2.0","id": 1001,"result": {"status": true,"quotaKb": "10000", "usedKb": "5000"}}

onAppDownloadStatus

onAppDownloadStatus Emitted When Download Fails Due to Disk Persistence Failure

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a call to register for onAppDownloadStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppDownloadStatus", "id": "client.events.1"}}
  3. And I check the space remaining in /opt/CDL df -h /opt/CDL | awk 'NR==2 {sub(/[A-Z]$/, "", $4); print int($4)}'
  4. And I create a empty test file with a size of the remaining space returned by the above command fallocate -l M /opt/CDL/PMTest ex: fallocate -l 576M /opt/CDL/PMTest
  5. And I send a download call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  6. Then I validate that an onAppDownloadStatus event is emitted
  7. And I validate that the event has a failReason of DISK_PERSISTENCE_FAILURE {"jsonrpc":"2.0","method":"client.events.1.onAppDownloadStatus","params":{"jsonresponse":"[{"downloadId":"1001","fileLocator":"\/opt\/CDL\/package1001","failReason":"DISK_PERSISTENCE_FAILURE"}]"}}
  8. And I remove the test file rm /opt/CDL/PMTest

onAppDownloadStatus Emitted When Download Fails Due to Download Failure

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a call to register for onAppDownloadStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppDownloadStatus", "id": "client.events.1"}}
  3. And I send a download call which has been modified to have an invalid url {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/testApp/123456/1.2.3/package.wgt"}}
  4. Then I validate that an onAppDownloadStatus event is emitted
  5. And I validate that downloadId, fileLocator & failReason are returned in the event {"jsonrpc":"2.0","method":"client.events.1.onAppDownloadStatus","params":{"jsonresponse":"[{"downloadId":"1001","fileLocator":"\/opt\/CDL\/package1001","failReason":"DOWNLOAD_FAILURE"}]"}}
  6. And I validate that failReason is DOWNLOAD_FAILURE

Register For onAppDownloadStatus Events

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a call to register for onAppDownloadStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppDownloadStatus", "id": "client.events.1"}}
  3. Then I validate I get a successful response {"jsonrpc":"2.0","id":3,"result":0}

onAppDownloadStatus Emitted When Download Succeeds

Steps

  1. Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
  2. When I send a call to register for onAppDownloadStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppDownloadStatus", "id": "client.events.1"}}
  3. And I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  4. And I wait for the download to complete
  5. Then I validate that an onAppDownloadStatus event is emitted
  6. And I validate that downloadId & fileLocator are returned in the event {"jsonrpc":"2.0","method":"client.events.1.onAppDownloadStatus","params":{"jsonresponse":"[{"downloadId":"1038","fileLocator":"/opt/CDL/package1001"}]"}}

RuntimeManager

suspend

Suspend - Interactive App launched to Suspend (launch app)

Steps

  1. Given I am using an RDK-E build with RuntimeManagerRDKEMS enabled and activated
  2. When I set the box to SUSPEND state, create Suspendable file in tmp touch /tmp/AI2.0Suspendable
  3. Then When we do suspend there is NO UI display. Display should be OFF state
  4. And launch app or preload app with app id following curl command Launch App using curl command Ex- YouTube app

curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc 5. And to verify use DobbyTool list whether state is in paused state or running state 6. And In suspended state App should be in paused state, will get the response when app is in suspendable state 7. And Container should be in Paused state

439com.sky.as.apps713d8b02-35ff-4579-a03b-a09c2e98822dpaused


Suspend - Interactive App launched to Suspend (Preload app)

Steps

  1. Given I am using an RDK-E build with RuntimeManagerRDKEMS enabled and activated
  2. When I set the box to SUSPEND state, create Suspendable file in tmp touch /tmp/AI2.0Suspendable
  3. Then When we do suspend there is NO UI display. Display should be OFF state
  4. And Preload App with following curl command

curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "YouTube", "launchArgs": "{}"}}' http://127.0.0.1:9998/jsonrpc 5. And to verify use DobbyTool list whether state is in paused state or running state 6. And In suspended state App should be in paused state, will get the response when app is in suspendable state 7. And Container should be in Paused state

439com.sky.as.apps713d8b02-35ff-4579-a03b-a09c2e98822dpaused


resume

resume - Resume Suspended Interactive Launched App

Steps

  1. Given I am using an RDK-E build with RuntimeManagerRDKEMS enabled and activated
  2. And Make sure that box is in suspended state
  3. And No UI display. Display should be off state
  4. When I Resume suspended app by launching app again with same App ID Launch App using curl command Ex- YouTube app

curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc 5. Then I validate Suspended app should be resumed Suspended Interactive Launched App should resume i.e. Resume container and move to previous screen UI should display without any issues. 6. And Verify from Wpeframework log resume state

onStateChanged

onStateChanged - Event Emitted for starting State

Steps

  1. Given I am using an RDK-E build with RuntimeManager enabled and activated
  2. When I send a launchApp call for an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate in logs that an onStateChanged event is emitted for the starting state ([1]) 2025-11-11T15:21:08.843Z WPEFramework[3905]: [3961] INFO [RuntimeManagerImplementation.cpp:170] Dispatch: RuntimeManagerImplementation::Dispatch: state[1]

onStateChanged - Event Emitted for terminating State

Steps

  1. Given I am using an RDK-E build with RuntimeManager enabled and activated
  2. When I send a launchApp call for an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a terminateApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  5. Then I validate in logs that an onStateChanged event is emitted for the terminating state ([7]) 2025-11-11T15:21:08.850Z WPEFramework[3905]: [3949] INFO [RuntimeManagerImplementation.cpp:170] Dispatch: RuntimeManagerImplementation::Dispatch: state[7]

onStateChanged - Event Emitted for suspended State

Steps

  1. Given I am using an RDK-E build with RuntimeManager enabled and activated
  2. And I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
  3. And I preload an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "YouTube", "launchArgs":"{}"}}
  4. Then I validate in logs that an onStateChanged event is emitted for the suspended state ([3]) 2025-11-11T15:42:25.355Z WPEFramework[3905]: [3957] INFO [RuntimeManagerImplementation.cpp:170] Dispatch: RuntimeManagerImplementation::Dispatch: state[3]

onStateChanged - Event Emitted for running State

Steps

  1. Given I am using an RDK-E build with RuntimeManager enabled and activated
  2. When I send a launchApp call for an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate in logs that an onStateChanged event is emitted for the running state ([2]) 2025-11-11T15:21:08.850Z WPEFramework[3905]: [3949] INFO [RuntimeManagerImplementation.cpp:170] Dispatch: RuntimeManagerImplementation::Dispatch: state[2]

onStateChanged - Event Emitted for terminated State

Steps

  1. Given I am using an RDK-E build with RuntimeManager enabled and activated
  2. When I send a launchApp call for an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a terminateApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  5. Then I validate in logs that an onStateChanged event is emitted for the terminated state ([8]) 2025-11-11T15:25:46.614Z WPEFramework[3905]: [3955] INFO [RuntimeManagerImplementation.cpp:170] Dispatch: RuntimeManagerImplementation::Dispatch: state[8]

onStateChanged - Event Emitted for hibernating State

Steps

  1. Given I am using an RDK-E build with RuntimeManager enabled and activated
  2. When I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait until the app is finished launching
  4. And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
  5. And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
  6. And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  7. Then I validate in logs that an onStateChanged event is emitted for the hibernating state ([4]) 2025-11-11T15:38:09.391Z WPEFramework[3905]: [3958] INFO [RuntimeManagerImplementation.cpp:170] Dispatch: RuntimeManagerImplementation::Dispatch: state[4]

onStateChanged - Event Emitted for hibernated State

Steps

  1. Given I am using an RDK-E build with RuntimeManager enabled and activated
  2. When I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait until the app is finished launching
  4. And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
  5. And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
  6. And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  7. Then I validate in logs that an onStateChanged event is emitted for the hibernated state ([5]) 2025-11-11T15:38:09.391Z WPEFramework[3905]: [3958] INFO [RuntimeManagerImplementation.cpp:170] Dispatch: RuntimeManagerImplementation::Dispatch: state[5]

onStateChanged - Event Emitted for waking State

Steps

  1. Given I am using an RDK-E build with RuntimeManager enabled and activated
  2. When I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait until the app is finished launching
  4. And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
  5. And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
  6. And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  7. And I remove the 2 recently created empty files rm /tmp/AI2.0Suspendable rm /tmp/AI2.0Hibernatable
  8. And I send a launchApp call to wake the hibernated app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  9. Then I validate in logs that an onStateChanged event is emitted for the waking state ([6]) 2025-11-11T15:38:09.391Z WPEFramework[3905]: [3958] INFO [RuntimeManagerImplementation.cpp:170] Dispatch: RuntimeManagerImplementation::Dispatch: state[6]

run

run - Container Started and Running

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I send a launchApp call for an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate that Runtime Manager run is called 2025-11-17T19:19:32.357Z WPEFramework[3650]: [5914] INFO [RuntimeManagerImplementation.cpp:570] Run: ApplicationConfiguration populated for InstanceId: 1f266088-7be7-4e01-8dbb-d09b0c2b5043
  4. And I validate that a container is successfully started 2025-11-17T19:19:33.631Z WPEFramework[3650]: [3685] INFO [OCIContainer.h:74] OnContainerStarted: OnContainerStarted
  5. And I validate that the container state is changed to running 2025-11-17T19:19:33.628Z WPEFramework[3650]: [3687] INFO [DobbyEventListener.cpp:158] OnContainerStateChanged: Container state changed: com.sky.as.apps1f266088-7be7-4e01-8dbb-d09b0c2b5043 state: 2 runtimeState: 2

terminate

terminate - Container is Terminated on App Termination

Steps

  1. Given I am using an RDK-E build with RDK App Managers
  2. When I send a launchApp call for an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I send a terminateApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  5. Then I validate that a call is made to stop the container 2025-11-17T19:27:10.277Z WPEFramework[3650]: [5914] INFO [DobbyInterface.cpp:351] stopContainer: Stop container
  6. And I validate that the container state transitions to stopped 2025-11-17T19:27:11.574Z WPEFramework[3650]: [3694] INFO [DobbyEventListener.cpp:158] OnContainerStateChanged: Container state changed: com.sky.as.apps1f266088-7be7-4e01-8dbb-d09b0c2b5043 state: 5 runtimeState: 8

hibernate

Hibernate - Container Hibernated on closeApp For Hibernatable App

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I launch an installed app which supports hibernation {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I create test files to force the app to hibernate after close touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
  4. And I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  5. Then I validate that the container is hibernated 2025-11-17T19:23:33.072Z WPEFramework[3650]: [5914] INFO [DobbyInterface.cpp:441] hibernateContainer: Hibernate container
  6. And I validate that the container state transitions to hibernated 2025-11-17T19:23:37.627Z WPEFramework[3650]: [3693] INFO [DobbyEventListener.cpp:158] OnContainerStateChanged: Container state changed: com.sky.as.apps1f266088-7be7-4e01-8dbb-d09b0c2b5043 state: 7 runtimeState: 5

wake

wake - Wake Container After Launching Hibernated App

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I launch an installed app which supports hibernation {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I create test files to force the app to hibernate after close touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
  4. And I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
  5. And I wait for the app to be hibernated
  6. And I remove the test files rm /tmp/AI2.0Suspendable rm /tmp/AI2.0Hibernatable
  7. And I send a launchApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  8. Then I validate that wake is called to wake the container 2025-11-17T19:26:06.326Z WPEFramework[3650]: [5914] INFO [DobbyInterface.cpp:470] wakeupContainer: wakeup container
  9. And I validate that the state of the container transitions from hibernated to running 2025-11-17T19:26:07.487Z WPEFramework[3650]: [3694] INFO [DobbyEventListener.cpp:158] OnContainerStateChanged: Container state changed: com.sky.as.apps1f266088-7be7-4e01-8dbb-d09b0c2b5043 state: 2 runtimeState: 2

onStarted

onStarted - Emitted When a Container is Started

Steps

  1. Given I am using an RDK-E build with RDK App Managers Enabled
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate that an onStarted event is emitted 2025-11-11T18:40:02.161Z WPEFramework[3600]: [3626] INFO [RuntimeManagerImplementation.cpp:160] Dispatch: Dispatching event[onContainerStarted] for appInstanceId[fdb5849d-bf07-4446-91fe-f39b0c8604be]

onTerminated

onTerminated - Emitted When a Container is Shutdown

Steps

  1. Given I am using an RDK-E build with RDK App Managers Enabled
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  5. Then I validate that an onTerminated event is emitted 2025-11-11T18:49:22.920Z WPEFramework[3600]: [3615] INFO [RuntimeManagerImplementation.cpp:160] Dispatch: Dispatching event[onContainerStopped] for appInstanceId[fdb5849d-bf07-4446-91fe-f39b0c8604be]

StorageManager

clear

clear Called Without appId

Steps

  1. Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
  2. When I send a clear call without an appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clear", "params":{}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

clear Called With Invalid appId

Steps

  1. Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
  2. When I send a clear call with an appId of an app which is not installed {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clear", "params":{"appId": "storageTestApp"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

Clear for app

Steps

  1. Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
  2. And uktv is currently installed
  3. When I create an empty file in an app's storage directory touch /opt/persistent/storageManager/uktv/testFile
  4. And I send a clear call for uktv {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clear", "params":{"appId": "uktv"}}
  5. Then I validate that the clear call was successful {"jsonrpc":"2.0","id":3,"result":""}
  6. And I validate that the uktv storage directory is empty ls /opt/persistent/storageManager/uktv/

getStorage

getStorage - Called When an App is Launched

Steps

  1. Given I am using an RDKE device and StorageManager is activated
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate that getStorage is called 2025-10-01T14:33:50.180Z WPEFramework[3756]: [5883] INFO [StorageManagerImplementation.cpp:137] GetStorage: Entered GetStorage Implementation
  4. And I validate that the getStorage call is successful 2025-10-01T14:33:50.180Z WPEFramework[3756]: [5883] INFO [RequestHandler.cpp:667] GetStorage: GetStorage Information path = /opt/persistent/storageManager/uktv, userId = 0, groupId = 0, size = 1024, used = 0 2025-10-01T14:33:50.180Z WPEFramework[3756]: [5883] INFO [StorageManagerImplementation.cpp:150] GetStorage: Storage retreived successfully for appId: uktv

clearAll

clearAll With Exempt App

Steps

  1. Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
  2. And there are at least 2 apps installed
  3. When I create test files in the storage directories of 2 different apps touch /opt/persistent/storageManager/uktv/testFile touch /opt/persistent/storageManager/xumo/testFile
  4. And I send a clearAll call with uktv in the exemptionAppIds array {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clearAll", "params":{"exemptionAppIds":["uktv"]}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":""}
  6. And I validate that the test file still remains in the uktv storage directory ls /opt/persistent/storageManager/uktv
  7. And I validate that there are no files in the other app's storage directory ls /opt/persistent/storageManager/xumo

clearAll With No Exempted Apps

Steps

  1. Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
  2. And there are at least 2 apps installed
  3. When I create test files in the storage directories of 2 different apps touch /opt/persistent/storageManager/uktv/testFile touch /opt/persistent/storageManager/xumo/testFile
  4. And I send a clearAll call with uktv in the exemptionAppIds array {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clearAll", "params":{"exemptionAppIds":[]}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":""}
  6. And I validate that there are no files in the uktv storage directory ls /opt/persistent/storageManager/uktv
  7. And I validate that there are no files in the other app's storage directory ls /opt/persistent/storageManager/xumo

clearAll Called Without exemptionAppIds

Steps

  1. Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
  2. And there are at least 2 apps installed
  3. When I send a clearAll call without an exemptionAppIds param {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clearAll", "params":{}}
  4. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

deleteStorage

deleteStorage - Called When an App is Uninstalled

Steps

  1. Given I am using an RDK-E build with StorageManager enabled and activated
  2. When I uninstall an app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"uktv"} }
  3. Then I validate that deleteStorage is called 2025-10-01T14:42:35.252Z WPEFramework[3756]: [3770] INFO [StorageManagerImplementation.cpp:160] DeleteStorage: Entered DeleteStorage Implementation
  4. And I validate that deleteStorage is successful 2025-10-01T14:42:35.265Z WPEFramework[3756]: [3770] INFO [StorageManagerImplementation.cpp:174] DeleteStorage: Storage deleted successfully for appId: uktv
  5. And I validate that the uktv app storage folder was deleted ls /opt/persistent/storageManager/uktv ls: /opt/persistent/storageManager/uktv: No such file or directory

PreinstallManager

startPreinstall

startPreinstall - forceInstall false - App not currently installed

Steps

  1. Given I am using an RDKE device and PreinstallManager is activated
  2. And no version of YouTube is currently installed
  3. And a YouTube widget is on the device at location /opt/preinstall/YouTube/package.wgt
  4. When I send a startPreinstall call with forceInstall: false {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": false}}
  5. Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed

startPreinstall - forceInstall true - App With Older Version Installed

Steps

  1. Given I am using an RDKE device and PreinstallManager is activated
  2. And YouTube is currently installed and has a version less than 100.1.59 url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/3171759197/100.1.17/package.wgt
  3. And a YouTube version 100.1.59 widget is on the device at location /opt/preinstall/YouTube/package.wgt url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/1478162808/100.1.59+hibernate/package.wgt
  4. When I send a startPreinstall call with forceInstall: true {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": true}}
  5. Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed (version 100.1.59+hibernate)

startPreinstall - forceInstall true - App With Newer Version Installed

Steps

  1. Given I am using an RDKE device and PreinstallManager is activated
  2. And YouTube is currently installed and has a version greater than 100.1.17 url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/1478162808/100.1.59+hibernate/package.wgt
  3. And a YouTube version 100.1.17 widget is on the device at location /opt/preinstall/YouTube/package.wgt url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/3171759197/100.1.17/package.wgt
  4. When I send a startPreinstall call with forceInstall: true {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": true}}
  5. Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed (version 100.1.17)

startPreinstall - forceInstall false - App With Older Version Installed

Steps

  1. Given I am using an RDKE device and PreinstallManager is activated
  2. And YouTube is currently installed and has a version less than 100.1.59 url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/3171759197/100.1.17/package.wgt
  3. And a YouTube version 100.1.59 widget is on the device at location /opt/preinstall/YouTube/package.wgt url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/1478162808/100.1.59+hibernate/package.wgt
  4. When I send a startPreinstall call with forceInstall: false {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": false}}
  5. Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed (version 100.1.59+hibernate)

startPreinstall - forceInstall true - App Not Installed

Steps

  1. Given I am using an RDKE device and PreinstallManager is activated
  2. And no version of YouTube is currently installed
  3. And a YouTube widget is on the device at location /opt/preinstall/YouTube/package.wgt
  4. When I send a startPreinstall call with forceInstall: true {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": true}}
  5. Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed

startPreinstall - forceInstall false - App With Newer Version Installed

Steps

  1. Given I am using an RDKE device and PreinstallManager is activated
  2. And YouTube is currently installed and has a version greater than 100.1.17 url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/1478162808/100.1.59+hibernate/package.wgt
  3. And a YouTube version 100.1.17 widget is on the device at location /opt/preinstall/YouTube/package.wgt url for widget which can be used to fulfill this: http://content.gb.services.skyq.sky.com/softcat/widgets/YouTube/3171759197/100.1.17/package.wgt
  4. When I send a startPreinstall call with forceInstall: false {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": false}}
  5. Then I validate that the YouTube widget in /opt/preinstall/YouTube is NOT installed and that the currently installed YouTube version remains installed

onAppInstallationStatus

Preinstall Manager - onAppInstallationStatus Emitted When State Changes to Installed

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a call to register for onAppInstallationStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppInstallationStatus", "id": "client.events.1"}}
  3. And I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  4. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  5. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  6. Then I validate that an onAppInstallationStatus event is emitted with a state of INSTALLING {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"INSTALLING"}]"}}
  7. And I wait for the app to finish installing
  8. And I validate that an onAppInstallationStatus event is emitted with a state of INSTALLED {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"INSTALLED"}]"}}

Preinstall Manager - onAppInstallationStatus Emitted When State Changes to uninstalled

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a call to register for onAppInstallationStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppInstallationStatus", "id": "client.events.1"}}
  3. And I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  4. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  5. And I send an install call to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001.wgt"}}
  6. And I wait for the app to finish installing
  7. And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
  8. Then I validate an onAppInstallationStatus event is emitted with a state of UNINSTALLING {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"UNINSTALLING"}]"}}
  9. And I wait for the app to finish uninstalling
  10. And I validate that an onAppInstallationStatus event is emitted with a state of UNINSTALLED {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"UNINSTALLED"}]"}}

Preinstall Manager - onAppInstallationStatus Emitted When State Changes to installFailure

Steps

  1. Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
  2. When I send a call to register for onAppInstallationStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppInstallationStatus", "id": "client.events.1"}}
  3. And I send a download call to download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/NetflixApp/3093804962/2.2.7.53/package.wgt"}}
  4. And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
  5. And I check the space remaining in /media/apps/sky/packages df -h /media/apps/sky/packages
  6. And I create a test file that has a size of the free space returned by the above command ex: fallocate -l 1.1G /media/apps/sky/packages/PMTest
  7. And I send an install call to attempt to install the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.install","params": {"packageId":"NetflixApp", "version":"2.2.7.53", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"}}
  8. Then I validate that an onAppInstallationStatus event is emitted with a state of INSTALLING {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"INSTALLING"}]"}}
  9. And I wait for the app to finish installing
  10. And I validate that an onAppInstallationStatus event is emitted with a state of INSTALL_FAILURE and a failReason of PERSISTENCE_FAILURE {"jsonrpc":"2.0","method":"client.events.1.onAppInstallationStatus","params":{"jsonresponse":"[{"packageId":"NetflixApp","version":"2.2.7.53","state":"INSTALL_FAILURE","failReason":"PERSISTENCE_FAILURE"}]"}}

LifecycleManager

closeApp

closeApp - Called Without appId Param

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled & activated
  2. When I send a closeApp call without the appId param {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.closeApp", "params": {"closeReason":"USER_EXIT"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

closeApp - Called Without closeReason Param

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled & activated
  2. When I send a closeApp call without the closeReason param {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.closeApp", "params": {"appId":"YouTube"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

closeApp - Called for Active App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled & activated
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to launch
  4. And I send a closeApp call to LifecycleManager for the app that was just launched {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.closeApp", "params": {"appId":"YouTube", "closeReason":"USER_EXIT"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that the app is closed

closeApp - Called for Preloaded App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled & activated
  2. When I preload an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish preload
  4. And I send a closeApp call to LifecycleManager for the app that was just preloaded {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.closeApp", "params": {"appId":"YouTube", "closeReason":"USER_EXIT"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that the app is closed

appReady

appReady - Called for Active App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled & activated
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to launch
  4. And I send an appReady to LifecycleManager with the launched app's appId in the appId param {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.appReady", "params": {"appId":"YouTube"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}

appReady - Called for App That is Not Launched

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled & activated
  2. When I send an appReady to LifecycleManager with an appId of an app which is not launched {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.appReady", "params": {"appId":"uktv"}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

appReady - Called Without appId Param

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled & activated
  2. When I send an appReady to LifecycleManager without an appId param {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.appReady", "params": {}}
  3. Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}

onAppLifecycleStateChanged

onAppLifecycleStateChanged - App Launched to Suspend

Steps

  1. Given I am using a device which has AI 2.0 enabled. To enable AI2.0 create an empty ai2managers file in /opt (touch /opt/ai2managers) and reboot the device
  2. When I send a call to register for onAppLifecycleStateChanged events from LifecycleManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
  5. And I preload an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "YouTube", "launchArgs":"{}"}}
  6. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the LOADING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"76e888a2-de9b-4c34-97d7-8f4b6ce63c2b","oldLifecycleState":"UNLOADED","newLifecycleState":"LOADING","navigationIntent":"null"}}
  7. And I validate that on onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the INITIALIZING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"76e888a2-de9b-4c34-97d7-8f4b6ce63c2b","oldLifecycleState":"LOADING","newLifecycleState":"INITIALIZING","navigationIntent":"null"}}
  8. And I validate that on onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the SUSPENDED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"76e888a2-de9b-4c34-97d7-8f4b6ce63c2b","oldLifecycleState":"INITIALIZING","newLifecycleState":"SUSPENDED","navigationIntent":"null"}}

onAppLifecycleStateChanged - App Launched to Active

Steps

  1. Given I am using a device which has AI 2.0 enabled. To enable AI2.0 create an empty ai2managers file in /opt (touch /opt/ai2managers) and reboot the device
  2. When I send a call to register for onAppLifecycleStateChanged events from LifecycleManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the LOADING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"719b326f-0501-4cb2-bcba-4cae9afd222d","oldLifecycleState":"UNLOADED","newLifecycleState":"LOADING","navigationIntent":"null"}}
  6. And I validate that on onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the INITIALIZING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"719b326f-0501-4cb2-bcba-4cae9afd222d","oldLifecycleState":"LOADING","newLifecycleState":"INITIALIZING","navigationIntent":"null"}}
  7. And I validate that on onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the Paused state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"719b326f-0501-4cb2-bcba-4cae9afd222d","oldLifecycleState":"INITIALIZING","newLifecycleState":"PAUSED","navigationIntent":"null"}}
  8. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the ACTIVE state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"719b326f-0501-4cb2-bcba-4cae9afd222d","oldLifecycleState":"PAUSED","newLifecycleState":"ACTIVE","navigationIntent":"{"action":"launch","context":{"source":"voice"}}"}}

onAppLifecycleStateChanged - Suspendable App Closed

Steps

  1. Given I am using a device which has AI 2.0 enabled. To enable AI2.0 create an empty ai2managers file in /opt (touch /opt/ai2managers) and reboot the device
  2. When I send a call to register for onAppLifecycleStateChanged events from LifecycleManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait until the app is finished launching
  6. And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
  7. And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  8. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the PAUSED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"f9cc0136-253c-4527-9749-2ca3431236de","oldLifecycleState":"ACTIVE","newLifecycleState":"PAUSED","navigationIntent":"null"}}
  9. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the SUSPENDED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"f9cc0136-253c-4527-9749-2ca3431236de","oldStoldLifecycleStateate":"PAUSED","newLifecycleState":"SUSPENDED","navigationIntent":"null"}}

onAppLifecycleStateChanged - Hibernateable App Closed

Steps

  1. Given I am using a device which has AI 2.0 enabled. To enable AI2.0 create an empty ai2managers file in /opt (touch /opt/ai2managers) and reboot the device
  2. When I send a call to register for onAppLifecycleStateChanged events from LifecycleManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait until the app is finished launching
  6. And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
  7. And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
  8. And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
  9. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the PAUSED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"c748a95c-77a3-4007-875a-b029381c54ce","oldLifecycleState":"ACTIVE","newLifecycleState":"PAUSED","navigationIntent":"null"}}
  10. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the SUSPENDED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"c748a95c-77a3-4007-875a-b029381c54ce","oldLifecycleState":"PAUSED","newLifecycleState":"SUSPENDED","navigationIntent":"null"}}
  11. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the HIBERNATED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"c748a95c-77a3-4007-875a-b029381c54ce","oldLifecycleState":"SUSPENDED","newLifecycleState":"HIBERNATED","navigationIntent":"null"}}

onAppLifecycleStateChanged - Non-Suspendable App Terminated

Steps

  1. Given I am using a device which has AI 2.0 enabled. To enable AI2.0 create an empty ai2managers file in /opt (touch /opt/ai2managers) and reboot the device
  2. When I send a call to register for onAppLifecycleStateChanged events from LifecycleManager {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.register", "params": {"event":"onAppLifecycleStateChanged", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait until the app is finished launching
  6. And I terminate the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
  7. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the PAUSED state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"719b326f-0501-4cb2-bcba-4cae9afd222d","oldLifecycleState":"ACTIVE","newLifecycleState":"PAUSED","navigationIntent":"null"}}
  8. And I validate that an onAppLifecycleStateChanged event is emitted from LifecycleManager for the transition to the TERMINATING state {"jsonrpc":"2.0","method":"client.events.1.onAppLifecycleStateChanged","params":{"appId":"YouTube","appInstanceId":"719b326f-0501-4cb2-bcba-4cae9afd222d","oldLifecycleState":"PAUSED","newLifecycleState":"TERMINATING","navigationIntent":"null"}}

WindowManager

generateKey

generateKey - Generate Key for a Focused App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I send a setFocus call to focus the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setFocus", "params":{"client": "500df9ca-d41e-4b1e-882b-d4e23c3a5acf"}}
  4. And I send a generateKey call with the clientId param populated with the appInstanceId of the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.generateKey", "params":{"clientId":"500df9ca-d41e-4b1e-882b-d4e23c3a5acf", "keyCode": 31, "modifiers":[], "duration":3}}
  5. Then I validate that the key is handled by the app

addKeyIntercepts

addKeyIntercepts - Add a Key Intercept With focusOnly=true for Focused App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch an app
  3. And I focus the launched app
  4. And I send an addKeyIntercepts call for the focused app {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"500df9ca-d41e-4b1e-882b-d4e23c3a5acf", "keyCode": 13, "modifiers":[], "focusOnly": true, "propagate": true}}
  5. And I press the key that was specified in the addKeyIntercepts call
  6. Then I validate that the key is intercepted by the app

addKeyIntercepts - Add a Key Intercept With focusOnly=false for Focused App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch an app
  3. And I focus the launched app
  4. And I send an addKeyIntercepts call for the focused app {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"500df9ca-d41e-4b1e-882b-d4e23c3a5acf", "keyCode": 13, "modifiers":[], "focusOnly": false, "propagate": true}}
  5. And I press the key that was specified in the addKeyIntercepts call
  6. Then I validate that the key is intercepted by the app

addKeyIntercepts - Add a Key Intercept With focusOnly=true for Unfocused App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch an app but do not set focus to the app
  3. And I send an addKeyIntercepts call for the unfocused app {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"500df9ca-d41e-4b1e-882b-d4e23c3a5acf", "keyCode": 13, "modifiers":[], "focusOnly": true, "propagate": true}}
  4. And I press the key that was specified in the addKeyIntercepts call
  5. Then I validate that the key is NOT intercepted by the app

addKeyIntercepts - Add a Key Intercept With focusOnly=false for Unfocused App

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch an app but do not set focus to the app
  3. And I send an addKeyIntercepts call for the unfocused app with "focusOnly": false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"500df9ca-d41e-4b1e-882b-d4e23c3a5acf", "keyCode": 13, "modifiers":[], "focusOnly": false, "propagate": true}}
  4. And I press the key that was specified in the addKeyIntercepts call
  5. Then I validate that the key is intercepted by the app

addKeyIntercepts - Add a key intercept with propagate=true for focused app

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch 2 apps
  3. And I send a setFocus call to set focus to one of the apps
  4. And I send an addKeyIntercepts call for the unfocused app with focusOnly:false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"500df9ca-d41e-4b1e-882b-d4e23c3a5acf", "keyCode": 13, "modifiers":[], "focusOnly": true, "propagate": true}}
  5. And I send an addKeyIntercepts call for the focused app with propagate=true {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"0db786d6-8e01-4cd6-a2ac-66e7b87d715b", "keyCode": 13, "modifiers":[], "focusOnly": true, "propagate": true}}
  6. And I press the key that was sent in the addKeyIntercepts calls
  7. Then I validate that the keypress is sent to the focused app
  8. And I validate that the keypress is sent to the unfocused app

addKeyIntercepts - Add a key intercept with propagate=false for focused app

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch 2 apps
  3. And I send a setFocus call to set focus to one of the apps
  4. And I send an addKeyIntercepts call for the unfocused app with focusOnly:false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"500df9ca-d41e-4b1e-882b-d4e23c3a5acf", "keyCode": 13, "modifiers":[], "focusOnly": true, "propagate": true}}
  5. And I send an addKeyIntercepts call for the focused app with propagate=false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"0db786d6-8e01-4cd6-a2ac-66e7b87d715b", "keyCode": 13, "modifiers":[], "focusOnly": true, "propagate": true}}
  6. And I press the key that was sent in the addKeyIntercepts calls
  7. Then I validate that the keypress is sent to the focused app
  8. And I validate that the keypress is NOT sent to the unfocused app

removeKeyIntercepts

removeKeyIntercepts - Key Intercept is Removed

Steps

  1. Given I am using an RDKE device with RDK App Managers enabled
  2. When I launch an app but do not set focus to the app
  3. And I send an addKeyIntercepts call for the unfocused app with "focusOnly": false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.addKeyIntercepts", "params":{"clientId":"500df9ca-d41e-4b1e-882b-d4e23c3a5acf", "keyCode": 13, "modifiers":[], "focusOnly": false, "propagate": true}}
  4. And I press the key that was specified in the addKeyIntercepts call
  5. Then I validate that the key is intercepted by the app
  6. And I send a removeKeyIntercepts call for the unfocused app with the same keyCode
  7. And I press the key that was specified in the removeKeyIntercepts call
  8. And I validate that the key is NOT intercepted by the app

renderReady

renderReady - First Frame of App Not Yet Rendered

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I create a AI2.0Suspendable file in /tmp to force app launches to Suspended state touch /tmp/AI2.0Suspendable
  3. And I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  4. And I send a renderReady call with the appInstanceId of the {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.renderReady", "params":{"clientId":"cd1df838-97d8-41d6-95ad-713b99897e79"}}
  5. Then I validate that result is false {"jsonrpc":"2.0","id":3,"result":false}

renderReady - First Frame of App Already Rendered

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to launch
  4. And I send a renderReady call {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.renderReady", "params":{"clientId":"cd1df838-97d8-41d6-95ad-713b99897e79"}}
  5. Then I validate that result is true {"jsonrpc":"2.0","id":3,"result":true}

onReady

onReady - Event Emitted When App is Rendered

Steps

  1. Given I am using an RDK-E build with RDK App Managers
  2. When I register for onReady events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onReady", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait for the app to finish launching
  6. And I validate that an onReady event is emitted {"jsonrpc":"2.0","method":"client.events.1.onReady","params":{"client":"cd1df838-97d8-41d6-95ad-713b99897e79"}}

createDisplay

CreateDisplay - Creating display with app instance ID

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I launch an app
  3. And I wait for the app to launch
  4. And I send a createDisplay call with the clientId param populated with the appInstanceId of the app that was launched {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.createDisplay", "params":{"clientId": "4ce89fff-2543-4ff2-9929-9a274cfcb1f7", "displayName": "testDisplay", "displayWidth":1280, "displayHeight":720, "virtualWidth":1280, "virtualHeight": 720}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that display creation is successful 2026-01-09T18:32:38.897Z WPEFramework[2765]: [4215] INFO [RuntimeManagerImplementation.cpp:609] Run: Display [wst-4ce89fff-2543-4ff2-9929-9a274cfcb1f7] created successfully

enableDisplayRender

enableDisplayRender - Enable Display Render

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. Then I validate that the app is displayed on screen
  5. And I send an enableDisplayRender call with "enable" as false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.enableDisplayRender", "params":{"clientId":"cd1df838-97d8-41d6-95ad-713b99897e79", "enable":false}}
  6. And I validate that the app is no longer displayed on screen
  7. And I register for onReady events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onReady", "id": "client.events.1"}}
  8. And I send an enableDisplayRender call with "enable" as true {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.enableDisplayRender", "params":{"clientId":"cd1df838-97d8-41d6-95ad-713b99897e79", "enable":true}}
  9. And I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  10. And I validate that an onReady event is emitted {"jsonrpc":"2.0","method":"client.events.1.onReady","params":{"client":"cd1df838-97d8-41d6-95ad-713b99897e79"}}

enableDisplayRender - Disable Display Render

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. And I wait for the app to finish launching
  4. Then I validate that the app is displayed on screen
  5. And I send a enableDisplayRender call with "enable" as false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.enableDisplayRender", "params":{"clientId":"cd1df838-97d8-41d6-95ad-713b99897e79", "enable":false}}
  6. And I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  7. And I validate that the app is no longer displayed on screen

onBlur

onBlur - Sent when the app removes focus

Steps

  1. Given I am using an RDK-E build with RDK App Managers
  2. When I register for onBlur events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onBlur", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch an app 2 apps
  5. And I wait for the app to finish launching
  6. And I set focus to one of the apps {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setFocus", "params":{"client": "39453376-c785-476b-9f5a-c7f87a4d3473"}}
  7. And I set focus to the other app {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setFocus", "params":{"client": "500df9ca-d41e-4b1e-882b-d4e23c3a5acf"}}
  8. And I validate that an onReady event is emitted {"jsonrpc":"2.0","method":"client.events.1.onBlur","params":{"client":"39453376-c785-476b-9f5a-c7f87a4d3473"}}

setVisible

setVisible - Sets the visibility of an app

Steps

  1. Given I am using a device with RDK App Managers enabled
  2. When I launch 2 different apps {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}} {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  3. Then I validate that the 2nd app that was launched is now displayed on screen
  4. And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}} {"jsonrpc":"2.0","id":3,"result":[{"appId":"YouTube","appInstanceId":"df7d1734-c10e-4683-8d6b-400221525e79","activeSessionId":"","type":"INTERACTIVE_APP","targetLifecycleState":"APP_STATE_ACTIVE","lifecycleState":"APP_STATE_ACTIVE"},{"appId":"uktv","appInstanceId":"0968657b-1535-44e4-b48d-05be4de862e9","activeSessionId":"","type":"INTERACTIVE_APP","targetLifecycleState":"APP_STATE_ACTIVE","lifecycleState":"APP_STATE_ACTIVE"}]}
  5. And I send a setVisible call with the "client" param populated with the appInstanceId (from getLoadedApps response) of the 2nd launched app and the "visible" param set to false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setVisible", "params":{"client": "0968657b-1535-44e4-b48d-05be4de862e9", "visible":false}}
  6. And I validate that a successful response is returned
  7. And I validate that the 2nd launched app is no longer displayed on screen
  8. And I send a setVisible call with the "client" param populated with the appInstanceId (from getLoadedApps response) of the 1st launched app and the "visible" param set to true {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setVisible", "params":{"client": "df7d1734-c10e-4683-8d6b-400221525e79", "visible":true}}
  9. And I validate that a successful response is returned
  10. And i validate that the 1st launched app is now displayed on screen

onConnected

onConnected - Triggered when an app is connected to display

Steps

  1. Given I am using an RDK-E build with RDK App Managers Enabled
  2. When I register for onConnected events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onConnected", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I validate that an onConnected event is emitted with the appInstanceId of the launched app {"jsonrpc":"2.0","method":"client.events.1.onConnected","params":{"appInstanceId":"b1cbfc45-4b91-4a1b-9f96-8bc8452d343c"}}

onDisconnected

onDisconnected - Triggered when an app is disconnected from a display

Steps

  1. Given I am using an RDK-E build with RDK App Managers Enabled
  2. When I register for onDisconnected events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onDisconnected", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait for the app to finish launching
  6. And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "uktv"}}
  7. And I validate that an onDisconnected event is emitted with the appInstanceId of the terminated app {"jsonrpc":"2.0","method":"client.events.1.onDisconnected","params":{"client":"cd1df838-97d8-41d6-95ad-713b99897e79"}}

onFocus

onFocus - Sent when the app receives focus

Steps

  1. Given I am using an RDK-E build with RDK App Managers
  2. When I register for onFocus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onFocus", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  5. And I wait for the app to finish launching
  6. And I set focus to the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setFocus", "params":{"client": "39453376-c785-476b-9f5a-c7f87a4d3473"}}
  7. And I validate that an onReady event is emitted {"jsonrpc":"2.0","method":"client.events.1.onFocus","params":{"client":"39453376-c785-476b-9f5a-c7f87a4d3473"}}

onVisible

onVisible - Sent when the app becomes visible

Steps

  1. Give I am using an RDKE build with RDK App Managers enabled
  2. When I register for onVisible events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onVisible", "id": "client.events.1"}}
  3. And I launch an app
  4. And I send a setVisible call to set the visibility to false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setVisible", "params":{"client": "39453376-c785-476b-9f5a-c7f87a4d3473", "visible":false}}
  5. And I send a setVisible call to set the visibility to true {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setVisible", "params":{"client": "39453376-c785-476b-9f5a-c7f87a4d3473", "visible":true}}
  6. Then I validate an onVisible event is emitted {"jsonrpc":"2.0","method":"client.events.1.onVisible","params":{"client":"39453376-c785-476b-9f5a-c7f87a4d3473"}}

setZOrder

setZOrder - Sets the z-order of an app

Steps

  1. Given I am using an RDK-E build with WindowManagerRDKEMS enabled and activated

  2. When I send a command to Launch APP using curl command Ex- YouTube app, Xumo TV curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc

  3. Then I Validate that a successful response is returned when app launched, Youtube App should launch {"jsonrpc":"2.0","id":3,"result":null}

  4. And run the following curl command to get the order of an app curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST -d '{"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.getZOrder", "params":{"appInstanceId": "9b864a32-badb-4782-87d2-f4de7cf78559"}}' http://127.0.0.1:9998/jsonrpc

  5. And I validate response returned - Returns the z-order of an app

    Current for Order YT : 0 Current for Order Xumo : 1

    {"jsonrpc":"2.0","id":3,"result":1}

  6. And When I send a command to different app using curl command curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "xumo", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc

  7. And I Validate that a successful response is returned - xumo TV app launched /UI displayed {"jsonrpc":"2.0","id":3,"result":null}

  8. And run the following curl command to get the order of an app -getZorder returns the z-order of an app

curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST -d '{"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.getZOrder", "params":{"appInstanceId": "51be92c2-1eda-477d-97dd-64a7ff5ae367"}}' http://127.0.0.1:9998/jsonrpc 9. And I validate that successful response returned

Current for Order YT : 0 Current for Order Xumo : 1 Current for Order uktv : 2

{"jsonrpc":"2.0","id":3,"result":2} 10. And run the following curl command to set the order of an app -It should Set the z-order of an app (YouTube : 4) curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST -d '{"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setZOrder", "params":{"appInstanceId": "6199236e-a089-4c2b-b14a-fe0f7551bb33", "zOrder":4}}' http://127.0.0.1:9998/jsonrpc 11. And I validate that successful response returned - Returns the z-order of an app of YouTube as 4

{"jsonrpc":"2.0","id":3,"result":4} Current Order of YouTube: 4

getZOrder

getZOrder - Returns the z-order of an app

Steps

  1. Given I am using an RDK-E build with WindowManagerRDKEMS enabled and activated

  2. When I send a command to Launch APP using curl command Ex- YouTube app, Xumo TV curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc

  3. Then I Validate that a successful response is returned when app launched, Youtube App should launch {"jsonrpc":"2.0","id":3,"result":null}

  4. And run the following curl command to get the order of an app curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST -d '{"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.getZOrder", "params":{"appInstanceId": "9b864a32-badb-4782-87d2-f4de7cf78559"}}' http://127.0.0.1:9998/jsonrpc

  5. And I validate response returned - Returns the z-order of an app

    Current for Order YT : 0 Current for Order Xumo : 1

    {"jsonrpc":"2.0","id":3,"result":1}

  6. And When I send a command to different app using curl command curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "xumo", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc

  7. And I Validate that a successful response is returned - xumo TV app launched /UI displayed {"jsonrpc":"2.0","id":3,"result":null}

  8. And run the following curl command to get the order of an app -getZorder returns the z-order of an app

curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST -d '{"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.getZOrder", "params":{"appInstanceId": "51be92c2-1eda-477d-97dd-64a7ff5ae367"}}' http://127.0.0.1:9998/jsonrpc 9. And I validate that successful response returned

Current for Order YT : 0 Current for Order Xumo : 1 Current for Order uktv : 2

{"jsonrpc":"2.0","id":3,"result":2}

setFocus

setFocus - setFocus Successful

Steps

  1. Given I am using an RDK-E build with RDK App Managers enabled
  2. When I register for onFocus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onFocus", "id": "client.events.1"}}
  3. And I launch an app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "intent": "{"action":"launch","context":{"source":"voice"}}", "launchArgs":"{}"}}
  4. And I send a setFocus call to set the focus to the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setFocus", "params":{"client": "02ee671f-d59c-419f-8649-5e857dff3f6c"}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that an onFocus event was emitted {"jsonrpc":"2.0","method":"client.events.1.onFocus","params":{"client":"02ee671f-d59c-419f-8649-5e857dff3f6c"}}

getApps

getApps - Returns a list of app clients connected to the window manager

Steps

  1. Given I am using an RDK-E build with WindowManager enabled and activated
  2. When I send a command to Launch com.entos.flutter_ref_app APP curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "com.entos.flutter_ref_app", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc
  3. Then validate that Application should be launched on screen. You should see com.entos.flutter_ref_app launched on screen
  4. And I send a command to Launch APP using curl command Ex- YouTube app, Xumo TV curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "YouTube", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc
  5. And I Validate that a successful response is returned when app launched {"jsonrpc":"2.0","id":3,"result":null}
  6. And I validate that Application should be launched on screen. You should see YouTube launched on screen
  7. And When I send a command to Launch xumo APP curl -H "Authorization: Bearer WPEFrameworkSecurityUtility | cut -d '"' -f 4" --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "xumo", "intent": "start", "launchArgs":"{}"}}' http://127.0.0.1:9998/jsonrpc
  8. And validate that Application should be launched on screen. You should see xumo launched on screen
  9. And when i send a command to check a list of app clients connected - getApps {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.getApps"}' http://127.0.0.1:9998/jsonrpc
  10. And I validate successful response is returned and should return list of app clients connected to the WM {"jsonrpc":"2.0","id":3,"result":"["500df9ca-d41e-4b1e-882b-d4e23c3a5acf","71ff6406-3201-47b5-83b0-f76b38cb0dcf","4076624b-b23a-4743-9db3-e6b694f15e91"]"}

onHidden

onHidden - Sent when the app becomes hidden

Steps

  1. Give I am using an RDKE build with RDK App Managers enabled
  2. When I register for onHidden events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onHidden", "id": "client.events.1"}}
  3. And I launch an app
  4. And I send a setVisible call to set the visibility to false {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setVisible", "params":{"client": "39453376-c785-476b-9f5a-c7f87a4d3473", "visible":false}}
  5. Then I validate an onHidden event is emitted {"jsonrpc":"2.0","method":"client.events.1.onHidden","params":{"client":"39453376-c785-476b-9f5a-c7f87a4d3473"}}

setInactivityInterval

setInactivityInterval - Set Inactivity Interval to 1 Minute

Steps

  1. Given I am using an RDKE device which has RDK App Managers enabled, and enableInactivityReporting is currently enabled
  2. When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
  3. And I send a setInactivityInterval call to set the inactivity interval to 1 minute {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setInactivityInterval", "params":{"interval":1}}
  4. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  5. And I wait 1 minute
  6. And I validate that an onUserInactivity event is emitted

resetInactivityTime

resetInactivityTime - Reset Inactivity Time

Steps

  1. Given I am using an RDKE device which has RDK App Managers enabled, and enableInactivityReporting is currently enabled
  2. When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
  3. And I send a setInactivityInterval call to set the inactivity interval to 1 minute {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setInactivityInterval", "params":{"interval":1}}
  4. And I wait for 1 minute
  5. Then I validate that an onUserInactivity event is emitted
  6. And I send a resetInactivityTime call {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.resetInactivityTime", "params":{}}
  7. And I wait 1 minute
  8. And I validate that an onUserInactivity event is emitted with the "minutes" value in the event reset {"jsonrpc":"2.0","method":"client.events.1.onUserInactivity","params":{"minutes":1.00039}}

onUserInactivity

onUserInactivity - Event Emitted When Inactivity Interval is Reached

Steps

  1. Given I am using an RDKE device which has RDK App Managers enabled, and enableInactivityReporting is currently enabled
  2. When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
  3. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
  4. And I send a setInactivityInterval call to set the inactivity interval to 1 minute {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setInactivityInterval", "params":{"interval":1}}
  5. And I wait 1 minute
  6. And I validate that an onUserInactivity event is emitted

enableInactivityReporting

enableInactivityReporting - Disable Inactivity Reporting

Steps

  1. Given I am usinig an RDKE device with RDK App Managers enabled, and enableInactivityReporting is currently enabled
  2. When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
  3. And I set the inactivity interval to 1 minute {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setInactivityInterval", "params":{"interval":1}}
  4. And I send a enableInactivityReporting call to disable inactivity reporting {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.enableInactivityReporting", "params":{"enable":false}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I wait for 1 minute
  7. And I validate that an onUserInactivity event is not emitted

enableInactivityReporting - Enable Inactivity Reporting

Steps

  1. Given I am usinig an RDKE device with RDK App Managers enabled, and enableInactivityReporting is currently disabled
  2. When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
  3. And I set the inactivity interval to 1 minute {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setInactivityInterval", "params":{"interval":1}}
  4. And I send a enableInactivityReporting call to enable inactivity reporting {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.enableInactivityReporting", "params":{"enable":true}}
  5. Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
  6. And I wait 1 minute
  7. And I validate that an onUserInactivity event is emitted

StorageManager,StorageManager

createStorage

createStorage - Called When an App is Installed

Steps

  1. Given I am using an RDK-E build with StorageManager enabled and activated
  2. When I download a widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.download","params": {"url": "http://content.gb.services.skyq.sky.com/softcat/widgets/uktv/3502058284/0.8.1.2100/package.wgt"}}
  3. And I install the widget (using the downloadId returned in the download response for the package number in the fileLocator) {"jsonrpc": "2.0","id": 1001, "method": "org.rdk.PackageManagerRDKEMS.install", "params": {"packageId":"uktv", "version":"0.8.1.2100", "additionalMetadata":[{"name":"test1","value":"testValue1"},{"name":"test2","value":"testValue2"}],"fileLocator":"/opt/CDL/package1001"} }
  4. Then I validate using logs in /opt/logs/wpeframework.log that a createStorage call was made 2025-10-01T14:21:35.022Z WPEFramework[3756]: [3771] INFO [StorageManagerImplementation.cpp:113] CreateStorage: Entered CreateStorage Implementation appId: uktv
  5. And I validate that createStorage was successful 2025-10-01T14:21:35.022Z WPEFramework[3756]: [3771] INFO [StorageManagerImplementation.cpp:127] CreateStorage: Storage created successfully for appId: uktv


 

  • No labels