services/healthreport/tests/xpcshell/test_provider_addons.js

Wed, 31 Dec 2014 07:53:36 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:53:36 +0100
branch
TOR_BUG_3246
changeset 5
4ab42b5ab56c
permissions
-rw-r--r--

Correct small whitespace inconsistency, lost while renaming variables.

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/ */
     4 "use strict";
     6 const {utils: Cu, classes: Cc, interfaces: Ci} = Components;
     9 Cu.import("resource://gre/modules/Metrics.jsm");
    10 Cu.import("resource://gre/modules/services/healthreport/providers.jsm");
    12 // The hack, it burns. This could go away if extensions code exposed its
    13 // test environment setup functions as a testing-only JSM. See similar
    14 // code in Sync's head_helpers.js.
    15 let gGlobalScope = this;
    16 function loadAddonManager() {
    17   let ns = {};
    18   Cu.import("resource://gre/modules/Services.jsm", ns);
    19   let head = "../../../../toolkit/mozapps/extensions/test/xpcshell/head_addons.js";
    20   let file = do_get_file(head);
    21   let uri = ns.Services.io.newFileURI(file);
    22   ns.Services.scriptloader.loadSubScript(uri.spec, gGlobalScope);
    23   createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
    24   startupManager();
    25 }
    27 function run_test() {
    28   loadAddonManager();
    29   run_next_test();
    30 }
    32 add_test(function test_constructor() {
    33   let provider = new AddonsProvider();
    35   run_next_test();
    36 });
    38 add_task(function test_init() {
    39   let storage = yield Metrics.Storage("init");
    40   let provider = new AddonsProvider();
    41   yield provider.init(storage);
    42   yield provider.shutdown();
    44   yield storage.close();
    45 });
    47 function monkeypatchAddons(provider, addons) {
    48   if (!Array.isArray(addons)) {
    49     throw new Error("Must define array of addon objects.");
    50   }
    52   Object.defineProperty(provider, "_createDataStructure", {
    53     value: function _createDataStructure() {
    54       return AddonsProvider.prototype._createDataStructure.call(provider, addons);
    55     },
    56   });
    57 }
    59 add_task(function test_collect() {
    60   let storage = yield Metrics.Storage("collect");
    61   let provider = new AddonsProvider();
    62   yield provider.init(storage);
    64   let now = new Date();
    66   // FUTURE install add-on via AddonManager and don't use monkeypatching.
    67   let testAddons = [
    68     {
    69       id: "addon0",
    70       userDisabled: false,
    71       appDisabled: false,
    72       version: "1",
    73       type: "extension",
    74       scope: 1,
    75       foreignInstall: false,
    76       hasBinaryComponents: false,
    77       installDate: now,
    78       updateDate: now,
    79     },
    80     // This plugin entry should get ignored.
    81     {
    82       id: "addon1",
    83       userDisabled: false,
    84       appDisabled: false,
    85       version: "2",
    86       type: "plugin",
    87       scope: 1,
    88       foreignInstall: false,
    89       hasBinaryComponents: false,
    90       installDate: now,
    91       updateDate: now,
    92     },
    93     // Is counted but full details are omitted because it is a theme.
    94     {
    95       id: "addon2",
    96       userDisabled: false,
    97       appDisabled: false,
    98       version: "3",
    99       type: "theme",
   100       scope: 1,
   101       foreignInstall: false,
   102       hasBinaryComponents: false,
   103       installDate: now,
   104       updateDate: now,
   105     },
   106     {
   107       id: "addon3",
   108       userDisabled: false,
   109       appDisabled: false,
   110       version: "4",
   111       type: "service",
   112       scope: 1,
   113       foreignInstall: false,
   114       hasBinaryComponents: false,
   115       installDate: now,
   116       updateDate: now,
   117       description: "addon3 description"
   118     },
   119   ];
   121   monkeypatchAddons(provider, testAddons);
   123   let testPlugins = {
   124     "Test Plug-in":
   125     {
   126       "version": "1.0.0.0",
   127       "description": "Plug-in for testing purposes.™ (हिन्दी 中文 العربية)",
   128       "blocklisted": false,
   129       "disabled": false,
   130       "clicktoplay": false,
   131       "mimeTypes":[
   132         "application/x-test"
   133       ],
   134     },
   135     "Second Test Plug-in":
   136     {
   137       "version": "1.0.0.0",
   138       "description": "Second plug-in for testing purposes.",
   139       "blocklisted": false,
   140       "disabled": false,
   141       "clicktoplay": false,
   142       "mimeTypes":[
   143         "application/x-second-test"
   144       ],
   145     },
   146     "Java Test Plug-in":
   147     {
   148       "version": "1.0.0.0",
   149       "description": "Dummy Java plug-in for testing purposes.",
   150       "blocklisted": false,
   151       "disabled": false,
   152       "clicktoplay": false,
   153       "mimeTypes":[
   154         "application/x-java-test"
   155       ],
   156     },
   157   };
   159   let pluginTags = Cc["@mozilla.org/plugin/host;1"]
   160                     .getService(Ci.nsIPluginHost)
   161                     .getPluginTags({});
   163   for (let tag of pluginTags) {
   164     if (tag.name in testPlugins) {
   165       let p = testPlugins[tag.name];
   166       p.id = tag.filename+":"+tag.name+":"+p.version+":"+p.description;
   167     }
   168   }
   170   yield provider.collectConstantData();
   172   // Test addons measurement.
   174   let addons = provider.getMeasurement("addons", 2);
   175   let data = yield addons.getValues();
   177   do_check_eq(data.days.size, 0);
   178   do_check_eq(data.singular.size, 1);
   179   do_check_true(data.singular.has("addons"));
   181   let json = data.singular.get("addons")[1];
   182   let value = JSON.parse(json);
   183   do_check_eq(typeof(value), "object");
   184   do_check_eq(Object.keys(value).length, 2);
   185   do_check_true("addon0" in value);
   186   do_check_true(!("addon1" in value));
   187   do_check_true(!("addon2" in value));
   188   do_check_true("addon3" in value);
   190   let serializer = addons.serializer(addons.SERIALIZE_JSON);
   191   let serialized = serializer.singular(data.singular);
   192   do_check_eq(typeof(serialized), "object");
   193   do_check_eq(Object.keys(serialized).length, 3); // Our entries, plus _v.
   194   do_check_true("addon0" in serialized);
   195   do_check_true("addon3" in serialized);
   196   do_check_eq(serialized._v, 2);
   198   // Test plugins measurement.
   200   let plugins = provider.getMeasurement("plugins", 1);
   201   data = yield plugins.getValues();
   203   do_check_eq(data.days.size, 0);
   204   do_check_eq(data.singular.size, 1);
   205   do_check_true(data.singular.has("plugins"));
   207   json = data.singular.get("plugins")[1];
   208   value = JSON.parse(json);
   209   do_check_eq(typeof(value), "object");
   210   do_check_eq(Object.keys(value).length, pluginTags.length);
   212   do_check_true(testPlugins["Test Plug-in"].id in value);
   213   do_check_true(testPlugins["Second Test Plug-in"].id in value);
   214   do_check_true(testPlugins["Java Test Plug-in"].id in value);
   216   for (let id in value) {
   217     let item = value[id];
   218     let testData = testPlugins[item.name];
   219     for (let prop in testData) {
   220       if (prop == "mimeTypes" || prop == "id") {
   221         continue;
   222       }
   223       do_check_eq(testData[prop], item[prop]);
   224     }
   226     for (let mime of testData.mimeTypes) {
   227       do_check_true(item.mimeTypes.indexOf(mime) != -1);
   228     }
   229   }
   231   serializer = plugins.serializer(plugins.SERIALIZE_JSON);
   232   serialized = serializer.singular(data.singular);
   233   do_check_eq(typeof(serialized), "object");
   234   do_check_eq(Object.keys(serialized).length, pluginTags.length+1); // Our entries, plus _v.
   235   for (let name in testPlugins) {
   236     do_check_true(testPlugins[name].id in serialized);
   237   }
   238   do_check_eq(serialized._v, 1);
   240   // Test counts measurement.
   242   let counts = provider.getMeasurement("counts", 2);
   243   data = yield counts.getValues();
   244   do_check_eq(data.days.size, 1);
   245   do_check_eq(data.singular.size, 0);
   246   do_check_true(data.days.hasDay(now));
   248   value = data.days.getDay(now);
   249   do_check_eq(value.size, 4);
   250   do_check_eq(value.get("extension"), 1);
   251   do_check_eq(value.get("plugin"), pluginTags.length);
   252   do_check_eq(value.get("theme"), 1);
   253   do_check_eq(value.get("service"), 1);
   255   yield provider.shutdown();
   256   yield storage.close();
   257 });

mercurial