1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/experiments/test/xpcshell/test_previous_provider.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,180 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +"use strict"; 1.8 + 1.9 +Cu.import("resource://gre/modules/Promise.jsm"); 1.10 +Cu.import("resource:///modules/experiments/Experiments.jsm"); 1.11 +Cu.import("resource://testing-common/httpd.js"); 1.12 + 1.13 +let gDataRoot; 1.14 +let gHttpServer; 1.15 +let gManifestObject; 1.16 + 1.17 +function run_test() { 1.18 + run_next_test(); 1.19 +} 1.20 + 1.21 +add_task(function test_setup() { 1.22 + loadAddonManager(); 1.23 + do_get_profile(); 1.24 + 1.25 + gHttpServer = new HttpServer(); 1.26 + gHttpServer.start(-1); 1.27 + let httpRoot = "http://localhost:" + gHttpServer.identity.primaryPort + "/"; 1.28 + gDataRoot = httpRoot + "data/"; 1.29 + gHttpServer.registerDirectory("/data/", do_get_cwd()); 1.30 + gHttpServer.registerPathHandler("/manifests/handler", (req, res) => { 1.31 + res.setStatusLine(null, 200, "OK"); 1.32 + res.write(JSON.stringify(gManifestObject)); 1.33 + res.processAsync(); 1.34 + res.finish(); 1.35 + }); 1.36 + do_register_cleanup(() => gHttpServer.stop(() => {})); 1.37 + 1.38 + Services.prefs.setBoolPref("experiments.enabled", true); 1.39 + Services.prefs.setCharPref("experiments.manifest.uri", 1.40 + httpRoot + "manifests/handler"); 1.41 + Services.prefs.setBoolPref("experiments.logging.dump", true); 1.42 + Services.prefs.setCharPref("experiments.logging.level", "Trace"); 1.43 + disableCertificateChecks(); 1.44 +}); 1.45 + 1.46 +add_task(function* test_provider_basic() { 1.47 + let e = Experiments.instance(); 1.48 + 1.49 + let provider = new Experiments.PreviousExperimentProvider(e); 1.50 + e._setPreviousExperimentsProvider(provider); 1.51 + 1.52 + let deferred = Promise.defer(); 1.53 + provider.getAddonsByTypes(["experiment"], (addons) => { 1.54 + deferred.resolve(addons); 1.55 + }); 1.56 + let addons = yield deferred.promise; 1.57 + Assert.ok(Array.isArray(addons), "getAddonsByTypes returns an Array."); 1.58 + Assert.equal(addons.length, 0, "No previous add-ons returned."); 1.59 + 1.60 + gManifestObject = { 1.61 + version: 1, 1.62 + experiments: [ 1.63 + { 1.64 + id: EXPERIMENT1_ID, 1.65 + xpiURL: gDataRoot + EXPERIMENT1_XPI_NAME, 1.66 + xpiHash: EXPERIMENT1_XPI_SHA1, 1.67 + startTime: Date.now() / 1000 - 60, 1.68 + endTime: Date.now() / 1000 + 60, 1.69 + maxActiveSeconds: 60, 1.70 + appName: ["XPCShell"], 1.71 + channel: [e._policy.updatechannel()], 1.72 + }, 1.73 + ], 1.74 + }; 1.75 + 1.76 + yield e.updateManifest(); 1.77 + 1.78 + deferred = Promise.defer(); 1.79 + provider.getAddonsByTypes(["experiment"], (addons) => { 1.80 + deferred.resolve(addons); 1.81 + }); 1.82 + addons = yield deferred.promise; 1.83 + Assert.equal(addons.length, 0, "Still no previous experiment."); 1.84 + 1.85 + let experiments = yield e.getExperiments(); 1.86 + Assert.equal(experiments.length, 1, "1 experiment present."); 1.87 + Assert.ok(experiments[0].active, "It is active."); 1.88 + 1.89 + // Deactivate it. 1.90 + defineNow(e._policy, new Date(gManifestObject.experiments[0].endTime * 1000 + 1000)); 1.91 + yield e.updateManifest(); 1.92 + 1.93 + experiments = yield e.getExperiments(); 1.94 + Assert.equal(experiments.length, 1, "1 experiment present."); 1.95 + Assert.equal(experiments[0].active, false, "It isn't active."); 1.96 + 1.97 + deferred = Promise.defer(); 1.98 + provider.getAddonsByTypes(["experiment"], (addons) => { 1.99 + deferred.resolve(addons); 1.100 + }); 1.101 + addons = yield deferred.promise; 1.102 + Assert.equal(addons.length, 1, "1 previous add-on known."); 1.103 + Assert.equal(addons[0].id, EXPERIMENT1_ID, "ID matches expected."); 1.104 + 1.105 + deferred = Promise.defer(); 1.106 + provider.getAddonByID(EXPERIMENT1_ID, (addon) => { 1.107 + deferred.resolve(addon); 1.108 + }); 1.109 + let addon = yield deferred.promise; 1.110 + Assert.ok(addon, "We got an add-on from its ID."); 1.111 + Assert.equal(addon.id, EXPERIMENT1_ID, "ID matches expected."); 1.112 + Assert.ok(addon.appDisabled, "Add-on is a previous experiment."); 1.113 + Assert.ok(addon.userDisabled, "Add-on is disabled."); 1.114 + Assert.equal(addon.type, "experiment", "Add-on is an experiment."); 1.115 + Assert.equal(addon.isActive, false, "Add-on is not active."); 1.116 + Assert.equal(addon.permissions, 0, "Add-on has no permissions."); 1.117 + 1.118 + deferred = Promise.defer(); 1.119 + AddonManager.getAddonsByTypes(["experiment"], (addons) => { 1.120 + deferred.resolve(addons); 1.121 + }); 1.122 + addons = yield deferred.promise; 1.123 + Assert.equal(addons.length, 1, "Got 1 experiment from add-on manager."); 1.124 + Assert.equal(addons[0].id, EXPERIMENT1_ID, "ID matches expected."); 1.125 + Assert.ok(addons[0].appDisabled, "It is a previous experiment add-on."); 1.126 +}); 1.127 + 1.128 +add_task(function* test_active_and_previous() { 1.129 + // Building on the previous test, activate experiment 2. 1.130 + let e = Experiments.instance(); 1.131 + let provider = new Experiments.PreviousExperimentProvider(e); 1.132 + e._setPreviousExperimentsProvider(provider); 1.133 + 1.134 + gManifestObject = { 1.135 + version: 1, 1.136 + experiments: [ 1.137 + { 1.138 + id: EXPERIMENT2_ID, 1.139 + xpiURL: gDataRoot + EXPERIMENT2_XPI_NAME, 1.140 + xpiHash: EXPERIMENT2_XPI_SHA1, 1.141 + startTime: Date.now() / 1000 - 60, 1.142 + endTime: Date.now() / 1000 + 60, 1.143 + maxActiveSeconds: 60, 1.144 + appName: ["XPCShell"], 1.145 + channel: [e._policy.updatechannel()], 1.146 + }, 1.147 + ], 1.148 + }; 1.149 + 1.150 + defineNow(e._policy, new Date()); 1.151 + yield e.updateManifest(); 1.152 + 1.153 + let experiments = yield e.getExperiments(); 1.154 + Assert.equal(experiments.length, 2, "2 experiments known."); 1.155 + 1.156 + let deferred = Promise.defer(); 1.157 + provider.getAddonsByTypes(["experiment"], (addons) => { 1.158 + deferred.resolve(addons); 1.159 + }); 1.160 + let addons = yield deferred.promise; 1.161 + Assert.equal(addons.length, 1, "1 previous experiment."); 1.162 + 1.163 + deferred = Promise.defer(); 1.164 + AddonManager.getAddonsByTypes(["experiment"], (addons) => { 1.165 + deferred.resolve(addons); 1.166 + }); 1.167 + addons = yield deferred.promise; 1.168 + Assert.equal(addons.length, 2, "2 experiment add-ons known."); 1.169 + 1.170 + for (let addon of addons) { 1.171 + if (addon.id == EXPERIMENT1_ID) { 1.172 + Assert.equal(addon.isActive, false, "Add-on is not active."); 1.173 + Assert.ok(addon.appDisabled, "Should be a previous experiment."); 1.174 + } 1.175 + else if (addon.id == EXPERIMENT2_ID) { 1.176 + Assert.ok(addon.isActive, "Add-on is active."); 1.177 + Assert.ok(!addon.appDisabled, "Should not be a previous experiment."); 1.178 + } 1.179 + else { 1.180 + throw new Error("Unexpected add-on ID: " + addon.id); 1.181 + } 1.182 + } 1.183 +});