michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: "use strict"; michael@0: michael@0: const {classes: Cc, interfaces: Ci, utils: Cu} = Components; michael@0: michael@0: Cu.import("resource://gre/modules/Promise.jsm"); michael@0: Cu.import("resource://gre/modules/Metrics.jsm"); michael@0: Cu.import("resource://testing-common/services/metrics/mocks.jsm"); michael@0: michael@0: const PULL_ONLY_TESTING_CATEGORY = "testing-only-pull-only-providers"; michael@0: michael@0: function run_test() { michael@0: let cm = Cc["@mozilla.org/categorymanager;1"] michael@0: .getService(Ci.nsICategoryManager); michael@0: cm.addCategoryEntry(PULL_ONLY_TESTING_CATEGORY, "DummyProvider", michael@0: "resource://testing-common/services/metrics/mocks.jsm", michael@0: false, true); michael@0: cm.addCategoryEntry(PULL_ONLY_TESTING_CATEGORY, "DummyConstantProvider", michael@0: "resource://testing-common/services/metrics/mocks.jsm", michael@0: false, true); michael@0: michael@0: run_next_test(); michael@0: }; michael@0: michael@0: add_task(function test_constructor() { michael@0: let storage = yield Metrics.Storage("constructor"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_register_provider() { michael@0: let storage = yield Metrics.Storage("register_provider"); michael@0: michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: let dummy = new DummyProvider(); michael@0: michael@0: yield manager.registerProvider(dummy); michael@0: do_check_eq(manager._providers.size, 1); michael@0: yield manager.registerProvider(dummy); michael@0: do_check_eq(manager._providers.size, 1); michael@0: do_check_eq(manager.getProvider(dummy.name), dummy); michael@0: michael@0: let failed = false; michael@0: try { michael@0: manager.registerProvider({}); michael@0: } catch (ex) { michael@0: do_check_true(ex.message.startsWith("Provider is not valid")); michael@0: failed = true; michael@0: } finally { michael@0: do_check_true(failed); michael@0: failed = false; michael@0: } michael@0: michael@0: manager.unregisterProvider(dummy.name); michael@0: do_check_eq(manager._providers.size, 0); michael@0: do_check_null(manager.getProvider(dummy.name)); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_register_providers_from_category_manager() { michael@0: const category = "metrics-providers-js-modules"; michael@0: michael@0: let cm = Cc["@mozilla.org/categorymanager;1"] michael@0: .getService(Ci.nsICategoryManager); michael@0: cm.addCategoryEntry(category, "DummyProvider", michael@0: "resource://testing-common/services/metrics/mocks.jsm", michael@0: false, true); michael@0: michael@0: let storage = yield Metrics.Storage("register_providers_from_category_manager"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: try { michael@0: do_check_eq(manager._providers.size, 0); michael@0: yield manager.registerProvidersFromCategoryManager(category); michael@0: do_check_eq(manager._providers.size, 1); michael@0: } finally { michael@0: yield storage.close(); michael@0: } michael@0: }); michael@0: michael@0: add_task(function test_collect_constant_data() { michael@0: let storage = yield Metrics.Storage("collect_constant_data"); michael@0: let errorCount = 0; michael@0: let manager= new Metrics.ProviderManager(storage); michael@0: manager.onProviderError = function () { errorCount++; } michael@0: let provider = new DummyProvider(); michael@0: yield manager.registerProvider(provider); michael@0: michael@0: do_check_eq(provider.collectConstantCount, 0); michael@0: michael@0: yield manager.collectConstantData(); michael@0: do_check_eq(provider.collectConstantCount, 1); michael@0: michael@0: do_check_true(manager._providers.get("DummyProvider").constantsCollected); michael@0: michael@0: yield storage.close(); michael@0: do_check_eq(errorCount, 0); michael@0: }); michael@0: michael@0: add_task(function test_collect_constant_throws() { michael@0: let storage = yield Metrics.Storage("collect_constant_throws"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: let errors = []; michael@0: manager.onProviderError = function (error) { errors.push(error); }; michael@0: michael@0: let provider = new DummyProvider(); michael@0: provider.throwDuringCollectConstantData = "Fake error during collect"; michael@0: yield manager.registerProvider(provider); michael@0: michael@0: yield manager.collectConstantData(); michael@0: do_check_eq(errors.length, 1); michael@0: do_check_true(errors[0].contains(provider.throwDuringCollectConstantData)); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_collect_constant_populate_throws() { michael@0: let storage = yield Metrics.Storage("collect_constant_populate_throws"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: let errors = []; michael@0: manager.onProviderError = function (error) { errors.push(error); }; michael@0: michael@0: let provider = new DummyProvider(); michael@0: provider.throwDuringConstantPopulate = "Fake error during constant populate"; michael@0: yield manager.registerProvider(provider); michael@0: michael@0: yield manager.collectConstantData(); michael@0: michael@0: do_check_eq(errors.length, 1); michael@0: do_check_true(errors[0].contains(provider.throwDuringConstantPopulate)); michael@0: do_check_false(manager._providers.get(provider.name).constantsCollected); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_collect_constant_onetime() { michael@0: let storage = yield Metrics.Storage("collect_constant_onetime"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: let provider = new DummyProvider(); michael@0: yield manager.registerProvider(provider); michael@0: michael@0: yield manager.collectConstantData(); michael@0: do_check_eq(provider.collectConstantCount, 1); michael@0: michael@0: yield manager.collectConstantData(); michael@0: do_check_eq(provider.collectConstantCount, 1); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_collect_multiple() { michael@0: let storage = yield Metrics.Storage("collect_multiple"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: michael@0: for (let i = 0; i < 10; i++) { michael@0: yield manager.registerProvider(new DummyProvider("provider" + i)); michael@0: } michael@0: michael@0: do_check_eq(manager._providers.size, 10); michael@0: michael@0: yield manager.collectConstantData(); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_collect_daily() { michael@0: let storage = yield Metrics.Storage("collect_daily"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: michael@0: let provider1 = new DummyProvider("DP1"); michael@0: let provider2 = new DummyProvider("DP2"); michael@0: michael@0: yield manager.registerProvider(provider1); michael@0: yield manager.registerProvider(provider2); michael@0: michael@0: yield manager.collectDailyData(); michael@0: do_check_eq(provider1.collectDailyCount, 1); michael@0: do_check_eq(provider2.collectDailyCount, 1); michael@0: michael@0: yield manager.collectDailyData(); michael@0: do_check_eq(provider1.collectDailyCount, 2); michael@0: do_check_eq(provider2.collectDailyCount, 2); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_pull_only_not_initialized() { michael@0: let storage = yield Metrics.Storage("pull_only_not_initialized"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); michael@0: do_check_eq(manager.providers.length, 1); michael@0: do_check_eq(manager.providers[0].name, "DummyProvider"); michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_pull_only_registration() { michael@0: let storage = yield Metrics.Storage("pull_only_registration"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); michael@0: do_check_eq(manager.providers.length, 1); michael@0: michael@0: // Simple registration and unregistration. michael@0: yield manager.ensurePullOnlyProvidersRegistered(); michael@0: do_check_eq(manager.providers.length, 2); michael@0: do_check_neq(manager.getProvider("DummyConstantProvider"), null); michael@0: yield manager.ensurePullOnlyProvidersUnregistered(); michael@0: do_check_eq(manager.providers.length, 1); michael@0: do_check_null(manager.getProvider("DummyConstantProvider")); michael@0: michael@0: // Multiple calls to register work. michael@0: yield manager.ensurePullOnlyProvidersRegistered(); michael@0: do_check_eq(manager.providers.length, 2); michael@0: yield manager.ensurePullOnlyProvidersRegistered(); michael@0: do_check_eq(manager.providers.length, 2); michael@0: michael@0: // Unregister with 2 requests for registration should not unregister. michael@0: yield manager.ensurePullOnlyProvidersUnregistered(); michael@0: do_check_eq(manager.providers.length, 2); michael@0: michael@0: // But the 2nd one will. michael@0: yield manager.ensurePullOnlyProvidersUnregistered(); michael@0: do_check_eq(manager.providers.length, 1); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_pull_only_register_while_registering() { michael@0: let storage = yield Metrics.Storage("pull_only_register_will_registering"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); michael@0: michael@0: manager.ensurePullOnlyProvidersRegistered(); michael@0: manager.ensurePullOnlyProvidersRegistered(); michael@0: yield manager.ensurePullOnlyProvidersRegistered(); michael@0: do_check_eq(manager.providers.length, 2); michael@0: michael@0: manager.ensurePullOnlyProvidersUnregistered(); michael@0: manager.ensurePullOnlyProvidersUnregistered(); michael@0: yield manager.ensurePullOnlyProvidersUnregistered(); michael@0: do_check_eq(manager.providers.length, 1); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_pull_only_unregister_while_registering() { michael@0: let storage = yield Metrics.Storage("pull_only_unregister_while_registering"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); michael@0: michael@0: manager.ensurePullOnlyProvidersRegistered(); michael@0: yield manager.ensurePullOnlyProvidersUnregistered(); michael@0: do_check_eq(manager.providers.length, 1); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_pull_only_register_while_unregistering() { michael@0: let storage = yield Metrics.Storage("pull_only_register_while_unregistering"); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: yield manager.registerProvidersFromCategoryManager(PULL_ONLY_TESTING_CATEGORY); michael@0: michael@0: yield manager.ensurePullOnlyProvidersRegistered(); michael@0: manager.ensurePullOnlyProvidersUnregistered(); michael@0: yield manager.ensurePullOnlyProvidersRegistered(); michael@0: do_check_eq(manager.providers.length, 2); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: // Re-use database for perf reasons. michael@0: const REGISTRATION_ERRORS_DB = "registration_errors"; michael@0: michael@0: add_task(function test_category_manager_registration_error() { michael@0: let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: michael@0: let cm = Cc["@mozilla.org/categorymanager;1"] michael@0: .getService(Ci.nsICategoryManager); michael@0: cm.addCategoryEntry("registration-errors", "DummyThrowOnInitProvider", michael@0: "resource://testing-common/services/metrics/mocks.jsm", michael@0: false, true); michael@0: michael@0: let deferred = Promise.defer(); michael@0: let errorCount = 0; michael@0: michael@0: manager.onProviderError = function (msg) { michael@0: errorCount++; michael@0: deferred.resolve(msg); michael@0: }; michael@0: michael@0: yield manager.registerProvidersFromCategoryManager("registration-errors"); michael@0: do_check_eq(manager.providers.length, 0); michael@0: do_check_eq(errorCount, 1); michael@0: michael@0: let msg = yield deferred.promise; michael@0: do_check_true(msg.contains("Provider error: DummyThrowOnInitProvider: " michael@0: + "Error registering provider from category manager: " michael@0: + "Error: Dummy Error")); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_pull_only_registration_error() { michael@0: let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: michael@0: let deferred = Promise.defer(); michael@0: let errorCount = 0; michael@0: michael@0: manager.onProviderError = function (msg) { michael@0: errorCount++; michael@0: deferred.resolve(msg); michael@0: }; michael@0: michael@0: yield manager.registerProviderFromType(DummyPullOnlyThrowsOnInitProvider); michael@0: do_check_eq(errorCount, 0); michael@0: michael@0: yield manager.ensurePullOnlyProvidersRegistered(); michael@0: do_check_eq(errorCount, 1); michael@0: michael@0: let msg = yield deferred.promise; michael@0: do_check_true(msg.contains("Provider error: DummyPullOnlyThrowsOnInitProvider: " + michael@0: "Error registering pull-only provider: Error: Dummy Error")); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: add_task(function test_error_during_shutdown() { michael@0: let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB); michael@0: let manager = new Metrics.ProviderManager(storage); michael@0: michael@0: let deferred = Promise.defer(); michael@0: let errorCount = 0; michael@0: michael@0: manager.onProviderError = function (msg) { michael@0: errorCount++; michael@0: deferred.resolve(msg); michael@0: }; michael@0: michael@0: yield manager.registerProviderFromType(DummyThrowOnShutdownProvider); michael@0: yield manager.registerProviderFromType(DummyProvider); michael@0: do_check_eq(errorCount, 0); michael@0: do_check_eq(manager.providers.length, 1); michael@0: michael@0: yield manager.ensurePullOnlyProvidersRegistered(); michael@0: do_check_eq(errorCount, 0); michael@0: yield manager.ensurePullOnlyProvidersUnregistered(); michael@0: do_check_eq(errorCount, 1); michael@0: let msg = yield deferred.promise; michael@0: do_check_true(msg.contains("Provider error: DummyThrowOnShutdownProvider: " + michael@0: "Error when shutting down provider: Error: Dummy shutdown error")); michael@0: michael@0: yield storage.close(); michael@0: });