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: michael@0: Cu.import("resource:///modules/experiments/Experiments.jsm"); michael@0: michael@0: const FILE_MANIFEST = "experiments.manifest"; michael@0: const SEC_IN_ONE_DAY = 24 * 60 * 60; michael@0: const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000; michael@0: michael@0: let gProfileDir = null; michael@0: let gHttpServer = null; michael@0: let gHttpRoot = null; michael@0: let gReporter = null; michael@0: let gPolicy = null; michael@0: michael@0: michael@0: function ManifestEntry(data) { michael@0: this.id = EXPERIMENT1_ID; michael@0: this.xpiURL = "http://localhost:1/dummy.xpi"; michael@0: this.xpiHash = EXPERIMENT1_XPI_SHA1; michael@0: this.startTime = new Date(2010, 0, 1, 12).getTime() / 1000; michael@0: this.endTime = new Date(9001, 0, 1, 12).getTime() / 1000; michael@0: this.maxActiveSeconds = SEC_IN_ONE_DAY; michael@0: this.appName = ["XPCShell"]; michael@0: this.channel = ["nightly"]; michael@0: michael@0: data = data || {}; michael@0: for (let k of Object.keys(data)) { michael@0: this[k] = data[k]; michael@0: } michael@0: michael@0: if (!this.endTime) { michael@0: this.endTime = this.startTime + 5 * SEC_IN_ONE_DAY; michael@0: } michael@0: } michael@0: michael@0: function applicableFromManifestData(data, policy) { michael@0: let manifestData = new ManifestEntry(data); michael@0: let entry = new Experiments.ExperimentEntry(policy); michael@0: entry.initFromManifestData(manifestData); michael@0: return entry.isApplicable(); michael@0: } 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: createAppInfo(); michael@0: gProfileDir = do_get_profile(); michael@0: gPolicy = new Experiments.Policy(); michael@0: michael@0: gReporter = yield getReporter("json_payload_simple"); michael@0: yield gReporter.collectMeasurements(); michael@0: let payload = yield gReporter.getJSONPayload(true); michael@0: do_register_cleanup(() => gReporter._shutdown()); michael@0: michael@0: patchPolicy(gPolicy, { michael@0: updatechannel: () => "nightly", michael@0: locale: () => "en-US", michael@0: healthReportPayload: () => Promise.resolve(payload), michael@0: random: () => 0.5, michael@0: }); michael@0: michael@0: Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true); michael@0: Services.prefs.setIntPref(PREF_LOGGING_LEVEL, 0); michael@0: Services.prefs.setBoolPref(PREF_LOGGING_DUMP, true); michael@0: michael@0: let experiments = new Experiments.Experiments(); michael@0: }); michael@0: michael@0: function arraysEqual(a, b) { michael@0: if (a.length !== b.length) { michael@0: return false; michael@0: } michael@0: michael@0: for (let i=0; i applicable = value, michael@0: value => { michael@0: applicable = false; michael@0: reason = value; michael@0: } michael@0: ); michael@0: michael@0: Assert.equal(applicable, entry[0], michael@0: "Experiment entry applicability should match for test " michael@0: + i + ": " + JSON.stringify([entry[2], entry[3]])); michael@0: if (!applicable && entry[1]) { michael@0: Assert.equal(reason, entry[1], "Experiment rejection reason should match for test " + i); michael@0: } michael@0: } michael@0: });