summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/subapps/resources
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/subapps/resources')
-rw-r--r--testing/web-platform/tests/subapps/resources/subapps-helpers.js123
1 files changed, 123 insertions, 0 deletions
diff --git a/testing/web-platform/tests/subapps/resources/subapps-helpers.js b/testing/web-platform/tests/subapps/resources/subapps-helpers.js
new file mode 100644
index 0000000000..38b8d11466
--- /dev/null
+++ b/testing/web-platform/tests/subapps/resources/subapps-helpers.js
@@ -0,0 +1,123 @@
+// This mock provides a way to intercept renderer <-> browser mojo messages for
+// navigator.subApps.* calls eliminating the need for an actual browser.
+//
+// In Chromium-based browsers this implementation is provided by a polyfill
+// in order to reduce the amount of test-only code shipped to users.
+
+'use strict';
+
+let mockSubAppsService = null;
+
+// TODO(crbug.com/1408101): Figure out how to export SubAppsServiceResult (and
+// get rid of this).
+const Status = {
+ SUCCESS: 0,
+ FAILURE: 1,
+};
+
+async function createMockSubAppsService(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value) {
+ if (typeof SubAppsServiceTest === 'undefined') {
+ // Load test-only API helpers.
+ const script = document.createElement('script');
+ script.src = '/resources/test-only-api.js';
+ script.async = false;
+ const p = new Promise((resolve, reject) => {
+ script.onload = () => { resolve(); };
+ script.onerror = e => { reject(e); };
+ })
+ document.head.appendChild(script);
+ await p;
+
+ if (isChromiumBased) {
+ // Chrome setup.
+ await import('/resources/chromium/mock-subapps.js');
+ } else {
+ throw new Error('Unsupported browser.');
+ }
+ }
+ assert_implements(SubAppsServiceTest, 'SubAppsServiceTest is not loaded properly.');
+
+ if (mockSubAppsService === null) {
+ mockSubAppsService = new SubAppsServiceTest();
+ mockSubAppsService.initialize(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value);
+ }
+}
+
+function subapps_test(func, description) {
+ promise_test(async test => {
+ test.add_cleanup(async () => {
+ await mockSubAppsService.reset();
+ mockSubAppsService = null;
+ });
+ await createMockSubAppsService(Status.SUCCESS, [], [], []);
+ await func(test, mockSubAppsService);
+ }, description);
+}
+
+async function subapps_add_expect_reject_with_result(t, add_call_params, mocked_response, expected_results) {
+ t.add_cleanup(async () => {
+ await mockSubAppsService.reset();
+ mockSubAppsService = null;
+ });
+
+ await createMockSubAppsService(Status.FAILURE, mocked_response, [], []);
+ await navigator.subApps.add(add_call_params).then(
+ result => {
+ assert_unreached("Should have rejected: ", result);
+ },
+ error => {
+ for (const app_id in expected_results) {
+ assert_own_property(error, app_id, "Return results are missing entry for subapp.")
+ assert_equals(error[app_id], expected_results[app_id], "Return results are not as expected.")
+ }
+ });
+}
+
+async function subapps_add_expect_success_with_result(t, add_call_params, mocked_response, expected_results) {
+ t.add_cleanup(async () => {
+ await mockSubAppsService.reset();
+ mockSubAppsService = null;
+ });
+
+ await createMockSubAppsService(Status.SUCCESS, mocked_response, [], []);
+ await navigator.subApps.add(add_call_params).then(result => {
+ for (const app_id in expected_results) {
+ assert_own_property(result, app_id, "Return results are missing entry for subapp.")
+ assert_equals(result[app_id], expected_results[app_id], "Return results are not as expected.")
+ }
+ });
+}
+
+async function subapps_remove_expect_reject_with_result(t, remove_call_params, mocked_response, expected_results) {
+ t.add_cleanup(async () => {
+ await mockSubAppsService.reset();
+ mockSubAppsService = null;
+ });
+
+ await createMockSubAppsService(Status.FAILURE, [], [], mocked_response);
+ await navigator.subApps.remove(remove_call_params).then(
+ result => {
+ assert_unreached("Should have rejected: ", result);
+ },
+ error => {
+ for (const app_id in expected_results) {
+ assert_own_property(error, app_id, "Return results are missing entry for subapp.")
+ assert_equals(error[app_id], expected_results[app_id], "Return results are not as expected.")
+ }
+ });
+}
+
+async function subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results) {
+ t.add_cleanup(async () => {
+ await mockSubAppsService.reset();
+ mockSubAppsService = null;
+ });
+
+ await createMockSubAppsService(Status.SUCCESS, [], [], mocked_response);
+ await navigator.subApps.remove(remove_call_params).then(result => {
+ for (const app_id in expected_results) {
+ assert_own_property(result, app_id, "Return results are missing entry for subapp.")
+ assert_equals(result[app_id], expected_results[app_id], "Return results are not as expected.")
+ }
+ });
+}