tenfourfox/services/healthreport/tests/xpcshell/test_provider_addons.js
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

340 lines
9.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var {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.
var 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"
},
{
// Should be excluded from the report completely
id: "pluginfake",
type: "plugin",
userDisabled: false,
appDisabled: false,
},
{
// Should be in gm-plugins
id: "gmp-testgmp",
type: "plugin",
userDisabled: false,
version: "7.2",
isGMPlugin: true,
},
];
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"
],
},
"Third Test Plug-in":
{
"version": "1.0.0.0",
"description": "Third plug-in for testing purposes.",
"blocklisted": false,
"disabled": false,
"clicktoplay": false,
"mimeTypes":[
"application/x-third-test"
],
},
"Flash Test Plug-in":
{
"version": "1.0.0.0",
"description": "Flash plug-in for testing purposes.",
"blocklisted": false,
"disabled": false,
"clicktoplay": false,
"mimeTypes":[
"application/x-shockwave-flash-test"
],
},
"Silverlight Test Plug-in":
{
"version": "1.0.0.0",
"description": "Silverlight plug-in for testing purposes.",
"blocklisted": false,
"disabled": false,
"clicktoplay": false,
"mimeTypes":[
"application/x-silverlight-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);
do_check_true(!("pluginfake" in value));
do_check_true(!("gmp-testgmp" 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) {
// Special case for bug 1165981. There is a test plugin that
// exists to make sure we don't load it on certain platforms.
// We skip the check for that plugin here, as it will work on some
// platforms but not others.
if (name == "Third Test Plug-in") {
continue;
}
do_check_true(testPlugins[name].id in serialized);
}
do_check_eq(serialized._v, 1);
// Test GMP plugins measurement.
let gmPlugins = provider.getMeasurement("gm-plugins", 1);
data = yield gmPlugins.getValues();
do_check_eq(data.days.size, 0);
do_check_eq(data.singular.size, 1);
do_check_true(data.singular.has("gm-plugins"));
json = data.singular.get("gm-plugins")[1];
value = JSON.parse(json);
do_print("value: " + json);
do_check_eq(typeof(value), "object");
do_check_eq(Object.keys(value).length, 1);
do_check_eq(value["gmp-testgmp"].version, "7.2");
do_check_eq(value["gmp-testgmp"].userDisabled, false);
serializer = gmPlugins.serializer(plugins.SERIALIZE_JSON);
serialized = serializer.singular(data.singular);
do_check_eq(typeof(serialized), "object");
do_check_eq(serialized["gmp-testgmp"].version, "7.2");
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();
});