Bug 1323845: Part 5b - Add tests for bundled experiments APIs. r?aswan draft
authorKris Maglione <maglione.k@gmail.com>
Tue, 09 Jan 2018 17:01:29 -0800
changeset 718303 cee6f35737290fa7270b37d07987679051710d46
parent 718302 3dfb9326d77eabf51697ae1744f884e3a34a0fa5
child 718304 636292fe9bc958fc53321eb62779ca206aa9e73a
push id94869
push usermaglione.k@gmail.com
push dateWed, 10 Jan 2018 01:49:31 +0000
reviewersaswan
bugs1323845
milestone59.0a1
Bug 1323845: Part 5b - Add tests for bundled experiments APIs. r?aswan MozReview-Commit-ID: C0gAmW2QfNr
toolkit/components/extensions/ExtensionTestCommon.jsm
toolkit/components/extensions/test/xpcshell/test_ext_experiments.js
--- a/toolkit/components/extensions/ExtensionTestCommon.jsm
+++ b/toolkit/components/extensions/ExtensionTestCommon.jsm
@@ -378,11 +378,14 @@ this.ExtensionTestCommon = class Extensi
     if (!id) {
       id = uuidGen.generateUUID().number;
     }
 
     return new Extension({
       id,
       resourceURI: jarURI,
       cleanupFile: file,
+      signedState: data.isPrivileged ? AddonManager.SIGNEDSTATE_PRIVILEGED
+                                     : AddonManager.SIGNEDSTATE_SIGNED,
+      temporarilyInstalled: !!data.temporarilyInstalled,
     });
   }
 };
--- a/toolkit/components/extensions/test/xpcshell/test_ext_experiments.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_experiments.js
@@ -182,8 +182,122 @@ add_task(async function test_experiments
   boringAddon.userDisabled = true;
   await new Promise(do_execute_soon);
 
   equal(addon.appDisabled, true, "Add-on should be app-disabled after its dependency is removed.");
 
   addon.uninstall();
   boringAddon.uninstall();
 });
+
+add_task(async function test_bundled_experiments() {
+  let extension = ExtensionTestUtils.loadExtension({
+    isPrivileged: true,
+
+    manifest: {
+      experiment_apis: {
+        foo: {
+          schema: "schema.json",
+          parent: {
+            scopes: ["addon_parent"],
+            script: "parent.js",
+            paths: [["experiments", "foo", "parent"]],
+          },
+          child: {
+            scopes: ["addon_child"],
+            script: "child.js",
+            paths: [["experiments", "foo", "child"]],
+          },
+        },
+      },
+    },
+
+    async background() {
+      browser.test.assertEq("object", typeof browser.experiments,
+                            "typeof browser.experiments");
+
+      browser.test.assertEq("object", typeof browser.experiments.foo,
+                            "typeof browser.experiments.foo");
+
+      browser.test.assertEq("function", typeof browser.experiments.foo.child,
+                            "typeof browser.experiments.foo.child");
+
+      browser.test.assertEq("function", typeof browser.experiments.foo.parent,
+                            "typeof browser.experiments.foo.parent");
+
+      browser.test.assertEq("child", browser.experiments.foo.child(),
+                            "foo.child()");
+
+      browser.test.assertEq("parent", await browser.experiments.foo.parent(),
+                            "await foo.parent()");
+
+      browser.test.notifyPass("background.experiments.foo");
+    },
+
+    files: {
+      "schema.json": JSON.stringify([
+        {
+          "namespace": "experiments.foo",
+          "types": [
+            {
+              "id": "Meh",
+              "type": "object",
+              "properties": {},
+            },
+          ],
+          "functions": [
+            {
+              "name": "parent",
+              "type": "function",
+              "async": true,
+              "parameters": [],
+            },
+            {
+              "name": "child",
+              "type": "function",
+              "parameters": [],
+              "returns": {"type": "string"},
+            },
+          ],
+        },
+      ]),
+
+      /* globals ExtensionAPI */
+      "parent.js": () => {
+        this.foo = class extends ExtensionAPI {
+          getAPI(context) {
+            return {
+              experiments: {
+                foo: {
+                  parent() {
+                    return Promise.resolve("parent");
+                  },
+                },
+              },
+            };
+          }
+        };
+      },
+
+      "child.js": () => {
+        this.foo = class extends ExtensionAPI {
+          getAPI(context) {
+            return {
+              experiments: {
+                foo: {
+                  child() {
+                    return "child";
+                  },
+                },
+              },
+            };
+          }
+        };
+      },
+    },
+  });
+
+  await extension.startup();
+
+  await extension.awaitFinish("background.experiments.foo");
+
+  await extension.unload();
+});