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