1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/metrics/tests/xpcshell/test_metrics_provider_manager.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,357 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +"use strict"; 1.8 + 1.9 +const {classes: Cc, interfaces: Ci, utils: Cu} = Components; 1.10 + 1.11 +Cu.import("resource://gre/modules/Promise.jsm"); 1.12 +Cu.import("resource://gre/modules/Metrics.jsm"); 1.13 +Cu.import("resource://testing-common/services/metrics/mocks.jsm"); 1.14 + 1.15 +const PULL_ONLY_TESTING_CATEGORY = "testing-only-pull-only-providers"; 1.16 + 1.17 +function run_test() { 1.18 + let cm = Cc["@mozilla.org/categorymanager;1"] 1.19 + .getService(Ci.nsICategoryManager); 1.20 + cm.addCategoryEntry(PULL_ONLY_TESTING_CATEGORY, "DummyProvider", 1.21 + "resource://testing-common/services/metrics/mocks.jsm", 1.22 + false, true); 1.23 + cm.addCategoryEntry(PULL_ONLY_TESTING_CATEGORY, "DummyConstantProvider", 1.24 + "resource://testing-common/services/metrics/mocks.jsm", 1.25 + false, true); 1.26 + 1.27 + run_next_test(); 1.28 +}; 1.29 + 1.30 +add_task(function test_constructor() { 1.31 + let storage = yield Metrics.Storage("constructor"); 1.32 + let manager = new Metrics.ProviderManager(storage); 1.33 + 1.34 + yield storage.close(); 1.35 +}); 1.36 + 1.37 +add_task(function test_register_provider() { 1.38 + let storage = yield Metrics.Storage("register_provider"); 1.39 + 1.40 + let manager = new Metrics.ProviderManager(storage); 1.41 + let dummy = new DummyProvider(); 1.42 + 1.43 + yield manager.registerProvider(dummy); 1.44 + do_check_eq(manager._providers.size, 1); 1.45 + yield manager.registerProvider(dummy); 1.46 + do_check_eq(manager._providers.size, 1); 1.47 + do_check_eq(manager.getProvider(dummy.name), dummy); 1.48 + 1.49 + let failed = false; 1.50 + try { 1.51 + manager.registerProvider({}); 1.52 + } catch (ex) { 1.53 + do_check_true(ex.message.startsWith("Provider is not valid")); 1.54 + failed = true; 1.55 + } finally { 1.56 + do_check_true(failed); 1.57 + failed = false; 1.58 + } 1.59 + 1.60 + manager.unregisterProvider(dummy.name); 1.61 + do_check_eq(manager._providers.size, 0); 1.62 + do_check_null(manager.getProvider(dummy.name)); 1.63 + 1.64 + yield storage.close(); 1.65 +}); 1.66 + 1.67 +add_task(function test_register_providers_from_category_manager() { 1.68 + const category = "metrics-providers-js-modules"; 1.69 + 1.70 + let cm = Cc["@mozilla.org/categorymanager;1"] 1.71 + .getService(Ci.nsICategoryManager); 1.72 + cm.addCategoryEntry(category, "DummyProvider", 1.73 + "resource://testing-common/services/metrics/mocks.jsm", 1.74 + false, true); 1.75 + 1.76 + let storage = yield Metrics.Storage("register_providers_from_category_manager"); 1.77 + let manager = new Metrics.ProviderManager(storage); 1.78 + try { 1.79 + do_check_eq(manager._providers.size, 0); 1.80 + yield manager.registerProvidersFromCategoryManager(category); 1.81 + do_check_eq(manager._providers.size, 1); 1.82 + } finally { 1.83 + yield storage.close(); 1.84 + } 1.85 +}); 1.86 + 1.87 +add_task(function test_collect_constant_data() { 1.88 + let storage = yield Metrics.Storage("collect_constant_data"); 1.89 + let errorCount = 0; 1.90 + let manager= new Metrics.ProviderManager(storage); 1.91 + manager.onProviderError = function () { errorCount++; } 1.92 + let provider = new DummyProvider(); 1.93 + yield manager.registerProvider(provider); 1.94 + 1.95 + do_check_eq(provider.collectConstantCount, 0); 1.96 + 1.97 + yield manager.collectConstantData(); 1.98 + do_check_eq(provider.collectConstantCount, 1); 1.99 + 1.100 + do_check_true(manager._providers.get("DummyProvider").constantsCollected); 1.101 + 1.102 + yield storage.close(); 1.103 + do_check_eq(errorCount, 0); 1.104 +}); 1.105 + 1.106 +add_task(function test_collect_constant_throws() { 1.107 + let storage = yield Metrics.Storage("collect_constant_throws"); 1.108 + let manager = new Metrics.ProviderManager(storage); 1.109 + let errors = []; 1.110 + manager.onProviderError = function (error) { errors.push(error); }; 1.111 + 1.112 + let provider = new DummyProvider(); 1.113 + provider.throwDuringCollectConstantData = "Fake error during collect"; 1.114 + yield manager.registerProvider(provider); 1.115 + 1.116 + yield manager.collectConstantData(); 1.117 + do_check_eq(errors.length, 1); 1.118 + do_check_true(errors[0].contains(provider.throwDuringCollectConstantData)); 1.119 + 1.120 + yield storage.close(); 1.121 +}); 1.122 + 1.123 +add_task(function test_collect_constant_populate_throws() { 1.124 + let storage = yield Metrics.Storage("collect_constant_populate_throws"); 1.125 + let manager = new Metrics.ProviderManager(storage); 1.126 + let errors = []; 1.127 + manager.onProviderError = function (error) { errors.push(error); }; 1.128 + 1.129 + let provider = new DummyProvider(); 1.130 + provider.throwDuringConstantPopulate = "Fake error during constant populate"; 1.131 + yield manager.registerProvider(provider); 1.132 + 1.133 + yield manager.collectConstantData(); 1.134 + 1.135 + do_check_eq(errors.length, 1); 1.136 + do_check_true(errors[0].contains(provider.throwDuringConstantPopulate)); 1.137 + do_check_false(manager._providers.get(provider.name).constantsCollected); 1.138 + 1.139 + yield storage.close(); 1.140 +}); 1.141 + 1.142 +add_task(function test_collect_constant_onetime() { 1.143 + let storage = yield Metrics.Storage("collect_constant_onetime"); 1.144 + let manager = new Metrics.ProviderManager(storage); 1.145 + let provider = new DummyProvider(); 1.146 + yield manager.registerProvider(provider); 1.147 + 1.148 + yield manager.collectConstantData(); 1.149 + do_check_eq(provider.collectConstantCount, 1); 1.150 + 1.151 + yield manager.collectConstantData(); 1.152 + do_check_eq(provider.collectConstantCount, 1); 1.153 + 1.154 + yield storage.close(); 1.155 +}); 1.156 + 1.157 +add_task(function test_collect_multiple() { 1.158 + let storage = yield Metrics.Storage("collect_multiple"); 1.159 + let manager = new Metrics.ProviderManager(storage); 1.160 + 1.161 + for (let i = 0; i < 10; i++) { 1.162 + yield manager.registerProvider(new DummyProvider("provider" + i)); 1.163 + } 1.164 + 1.165 + do_check_eq(manager._providers.size, 10); 1.166 + 1.167 + yield manager.collectConstantData(); 1.168 + 1.169 + yield storage.close(); 1.170 +}); 1.171 + 1.172 +add_task(function test_collect_daily() { 1.173 + let storage = yield Metrics.Storage("collect_daily"); 1.174 + let manager = new Metrics.ProviderManager(storage); 1.175 + 1.176 + let provider1 = new DummyProvider("DP1"); 1.177 + let provider2 = new DummyProvider("DP2"); 1.178 + 1.179 + yield manager.registerProvider(provider1); 1.180 + yield manager.registerProvider(provider2); 1.181 + 1.182 + yield manager.collectDailyData(); 1.183 + do_check_eq(provider1.collectDailyCount, 1); 1.184 + do_check_eq(provider2.collectDailyCount, 1); 1.185 + 1.186 + yield manager.collectDailyData(); 1.187 + do_check_eq(provider1.collectDailyCount, 2); 1.188 + do_check_eq(provider2.collectDailyCount, 2); 1.189 + 1.190 + yield storage.close(); 1.191 +}); 1.192 + 1.193 +add_task(function test_pull_only_not_initialized() { 1.194 + let storage = yield Metrics.Storage("pull_only_not_initialized"); 1.195 + let manager = new Metrics.ProviderManager(storage); 1.196 + yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); 1.197 + do_check_eq(manager.providers.length, 1); 1.198 + do_check_eq(manager.providers[0].name, "DummyProvider"); 1.199 + yield storage.close(); 1.200 +}); 1.201 + 1.202 +add_task(function test_pull_only_registration() { 1.203 + let storage = yield Metrics.Storage("pull_only_registration"); 1.204 + let manager = new Metrics.ProviderManager(storage); 1.205 + yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); 1.206 + do_check_eq(manager.providers.length, 1); 1.207 + 1.208 + // Simple registration and unregistration. 1.209 + yield manager.ensurePullOnlyProvidersRegistered(); 1.210 + do_check_eq(manager.providers.length, 2); 1.211 + do_check_neq(manager.getProvider("DummyConstantProvider"), null); 1.212 + yield manager.ensurePullOnlyProvidersUnregistered(); 1.213 + do_check_eq(manager.providers.length, 1); 1.214 + do_check_null(manager.getProvider("DummyConstantProvider")); 1.215 + 1.216 + // Multiple calls to register work. 1.217 + yield manager.ensurePullOnlyProvidersRegistered(); 1.218 + do_check_eq(manager.providers.length, 2); 1.219 + yield manager.ensurePullOnlyProvidersRegistered(); 1.220 + do_check_eq(manager.providers.length, 2); 1.221 + 1.222 + // Unregister with 2 requests for registration should not unregister. 1.223 + yield manager.ensurePullOnlyProvidersUnregistered(); 1.224 + do_check_eq(manager.providers.length, 2); 1.225 + 1.226 + // But the 2nd one will. 1.227 + yield manager.ensurePullOnlyProvidersUnregistered(); 1.228 + do_check_eq(manager.providers.length, 1); 1.229 + 1.230 + yield storage.close(); 1.231 +}); 1.232 + 1.233 +add_task(function test_pull_only_register_while_registering() { 1.234 + let storage = yield Metrics.Storage("pull_only_register_will_registering"); 1.235 + let manager = new Metrics.ProviderManager(storage); 1.236 + yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); 1.237 + 1.238 + manager.ensurePullOnlyProvidersRegistered(); 1.239 + manager.ensurePullOnlyProvidersRegistered(); 1.240 + yield manager.ensurePullOnlyProvidersRegistered(); 1.241 + do_check_eq(manager.providers.length, 2); 1.242 + 1.243 + manager.ensurePullOnlyProvidersUnregistered(); 1.244 + manager.ensurePullOnlyProvidersUnregistered(); 1.245 + yield manager.ensurePullOnlyProvidersUnregistered(); 1.246 + do_check_eq(manager.providers.length, 1); 1.247 + 1.248 + yield storage.close(); 1.249 +}); 1.250 + 1.251 +add_task(function test_pull_only_unregister_while_registering() { 1.252 + let storage = yield Metrics.Storage("pull_only_unregister_while_registering"); 1.253 + let manager = new Metrics.ProviderManager(storage); 1.254 + yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); 1.255 + 1.256 + manager.ensurePullOnlyProvidersRegistered(); 1.257 + yield manager.ensurePullOnlyProvidersUnregistered(); 1.258 + do_check_eq(manager.providers.length, 1); 1.259 + 1.260 + yield storage.close(); 1.261 +}); 1.262 + 1.263 +add_task(function test_pull_only_register_while_unregistering() { 1.264 + let storage = yield Metrics.Storage("pull_only_register_while_unregistering"); 1.265 + let manager = new Metrics.ProviderManager(storage); 1.266 + yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); 1.267 + 1.268 + yield manager.ensurePullOnlyProvidersRegistered(); 1.269 + manager.ensurePullOnlyProvidersUnregistered(); 1.270 + yield manager.ensurePullOnlyProvidersRegistered(); 1.271 + do_check_eq(manager.providers.length, 2); 1.272 + 1.273 + yield storage.close(); 1.274 +}); 1.275 + 1.276 +// Re-use database for perf reasons. 1.277 +const REGISTRATION_ERRORS_DB = "registration_errors"; 1.278 + 1.279 +add_task(function test_category_manager_registration_error() { 1.280 + let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); 1.281 + let manager = new Metrics.ProviderManager(storage); 1.282 + 1.283 + let cm = Cc["@mozilla.org/categorymanager;1"] 1.284 + .getService(Ci.nsICategoryManager); 1.285 + cm.addCategoryEntry("registration-errors", "DummyThrowOnInitProvider", 1.286 + "resource://testing-common/services/metrics/mocks.jsm", 1.287 + false, true); 1.288 + 1.289 + let deferred = Promise.defer(); 1.290 + let errorCount = 0; 1.291 + 1.292 + manager.onProviderError = function (msg) { 1.293 + errorCount++; 1.294 + deferred.resolve(msg); 1.295 + }; 1.296 + 1.297 + yield manager.registerProvidersFromCategoryManager("registration-errors"); 1.298 + do_check_eq(manager.providers.length, 0); 1.299 + do_check_eq(errorCount, 1); 1.300 + 1.301 + let msg = yield deferred.promise; 1.302 + do_check_true(msg.contains("Provider error: DummyThrowOnInitProvider: " 1.303 + + "Error registering provider from category manager: " 1.304 + + "Error: Dummy Error")); 1.305 + 1.306 + yield storage.close(); 1.307 +}); 1.308 + 1.309 +add_task(function test_pull_only_registration_error() { 1.310 + let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); 1.311 + let manager = new Metrics.ProviderManager(storage); 1.312 + 1.313 + let deferred = Promise.defer(); 1.314 + let errorCount = 0; 1.315 + 1.316 + manager.onProviderError = function (msg) { 1.317 + errorCount++; 1.318 + deferred.resolve(msg); 1.319 + }; 1.320 + 1.321 + yield manager.registerProviderFromType(DummyPullOnlyThrowsOnInitProvider); 1.322 + do_check_eq(errorCount, 0); 1.323 + 1.324 + yield manager.ensurePullOnlyProvidersRegistered(); 1.325 + do_check_eq(errorCount, 1); 1.326 + 1.327 + let msg = yield deferred.promise; 1.328 + do_check_true(msg.contains("Provider error: DummyPullOnlyThrowsOnInitProvider: " + 1.329 + "Error registering pull-only provider: Error: Dummy Error")); 1.330 + 1.331 + yield storage.close(); 1.332 +}); 1.333 + 1.334 +add_task(function test_error_during_shutdown() { 1.335 + let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); 1.336 + let manager = new Metrics.ProviderManager(storage); 1.337 + 1.338 + let deferred = Promise.defer(); 1.339 + let errorCount = 0; 1.340 + 1.341 + manager.onProviderError = function (msg) { 1.342 + errorCount++; 1.343 + deferred.resolve(msg); 1.344 + }; 1.345 + 1.346 + yield manager.registerProviderFromType(DummyThrowOnShutdownProvider); 1.347 + yield manager.registerProviderFromType(DummyProvider); 1.348 + do_check_eq(errorCount, 0); 1.349 + do_check_eq(manager.providers.length, 1); 1.350 + 1.351 + yield manager.ensurePullOnlyProvidersRegistered(); 1.352 + do_check_eq(errorCount, 0); 1.353 + yield manager.ensurePullOnlyProvidersUnregistered(); 1.354 + do_check_eq(errorCount, 1); 1.355 + let msg = yield deferred.promise; 1.356 + do_check_true(msg.contains("Provider error: DummyThrowOnShutdownProvider: " + 1.357 + "Error when shutting down provider: Error: Dummy shutdown error")); 1.358 + 1.359 + yield storage.close(); 1.360 +});