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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I create an empty file in an app's storage directory touch /opt/persistent/storageManager/YouTube/testFile
- And I send a clearAppData call for the loaded app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAppData", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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
- And I validate that the YouTube storage directory is empty ls /opt/persistent/storageManager/YouTube/
- And I validate that the app remains loaded and displayed on screen
- And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- And I launch the app again
- And I validate that the app successfully launches
clearAppData - Called for App That is Not Loaded
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I create an empty file in an app's storage directory touch /opt/persistent/storageManager/YouTube/testFile
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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
- And I validate that the YouTube storage directory is empty ls /opt/persistent/storageManager/YouTube/
- And I launch the app
- And I validate that the app successfully launches
clearAppData - No appId Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a clearAppData call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAppData", "params":{}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- When I call isInstalled without an appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.isInstalled", "params":{}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that the result in the response is false {"jsonrpc":"2.0","id":3,"result":false}
isInstalled - Called for Installed App
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that the result in the response is true {"jsonrpc":"2.0","id":3,"result":true}
isInstalled - Called for Uninstalled App
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I uninstall an app that is currently installed {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"xumo"} }
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that no app is launched
launchApp - No launchArgs Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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"}}"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for the app to finish launching
- And I validate that the app is successfully launched on screen
launchApp - No appId Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that no app is launched
launchApp - No intent Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a launchApp call with no intent {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for the app to finish launching
- And I validate that the app is successfully launched on screen
launchApp - Called Without intent or launchArgs
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a launchApp call without intent or launchArgs params {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.launchApp", "params":{"appId": "uktv"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for the app to finish launching
- And I validate that the app is successfully launched on screen
launchApp - Called for Installed App
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for the app to finish launching
- And I validate that the app is successfully launched on screen
launchApp - Called for Suspended App
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
- And I preload an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
- And I wait for the app to transition to suspended state
- And I remove the AI2.0Suspendable file from /tmp rm /tmp/AI2.0Suspendable
- 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":"{}"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for the app to finish launching
- And I validate that the app is successfully launched on screen
launchApp - Called for Uninstalled App
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I uninstall an app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"xumo"} }
- 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":"{}"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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":"{}"}}
- And I wait for the app to launch
- 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
- And I close the recently launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- And I wait for the app to transition to hibernated state
- And I remove the AI2.0Suspendable and AI2.0Hibernatable files from /tmp rm /tmp/AI2.0Suspendable rm /tmp/AI2.0Hibernatable
- 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":"{}"}}
- And I wait for the app to transition to active state
- Then I validate that the app successfully launches and is displayed on screen
preloadApp
preloadApp - appId of Type Other Than String
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that an app is not loaded
preloadApp - No appId Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a preloadApp call without an appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"launchArgs":"{}"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that no app is loaded
preloadApp - launchArgs of Type Other Than String
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that no app is loaded
preloadApp - No launchArgs Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a preloadApp call with no launchArgs param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for the app to finish preloading
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for the app to finish preloading
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I uninstall an app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"xumo"} }
- And I preload an uninstalled app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a terminateApp call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that the app is not terminated
terminateApp - appId of Type Other Than String
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- 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}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that the app is not terminated
terminateApp - Called for App That is Not Loaded
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a terminateApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "uktv"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a terminateApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is no longer displayed on screen
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I create an empty AI2.0Suspendable file to /tmp to force app closures to go to suspended state touch /tmp/AI2.0Suspendable
- 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":"{}"}}
- And I wait for the app to transition to SUSPENDED state
- And I remove the empty AI2.0Suspendable file from /tmp rm /tmp/AI2.0Suspendable
- And I send a terminateApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is unloaded
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- 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
- And I send a closeApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- And I wait for the app to transition to hibernated state
- And I send a terminateApp call for the hibernated app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a startSystemApp call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.startSystemApp", "params":{}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that no app is launched
startSystemApp - Called for Valid App
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I call startSystemApp for an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.startSystemApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for the app to finish launching
- And I validate that the app is successfully launched on screen
startSystemApp - appId of Type Other Than String
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that the app is not launched
sendIntent
sendIntent - Called for App Not in Active State
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish loading
- 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"}}"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that no onAppLifecycleStateChanged event is emitted to Ripple
sendIntent - Called for App in Active State
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- 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"}}"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a setAppProperty call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
- Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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"}}
- And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"testProperty"}
setAppProperty - value of Type Boolean
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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}}
- Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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"}}
- And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"true"}
setAppProperty - value of Type Number
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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}}
- Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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"}}
- And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"33"}
setAppProperty - No value Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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"}}
- Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
setAppProperty - No key Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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"}}
- Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
setAppProperty - value of Type String
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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"}}
- Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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"}}
- And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"testProperty"}
setAppProperty - value of Type Object
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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"}}}
- Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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"}}
- Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
setAppProperty - No appId Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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"}}
- Then I validate an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
getAppProperty
getAppProperty - Property Returned Successfully
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a setAppProperty call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
- Then I validate a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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"}}
- And I validate that the correct value is returned {"jsonrpc":"2.0","id":3,"result":"testProperty"}
getAppProperty - No appId Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a getAppProperty call with no appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"key": "test1"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a setAppProperty call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
- 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}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a setAppProperty call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.setAppProperty", "params":{"appId": "YouTube", "key": "test1", "value": "testProperty"}}
- 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"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
getAppProperty - No key Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a getAppProperty call with no key param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getAppProperty", "params":{"appId": "YouTube"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and an app is installed
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"uktv"}}
- Then I validate that an onAppUninstalled event is emitted
onAppUninstalled - App Uninstall Failed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and an app is installed
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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"}}
- Then I validate that an onAppUninstalled event is not emitted
onAppUnloaded
onAppUnloaded - App Closed with killApp
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a killApp call to close the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "YouTube"}}
- 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"}}
- And I validate that the event contains an appId and appInstanceId
onAppUnloaded - App Closed With terminateApp
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a terminateApp call to close the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- 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"}}
- And I validate that the event contains an appId and appInstanceId
killApp
killApp - No appId Passed
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a killApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that the app is not killed
killApp - appId of Type Other Than String
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- 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}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that the app is not killed
killApp - Called for a Suspended App
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I create an empty AI2.0Suspendable file to /tmp to force app launches to go to suspended state touch /tmp/AI2.0Suspendable
- 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":"{}"}}
- And I wait for the app to transition to SUSPENDED state
- And I remove the empty AI2.0Suspendable file from /tmp rm /tmp/AI2.0Suspendable
- And I send a killApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is unloaded
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a killApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is no longer displayed on screen
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a killApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "uktv"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- 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
- And I send a closeApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- And I wait for the app to transition to hibernated state
- And I send a killApp call for the hibernated app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- Then I validate that an onAppInstalled event is emitted
onAppInstalled - App Install Failed
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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"}}
- Then I validate that an onAppInstalled event is not emitted
onAppLifecycleStateChanged
onAppLifecycleStateChanged - App Launched to Suspend
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- And I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
- And I preload an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
- 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"}}
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- 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"}}
- 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"}}
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait until the app is finished launching
- And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
- And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait until the app is finished launching
- And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
- And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
- And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- 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"}}
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait until the app is finished launching
- And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a closeApp call without an appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that the loaded app is not closed
closeApp - appId of Type Other Than String
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- 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}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I validate that the app is not closed
closeApp - Called for Suspendable App
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I create an empty AI2.0Suspendable file to /tmp to force app closures to go to suspended state touch /tmp/AI2.0Suspendable
- And I send a closeApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is no longer displayed on screen
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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}]"}
- And I validate that the targetLifecycleState and lifecycleState are both 7
closeApp - Called for Hibernateable App
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- 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
- And I send a closeApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is no longer displayed on screen
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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}]"}
- And I validate that the targetLifecycleState and lifecycleState are both 8
closeApp - Called for App That is in Paused State
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I launch an installed app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "uktv", "launchArgs":"{}"}}
- And I wait for the app to finish preloading
- And I send a closeApp call for the preloaded app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app remains in the Paused state
closeApp - Called for Non-Suspendable App
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app transitions to the Paused state
closeApp - Called for App That is Not Loaded
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{ }}
clearAllAppData
clearAllAppData - Called for App That is Not Loaded
Steps
- Given I am using an RDKE device with RDK App Managers enabled and no apps are currently loaded
- When I create an empty file in an app's storage directory touch /opt/persistent/storageManager/YouTube/testFile
- And I send a clearAllAppData call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAllAppData", "params":{}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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
- And I validate that the YouTube storage directory is empty ls /opt/persistent/storageManager/YouTube/
- And I launch YouTube
- And I validate that the app successfully launches
clearAllAppData - Called While App is Loaded
Steps
- Given I am using an RDKE device with RDK App Managers enabled and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I create an empty file in an app's storage directory touch /opt/persistent/storageManager/YouTube/testFile
- And I send a clearAllAppData call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.clearAllAppData", "params":{}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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
- And I validate that the YouTube storage directory is empty ls /opt/persistent/storageManager/YouTube/
- And I validate that the app remains loaded and displayed on screen
- And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- And I launch the app again
- And I validate that the app successfully launches
Integration
AppManager Call PackageManager.lock After App Launch
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- 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":"{}"}}
- 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
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- And I wait for the app to be closed
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a killApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.killApp", "params":{"appId": "uktv"}}
- And I wait for the app to be killed
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a terminateApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "uktv"}}
- And I wait for the app to be closed
- 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
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- When I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- Then I validate that the result is an empty array {"jsonrpc":"2.0","id":3,"result":"[]"}
getLoadedApps - App Loaded in Suspended State
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
- And I preload an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "YouTube", "launchArgs":"{}"}}
- And I wait for the app to transition to suspended state
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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}]"}
- And I validate that the app object includes appId, type, lifecycleState, targetLifecycleState, activeSessionId, appInstanceId
- And I validate that targetLifecycleState and lifecycleState value is 7
- And I remove the AI2.0Suspendable and AI2.0Hibernatable files rm /tmp/AI2.0Suspendable
getLoadedApps - App Loaded in Active State
Steps
- Given I am using an RDKE device with RDK App Managers enabled, and no apps are currently loaded
- 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":"{}"}}
- And I wait for the app to launch
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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}]"}
- And I validate that the app object includes appId, type, lifecycleState, targetLifecycleState, activeSessionId, appInstanceId
- And I validate that targetLifecycleState and lifecycleState value is 6
getLoadedApps - App Loaded in Hibernated State
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- 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":"{}"}}
- And I wait for the app to launch
- 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
- And I close the recently launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- And I wait for the app to transition to hibernated state
- And I send a getLoadedApps call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getLoadedApps", "params":{}}
- 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}]"}
- And I validate that the app object includes appId, type, lifecycleState, targetLifecycleState, activeSessionId, appInstanceId
- And I validate that targetLifecycleState and lifecycleState value is 8
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- When I send a getInstalledApps call to AppManager {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getInstalledApps", "params":{}}
- 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":""}]}
- And I uninstall an app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"xumo"} }
- And I make another getInstalledApps call
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- When I send a getInstalledApps call to AppManager {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.getInstalledApps", "params":{}}
- 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":""}]}
- 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"} }
- And I make another getInstalledApps call
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- When I send a delete call without a fileLocator param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.delete","params": {}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
delete Donwnloaded App
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- And I wait until the download completes
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
Progress Called Without downloadId
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- When I send a progress call without a downloadId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- And I send a progress call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {"downloadId": "1002"}}
- 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}}
- And I wait a few seconds
- And I send another progress call
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- And I send a progress call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {"downloadId": "1002"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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"}}
- And I send a progress call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.progress","params": {"downloadId": "1002"}}
- 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 Called Without packageId Param
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
install Called Without fileLocator Param
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}]}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
install Called Without version Param
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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}}
- Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
install Called With version Param of Type Other Than String
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- Then I result an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- And I modify the widget to remove signature1.xml Or config.xml
- 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"}}
- And I wait until install successfully completes
- Then I validate that a call was made to StorageManager to create storage
install Called with Different Version of Currently Installed Locked App
Steps
- Given I am using an RDKE device and RDK App Managers are enabled
- 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
- When I launch the currently installed YouTube app, causing the app to be locked
- 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"}}
- 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"} }
- Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed (version 100.1.59+hibernate)
install Completed Successfully
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- Then I result a successful response is returned {"jsonrpc":"2.0","id":1001,"result":"NONE"}
StorageManager.createStorage Called After Installing App
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait until install successfully completes
- 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]
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to finish installing
- 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":"{}"}}
- And I wait for the app to finish launching
- And I register for onAppInstallationStatus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.PackageManagerRDKEMS.register", "params": {"event":"onAppInstallationStatus", "id": "client.events.1"}}
- And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"uktv"}}
- Then I validate an error is returned {"jsonrpc":"2.0","id":1002,"error":{"code":1,"message":"ERROR_GENERAL"}}
- 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"}]"}}
- And I validate that the app is still loaded and functions as normal
- And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "uktv"}}
- 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"}]"}}
- 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"} }
- And I validate that the result is UNISTALLED {"jsonrpc":"2.0","id":1002,"result":"UNINSTALLED"}
Uninstall Called With Invalid packageId Param
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- When I send an uninstall call without a packageId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- Then I validate a StorageManager.deleteStorage call is NOT made
StorageManager.deleteStorage Called After Uninstalling App
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to finish installing
- And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to finish installing
- And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- 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"} }
- 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 UnInstalling
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to finish installing
- And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
- 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"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- When I send a packageState call without a verison param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"} }
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
packageState Called Without packageId
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to be installed
- And I send a packageState call {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp", "version": "2.2.7.53"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to finish installing
- And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
- And I wait
- And I send a packageState call {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.packageState", "params": {"packageId":"NetflixApp", "version": "2.2.7.53"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
Lock Called Without packageId
Steps
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
Lock Called Without lockReason
Steps
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- Then I validate that a successful response is returned
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- When I send an unlock call without a version param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.unlock", "params": {"packageId":"YouTube"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1002,"result":null}
Unlock Called For Unlocked App
Steps
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- When I send a getLockedInfo call without a version param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.getLockedInfo", "params": {"packageId":"YouTube"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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}}
- And I validate that the returned locked value is false
getLockedInfo Called For Locked App
Steps
- Given I am using an RDK-E build with AI2.0 plugins enabled and activated
- 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"} }
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate that a response is returned: {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- And the download attempt fails with a 404 error
- And I validate that the download attempt is NOT retried
Download - Download Added to Front of Queue Based on Priority Param
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}} - 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}}}
- Then I validate that the 3rd download is placed in the queue ahead of the 2nd download
- 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}}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate that a response is returned: {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- And the download attempt fails with an http error other than 404
- And I validate that the download attempt is retried 2 times before the download fails
Download - Download Called With No Network Connection
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated and the device is not connected to the internet
- 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"}}
- 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
- 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
- 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"}}
- Then I validate that an error is returned: {"jsonrpc": "2.0","id": 1010,"error": {"code": 1,"message": "ERROR_GENERAL"}}
Download - retries Param Honored
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- Then I validate that a response is returned: {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- And the download attempt fails with an http error other than 404
- And I validate that the download attempt is retried 4 times before the download fails
Download - No priority Param Passed in download call
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
Download - rateLimit Param Not Passed
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate that a successful response is returned
- And I send another download call to download the same widget
- And I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
Download - downloadId Returned in download Response
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- Then I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- And I validate that the rateLimit param is being honored
Download - Download Call Successful
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate that a successful response is returned
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
pause
Pause Called Without downloadId Param
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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": {}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
- 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
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- And send a rateLimit call without the downloadId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"limit": 40000}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- 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}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- And send a rateLimit call without the limit param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.rateLimit","params": {"downloadId": "1005"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- 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"}}
- 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}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
- And I send a resume call to resume the paused download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1005"}}
- And I validate that the rateLimit param is being honored
- And I wait for the download to complete
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}}
- And I note the downloadId returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1005"}}
- 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}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
- And I validate that the rateLimit param is being honored
- And I wait for the download to complete
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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} }
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- When I send a config call without a version param {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.config", "params": {"packageId":"NetflixApp"} }
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
config Successful
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to be installed
- 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"} }
- 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 Installed
Steps
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- 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"}]"}}
- And I wait for the app to finish installing
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to finish installing
- And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
- 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"}]"}}
- And I wait for the app to finish uninstalling
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- And I check the space remaining in /media/apps/sky/packages df -h /media/apps/sky/packages
- 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
- 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"}}
- 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"}]"}}
- And I wait for the app to finish installing
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to be installed
- And I send a listPackages call {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.listPackages","params": {}}
- Then I validate that a successful response is returned and that it includes an array of packages, each containing packageId, version, packageState, digest & sizeKb.
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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"}}
- 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
- 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": {}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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"}}
- 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
- 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}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- And I send a resume call for the in-progress download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1002"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I wait for the in-progress download to complete
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- And I send a resume call for the in-progress download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1002"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
- And I wait for the in-progress download to complete
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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"}}
- 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
- And I send a resume call to resume the paused download {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.resume","params": {"downloadId": "1002"}}
- And I validate that a successul response is returned {"jsonrpc":"2.0","id":1001,"result":null}
- 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
- And I wait for the download to complete
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- When I send cancel without a downloadId param {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.cancel","params": {}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":1001,"error":{"code":1,"message":"ERROR_GENERAL"}}
cancel Paused Download
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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"}}
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1002"}}
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":1001,"result":null}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- And I note the downloadId that is returned in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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
- 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"}}
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- When I send a download call to download the widget {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.getStorageDetails"}
- Then I validate that a successful response is returned
- 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
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- And I check the space remaining in /opt/CDL df -h /opt/CDL | awk 'NR==2 {sub(/[A-Z]$/, "", $4); print int($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
- 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"}}
- Then I validate that an onAppDownloadStatus event is emitted
- 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"}]"}}
- And I remove the test file rm /opt/CDL/PMTest
onAppDownloadStatus Emitted When Download Fails Due to Download Failure
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- 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"}}
- Then I validate that an onAppDownloadStatus event is emitted
- 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"}]"}}
- And I validate that failReason is DOWNLOAD_FAILURE
Register For onAppDownloadStatus Events
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate I get a successful response {"jsonrpc":"2.0","id":3,"result":0}
onAppDownloadStatus Emitted When Download Succeeds
Steps
- Given I am using an RDK-E build with PackageManagerRDKEMS enabled and activated
- 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"}}
- 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"}}
- And I wait for the download to complete
- Then I validate that an onAppDownloadStatus event is emitted
- 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
- Given I am using an RDK-E build with RuntimeManagerRDKEMS enabled and activated
- When I set the box to SUSPEND state, create Suspendable file in tmp touch /tmp/AI2.0Suspendable
- Then When we do suspend there is NO UI display. Display should be OFF state
- 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
| 439 | com.sky.as.apps713d8b02-35ff-4579-a03b-a09c2e98822d | paused |
Suspend - Interactive App launched to Suspend (Preload app)
Steps
- Given I am using an RDK-E build with RuntimeManagerRDKEMS enabled and activated
- When I set the box to SUSPEND state, create Suspendable file in tmp touch /tmp/AI2.0Suspendable
- Then When we do suspend there is NO UI display. Display should be OFF state
- 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
| 439 | com.sky.as.apps713d8b02-35ff-4579-a03b-a09c2e98822d | paused |
resume
resume - Resume Suspended Interactive Launched App
Steps
- Given I am using an RDK-E build with RuntimeManagerRDKEMS enabled and activated
- And Make sure that box is in suspended state
- And No UI display. Display should be off state
- 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
- Given I am using an RDK-E build with RuntimeManager enabled and activated
- 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":"{}"}}
- 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
- Given I am using an RDK-E build with RuntimeManager enabled and activated
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a terminateApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- 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
- Given I am using an RDK-E build with RuntimeManager enabled and activated
- And I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
- And I preload an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "YouTube", "launchArgs":"{}"}}
- 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
- Given I am using an RDK-E build with RuntimeManager enabled and activated
- 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":"{}"}}
- 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
- Given I am using an RDK-E build with RuntimeManager enabled and activated
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a terminateApp call for the launched app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- 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
- Given I am using an RDK-E build with RuntimeManager enabled and activated
- 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":"{}"}}
- And I wait until the app is finished launching
- And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
- And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
- And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- 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
- Given I am using an RDK-E build with RuntimeManager enabled and activated
- 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":"{}"}}
- And I wait until the app is finished launching
- And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
- And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
- And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- 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
- Given I am using an RDK-E build with RuntimeManager enabled and activated
- 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":"{}"}}
- And I wait until the app is finished launching
- And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
- And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
- And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- And I remove the 2 recently created empty files rm /tmp/AI2.0Suspendable rm /tmp/AI2.0Hibernatable
- 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":"{}"}}
- 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
- Given I am using an RDK-E build with RDK App Managers enabled
- 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":"{}"}}
- 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
- And I validate that a container is successfully started 2025-11-17T19:19:33.631Z WPEFramework[3650]: [3685] INFO [OCIContainer.h:74] OnContainerStarted: OnContainerStarted
- 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
- Given I am using an RDK-E build with RDK App Managers
- 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":"{}"}}
- And I wait for the app to finish launching
- And I send a terminateApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- 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
- 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
- Given I am using an RDK-E build with RDK App Managers enabled
- 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":"{}"}}
- And I create test files to force the app to hibernate after close touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
- And I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- Then I validate that the container is hibernated 2025-11-17T19:23:33.072Z WPEFramework[3650]: [5914] INFO [DobbyInterface.cpp:441] hibernateContainer: Hibernate container
- 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
- Given I am using an RDK-E build with RDK App Managers enabled
- 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":"{}"}}
- And I create test files to force the app to hibernate after close touch /tmp/AI2.0Suspendable touch /tmp/AI2.0Hibernatable
- And I send a closeApp call {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "YouTube"}}
- And I wait for the app to be hibernated
- And I remove the test files rm /tmp/AI2.0Suspendable rm /tmp/AI2.0Hibernatable
- 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":"{}"}}
- 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
- 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
- Given I am using an RDK-E build with RDK App Managers Enabled
- 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":"{}"}}
- 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
- Given I am using an RDK-E build with RDK App Managers Enabled
- 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":"{}"}}
- And I wait for the app to finish launching
- And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- 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
- Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
- When I send a clear call without an appId param {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clear", "params":{}}
- 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
- Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
- 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"}}
- Then I validate that an error is returned {"jsonrpc":"2.0","id":3,"error":{"code":1,"message":"ERROR_GENERAL"}}
Clear for app
Steps
- Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
- And uktv is currently installed
- When I create an empty file in an app's storage directory touch /opt/persistent/storageManager/uktv/testFile
- And I send a clear call for uktv {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clear", "params":{"appId": "uktv"}}
- Then I validate that the clear call was successful {"jsonrpc":"2.0","id":3,"result":""}
- And I validate that the uktv storage directory is empty ls /opt/persistent/storageManager/uktv/
getStorage
getStorage - Called When an App is Launched
Steps
- Given I am using an RDKE device and StorageManager is activated
- 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":"{}"}}
- Then I validate that getStorage is called 2025-10-01T14:33:50.180Z WPEFramework[3756]: [5883] INFO [StorageManagerImplementation.cpp:137] GetStorage: Entered GetStorage Implementation
- 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
- Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
- And there are at least 2 apps installed
- 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
- 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"]}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":""}
- And I validate that the test file still remains in the uktv storage directory ls /opt/persistent/storageManager/uktv
- 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
- Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
- And there are at least 2 apps installed
- 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
- And I send a clearAll call with uktv in the exemptionAppIds array {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clearAll", "params":{"exemptionAppIds":[]}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":""}
- And I validate that there are no files in the uktv storage directory ls /opt/persistent/storageManager/uktv
- 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
- Given I am using an RDK-E build with StorageManagerRDKEMS enabled and activated
- And there are at least 2 apps installed
- When I send a clearAll call without an exemptionAppIds param {"jsonrpc":"2.0","id":"3","method": "org.rdk.StorageManager.clearAll", "params":{}}
- 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
- Given I am using an RDK-E build with StorageManager enabled and activated
- When I uninstall an app {"jsonrpc": "2.0","id": 1002, "method": "org.rdk.PackageManagerRDKEMS.uninstall", "params": {"packageId":"uktv"} }
- Then I validate that deleteStorage is called 2025-10-01T14:42:35.252Z WPEFramework[3756]: [3770] INFO [StorageManagerImplementation.cpp:160] DeleteStorage: Entered DeleteStorage Implementation
- 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
- 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
createStorage
createStorage - Called When an App is Installed
Steps
- Given I am using an RDK-E build with StorageManager enabled and activated
- 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"}}
- 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"} }
- 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
- 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
PreinstallManager
startPreinstall
startPreinstall - forceInstall false - App not currently installed
Steps
- Given I am using an RDKE device and PreinstallManager is activated
- And no version of YouTube is currently installed
- And a YouTube widget is on the device at location /opt/preinstall/YouTube/package.wgt
- When I send a startPreinstall call with forceInstall: false {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": false}}
- Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed
startPreinstall - forceInstall true - App With Older Version Installed
Steps
- Given I am using an RDKE device and PreinstallManager is activated
- 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
- 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
- When I send a startPreinstall call with forceInstall: true {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": true}}
- 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
- Given I am using an RDKE device and PreinstallManager is activated
- 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
- 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
- When I send a startPreinstall call with forceInstall: true {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": true}}
- 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
- Given I am using an RDKE device and PreinstallManager is activated
- 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
- 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
- When I send a startPreinstall call with forceInstall: false {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": false}}
- 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
- Given I am using an RDKE device and PreinstallManager is activated
- And no version of YouTube is currently installed
- And a YouTube widget is on the device at location /opt/preinstall/YouTube/package.wgt
- When I send a startPreinstall call with forceInstall: true {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": true}}
- Then I validate that the YouTube widget in /opt/preinstall/YouTube is successfully installed
startPreinstall - forceInstall false - App With Newer Version Installed
Steps
- Given I am using an RDKE device and PreinstallManager is activated
- 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
- 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
- When I send a startPreinstall call with forceInstall: false {"jsonrpc":"2.0","id":"3","method": "org.rdk.PreinstallManager.startPreinstall", "params":{"forceInstall": false}}
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- 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"}]"}}
- And I wait for the app to finish installing
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- 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"}}
- And I wait for the app to finish installing
- And I send an uninstall call to uninstall the app {"jsonrpc": "2.0","id": 1001,"method": "org.rdk.PackageManagerRDKEMS.uninstall","params": {"packageId":"NetflixApp"}}
- 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"}]"}}
- And I wait for the app to finish uninstalling
- 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
- Given I am using an RDK-E build which includes PackageManagerRDKEMS & StorageManager and both plugins are activated
- 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"}}
- 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"}}
- And I note the downloadId in the response {"jsonrpc": "2.0","id": 1001,"result": {"downloadid": "1001"}}
- And I check the space remaining in /media/apps/sky/packages df -h /media/apps/sky/packages
- 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
- 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"}}
- 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"}]"}}
- And I wait for the app to finish installing
- 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
- Given I am using an RDKE device with RDK App Managers enabled & activated
- When I send a closeApp call without the appId param {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.closeApp", "params": {"closeReason":"USER_EXIT"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled & activated
- When I send a closeApp call without the closeReason param {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.closeApp", "params": {"appId":"YouTube"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled & activated
- 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":"{}"}}
- And I wait for the app to launch
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is closed
closeApp - Called for Preloaded App
Steps
- Given I am using an RDKE device with RDK App Managers enabled & activated
- 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":"{}"}}
- And I wait for the app to finish preload
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is closed
appReady
appReady - Called for Active App
Steps
- Given I am using an RDKE device with RDK App Managers enabled & activated
- 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":"{}"}}
- And I wait for the app to launch
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled & activated
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled & activated
- When I send an appReady to LifecycleManager without an appId param {"jsonrpc":"2.0","id":"3","method":"org.rdk.LifecycleManager.appReady", "params": {}}
- 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
- 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
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- And I create an empty AI2.0Suspendable file to /tmp to force app launches/preloads to go to suspended state touch /tmp/AI2.0Suspendable
- And I preload an app which is not currently loaded {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.preloadApp", "params":{"appId": "YouTube", "launchArgs":"{}"}}
- 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"}}
- 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"}}
- 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
- 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
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- 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"}}
- 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"}}
- 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"}}
- 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
- 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
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait until the app is finished launching
- And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
- And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- 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"}}
- 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
- 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
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait until the app is finished launching
- And I create an empty AI2.0Suspendable file to /tmp touch /tmp/AI2.0Suspendable
- And I create an empty AI2.0Hibernatable file to /tmp touch /tmp/AI2.0Hibernatable
- And I close the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.closeApp", "params":{"appId": "uktv"}}
- 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"}}
- 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"}}
- 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
- 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
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait until the app is finished launching
- And I terminate the active app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "YouTube"}}
- 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"}}
- 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
- Given I am using an RDKE device with RDK App Managers enabled
- 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":"{}"}}
- 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"}}
- 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}}
- Then I validate that the key is handled by the app
addKeyIntercepts
addKeyIntercepts - Add a Key Intercept With focusOnly=true for Focused App
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I launch an app
- And I focus the launched app
- 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}}
- And I press the key that was specified in the addKeyIntercepts call
- Then I validate that the key is intercepted by the app
addKeyIntercepts - Add a Key Intercept With focusOnly=false for Focused App
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I launch an app
- And I focus the launched app
- 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}}
- And I press the key that was specified in the addKeyIntercepts call
- Then I validate that the key is intercepted by the app
addKeyIntercepts - Add a Key Intercept With focusOnly=true for Unfocused App
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I launch an app but do not set focus to the app
- 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}}
- And I press the key that was specified in the addKeyIntercepts call
- Then I validate that the key is NOT intercepted by the app
addKeyIntercepts - Add a Key Intercept With focusOnly=false for Unfocused App
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I launch an app but do not set focus to the app
- 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}}
- And I press the key that was specified in the addKeyIntercepts call
- Then I validate that the key is intercepted by the app
addKeyIntercepts - Add a key intercept with propagate=true for focused app
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I launch 2 apps
- And I send a setFocus call to set focus to one of the apps
- 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}}
- 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}}
- And I press the key that was sent in the addKeyIntercepts calls
- Then I validate that the keypress is sent to the focused app
- And I validate that the keypress is sent to the unfocused app
addKeyIntercepts - Add a key intercept with propagate=false for focused app
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I launch 2 apps
- And I send a setFocus call to set focus to one of the apps
- 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}}
- 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}}
- And I press the key that was sent in the addKeyIntercepts calls
- Then I validate that the keypress is sent to the focused app
- And I validate that the keypress is NOT sent to the unfocused app
removeKeyIntercepts
removeKeyIntercepts - Key Intercept is Removed
Steps
- Given I am using an RDKE device with RDK App Managers enabled
- When I launch an app but do not set focus to the app
- 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}}
- And I press the key that was specified in the addKeyIntercepts call
- Then I validate that the key is intercepted by the app
- And I send a removeKeyIntercepts call for the unfocused app with the same keyCode
- And I press the key that was specified in the removeKeyIntercepts call
- And I validate that the key is NOT intercepted by the app
renderReady
renderReady - First Frame of App Not Yet Rendered
Steps
- Given I am using an RDK-E build with RDK App Managers enabled
- When I create a AI2.0Suspendable file in /tmp to force app launches to Suspended state touch /tmp/AI2.0Suspendable
- 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":"{}"}}
- 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"}}
- Then I validate that result is false {"jsonrpc":"2.0","id":3,"result":false}
renderReady - First Frame of App Already Rendered
Steps
- Given I am using an RDK-E build with RDK App Managers enabled
- 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":"{}"}}
- And I wait for the app to launch
- And I send a renderReady call {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.renderReady", "params":{"clientId":"cd1df838-97d8-41d6-95ad-713b99897e79"}}
- Then I validate that result is true {"jsonrpc":"2.0","id":3,"result":true}
onReady
onReady - Event Emitted When App is Rendered
Steps
- Given I am using an RDK-E build with RDK App Managers
- When I register for onReady events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onReady", "id": "client.events.1"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait for the app to finish launching
- 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
- Given I am using an RDK-E build with RDK App Managers enabled
- When I launch an app
- And I wait for the app to launch
- 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}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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
- Given I am using an RDK-E build with RDK App Managers enabled
- 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":"{}"}}
- And I wait for the app to finish launching
- Then I validate that the app is displayed on screen
- 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}}
- And I validate that the app is no longer displayed on screen
- And I register for onReady events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onReady", "id": "client.events.1"}}
- 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}}
- And I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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
- Given I am using an RDK-E build with RDK App Managers enabled
- 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":"{}"}}
- And I wait for the app to finish launching
- Then I validate that the app is displayed on screen
- 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}}
- And I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that the app is no longer displayed on screen
onBlur
onBlur - Sent when the app removes focus
Steps
- Given I am using an RDK-E build with RDK App Managers
- When I register for onBlur events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onBlur", "id": "client.events.1"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- And I launch an app 2 apps
- And I wait for the app to finish launching
- 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"}}
- 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"}}
- 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
- Given I am using a device with RDK App Managers enabled
- 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":"{}"}}
- Then I validate that the 2nd app that was launched is now displayed on screen
- 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"}]}
- 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}}
- And I validate that a successful response is returned
- And I validate that the 2nd launched app is no longer displayed on screen
- 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}}
- And I validate that a successful response is returned
- And i validate that the 1st launched app is now displayed on screen
onConnected
onConnected - Triggered when an app is connected to display
Steps
- Given I am using an RDK-E build with RDK App Managers Enabled
- When I register for onConnected events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onConnected", "id": "client.events.1"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- 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
- Given I am using an RDK-E build with RDK App Managers Enabled
- When I register for onDisconnected events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onDisconnected", "id": "client.events.1"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait for the app to finish launching
- And I terminate the app {"jsonrpc":"2.0","id":"3","method": "org.rdk.AppManager.terminateApp", "params":{"appId": "uktv"}}
- 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
- Given I am using an RDK-E build with RDK App Managers
- When I register for onFocus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onFocus", "id": "client.events.1"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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":"{}"}}
- And I wait for the app to finish launching
- 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"}}
- 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
- Give I am using an RDKE build with RDK App Managers enabled
- When I register for onVisible events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onVisible", "id": "client.events.1"}}
- And I launch an app
- 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}}
- 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}}
- 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
Given I am using an RDK-E build with WindowManagerRDKEMS enabled and activated
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
Then I Validate that a successful response is returned when app launched, Youtube App should launch {"jsonrpc":"2.0","id":3,"result":null}
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
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}
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
And I Validate that a successful response is returned - xumo TV app launched /UI displayed {"jsonrpc":"2.0","id":3,"result":null}
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
Given I am using an RDK-E build with WindowManagerRDKEMS enabled and activated
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
Then I Validate that a successful response is returned when app launched, Youtube App should launch {"jsonrpc":"2.0","id":3,"result":null}
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
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}
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
And I Validate that a successful response is returned - xumo TV app launched /UI displayed {"jsonrpc":"2.0","id":3,"result":null}
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
- Given I am using an RDK-E build with RDK App Managers enabled
- When I register for onFocus events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onFocus", "id": "client.events.1"}}
- 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":"{}"}}
- 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"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- 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
- Given I am using an RDK-E build with WindowManager enabled and activated
- 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 - Then validate that Application should be launched on screen. You should see com.entos.flutter_ref_app launched on screen
- 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 - And I Validate that a successful response is returned when app launched {"jsonrpc":"2.0","id":3,"result":null}
- And I validate that Application should be launched on screen. You should see YouTube launched on screen
- 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 - And validate that Application should be launched on screen. You should see xumo launched on screen
- 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
- 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
- Give I am using an RDKE build with RDK App Managers enabled
- When I register for onHidden events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onHidden", "id": "client.events.1"}}
- And I launch an app
- 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}}
- 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
- Given I am using an RDKE device which has RDK App Managers enabled, and enableInactivityReporting is currently enabled
- When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
- 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}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait 1 minute
- And I validate that an onUserInactivity event is emitted
resetInactivityTime
resetInactivityTime - Reset Inactivity Time
Steps
- Given I am using an RDKE device which has RDK App Managers enabled, and enableInactivityReporting is currently enabled
- When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
- 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}}
- And I wait for 1 minute
- Then I validate that an onUserInactivity event is emitted
- And I send a resetInactivityTime call {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.resetInactivityTime", "params":{}}
- And I wait 1 minute
- 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
- Given I am using an RDKE device which has RDK App Managers enabled, and enableInactivityReporting is currently enabled
- When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":0}
- 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}}
- And I wait 1 minute
- And I validate that an onUserInactivity event is emitted
enableInactivityReporting
enableInactivityReporting - Disable Inactivity Reporting
Steps
- Given I am usinig an RDKE device with RDK App Managers enabled, and enableInactivityReporting is currently enabled
- When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
- And I set the inactivity interval to 1 minute {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setInactivityInterval", "params":{"interval":1}}
- And I send a enableInactivityReporting call to disable inactivity reporting {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.enableInactivityReporting", "params":{"enable":false}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait for 1 minute
- And I validate that an onUserInactivity event is not emitted
enableInactivityReporting - Enable Inactivity Reporting
Steps
- Given I am usinig an RDKE device with RDK App Managers enabled, and enableInactivityReporting is currently disabled
- When I register for onUserInactivity events {"jsonrpc":"2.0","id":"3","method":"org.rdk.RDKWindowManager.register", "params": {"event":"onUserInactivity", "id": "client.events.1"}}
- And I set the inactivity interval to 1 minute {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.setInactivityInterval", "params":{"interval":1}}
- And I send a enableInactivityReporting call to enable inactivity reporting {"jsonrpc":"2.0","id":"3","method": "org.rdk.RDKWindowManager.enableInactivityReporting", "params":{"enable":true}}
- Then I validate that a successful response is returned {"jsonrpc":"2.0","id":3,"result":null}
- And I wait 1 minute
- And I validate that an onUserInactivity event is emitted