1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/experiments/test/xpcshell/test_activate.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,163 @@ 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://testing-common/httpd.js"); 1.10 +Cu.import("resource:///modules/experiments/Experiments.jsm"); 1.11 + 1.12 +const FILE_MANIFEST = "experiments.manifest"; 1.13 +const SEC_IN_ONE_DAY = 24 * 60 * 60; 1.14 +const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000; 1.15 + 1.16 +let gProfileDir = null; 1.17 +let gHttpServer = null; 1.18 +let gHttpRoot = null; 1.19 +let gReporter = null; 1.20 +let gPolicy = null; 1.21 + 1.22 +function ManifestEntry(data) { 1.23 + this.id = data.id || EXPERIMENT1_ID; 1.24 + this.xpiURL = data.xpiURL || gHttpRoot + EXPERIMENT1_XPI_NAME; 1.25 + this.xpiHash = data.xpiHash || EXPERIMENT1_XPI_SHA1; 1.26 + this.appName = data.appName || ["XPCShell"]; 1.27 + this.channel = data.appName || ["nightly"]; 1.28 + this.startTime = data.startTime || new Date(2010, 0, 1, 12).getTime() / 1000; 1.29 + this.endTime = data.endTime || new Date(9001, 0, 1, 12).getTime() / 1000; 1.30 + this.maxActiveSeconds = data.maxActiveSeconds || 5 * SEC_IN_ONE_DAY; 1.31 +} 1.32 + 1.33 +function run_test() { 1.34 + run_next_test(); 1.35 +} 1.36 + 1.37 +add_task(function* test_setup() { 1.38 + loadAddonManager(); 1.39 + gProfileDir = do_get_profile(); 1.40 + gPolicy = new Experiments.Policy(); 1.41 + 1.42 + gHttpServer = new HttpServer(); 1.43 + gHttpServer.start(-1); 1.44 + let port = gHttpServer.identity.primaryPort; 1.45 + gHttpRoot = "http://localhost:" + port + "/"; 1.46 + gHttpServer.registerDirectory("/", do_get_cwd()); 1.47 + do_register_cleanup(() => gHttpServer.stop(() => {})); 1.48 + 1.49 + gReporter = yield getReporter("json_payload_simple"); 1.50 + yield gReporter.collectMeasurements(); 1.51 + let payload = yield gReporter.getJSONPayload(true); 1.52 + do_register_cleanup(() => gReporter._shutdown()); 1.53 + 1.54 + patchPolicy(gPolicy, { 1.55 + updatechannel: () => "nightly", 1.56 + healthReportPayload: () => Promise.resolve(payload), 1.57 + }); 1.58 + 1.59 + Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true); 1.60 + Services.prefs.setIntPref(PREF_LOGGING_LEVEL, 0); 1.61 + Services.prefs.setBoolPref(PREF_LOGGING_DUMP, true); 1.62 + 1.63 + let experiments = new Experiments.Experiments(); 1.64 +}); 1.65 + 1.66 +function isApplicable(experiment) { 1.67 + let deferred = Promise.defer(); 1.68 + experiment.isApplicable().then( 1.69 + result => deferred.resolve({ applicable: true, reason: null }), 1.70 + reason => deferred.resolve({ applicable: false, reason: reason }) 1.71 + ); 1.72 + 1.73 + return deferred.promise; 1.74 +} 1.75 + 1.76 +add_task(function* test_startStop() { 1.77 + let baseDate = new Date(2014, 5, 1, 12); 1.78 + let startDate = futureDate(baseDate, 30 * MS_IN_ONE_DAY); 1.79 + let endDate = futureDate(baseDate, 60 * MS_IN_ONE_DAY); 1.80 + let manifestData = new ManifestEntry({ 1.81 + startTime: dateToSeconds(startDate), 1.82 + endTime: dateToSeconds(endDate), 1.83 + maxActiveSeconds: 10 * SEC_IN_ONE_DAY, 1.84 + }); 1.85 + let experiment = new Experiments.ExperimentEntry(gPolicy); 1.86 + experiment.initFromManifestData(manifestData); 1.87 + 1.88 + // We need to associate it with the singleton so the onInstallStarted 1.89 + // Addon Manager listener will know about it. 1.90 + Experiments.instance()._experiments = new Map(); 1.91 + Experiments.instance()._experiments.set(experiment.id, experiment); 1.92 + 1.93 + let result; 1.94 + 1.95 + defineNow(gPolicy, baseDate); 1.96 + result = yield isApplicable(experiment); 1.97 + Assert.equal(result.applicable, false, "Experiment should not be applicable."); 1.98 + Assert.equal(experiment.enabled, false, "Experiment should not be enabled."); 1.99 + 1.100 + let addons = yield getExperimentAddons(); 1.101 + Assert.equal(addons.length, 0, "No experiment add-ons are installed."); 1.102 + 1.103 + defineNow(gPolicy, futureDate(startDate, 5 * MS_IN_ONE_DAY)); 1.104 + result = yield isApplicable(experiment); 1.105 + Assert.equal(result.applicable, true, "Experiment should now be applicable."); 1.106 + Assert.equal(experiment.enabled, false, "Experiment should not be enabled."); 1.107 + 1.108 + let changes = yield experiment.start(); 1.109 + Assert.equal(changes, experiment.ADDON_CHANGE_INSTALL, "Add-on was installed."); 1.110 + addons = yield getExperimentAddons(); 1.111 + Assert.equal(experiment.enabled, true, "Experiment should now be enabled."); 1.112 + Assert.equal(addons.length, 1, "1 experiment add-on is installed."); 1.113 + Assert.equal(addons[0].id, experiment._addonId, "The add-on is the one we expect."); 1.114 + Assert.equal(addons[0].userDisabled, false, "The add-on is not userDisabled."); 1.115 + Assert.ok(addons[0].isActive, "The add-on is active."); 1.116 + 1.117 + changes = yield experiment.stop(); 1.118 + Assert.equal(changes, experiment.ADDON_CHANGE_UNINSTALL, "Add-on was uninstalled."); 1.119 + addons = yield getExperimentAddons(); 1.120 + Assert.equal(experiment.enabled, false, "Experiment should not be enabled."); 1.121 + Assert.equal(addons.length, 0, "Experiment should be uninstalled from the Addon Manager."); 1.122 + 1.123 + changes = yield experiment.start(); 1.124 + Assert.equal(changes, experiment.ADDON_CHANGE_INSTALL, "Add-on was installed."); 1.125 + addons = yield getExperimentAddons(); 1.126 + Assert.equal(experiment.enabled, true, "Experiment should now be enabled."); 1.127 + Assert.equal(addons.length, 1, "1 experiment add-on is installed."); 1.128 + Assert.equal(addons[0].id, experiment._addonId, "The add-on is the one we expect."); 1.129 + Assert.equal(addons[0].userDisabled, false, "The add-on is not userDisabled."); 1.130 + Assert.ok(addons[0].isActive, "The add-on is active."); 1.131 + 1.132 + let result = yield experiment.shouldStop(); 1.133 + Assert.equal(result.shouldStop, false, "shouldStop should be false."); 1.134 + Assert.equal(experiment.enabled, true, "Experiment should be enabled."); 1.135 + addons = yield getExperimentAddons(); 1.136 + Assert.equal(addons.length, 1, "Experiment still in add-ons manager."); 1.137 + Assert.ok(addons[0].isActive, "The add-on is still active."); 1.138 + 1.139 + defineNow(gPolicy, futureDate(endDate, MS_IN_ONE_DAY)); 1.140 + result = yield experiment.shouldStop(); 1.141 + Assert.equal(result.shouldStop, true, "shouldStop should now be true."); 1.142 + changes = yield experiment.stop(); 1.143 + Assert.equal(changes, experiment.ADDON_CHANGE_UNINSTALL, "Add-on should be uninstalled."); 1.144 + Assert.equal(experiment.enabled, false, "Experiment should be disabled."); 1.145 + addons = yield getExperimentAddons(); 1.146 + Assert.equal(addons.length, 0, "Experiment add-on is uninstalled."); 1.147 + 1.148 + // Ensure hash validation works. 1.149 + // We set an incorrect hash and expect the install to fail. 1.150 + experiment._manifestData.xpiHash = "sha1:41014dcc66b4dcedcd973491a1530a32f0517d8a"; 1.151 + let errored = false; 1.152 + try { 1.153 + yield experiment.start(); 1.154 + } catch (ex) { 1.155 + errored = true; 1.156 + } 1.157 + Assert.ok(experiment._failedStart, "Experiment failed to start."); 1.158 + Assert.ok(errored, "start() threw an exception."); 1.159 + 1.160 + // Make sure "ignore hashes" mode works. 1.161 + gPolicy.ignoreHashes = true; 1.162 + let changes = yield experiment.start(); 1.163 + Assert.equal(changes, experiment.ADDON_CHANGE_INSTALL); 1.164 + yield experiment.stop(); 1.165 + gPolicy.ignoreHashes = false; 1.166 +});