|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 * http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 "use strict"; |
|
5 |
|
6 const {classes: Cc, interfaces: Ci, utils: Cu} = Components; |
|
7 |
|
8 Cu.import("resource://gre/modules/Promise.jsm"); |
|
9 Cu.import("resource://gre/modules/Metrics.jsm"); |
|
10 Cu.import("resource://testing-common/services/metrics/mocks.jsm"); |
|
11 |
|
12 const PULL_ONLY_TESTING_CATEGORY = "testing-only-pull-only-providers"; |
|
13 |
|
14 function run_test() { |
|
15 let cm = Cc["@mozilla.org/categorymanager;1"] |
|
16 .getService(Ci.nsICategoryManager); |
|
17 cm.addCategoryEntry(PULL_ONLY_TESTING_CATEGORY, "DummyProvider", |
|
18 "resource://testing-common/services/metrics/mocks.jsm", |
|
19 false, true); |
|
20 cm.addCategoryEntry(PULL_ONLY_TESTING_CATEGORY, "DummyConstantProvider", |
|
21 "resource://testing-common/services/metrics/mocks.jsm", |
|
22 false, true); |
|
23 |
|
24 run_next_test(); |
|
25 }; |
|
26 |
|
27 add_task(function test_constructor() { |
|
28 let storage = yield Metrics.Storage("constructor"); |
|
29 let manager = new Metrics.ProviderManager(storage); |
|
30 |
|
31 yield storage.close(); |
|
32 }); |
|
33 |
|
34 add_task(function test_register_provider() { |
|
35 let storage = yield Metrics.Storage("register_provider"); |
|
36 |
|
37 let manager = new Metrics.ProviderManager(storage); |
|
38 let dummy = new DummyProvider(); |
|
39 |
|
40 yield manager.registerProvider(dummy); |
|
41 do_check_eq(manager._providers.size, 1); |
|
42 yield manager.registerProvider(dummy); |
|
43 do_check_eq(manager._providers.size, 1); |
|
44 do_check_eq(manager.getProvider(dummy.name), dummy); |
|
45 |
|
46 let failed = false; |
|
47 try { |
|
48 manager.registerProvider({}); |
|
49 } catch (ex) { |
|
50 do_check_true(ex.message.startsWith("Provider is not valid")); |
|
51 failed = true; |
|
52 } finally { |
|
53 do_check_true(failed); |
|
54 failed = false; |
|
55 } |
|
56 |
|
57 manager.unregisterProvider(dummy.name); |
|
58 do_check_eq(manager._providers.size, 0); |
|
59 do_check_null(manager.getProvider(dummy.name)); |
|
60 |
|
61 yield storage.close(); |
|
62 }); |
|
63 |
|
64 add_task(function test_register_providers_from_category_manager() { |
|
65 const category = "metrics-providers-js-modules"; |
|
66 |
|
67 let cm = Cc["@mozilla.org/categorymanager;1"] |
|
68 .getService(Ci.nsICategoryManager); |
|
69 cm.addCategoryEntry(category, "DummyProvider", |
|
70 "resource://testing-common/services/metrics/mocks.jsm", |
|
71 false, true); |
|
72 |
|
73 let storage = yield Metrics.Storage("register_providers_from_category_manager"); |
|
74 let manager = new Metrics.ProviderManager(storage); |
|
75 try { |
|
76 do_check_eq(manager._providers.size, 0); |
|
77 yield manager.registerProvidersFromCategoryManager(category); |
|
78 do_check_eq(manager._providers.size, 1); |
|
79 } finally { |
|
80 yield storage.close(); |
|
81 } |
|
82 }); |
|
83 |
|
84 add_task(function test_collect_constant_data() { |
|
85 let storage = yield Metrics.Storage("collect_constant_data"); |
|
86 let errorCount = 0; |
|
87 let manager= new Metrics.ProviderManager(storage); |
|
88 manager.onProviderError = function () { errorCount++; } |
|
89 let provider = new DummyProvider(); |
|
90 yield manager.registerProvider(provider); |
|
91 |
|
92 do_check_eq(provider.collectConstantCount, 0); |
|
93 |
|
94 yield manager.collectConstantData(); |
|
95 do_check_eq(provider.collectConstantCount, 1); |
|
96 |
|
97 do_check_true(manager._providers.get("DummyProvider").constantsCollected); |
|
98 |
|
99 yield storage.close(); |
|
100 do_check_eq(errorCount, 0); |
|
101 }); |
|
102 |
|
103 add_task(function test_collect_constant_throws() { |
|
104 let storage = yield Metrics.Storage("collect_constant_throws"); |
|
105 let manager = new Metrics.ProviderManager(storage); |
|
106 let errors = []; |
|
107 manager.onProviderError = function (error) { errors.push(error); }; |
|
108 |
|
109 let provider = new DummyProvider(); |
|
110 provider.throwDuringCollectConstantData = "Fake error during collect"; |
|
111 yield manager.registerProvider(provider); |
|
112 |
|
113 yield manager.collectConstantData(); |
|
114 do_check_eq(errors.length, 1); |
|
115 do_check_true(errors[0].contains(provider.throwDuringCollectConstantData)); |
|
116 |
|
117 yield storage.close(); |
|
118 }); |
|
119 |
|
120 add_task(function test_collect_constant_populate_throws() { |
|
121 let storage = yield Metrics.Storage("collect_constant_populate_throws"); |
|
122 let manager = new Metrics.ProviderManager(storage); |
|
123 let errors = []; |
|
124 manager.onProviderError = function (error) { errors.push(error); }; |
|
125 |
|
126 let provider = new DummyProvider(); |
|
127 provider.throwDuringConstantPopulate = "Fake error during constant populate"; |
|
128 yield manager.registerProvider(provider); |
|
129 |
|
130 yield manager.collectConstantData(); |
|
131 |
|
132 do_check_eq(errors.length, 1); |
|
133 do_check_true(errors[0].contains(provider.throwDuringConstantPopulate)); |
|
134 do_check_false(manager._providers.get(provider.name).constantsCollected); |
|
135 |
|
136 yield storage.close(); |
|
137 }); |
|
138 |
|
139 add_task(function test_collect_constant_onetime() { |
|
140 let storage = yield Metrics.Storage("collect_constant_onetime"); |
|
141 let manager = new Metrics.ProviderManager(storage); |
|
142 let provider = new DummyProvider(); |
|
143 yield manager.registerProvider(provider); |
|
144 |
|
145 yield manager.collectConstantData(); |
|
146 do_check_eq(provider.collectConstantCount, 1); |
|
147 |
|
148 yield manager.collectConstantData(); |
|
149 do_check_eq(provider.collectConstantCount, 1); |
|
150 |
|
151 yield storage.close(); |
|
152 }); |
|
153 |
|
154 add_task(function test_collect_multiple() { |
|
155 let storage = yield Metrics.Storage("collect_multiple"); |
|
156 let manager = new Metrics.ProviderManager(storage); |
|
157 |
|
158 for (let i = 0; i < 10; i++) { |
|
159 yield manager.registerProvider(new DummyProvider("provider" + i)); |
|
160 } |
|
161 |
|
162 do_check_eq(manager._providers.size, 10); |
|
163 |
|
164 yield manager.collectConstantData(); |
|
165 |
|
166 yield storage.close(); |
|
167 }); |
|
168 |
|
169 add_task(function test_collect_daily() { |
|
170 let storage = yield Metrics.Storage("collect_daily"); |
|
171 let manager = new Metrics.ProviderManager(storage); |
|
172 |
|
173 let provider1 = new DummyProvider("DP1"); |
|
174 let provider2 = new DummyProvider("DP2"); |
|
175 |
|
176 yield manager.registerProvider(provider1); |
|
177 yield manager.registerProvider(provider2); |
|
178 |
|
179 yield manager.collectDailyData(); |
|
180 do_check_eq(provider1.collectDailyCount, 1); |
|
181 do_check_eq(provider2.collectDailyCount, 1); |
|
182 |
|
183 yield manager.collectDailyData(); |
|
184 do_check_eq(provider1.collectDailyCount, 2); |
|
185 do_check_eq(provider2.collectDailyCount, 2); |
|
186 |
|
187 yield storage.close(); |
|
188 }); |
|
189 |
|
190 add_task(function test_pull_only_not_initialized() { |
|
191 let storage = yield Metrics.Storage("pull_only_not_initialized"); |
|
192 let manager = new Metrics.ProviderManager(storage); |
|
193 yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); |
|
194 do_check_eq(manager.providers.length, 1); |
|
195 do_check_eq(manager.providers[0].name, "DummyProvider"); |
|
196 yield storage.close(); |
|
197 }); |
|
198 |
|
199 add_task(function test_pull_only_registration() { |
|
200 let storage = yield Metrics.Storage("pull_only_registration"); |
|
201 let manager = new Metrics.ProviderManager(storage); |
|
202 yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); |
|
203 do_check_eq(manager.providers.length, 1); |
|
204 |
|
205 // Simple registration and unregistration. |
|
206 yield manager.ensurePullOnlyProvidersRegistered(); |
|
207 do_check_eq(manager.providers.length, 2); |
|
208 do_check_neq(manager.getProvider("DummyConstantProvider"), null); |
|
209 yield manager.ensurePullOnlyProvidersUnregistered(); |
|
210 do_check_eq(manager.providers.length, 1); |
|
211 do_check_null(manager.getProvider("DummyConstantProvider")); |
|
212 |
|
213 // Multiple calls to register work. |
|
214 yield manager.ensurePullOnlyProvidersRegistered(); |
|
215 do_check_eq(manager.providers.length, 2); |
|
216 yield manager.ensurePullOnlyProvidersRegistered(); |
|
217 do_check_eq(manager.providers.length, 2); |
|
218 |
|
219 // Unregister with 2 requests for registration should not unregister. |
|
220 yield manager.ensurePullOnlyProvidersUnregistered(); |
|
221 do_check_eq(manager.providers.length, 2); |
|
222 |
|
223 // But the 2nd one will. |
|
224 yield manager.ensurePullOnlyProvidersUnregistered(); |
|
225 do_check_eq(manager.providers.length, 1); |
|
226 |
|
227 yield storage.close(); |
|
228 }); |
|
229 |
|
230 add_task(function test_pull_only_register_while_registering() { |
|
231 let storage = yield Metrics.Storage("pull_only_register_will_registering"); |
|
232 let manager = new Metrics.ProviderManager(storage); |
|
233 yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); |
|
234 |
|
235 manager.ensurePullOnlyProvidersRegistered(); |
|
236 manager.ensurePullOnlyProvidersRegistered(); |
|
237 yield manager.ensurePullOnlyProvidersRegistered(); |
|
238 do_check_eq(manager.providers.length, 2); |
|
239 |
|
240 manager.ensurePullOnlyProvidersUnregistered(); |
|
241 manager.ensurePullOnlyProvidersUnregistered(); |
|
242 yield manager.ensurePullOnlyProvidersUnregistered(); |
|
243 do_check_eq(manager.providers.length, 1); |
|
244 |
|
245 yield storage.close(); |
|
246 }); |
|
247 |
|
248 add_task(function test_pull_only_unregister_while_registering() { |
|
249 let storage = yield Metrics.Storage("pull_only_unregister_while_registering"); |
|
250 let manager = new Metrics.ProviderManager(storage); |
|
251 yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); |
|
252 |
|
253 manager.ensurePullOnlyProvidersRegistered(); |
|
254 yield manager.ensurePullOnlyProvidersUnregistered(); |
|
255 do_check_eq(manager.providers.length, 1); |
|
256 |
|
257 yield storage.close(); |
|
258 }); |
|
259 |
|
260 add_task(function test_pull_only_register_while_unregistering() { |
|
261 let storage = yield Metrics.Storage("pull_only_register_while_unregistering"); |
|
262 let manager = new Metrics.ProviderManager(storage); |
|
263 yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); |
|
264 |
|
265 yield manager.ensurePullOnlyProvidersRegistered(); |
|
266 manager.ensurePullOnlyProvidersUnregistered(); |
|
267 yield manager.ensurePullOnlyProvidersRegistered(); |
|
268 do_check_eq(manager.providers.length, 2); |
|
269 |
|
270 yield storage.close(); |
|
271 }); |
|
272 |
|
273 // Re-use database for perf reasons. |
|
274 const REGISTRATION_ERRORS_DB = "registration_errors"; |
|
275 |
|
276 add_task(function test_category_manager_registration_error() { |
|
277 let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); |
|
278 let manager = new Metrics.ProviderManager(storage); |
|
279 |
|
280 let cm = Cc["@mozilla.org/categorymanager;1"] |
|
281 .getService(Ci.nsICategoryManager); |
|
282 cm.addCategoryEntry("registration-errors", "DummyThrowOnInitProvider", |
|
283 "resource://testing-common/services/metrics/mocks.jsm", |
|
284 false, true); |
|
285 |
|
286 let deferred = Promise.defer(); |
|
287 let errorCount = 0; |
|
288 |
|
289 manager.onProviderError = function (msg) { |
|
290 errorCount++; |
|
291 deferred.resolve(msg); |
|
292 }; |
|
293 |
|
294 yield manager.registerProvidersFromCategoryManager("registration-errors"); |
|
295 do_check_eq(manager.providers.length, 0); |
|
296 do_check_eq(errorCount, 1); |
|
297 |
|
298 let msg = yield deferred.promise; |
|
299 do_check_true(msg.contains("Provider error: DummyThrowOnInitProvider: " |
|
300 + "Error registering provider from category manager: " |
|
301 + "Error: Dummy Error")); |
|
302 |
|
303 yield storage.close(); |
|
304 }); |
|
305 |
|
306 add_task(function test_pull_only_registration_error() { |
|
307 let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); |
|
308 let manager = new Metrics.ProviderManager(storage); |
|
309 |
|
310 let deferred = Promise.defer(); |
|
311 let errorCount = 0; |
|
312 |
|
313 manager.onProviderError = function (msg) { |
|
314 errorCount++; |
|
315 deferred.resolve(msg); |
|
316 }; |
|
317 |
|
318 yield manager.registerProviderFromType(DummyPullOnlyThrowsOnInitProvider); |
|
319 do_check_eq(errorCount, 0); |
|
320 |
|
321 yield manager.ensurePullOnlyProvidersRegistered(); |
|
322 do_check_eq(errorCount, 1); |
|
323 |
|
324 let msg = yield deferred.promise; |
|
325 do_check_true(msg.contains("Provider error: DummyPullOnlyThrowsOnInitProvider: " + |
|
326 "Error registering pull-only provider: Error: Dummy Error")); |
|
327 |
|
328 yield storage.close(); |
|
329 }); |
|
330 |
|
331 add_task(function test_error_during_shutdown() { |
|
332 let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); |
|
333 let manager = new Metrics.ProviderManager(storage); |
|
334 |
|
335 let deferred = Promise.defer(); |
|
336 let errorCount = 0; |
|
337 |
|
338 manager.onProviderError = function (msg) { |
|
339 errorCount++; |
|
340 deferred.resolve(msg); |
|
341 }; |
|
342 |
|
343 yield manager.registerProviderFromType(DummyThrowOnShutdownProvider); |
|
344 yield manager.registerProviderFromType(DummyProvider); |
|
345 do_check_eq(errorCount, 0); |
|
346 do_check_eq(manager.providers.length, 1); |
|
347 |
|
348 yield manager.ensurePullOnlyProvidersRegistered(); |
|
349 do_check_eq(errorCount, 0); |
|
350 yield manager.ensurePullOnlyProvidersUnregistered(); |
|
351 do_check_eq(errorCount, 1); |
|
352 let msg = yield deferred.promise; |
|
353 do_check_true(msg.contains("Provider error: DummyThrowOnShutdownProvider: " + |
|
354 "Error when shutting down provider: Error: Dummy shutdown error")); |
|
355 |
|
356 yield storage.close(); |
|
357 }); |