toolkit/mozapps/extensions/test/xpcshell/test_updateCancel.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/
     3  */
     5 // Test cancelling add-on update checks while in progress (bug 925389)
     7 Components.utils.import("resource://gre/modules/Promise.jsm");
     9 // The test extension uses an insecure update url.
    10 Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
    11 Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, false);
    13 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
    15 // Set up an HTTP server to respond to update requests
    16 Components.utils.import("resource://testing-common/httpd.js");
    18 const profileDir = gProfD.clone();
    19 profileDir.append("extensions");
    21 // Return a promise that resolves with an addon retrieved by
    22 // AddonManager.getAddonByID()
    23 function promiseGetAddon(aID) {
    24   let p = Promise.defer();
    25   AddonManager.getAddonByID(aID, p.resolve);
    26   return p.promise;
    27 }
    29 function run_test() {
    30   // Kick off the task-based tests...
    31   run_next_test();
    32 }
    34 // Install one extension
    35 // Start download of update check (but delay HTTP response)
    36 // Cancel update check
    37 //  - ensure we get cancel notification
    38 // complete HTTP response
    39 //  - ensure no callbacks after cancel
    40 //  - ensure update is gone
    42 // Create an addon update listener containing a promise
    43 // that resolves when the update is cancelled
    44 function makeCancelListener() {
    45   let updated = Promise.defer();
    46   return {
    47     onUpdateAvailable: function(addon, install) {
    48       updated.reject("Should not have seen onUpdateAvailable notification");
    49     },
    51     onUpdateFinished: function(aAddon, aError) {
    52       do_print("onUpdateCheckFinished: " + aAddon.id + " " + aError);
    53       updated.resolve(aError);
    54     },
    55     promise: updated.promise
    56   };
    57 }
    59 // Set up the HTTP server so that we can control when it responds
    60 let httpReceived = Promise.defer();
    61 function dataHandler(aRequest, aResponse) {
    62   asyncResponse = aResponse;
    63   aResponse.processAsync();
    64   httpReceived.resolve([aRequest, aResponse]);
    65 }
    66 var testserver = new HttpServer();
    67 testserver.registerDirectory("/addons/", do_get_file("addons"));
    68 testserver.registerPathHandler("/data/test_update.rdf", dataHandler);
    69 testserver.start(-1);
    70 gPort = testserver.identity.primaryPort;
    72 // Set up an add-on for update check
    73 writeInstallRDFForExtension({
    74   id: "addon1@tests.mozilla.org",
    75   version: "1.0",
    76   updateURL: "http://localhost:" + gPort + "/data/test_update.rdf",
    77   targetApplications: [{
    78     id: "xpcshell@tests.mozilla.org",
    79     minVersion: "1",
    80     maxVersion: "1"
    81   }],
    82   name: "Test Addon 1",
    83 }, profileDir);
    85 add_task(function cancel_during_check() {
    86   startupManager();
    88   let a1 = yield promiseGetAddon("addon1@tests.mozilla.org");
    89   do_check_neq(a1, null);
    91   let listener = makeCancelListener();
    92   a1.findUpdates(listener, AddonManager.UPDATE_WHEN_USER_REQUESTED);
    94   // Wait for the http request to arrive
    95   let [request, response] = yield httpReceived.promise;
    97   // cancelUpdate returns true if there is an update check in progress
    98   do_check_true(a1.cancelUpdate());
   100   let updateResult = yield listener.promise;
   101   do_check_eq(AddonManager.UPDATE_STATUS_CANCELLED, updateResult);
   103   // Now complete the HTTP request
   104   let file = do_get_cwd();
   105   file.append("data");
   106   file.append("test_update.rdf");
   107   let data = loadFile(file);
   108   response.write(data);
   109   response.finish();
   111   // trying to cancel again should return false, i.e. nothing to cancel
   112   do_check_false(a1.cancelUpdate());
   114   yield true;
   115 });
   117 // Test that update check is cancelled if the XPI provider shuts down while
   118 // the update check is in progress
   119 add_task(function shutdown_during_check() {
   120   // Reset our HTTP listener
   121   httpReceived = Promise.defer();
   123   let a1 = yield promiseGetAddon("addon1@tests.mozilla.org");
   124   do_check_neq(a1, null);
   126   let listener = makeCancelListener();
   127   a1.findUpdates(listener, AddonManager.UPDATE_WHEN_USER_REQUESTED);
   129   // Wait for the http request to arrive
   130   let [request, response] = yield httpReceived.promise;
   132   shutdownManager();
   134   let updateResult = yield listener.promise;
   135   do_check_eq(AddonManager.UPDATE_STATUS_CANCELLED, updateResult);
   137   // Now complete the HTTP request
   138   let file = do_get_cwd();
   139   file.append("data");
   140   file.append("test_update.rdf");
   141   let data = loadFile(file);
   142   response.write(data);
   143   response.finish();
   145   // trying to cancel again should return false, i.e. nothing to cancel
   146   do_check_false(a1.cancelUpdate());
   148   yield testserver.stop(Promise.defer().resolve);
   149 });

mercurial