|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 * http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 "use strict"; |
|
5 |
|
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"); |
|
11 |
|
12 const kMeasurementVersion = 2; |
|
13 |
|
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); |
|
19 |
|
20 return [storage, provider]; |
|
21 }); |
|
22 } |
|
23 |
|
24 function run_test() { |
|
25 run_next_test(); |
|
26 } |
|
27 |
|
28 add_test(function setup() { |
|
29 do_get_profile(); |
|
30 initTestLogging(); |
|
31 |
|
32 Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true); |
|
33 Services.prefs.setBoolPref(PREF_TELEMETRY_ENABLED, true); |
|
34 Services.prefs.setBoolPref(PREF_HEALTHREPORT_ENABLED, true); |
|
35 |
|
36 run_next_test(); |
|
37 }); |
|
38 |
|
39 add_task(function test_constructor() { |
|
40 Experiments.instance(); |
|
41 yield Experiments._mainTask; |
|
42 let provider = new ExperimentsProvider(); |
|
43 }); |
|
44 |
|
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 }); |
|
52 |
|
53 add_task(function* test_collect() { |
|
54 let [storage, provider] = yield getStorageAndProvider("no_active"); |
|
55 |
|
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."); |
|
61 |
|
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()); |
|
66 |
|
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"); |
|
76 |
|
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"); |
|
85 |
|
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 }); |
|
94 |
|
95 values = yield m.getValues(); |
|
96 day = values.days.getDay(now); |
|
97 Assert.equal(day.get("lastActive"), "id2", "Last active ID set by observer."); |
|
98 |
|
99 yield provider.shutdown(); |
|
100 yield storage.close(); |
|
101 }); |
|
102 |
|
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(); |
|
112 |
|
113 let payload = yield reporter.getJSONPayload(true); |
|
114 let today = reporter._formatDate(reporter._policy.now()); |
|
115 |
|
116 Assert.ok(today in payload.data.days, "Day in payload."); |
|
117 let day = payload.data.days[today]; |
|
118 |
|
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 }); |