1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/healthreport/tests/xpcshell/test_provider_addons.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,258 @@ 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 {utils: Cu, classes: Cc, interfaces: Ci} = Components; 1.10 + 1.11 + 1.12 +Cu.import("resource://gre/modules/Metrics.jsm"); 1.13 +Cu.import("resource://gre/modules/services/healthreport/providers.jsm"); 1.14 + 1.15 +// The hack, it burns. This could go away if extensions code exposed its 1.16 +// test environment setup functions as a testing-only JSM. See similar 1.17 +// code in Sync's head_helpers.js. 1.18 +let gGlobalScope = this; 1.19 +function loadAddonManager() { 1.20 + let ns = {}; 1.21 + Cu.import("resource://gre/modules/Services.jsm", ns); 1.22 + let head = "../../../../toolkit/mozapps/extensions/test/xpcshell/head_addons.js"; 1.23 + let file = do_get_file(head); 1.24 + let uri = ns.Services.io.newFileURI(file); 1.25 + ns.Services.scriptloader.loadSubScript(uri.spec, gGlobalScope); 1.26 + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.27 + startupManager(); 1.28 +} 1.29 + 1.30 +function run_test() { 1.31 + loadAddonManager(); 1.32 + run_next_test(); 1.33 +} 1.34 + 1.35 +add_test(function test_constructor() { 1.36 + let provider = new AddonsProvider(); 1.37 + 1.38 + run_next_test(); 1.39 +}); 1.40 + 1.41 +add_task(function test_init() { 1.42 + let storage = yield Metrics.Storage("init"); 1.43 + let provider = new AddonsProvider(); 1.44 + yield provider.init(storage); 1.45 + yield provider.shutdown(); 1.46 + 1.47 + yield storage.close(); 1.48 +}); 1.49 + 1.50 +function monkeypatchAddons(provider, addons) { 1.51 + if (!Array.isArray(addons)) { 1.52 + throw new Error("Must define array of addon objects."); 1.53 + } 1.54 + 1.55 + Object.defineProperty(provider, "_createDataStructure", { 1.56 + value: function _createDataStructure() { 1.57 + return AddonsProvider.prototype._createDataStructure.call(provider, addons); 1.58 + }, 1.59 + }); 1.60 +} 1.61 + 1.62 +add_task(function test_collect() { 1.63 + let storage = yield Metrics.Storage("collect"); 1.64 + let provider = new AddonsProvider(); 1.65 + yield provider.init(storage); 1.66 + 1.67 + let now = new Date(); 1.68 + 1.69 + // FUTURE install add-on via AddonManager and don't use monkeypatching. 1.70 + let testAddons = [ 1.71 + { 1.72 + id: "addon0", 1.73 + userDisabled: false, 1.74 + appDisabled: false, 1.75 + version: "1", 1.76 + type: "extension", 1.77 + scope: 1, 1.78 + foreignInstall: false, 1.79 + hasBinaryComponents: false, 1.80 + installDate: now, 1.81 + updateDate: now, 1.82 + }, 1.83 + // This plugin entry should get ignored. 1.84 + { 1.85 + id: "addon1", 1.86 + userDisabled: false, 1.87 + appDisabled: false, 1.88 + version: "2", 1.89 + type: "plugin", 1.90 + scope: 1, 1.91 + foreignInstall: false, 1.92 + hasBinaryComponents: false, 1.93 + installDate: now, 1.94 + updateDate: now, 1.95 + }, 1.96 + // Is counted but full details are omitted because it is a theme. 1.97 + { 1.98 + id: "addon2", 1.99 + userDisabled: false, 1.100 + appDisabled: false, 1.101 + version: "3", 1.102 + type: "theme", 1.103 + scope: 1, 1.104 + foreignInstall: false, 1.105 + hasBinaryComponents: false, 1.106 + installDate: now, 1.107 + updateDate: now, 1.108 + }, 1.109 + { 1.110 + id: "addon3", 1.111 + userDisabled: false, 1.112 + appDisabled: false, 1.113 + version: "4", 1.114 + type: "service", 1.115 + scope: 1, 1.116 + foreignInstall: false, 1.117 + hasBinaryComponents: false, 1.118 + installDate: now, 1.119 + updateDate: now, 1.120 + description: "addon3 description" 1.121 + }, 1.122 + ]; 1.123 + 1.124 + monkeypatchAddons(provider, testAddons); 1.125 + 1.126 + let testPlugins = { 1.127 + "Test Plug-in": 1.128 + { 1.129 + "version": "1.0.0.0", 1.130 + "description": "Plug-in for testing purposes.™ (हिन्दी 中文 العربية)", 1.131 + "blocklisted": false, 1.132 + "disabled": false, 1.133 + "clicktoplay": false, 1.134 + "mimeTypes":[ 1.135 + "application/x-test" 1.136 + ], 1.137 + }, 1.138 + "Second Test Plug-in": 1.139 + { 1.140 + "version": "1.0.0.0", 1.141 + "description": "Second plug-in for testing purposes.", 1.142 + "blocklisted": false, 1.143 + "disabled": false, 1.144 + "clicktoplay": false, 1.145 + "mimeTypes":[ 1.146 + "application/x-second-test" 1.147 + ], 1.148 + }, 1.149 + "Java Test Plug-in": 1.150 + { 1.151 + "version": "1.0.0.0", 1.152 + "description": "Dummy Java plug-in for testing purposes.", 1.153 + "blocklisted": false, 1.154 + "disabled": false, 1.155 + "clicktoplay": false, 1.156 + "mimeTypes":[ 1.157 + "application/x-java-test" 1.158 + ], 1.159 + }, 1.160 + }; 1.161 + 1.162 + let pluginTags = Cc["@mozilla.org/plugin/host;1"] 1.163 + .getService(Ci.nsIPluginHost) 1.164 + .getPluginTags({}); 1.165 + 1.166 + for (let tag of pluginTags) { 1.167 + if (tag.name in testPlugins) { 1.168 + let p = testPlugins[tag.name]; 1.169 + p.id = tag.filename+":"+tag.name+":"+p.version+":"+p.description; 1.170 + } 1.171 + } 1.172 + 1.173 + yield provider.collectConstantData(); 1.174 + 1.175 + // Test addons measurement. 1.176 + 1.177 + let addons = provider.getMeasurement("addons", 2); 1.178 + let data = yield addons.getValues(); 1.179 + 1.180 + do_check_eq(data.days.size, 0); 1.181 + do_check_eq(data.singular.size, 1); 1.182 + do_check_true(data.singular.has("addons")); 1.183 + 1.184 + let json = data.singular.get("addons")[1]; 1.185 + let value = JSON.parse(json); 1.186 + do_check_eq(typeof(value), "object"); 1.187 + do_check_eq(Object.keys(value).length, 2); 1.188 + do_check_true("addon0" in value); 1.189 + do_check_true(!("addon1" in value)); 1.190 + do_check_true(!("addon2" in value)); 1.191 + do_check_true("addon3" in value); 1.192 + 1.193 + let serializer = addons.serializer(addons.SERIALIZE_JSON); 1.194 + let serialized = serializer.singular(data.singular); 1.195 + do_check_eq(typeof(serialized), "object"); 1.196 + do_check_eq(Object.keys(serialized).length, 3); // Our entries, plus _v. 1.197 + do_check_true("addon0" in serialized); 1.198 + do_check_true("addon3" in serialized); 1.199 + do_check_eq(serialized._v, 2); 1.200 + 1.201 + // Test plugins measurement. 1.202 + 1.203 + let plugins = provider.getMeasurement("plugins", 1); 1.204 + data = yield plugins.getValues(); 1.205 + 1.206 + do_check_eq(data.days.size, 0); 1.207 + do_check_eq(data.singular.size, 1); 1.208 + do_check_true(data.singular.has("plugins")); 1.209 + 1.210 + json = data.singular.get("plugins")[1]; 1.211 + value = JSON.parse(json); 1.212 + do_check_eq(typeof(value), "object"); 1.213 + do_check_eq(Object.keys(value).length, pluginTags.length); 1.214 + 1.215 + do_check_true(testPlugins["Test Plug-in"].id in value); 1.216 + do_check_true(testPlugins["Second Test Plug-in"].id in value); 1.217 + do_check_true(testPlugins["Java Test Plug-in"].id in value); 1.218 + 1.219 + for (let id in value) { 1.220 + let item = value[id]; 1.221 + let testData = testPlugins[item.name]; 1.222 + for (let prop in testData) { 1.223 + if (prop == "mimeTypes" || prop == "id") { 1.224 + continue; 1.225 + } 1.226 + do_check_eq(testData[prop], item[prop]); 1.227 + } 1.228 + 1.229 + for (let mime of testData.mimeTypes) { 1.230 + do_check_true(item.mimeTypes.indexOf(mime) != -1); 1.231 + } 1.232 + } 1.233 + 1.234 + serializer = plugins.serializer(plugins.SERIALIZE_JSON); 1.235 + serialized = serializer.singular(data.singular); 1.236 + do_check_eq(typeof(serialized), "object"); 1.237 + do_check_eq(Object.keys(serialized).length, pluginTags.length+1); // Our entries, plus _v. 1.238 + for (let name in testPlugins) { 1.239 + do_check_true(testPlugins[name].id in serialized); 1.240 + } 1.241 + do_check_eq(serialized._v, 1); 1.242 + 1.243 + // Test counts measurement. 1.244 + 1.245 + let counts = provider.getMeasurement("counts", 2); 1.246 + data = yield counts.getValues(); 1.247 + do_check_eq(data.days.size, 1); 1.248 + do_check_eq(data.singular.size, 0); 1.249 + do_check_true(data.days.hasDay(now)); 1.250 + 1.251 + value = data.days.getDay(now); 1.252 + do_check_eq(value.size, 4); 1.253 + do_check_eq(value.get("extension"), 1); 1.254 + do_check_eq(value.get("plugin"), pluginTags.length); 1.255 + do_check_eq(value.get("theme"), 1); 1.256 + do_check_eq(value.get("service"), 1); 1.257 + 1.258 + yield provider.shutdown(); 1.259 + yield storage.close(); 1.260 +}); 1.261 +