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 {utils: Cu, classes: Cc, interfaces: Ci} = Components; michael@0: michael@0: michael@0: Cu.import("resource://gre/modules/Metrics.jsm"); michael@0: Cu.import("resource://gre/modules/services/healthreport/providers.jsm"); michael@0: michael@0: // The hack, it burns. This could go away if extensions code exposed its michael@0: // test environment setup functions as a testing-only JSM. See similar michael@0: // code in Sync's head_helpers.js. michael@0: let gGlobalScope = this; michael@0: function loadAddonManager() { michael@0: let ns = {}; michael@0: Cu.import("resource://gre/modules/Services.jsm", ns); michael@0: let head = "../../../../toolkit/mozapps/extensions/test/xpcshell/head_addons.js"; michael@0: let file = do_get_file(head); michael@0: let uri = ns.Services.io.newFileURI(file); michael@0: ns.Services.scriptloader.loadSubScript(uri.spec, gGlobalScope); michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: startupManager(); michael@0: } michael@0: michael@0: function run_test() { michael@0: loadAddonManager(); michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function test_constructor() { michael@0: let provider = new AddonsProvider(); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_task(function test_init() { michael@0: let storage = yield Metrics.Storage("init"); michael@0: let provider = new AddonsProvider(); michael@0: yield provider.init(storage); michael@0: yield provider.shutdown(); michael@0: michael@0: yield storage.close(); michael@0: }); michael@0: michael@0: function monkeypatchAddons(provider, addons) { michael@0: if (!Array.isArray(addons)) { michael@0: throw new Error("Must define array of addon objects."); michael@0: } michael@0: michael@0: Object.defineProperty(provider, "_createDataStructure", { michael@0: value: function _createDataStructure() { michael@0: return AddonsProvider.prototype._createDataStructure.call(provider, addons); michael@0: }, michael@0: }); michael@0: } michael@0: michael@0: add_task(function test_collect() { michael@0: let storage = yield Metrics.Storage("collect"); michael@0: let provider = new AddonsProvider(); michael@0: yield provider.init(storage); michael@0: michael@0: let now = new Date(); michael@0: michael@0: // FUTURE install add-on via AddonManager and don't use monkeypatching. michael@0: let testAddons = [ michael@0: { michael@0: id: "addon0", michael@0: userDisabled: false, michael@0: appDisabled: false, michael@0: version: "1", michael@0: type: "extension", michael@0: scope: 1, michael@0: foreignInstall: false, michael@0: hasBinaryComponents: false, michael@0: installDate: now, michael@0: updateDate: now, michael@0: }, michael@0: // This plugin entry should get ignored. michael@0: { michael@0: id: "addon1", michael@0: userDisabled: false, michael@0: appDisabled: false, michael@0: version: "2", michael@0: type: "plugin", michael@0: scope: 1, michael@0: foreignInstall: false, michael@0: hasBinaryComponents: false, michael@0: installDate: now, michael@0: updateDate: now, michael@0: }, michael@0: // Is counted but full details are omitted because it is a theme. michael@0: { michael@0: id: "addon2", michael@0: userDisabled: false, michael@0: appDisabled: false, michael@0: version: "3", michael@0: type: "theme", michael@0: scope: 1, michael@0: foreignInstall: false, michael@0: hasBinaryComponents: false, michael@0: installDate: now, michael@0: updateDate: now, michael@0: }, michael@0: { michael@0: id: "addon3", michael@0: userDisabled: false, michael@0: appDisabled: false, michael@0: version: "4", michael@0: type: "service", michael@0: scope: 1, michael@0: foreignInstall: false, michael@0: hasBinaryComponents: false, michael@0: installDate: now, michael@0: updateDate: now, michael@0: description: "addon3 description" michael@0: }, michael@0: ]; michael@0: michael@0: monkeypatchAddons(provider, testAddons); michael@0: michael@0: let testPlugins = { michael@0: "Test Plug-in": michael@0: { michael@0: "version": "1.0.0.0", michael@0: "description": "Plug-in for testing purposes.™ (हिन्दी 中文 العربية)", michael@0: "blocklisted": false, michael@0: "disabled": false, michael@0: "clicktoplay": false, michael@0: "mimeTypes":[ michael@0: "application/x-test" michael@0: ], michael@0: }, michael@0: "Second Test Plug-in": michael@0: { michael@0: "version": "1.0.0.0", michael@0: "description": "Second plug-in for testing purposes.", michael@0: "blocklisted": false, michael@0: "disabled": false, michael@0: "clicktoplay": false, michael@0: "mimeTypes":[ michael@0: "application/x-second-test" michael@0: ], michael@0: }, michael@0: "Java Test Plug-in": michael@0: { michael@0: "version": "1.0.0.0", michael@0: "description": "Dummy Java plug-in for testing purposes.", michael@0: "blocklisted": false, michael@0: "disabled": false, michael@0: "clicktoplay": false, michael@0: "mimeTypes":[ michael@0: "application/x-java-test" michael@0: ], michael@0: }, michael@0: }; michael@0: michael@0: let pluginTags = Cc["@mozilla.org/plugin/host;1"] michael@0: .getService(Ci.nsIPluginHost) michael@0: .getPluginTags({}); michael@0: michael@0: for (let tag of pluginTags) { michael@0: if (tag.name in testPlugins) { michael@0: let p = testPlugins[tag.name]; michael@0: p.id = tag.filename+":"+tag.name+":"+p.version+":"+p.description; michael@0: } michael@0: } michael@0: michael@0: yield provider.collectConstantData(); michael@0: michael@0: // Test addons measurement. michael@0: michael@0: let addons = provider.getMeasurement("addons", 2); michael@0: let data = yield addons.getValues(); michael@0: michael@0: do_check_eq(data.days.size, 0); michael@0: do_check_eq(data.singular.size, 1); michael@0: do_check_true(data.singular.has("addons")); michael@0: michael@0: let json = data.singular.get("addons")[1]; michael@0: let value = JSON.parse(json); michael@0: do_check_eq(typeof(value), "object"); michael@0: do_check_eq(Object.keys(value).length, 2); michael@0: do_check_true("addon0" in value); michael@0: do_check_true(!("addon1" in value)); michael@0: do_check_true(!("addon2" in value)); michael@0: do_check_true("addon3" in value); michael@0: michael@0: let serializer = addons.serializer(addons.SERIALIZE_JSON); michael@0: let serialized = serializer.singular(data.singular); michael@0: do_check_eq(typeof(serialized), "object"); michael@0: do_check_eq(Object.keys(serialized).length, 3); // Our entries, plus _v. michael@0: do_check_true("addon0" in serialized); michael@0: do_check_true("addon3" in serialized); michael@0: do_check_eq(serialized._v, 2); michael@0: michael@0: // Test plugins measurement. michael@0: michael@0: let plugins = provider.getMeasurement("plugins", 1); michael@0: data = yield plugins.getValues(); michael@0: michael@0: do_check_eq(data.days.size, 0); michael@0: do_check_eq(data.singular.size, 1); michael@0: do_check_true(data.singular.has("plugins")); michael@0: michael@0: json = data.singular.get("plugins")[1]; michael@0: value = JSON.parse(json); michael@0: do_check_eq(typeof(value), "object"); michael@0: do_check_eq(Object.keys(value).length, pluginTags.length); michael@0: michael@0: do_check_true(testPlugins["Test Plug-in"].id in value); michael@0: do_check_true(testPlugins["Second Test Plug-in"].id in value); michael@0: do_check_true(testPlugins["Java Test Plug-in"].id in value); michael@0: michael@0: for (let id in value) { michael@0: let item = value[id]; michael@0: let testData = testPlugins[item.name]; michael@0: for (let prop in testData) { michael@0: if (prop == "mimeTypes" || prop == "id") { michael@0: continue; michael@0: } michael@0: do_check_eq(testData[prop], item[prop]); michael@0: } michael@0: michael@0: for (let mime of testData.mimeTypes) { michael@0: do_check_true(item.mimeTypes.indexOf(mime) != -1); michael@0: } michael@0: } michael@0: michael@0: serializer = plugins.serializer(plugins.SERIALIZE_JSON); michael@0: serialized = serializer.singular(data.singular); michael@0: do_check_eq(typeof(serialized), "object"); michael@0: do_check_eq(Object.keys(serialized).length, pluginTags.length+1); // Our entries, plus _v. michael@0: for (let name in testPlugins) { michael@0: do_check_true(testPlugins[name].id in serialized); michael@0: } michael@0: do_check_eq(serialized._v, 1); michael@0: michael@0: // Test counts measurement. michael@0: michael@0: let counts = provider.getMeasurement("counts", 2); michael@0: data = yield counts.getValues(); michael@0: do_check_eq(data.days.size, 1); michael@0: do_check_eq(data.singular.size, 0); michael@0: do_check_true(data.days.hasDay(now)); michael@0: michael@0: value = data.days.getDay(now); michael@0: do_check_eq(value.size, 4); michael@0: do_check_eq(value.get("extension"), 1); michael@0: do_check_eq(value.get("plugin"), pluginTags.length); michael@0: do_check_eq(value.get("theme"), 1); michael@0: do_check_eq(value.get("service"), 1); michael@0: michael@0: yield provider.shutdown(); michael@0: yield storage.close(); michael@0: }); michael@0: