services/healthreport/tests/xpcshell/test_provider_addons.js

changeset 0
6474c204b198
     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 +

mercurial