browser/experiments/test/xpcshell/test_activate.js

changeset 0
6474c204b198
     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 +});

mercurial