Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/ */
4 "use strict";
6 Cu.import("resource://gre/modules/Metrics.jsm");
7 Cu.import("resource://gre/modules/Task.jsm");
8 Cu.import("resource:///modules/experiments/Experiments.jsm");
9 Cu.import("resource://testing-common/services/healthreport/utils.jsm");
10 Cu.import("resource://testing-common/services-common/logging.js");
12 const kMeasurementVersion = 2;
14 function getStorageAndProvider(name) {
15 return Task.spawn(function* get() {
16 let storage = yield Metrics.Storage(name);
17 let provider = new ExperimentsProvider();
18 yield provider.init(storage);
20 return [storage, provider];
21 });
22 }
24 function run_test() {
25 run_next_test();
26 }
28 add_test(function setup() {
29 do_get_profile();
30 initTestLogging();
32 Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true);
33 Services.prefs.setBoolPref(PREF_TELEMETRY_ENABLED, true);
34 Services.prefs.setBoolPref(PREF_HEALTHREPORT_ENABLED, true);
36 run_next_test();
37 });
39 add_task(function test_constructor() {
40 Experiments.instance();
41 yield Experiments._mainTask;
42 let provider = new ExperimentsProvider();
43 });
45 add_task(function* test_init() {
46 let storage = yield Metrics.Storage("init");
47 let provider = new ExperimentsProvider();
48 yield provider.init(storage);
49 yield provider.shutdown();
50 yield storage.close();
51 });
53 add_task(function* test_collect() {
54 let [storage, provider] = yield getStorageAndProvider("no_active");
56 // Initial state should not report anything.
57 yield provider.collectDailyData();
58 let m = provider.getMeasurement("info", kMeasurementVersion);
59 let values = yield m.getValues();
60 Assert.equal(values.days.size, 0, "Have no data if no experiments known.");
62 // An old experiment that ended today should be reported.
63 replaceExperiments(provider._experiments, FAKE_EXPERIMENTS_2);
64 let now = new Date(FAKE_EXPERIMENTS_2[0].endDate);
65 defineNow(provider._experiments._policy, now.getTime());
67 yield provider.collectDailyData();
68 values = yield m.getValues();
69 Assert.equal(values.days.size, 1, "Have 1 day of data");
70 Assert.ok(values.days.hasDay(now), "Has day the experiment ended.");
71 let day = values.days.getDay(now);
72 Assert.ok(day.has("lastActive"), "Has lastActive field.");
73 Assert.equal(day.get("lastActive"), "id2", "Last active ID is sane.");
74 Assert.strictEqual(day.get("lastActiveBranch"), undefined,
75 "no branch should be set yet");
77 // Making an experiment active replaces the lastActive value.
78 replaceExperiments(provider._experiments, FAKE_EXPERIMENTS_1);
79 yield provider.collectDailyData();
80 values = yield m.getValues();
81 day = values.days.getDay(now);
82 Assert.equal(day.get("lastActive"), "id1", "Last active ID is the active experiment.");
83 Assert.equal(day.get("lastActiveBranch"), "foo",
84 "Experiment branch should be visible");
86 // And make sure the observer works.
87 replaceExperiments(provider._experiments, FAKE_EXPERIMENTS_2);
88 Services.obs.notifyObservers(null, "experiments-changed", null);
89 // This may not wait long enough. It relies on the SQL insert happening
90 // in the same tick as the observer notification.
91 yield storage.enqueueOperation(function () {
92 return Promise.resolve();
93 });
95 values = yield m.getValues();
96 day = values.days.getDay(now);
97 Assert.equal(day.get("lastActive"), "id2", "Last active ID set by observer.");
99 yield provider.shutdown();
100 yield storage.close();
101 });
103 add_task(function* test_healthreporterJSON() {
104 let reporter = yield getHealthReporter("healthreporterJSON");
105 yield reporter.init();
106 try {
107 yield reporter._providerManager.registerProvider(new ExperimentsProvider());
108 let experiments = Experiments.instance();
109 defineNow(experiments._policy, Date.now());
110 replaceExperiments(experiments, FAKE_EXPERIMENTS_1);
111 yield reporter.collectMeasurements();
113 let payload = yield reporter.getJSONPayload(true);
114 let today = reporter._formatDate(reporter._policy.now());
116 Assert.ok(today in payload.data.days, "Day in payload.");
117 let day = payload.data.days[today];
119 Assert.ok("org.mozilla.experiments.info" in day, "Measurement present.");
120 let m = day["org.mozilla.experiments.info"];
121 Assert.ok("lastActive" in m, "lastActive field present.");
122 Assert.equal(m["lastActive"], "id1", "Last active ID proper.");
123 } finally {
124 reporter._shutdown();
125 }
126 });