michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: "use strict"; michael@0: michael@0: Cu.import("resource://gre/modules/Promise.jsm"); michael@0: Cu.import("resource:///modules/experiments/Experiments.jsm"); michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: let gDataRoot; michael@0: let gHttpServer; michael@0: let gManifestObject; michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_task(function test_setup() { michael@0: loadAddonManager(); michael@0: do_get_profile(); michael@0: michael@0: gHttpServer = new HttpServer(); michael@0: gHttpServer.start(-1); michael@0: let httpRoot = "http://localhost:" + gHttpServer.identity.primaryPort + "/"; michael@0: gDataRoot = httpRoot + "data/"; michael@0: gHttpServer.registerDirectory("/data/", do_get_cwd()); michael@0: gHttpServer.registerPathHandler("/manifests/handler", (req, res) => { michael@0: res.setStatusLine(null, 200, "OK"); michael@0: res.write(JSON.stringify(gManifestObject)); michael@0: res.processAsync(); michael@0: res.finish(); michael@0: }); michael@0: do_register_cleanup(() => gHttpServer.stop(() => {})); michael@0: michael@0: Services.prefs.setBoolPref("experiments.enabled", true); michael@0: Services.prefs.setCharPref("experiments.manifest.uri", michael@0: httpRoot + "manifests/handler"); michael@0: Services.prefs.setBoolPref("experiments.logging.dump", true); michael@0: Services.prefs.setCharPref("experiments.logging.level", "Trace"); michael@0: disableCertificateChecks(); michael@0: }); michael@0: michael@0: add_task(function* test_provider_basic() { michael@0: let e = Experiments.instance(); michael@0: michael@0: let provider = new Experiments.PreviousExperimentProvider(e); michael@0: e._setPreviousExperimentsProvider(provider); michael@0: michael@0: let deferred = Promise.defer(); michael@0: provider.getAddonsByTypes(["experiment"], (addons) => { michael@0: deferred.resolve(addons); michael@0: }); michael@0: let addons = yield deferred.promise; michael@0: Assert.ok(Array.isArray(addons), "getAddonsByTypes returns an Array."); michael@0: Assert.equal(addons.length, 0, "No previous add-ons returned."); michael@0: michael@0: gManifestObject = { michael@0: version: 1, michael@0: experiments: [ michael@0: { michael@0: id: EXPERIMENT1_ID, michael@0: xpiURL: gDataRoot + EXPERIMENT1_XPI_NAME, michael@0: xpiHash: EXPERIMENT1_XPI_SHA1, michael@0: startTime: Date.now() / 1000 - 60, michael@0: endTime: Date.now() / 1000 + 60, michael@0: maxActiveSeconds: 60, michael@0: appName: ["XPCShell"], michael@0: channel: [e._policy.updatechannel()], michael@0: }, michael@0: ], michael@0: }; michael@0: michael@0: yield e.updateManifest(); michael@0: michael@0: deferred = Promise.defer(); michael@0: provider.getAddonsByTypes(["experiment"], (addons) => { michael@0: deferred.resolve(addons); michael@0: }); michael@0: addons = yield deferred.promise; michael@0: Assert.equal(addons.length, 0, "Still no previous experiment."); michael@0: michael@0: let experiments = yield e.getExperiments(); michael@0: Assert.equal(experiments.length, 1, "1 experiment present."); michael@0: Assert.ok(experiments[0].active, "It is active."); michael@0: michael@0: // Deactivate it. michael@0: defineNow(e._policy, new Date(gManifestObject.experiments[0].endTime * 1000 + 1000)); michael@0: yield e.updateManifest(); michael@0: michael@0: experiments = yield e.getExperiments(); michael@0: Assert.equal(experiments.length, 1, "1 experiment present."); michael@0: Assert.equal(experiments[0].active, false, "It isn't active."); michael@0: michael@0: deferred = Promise.defer(); michael@0: provider.getAddonsByTypes(["experiment"], (addons) => { michael@0: deferred.resolve(addons); michael@0: }); michael@0: addons = yield deferred.promise; michael@0: Assert.equal(addons.length, 1, "1 previous add-on known."); michael@0: Assert.equal(addons[0].id, EXPERIMENT1_ID, "ID matches expected."); michael@0: michael@0: deferred = Promise.defer(); michael@0: provider.getAddonByID(EXPERIMENT1_ID, (addon) => { michael@0: deferred.resolve(addon); michael@0: }); michael@0: let addon = yield deferred.promise; michael@0: Assert.ok(addon, "We got an add-on from its ID."); michael@0: Assert.equal(addon.id, EXPERIMENT1_ID, "ID matches expected."); michael@0: Assert.ok(addon.appDisabled, "Add-on is a previous experiment."); michael@0: Assert.ok(addon.userDisabled, "Add-on is disabled."); michael@0: Assert.equal(addon.type, "experiment", "Add-on is an experiment."); michael@0: Assert.equal(addon.isActive, false, "Add-on is not active."); michael@0: Assert.equal(addon.permissions, 0, "Add-on has no permissions."); michael@0: michael@0: deferred = Promise.defer(); michael@0: AddonManager.getAddonsByTypes(["experiment"], (addons) => { michael@0: deferred.resolve(addons); michael@0: }); michael@0: addons = yield deferred.promise; michael@0: Assert.equal(addons.length, 1, "Got 1 experiment from add-on manager."); michael@0: Assert.equal(addons[0].id, EXPERIMENT1_ID, "ID matches expected."); michael@0: Assert.ok(addons[0].appDisabled, "It is a previous experiment add-on."); michael@0: }); michael@0: michael@0: add_task(function* test_active_and_previous() { michael@0: // Building on the previous test, activate experiment 2. michael@0: let e = Experiments.instance(); michael@0: let provider = new Experiments.PreviousExperimentProvider(e); michael@0: e._setPreviousExperimentsProvider(provider); michael@0: michael@0: gManifestObject = { michael@0: version: 1, michael@0: experiments: [ michael@0: { michael@0: id: EXPERIMENT2_ID, michael@0: xpiURL: gDataRoot + EXPERIMENT2_XPI_NAME, michael@0: xpiHash: EXPERIMENT2_XPI_SHA1, michael@0: startTime: Date.now() / 1000 - 60, michael@0: endTime: Date.now() / 1000 + 60, michael@0: maxActiveSeconds: 60, michael@0: appName: ["XPCShell"], michael@0: channel: [e._policy.updatechannel()], michael@0: }, michael@0: ], michael@0: }; michael@0: michael@0: defineNow(e._policy, new Date()); michael@0: yield e.updateManifest(); michael@0: michael@0: let experiments = yield e.getExperiments(); michael@0: Assert.equal(experiments.length, 2, "2 experiments known."); michael@0: michael@0: let deferred = Promise.defer(); michael@0: provider.getAddonsByTypes(["experiment"], (addons) => { michael@0: deferred.resolve(addons); michael@0: }); michael@0: let addons = yield deferred.promise; michael@0: Assert.equal(addons.length, 1, "1 previous experiment."); michael@0: michael@0: deferred = Promise.defer(); michael@0: AddonManager.getAddonsByTypes(["experiment"], (addons) => { michael@0: deferred.resolve(addons); michael@0: }); michael@0: addons = yield deferred.promise; michael@0: Assert.equal(addons.length, 2, "2 experiment add-ons known."); michael@0: michael@0: for (let addon of addons) { michael@0: if (addon.id == EXPERIMENT1_ID) { michael@0: Assert.equal(addon.isActive, false, "Add-on is not active."); michael@0: Assert.ok(addon.appDisabled, "Should be a previous experiment."); michael@0: } michael@0: else if (addon.id == EXPERIMENT2_ID) { michael@0: Assert.ok(addon.isActive, "Add-on is active."); michael@0: Assert.ok(!addon.appDisabled, "Should not be a previous experiment."); michael@0: } michael@0: else { michael@0: throw new Error("Unexpected add-on ID: " + addon.id); michael@0: } michael@0: } michael@0: });