|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 * http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 "use strict"; |
|
5 |
|
6 const {interfaces: Ci, results: Cr, utils: Cu} = Components; |
|
7 |
|
8 Cu.import("resource://gre/modules/Metrics.jsm"); |
|
9 Cu.import("resource://gre/modules/Services.jsm"); |
|
10 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
11 Cu.import("resource://gre/modules/services/healthreport/providers.jsm"); |
|
12 Cu.import("resource://testing-common/services/healthreport/utils.jsm"); |
|
13 |
|
14 |
|
15 function run_test() { |
|
16 run_next_test(); |
|
17 } |
|
18 |
|
19 add_test(function test_constructor() { |
|
20 let provider = new AppInfoProvider(); |
|
21 |
|
22 run_next_test(); |
|
23 }); |
|
24 |
|
25 add_task(function test_collect_smoketest() { |
|
26 let storage = yield Metrics.Storage("collect_smoketest"); |
|
27 let provider = new AppInfoProvider(); |
|
28 yield provider.init(storage); |
|
29 |
|
30 let now = new Date(); |
|
31 yield provider.collectConstantData(); |
|
32 |
|
33 let m = provider.getMeasurement("appinfo", 2); |
|
34 let data = yield storage.getMeasurementValues(m.id); |
|
35 let serializer = m.serializer(m.SERIALIZE_JSON); |
|
36 let d = serializer.singular(data.singular); |
|
37 |
|
38 do_check_eq(d._v, 2); |
|
39 do_check_eq(d.vendor, "Mozilla"); |
|
40 do_check_eq(d.name, "xpcshell"); |
|
41 do_check_eq(d.id, "xpcshell@tests.mozilla.org"); |
|
42 do_check_eq(d.version, "1"); |
|
43 do_check_eq(d.appBuildID, "20121107"); |
|
44 do_check_eq(d.platformVersion, "p-ver"); |
|
45 do_check_eq(d.platformBuildID, "20121106"); |
|
46 do_check_eq(d.os, "XPCShell"); |
|
47 do_check_eq(d.xpcomabi, "noarch-spidermonkey"); |
|
48 |
|
49 do_check_eq(data.days.size, 1); |
|
50 do_check_true(data.days.hasDay(now)); |
|
51 let day = data.days.getDay(now); |
|
52 do_check_eq(day.size, 3); |
|
53 do_check_true(day.has("isDefaultBrowser")); |
|
54 do_check_true(day.has("isTelemetryEnabled")); |
|
55 do_check_true(day.has("isBlocklistEnabled")); |
|
56 |
|
57 // TODO Bug 827189 Actually test this properly. On some local builds, this |
|
58 // is always -1 (the service throws). On buildbot, it seems to always be 0. |
|
59 do_check_neq(day.get("isDefaultBrowser"), 1); |
|
60 |
|
61 yield provider.shutdown(); |
|
62 yield storage.close(); |
|
63 }); |
|
64 |
|
65 add_task(function test_record_version() { |
|
66 let storage = yield Metrics.Storage("record_version"); |
|
67 |
|
68 let provider = new AppInfoProvider(); |
|
69 let now = new Date(); |
|
70 yield provider.init(storage); |
|
71 |
|
72 // The provider records information on startup. |
|
73 let m = provider.getMeasurement("versions", 2); |
|
74 let data = yield m.getValues(); |
|
75 |
|
76 do_check_true(data.days.hasDay(now)); |
|
77 let day = data.days.getDay(now); |
|
78 do_check_eq(day.size, 4); |
|
79 do_check_true(day.has("appVersion")); |
|
80 do_check_true(day.has("platformVersion")); |
|
81 do_check_true(day.has("appBuildID")); |
|
82 do_check_true(day.has("platformBuildID")); |
|
83 |
|
84 let value = day.get("appVersion"); |
|
85 do_check_true(Array.isArray(value)); |
|
86 do_check_eq(value.length, 1); |
|
87 let ai = getAppInfo(); |
|
88 do_check_eq(value[0], ai.version); |
|
89 |
|
90 value = day.get("platformVersion"); |
|
91 do_check_true(Array.isArray(value)); |
|
92 do_check_eq(value.length, 1); |
|
93 do_check_eq(value[0], ai.platformVersion); |
|
94 |
|
95 value = day.get("appBuildID"); |
|
96 do_check_true(Array.isArray(value)); |
|
97 do_check_eq(value.length, 1); |
|
98 do_check_eq(value[0], ai.appBuildID); |
|
99 |
|
100 value = day.get("platformBuildID"); |
|
101 do_check_true(Array.isArray(value)); |
|
102 do_check_eq(value.length, 1); |
|
103 do_check_eq(value[0], ai.platformBuildID); |
|
104 |
|
105 yield provider.shutdown(); |
|
106 yield storage.close(); |
|
107 }); |
|
108 |
|
109 add_task(function test_record_version_change() { |
|
110 let storage = yield Metrics.Storage("record_version_change"); |
|
111 |
|
112 let provider = new AppInfoProvider(); |
|
113 let now = new Date(); |
|
114 yield provider.init(storage); |
|
115 yield provider.shutdown(); |
|
116 |
|
117 let ai = getAppInfo(); |
|
118 ai.version = "new app version"; |
|
119 ai.platformVersion = "new platform version"; |
|
120 ai.appBuildID = "new app id"; |
|
121 ai.platformBuildID = "new platform id"; |
|
122 updateAppInfo(ai); |
|
123 |
|
124 provider = new AppInfoProvider(); |
|
125 yield provider.init(storage); |
|
126 |
|
127 // There should be 2 records in the versions history. |
|
128 let m = provider.getMeasurement("versions", 2); |
|
129 let data = yield m.getValues(); |
|
130 do_check_true(data.days.hasDay(now)); |
|
131 let day = data.days.getDay(now); |
|
132 |
|
133 let value = day.get("appVersion"); |
|
134 do_check_true(Array.isArray(value)); |
|
135 do_check_eq(value.length, 2); |
|
136 do_check_eq(value[1], "new app version"); |
|
137 |
|
138 value = day.get("platformVersion"); |
|
139 do_check_true(Array.isArray(value)); |
|
140 do_check_eq(value.length, 2); |
|
141 do_check_eq(value[1], "new platform version"); |
|
142 |
|
143 // There should be 2 records in the buildID history. |
|
144 value = day.get("appBuildID"); |
|
145 do_check_true(Array.isArray(value)); |
|
146 do_check_eq(value.length, 2); |
|
147 do_check_eq(value[1], "new app id"); |
|
148 |
|
149 value = day.get("platformBuildID"); |
|
150 do_check_true(Array.isArray(value)); |
|
151 do_check_eq(value.length, 2); |
|
152 do_check_eq(value[1], "new platform id"); |
|
153 |
|
154 yield provider.shutdown(); |
|
155 yield storage.close(); |
|
156 }); |
|
157 |
|
158 add_task(function test_record_telemetry() { |
|
159 let storage = yield Metrics.Storage("record_telemetry"); |
|
160 let provider; |
|
161 |
|
162 let now = new Date(); |
|
163 |
|
164 Services.prefs.setBoolPref("toolkit.telemetry.enabled", true); |
|
165 provider = new AppInfoProvider(); |
|
166 yield provider.init(storage); |
|
167 yield provider.collectConstantData(); |
|
168 |
|
169 let m = provider.getMeasurement("appinfo", 2); |
|
170 let data = yield m.getValues(); |
|
171 let d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); |
|
172 do_check_eq(1, d.isTelemetryEnabled); |
|
173 yield provider.shutdown(); |
|
174 |
|
175 Services.prefs.setBoolPref("toolkit.telemetry.enabled", false); |
|
176 provider = new AppInfoProvider(); |
|
177 yield provider.init(storage); |
|
178 yield provider.collectConstantData(); |
|
179 |
|
180 m = provider.getMeasurement("appinfo", 2); |
|
181 data = yield m.getValues(); |
|
182 d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); |
|
183 do_check_eq(0, d.isTelemetryEnabled); |
|
184 yield provider.shutdown(); |
|
185 |
|
186 yield storage.close(); |
|
187 }); |
|
188 |
|
189 add_task(function test_record_blocklist() { |
|
190 let storage = yield Metrics.Storage("record_blocklist"); |
|
191 |
|
192 let now = new Date(); |
|
193 |
|
194 Services.prefs.setBoolPref("extensions.blocklist.enabled", true); |
|
195 let provider = new AppInfoProvider(); |
|
196 yield provider.init(storage); |
|
197 yield provider.collectConstantData(); |
|
198 |
|
199 let m = provider.getMeasurement("appinfo", 2); |
|
200 let data = yield m.getValues(); |
|
201 let d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); |
|
202 do_check_eq(d.isBlocklistEnabled, 1); |
|
203 yield provider.shutdown(); |
|
204 |
|
205 Services.prefs.setBoolPref("extensions.blocklist.enabled", false); |
|
206 provider = new AppInfoProvider(); |
|
207 yield provider.init(storage); |
|
208 yield provider.collectConstantData(); |
|
209 |
|
210 m = provider.getMeasurement("appinfo", 2); |
|
211 data = yield m.getValues(); |
|
212 d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); |
|
213 do_check_eq(d.isBlocklistEnabled, 0); |
|
214 yield provider.shutdown(); |
|
215 |
|
216 yield storage.close(); |
|
217 }); |
|
218 |
|
219 add_task(function test_record_app_update () { |
|
220 let storage = yield Metrics.Storage("record_update"); |
|
221 |
|
222 Services.prefs.setBoolPref("app.update.enabled", true); |
|
223 Services.prefs.setBoolPref("app.update.auto", true); |
|
224 let provider = new AppInfoProvider(); |
|
225 yield provider.init(storage); |
|
226 let now = new Date(); |
|
227 yield provider.collectDailyData(); |
|
228 |
|
229 let m = provider.getMeasurement("update", 1); |
|
230 let data = yield m.getValues(); |
|
231 let d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); |
|
232 do_check_eq(d.enabled, 1); |
|
233 do_check_eq(d.autoDownload, 1); |
|
234 |
|
235 Services.prefs.setBoolPref("app.update.enabled", false); |
|
236 Services.prefs.setBoolPref("app.update.auto", false); |
|
237 |
|
238 yield provider.collectDailyData(); |
|
239 data = yield m.getValues(); |
|
240 d = yield m.serializer(m.SERIALIZE_JSON).daily(data.days.getDay(now)); |
|
241 do_check_eq(d.enabled, 0); |
|
242 do_check_eq(d.autoDownload, 0); |
|
243 |
|
244 yield provider.shutdown(); |
|
245 yield storage.close(); |
|
246 }); |
|
247 |
|
248 add_task(function test_healthreporter_integration () { |
|
249 let reporter = getHealthReporter("healthreporter_integration"); |
|
250 yield reporter.init(); |
|
251 |
|
252 try { |
|
253 yield reporter._providerManager.registerProviderFromType(AppInfoProvider); |
|
254 yield reporter.collectMeasurements(); |
|
255 |
|
256 let payload = yield reporter.getJSONPayload(true); |
|
257 let days = payload['data']['days']; |
|
258 |
|
259 for (let [day, measurements] in Iterator(days)) { |
|
260 do_check_eq(Object.keys(measurements).length, 3); |
|
261 do_check_true("org.mozilla.appInfo.appinfo" in measurements); |
|
262 do_check_true("org.mozilla.appInfo.update" in measurements); |
|
263 do_check_true("org.mozilla.appInfo.versions" in measurements); |
|
264 } |
|
265 } finally { |
|
266 reporter._shutdown(); |
|
267 } |
|
268 }); |