summaryrefslogtreecommitdiffstats
path: root/browser/experiments/test/xpcshell/test_cacherace.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/experiments/test/xpcshell/test_cacherace.js')
-rw-r--r--browser/experiments/test/xpcshell/test_cacherace.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/browser/experiments/test/xpcshell/test_cacherace.js b/browser/experiments/test/xpcshell/test_cacherace.js
new file mode 100644
index 000000000..ff77cfdc4
--- /dev/null
+++ b/browser/experiments/test/xpcshell/test_cacherace.js
@@ -0,0 +1,102 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+Cu.import("resource://testing-common/httpd.js");
+Cu.import("resource://gre/modules/Timer.jsm");
+
+const MANIFEST_HANDLER = "manifests/handler";
+
+const SEC_IN_ONE_DAY = 24 * 60 * 60;
+const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000;
+
+var gHttpServer = null;
+var gHttpRoot = null;
+var gDataRoot = null;
+var gPolicy = null;
+var gManifestObject = null;
+var gManifestHandlerURI = null;
+
+function run_test() {
+ run_next_test();
+}
+
+add_task(function* test_setup() {
+ loadAddonManager();
+ yield removeCacheFile();
+
+ gHttpServer = new HttpServer();
+ gHttpServer.start(-1);
+ let port = gHttpServer.identity.primaryPort;
+ gHttpRoot = "http://localhost:" + port + "/";
+ gDataRoot = gHttpRoot + "data/";
+ gManifestHandlerURI = gHttpRoot + MANIFEST_HANDLER;
+ gHttpServer.registerDirectory("/data/", do_get_cwd());
+ gHttpServer.registerPathHandler("/" + MANIFEST_HANDLER, (request, response) => {
+ response.setStatusLine(null, 200, "OK");
+ response.write(JSON.stringify(gManifestObject));
+ response.processAsync();
+ response.finish();
+ });
+ do_register_cleanup(() => gHttpServer.stop(() => {}));
+
+ Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true);
+ Services.prefs.setIntPref(PREF_LOGGING_LEVEL, 0);
+ Services.prefs.setBoolPref(PREF_LOGGING_DUMP, true);
+ Services.prefs.setCharPref(PREF_MANIFEST_URI, gManifestHandlerURI);
+ Services.prefs.setIntPref(PREF_FETCHINTERVAL, 0);
+
+ let ExperimentsScope = Cu.import("resource:///modules/experiments/Experiments.jsm");
+ let Experiments = ExperimentsScope.Experiments;
+
+ gPolicy = new Experiments.Policy();
+ patchPolicy(gPolicy, {
+ updatechannel: () => "nightly",
+ delayCacheWrite: (promise) => {
+ return new Promise((resolve, reject) => {
+ promise.then(
+ (result) => { setTimeout(() => resolve(result), 500); },
+ (err) => { reject(err); }
+ );
+ });
+ },
+ });
+
+ let now = new Date(2014, 5, 1, 12);
+ defineNow(gPolicy, now);
+
+ let experimentName = "experiment-racybranch.xpi";
+ let experimentPath = getExperimentPath(experimentName);
+ let experimentHash = "sha1:" + sha1File(experimentPath);
+
+ gManifestObject = {
+ version: 1,
+ experiments: [
+ {
+ id: "test-experiment-racybranch@tests.mozilla.org",
+ xpiURL: gDataRoot + "experiment-racybranch.xpi",
+ xpiHash: experimentHash,
+ maxActiveSeconds: 10 * SEC_IN_ONE_DAY,
+ appName: ["XPCShell"],
+ channel: ["nightly"],
+ startTime: dateToSeconds(futureDate(now, -MS_IN_ONE_DAY)),
+ endTime: dateToSeconds(futureDate(now, MS_IN_ONE_DAY)),
+ },
+ ],
+ };
+
+ do_print("gManifestObject: " + JSON.stringify(gManifestObject));
+
+ // In order for the addon manager to work properly, we hack
+ // Experiments.instance which is used by the XPIProvider
+ let experiments = new Experiments.Experiments(gPolicy);
+ Assert.strictEqual(ExperimentsScope.gExperiments, null);
+ ExperimentsScope.gExperiments = experiments;
+
+ yield experiments.updateManifest();
+ let active = experiments._getActiveExperiment();
+ Assert.ok(active);
+ Assert.equal(active.branch, "racy-set");
+ Assert.ok(!experiments._dirty);
+});