1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/sync/tests/unit/test_addon_utils.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,162 @@ 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 +Cu.import("resource://gre/modules/Preferences.jsm"); 1.10 +Cu.import("resource://services-sync/addonutils.js"); 1.11 +Cu.import("resource://services-sync/util.js"); 1.12 + 1.13 +const HTTP_PORT = 8888; 1.14 +const SERVER_ADDRESS = "http://127.0.0.1:8888"; 1.15 + 1.16 +let prefs = new Preferences(); 1.17 + 1.18 +prefs.set("extensions.getAddons.get.url", 1.19 + SERVER_ADDRESS + "/search/guid:%IDS%"); 1.20 + 1.21 +loadAddonTestFunctions(); 1.22 +startupManager(); 1.23 + 1.24 +function createAndStartHTTPServer(port=HTTP_PORT) { 1.25 + try { 1.26 + let server = new HttpServer(); 1.27 + 1.28 + let bootstrap1XPI = ExtensionsTestPath("/addons/test_bootstrap1_1.xpi"); 1.29 + 1.30 + server.registerFile("/search/guid:missing-sourceuri%40tests.mozilla.org", 1.31 + do_get_file("missing-sourceuri.xml")); 1.32 + 1.33 + server.registerFile("/search/guid:rewrite%40tests.mozilla.org", 1.34 + do_get_file("rewrite-search.xml")); 1.35 + 1.36 + server.start(port); 1.37 + 1.38 + return server; 1.39 + } catch (ex) { 1.40 + _("Got exception starting HTTP server on port " + port); 1.41 + _("Error: " + Utils.exceptionStr(ex)); 1.42 + do_throw(ex); 1.43 + } 1.44 +} 1.45 + 1.46 +function run_test() { 1.47 + initTestLogging("Trace"); 1.48 + 1.49 + run_next_test(); 1.50 +} 1.51 + 1.52 +add_test(function test_handle_empty_source_uri() { 1.53 + _("Ensure that search results without a sourceURI are properly ignored."); 1.54 + 1.55 + let server = createAndStartHTTPServer(); 1.56 + 1.57 + const ID = "missing-sourceuri@tests.mozilla.org"; 1.58 + 1.59 + let cb = Async.makeSpinningCallback(); 1.60 + AddonUtils.installAddons([{id: ID, requireSecureURI: false}], cb); 1.61 + let result = cb.wait(); 1.62 + 1.63 + do_check_true("installedIDs" in result); 1.64 + do_check_eq(0, result.installedIDs.length); 1.65 + 1.66 + server.stop(run_next_test); 1.67 +}); 1.68 + 1.69 +add_test(function test_ignore_untrusted_source_uris() { 1.70 + _("Ensures that source URIs from insecure schemes are rejected."); 1.71 + 1.72 + let ioService = Cc["@mozilla.org/network/io-service;1"] 1.73 + .getService(Ci.nsIIOService); 1.74 + 1.75 + const bad = ["http://example.com/foo.xpi", 1.76 + "ftp://example.com/foo.xpi", 1.77 + "silly://example.com/foo.xpi"]; 1.78 + 1.79 + const good = ["https://example.com/foo.xpi"]; 1.80 + 1.81 + for (let s of bad) { 1.82 + let sourceURI = ioService.newURI(s, null, null); 1.83 + let addon = {sourceURI: sourceURI, name: "bad", id: "bad"}; 1.84 + 1.85 + try { 1.86 + let cb = Async.makeSpinningCallback(); 1.87 + AddonUtils.getInstallFromSearchResult(addon, cb, true); 1.88 + cb.wait(); 1.89 + } catch (ex) { 1.90 + do_check_neq(null, ex); 1.91 + do_check_eq(0, ex.message.indexOf("Insecure source URI")); 1.92 + continue; 1.93 + } 1.94 + 1.95 + // We should never get here if an exception is thrown. 1.96 + do_check_true(false); 1.97 + } 1.98 + 1.99 + let count = 0; 1.100 + for (let s of good) { 1.101 + let sourceURI = ioService.newURI(s, null, null); 1.102 + let addon = {sourceURI: sourceURI, name: "good", id: "good"}; 1.103 + 1.104 + // Despite what you might think, we don't get an error in the callback. 1.105 + // The install won't work because the underlying Addon instance wasn't 1.106 + // proper. But, that just results in an AddonInstall that is missing 1.107 + // certain values. We really just care that the callback is being invoked 1.108 + // anyway. 1.109 + let callback = function onInstall(error, install) { 1.110 + do_check_null(error); 1.111 + do_check_neq(null, install); 1.112 + do_check_eq(sourceURI.spec, install.sourceURI.spec); 1.113 + 1.114 + count += 1; 1.115 + 1.116 + if (count >= good.length) { 1.117 + run_next_test(); 1.118 + } 1.119 + }; 1.120 + 1.121 + AddonUtils.getInstallFromSearchResult(addon, callback, true); 1.122 + } 1.123 +}); 1.124 + 1.125 +add_test(function test_source_uri_rewrite() { 1.126 + _("Ensure that a 'src=api' query string is rewritten to 'src=sync'"); 1.127 + 1.128 + // This tests for conformance with bug 708134 so server-side metrics aren't 1.129 + // skewed. 1.130 + 1.131 + Svc.Prefs.set("addons.ignoreRepositoryChecking", true); 1.132 + 1.133 + // We resort to monkeypatching because of the API design. 1.134 + let oldFunction = AddonUtils.__proto__.installAddonFromSearchResult; 1.135 + 1.136 + let installCalled = false; 1.137 + AddonUtils.__proto__.installAddonFromSearchResult = 1.138 + function testInstallAddon(addon, metadata, cb) { 1.139 + 1.140 + do_check_eq(SERVER_ADDRESS + "/require.xpi?src=sync", 1.141 + addon.sourceURI.spec); 1.142 + 1.143 + installCalled = true; 1.144 + 1.145 + AddonUtils.getInstallFromSearchResult(addon, function (error, install) { 1.146 + do_check_null(error); 1.147 + do_check_eq(SERVER_ADDRESS + "/require.xpi?src=sync", 1.148 + install.sourceURI.spec); 1.149 + 1.150 + cb(null, {id: addon.id, addon: addon, install: install}); 1.151 + }, false); 1.152 + }; 1.153 + 1.154 + let server = createAndStartHTTPServer(); 1.155 + 1.156 + let installCallback = Async.makeSpinningCallback(); 1.157 + AddonUtils.installAddons([{id: "rewrite@tests.mozilla.org"}], installCallback); 1.158 + 1.159 + installCallback.wait(); 1.160 + do_check_true(installCalled); 1.161 + AddonUtils.__proto__.installAddonFromSearchResult = oldFunction; 1.162 + 1.163 + Svc.Prefs.reset("addons.ignoreRepositoryChecking"); 1.164 + server.stop(run_next_test); 1.165 +});