1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/unit/test_cache_jar.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,108 @@ 1.4 +Cu.import("resource://testing-common/httpd.js"); 1.5 +Cu.import("resource://gre/modules/Services.jsm"); 1.6 +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 1.7 + 1.8 +XPCOMUtils.defineLazyGetter(this, "URL", function() { 1.9 + return "http://localhost:" + httpserv.identity.primaryPort + "/cached"; 1.10 +}); 1.11 + 1.12 +var httpserv = null; 1.13 +var handlers_called = 0; 1.14 + 1.15 +function cached_handler(metadata, response) { 1.16 + response.setHeader("Content-Type", "text/plain", false); 1.17 + response.setHeader("Cache-Control", "max-age=10000", false); 1.18 + response.setStatusLine(metadata.httpVersion, 200, "OK"); 1.19 + var body = "0123456789"; 1.20 + response.bodyOutputStream.write(body, body.length); 1.21 + handlers_called++; 1.22 +} 1.23 + 1.24 +function makeChan(url, appId, inBrowser) { 1.25 + var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 1.26 + var chan = ios.newChannel(url, null, null).QueryInterface(Ci.nsIHttpChannel); 1.27 + chan.notificationCallbacks = { 1.28 + appId: appId, 1.29 + isInBrowserElement: inBrowser, 1.30 + QueryInterface: function(iid) { 1.31 + if (iid.equals(Ci.nsILoadContext)) 1.32 + return this; 1.33 + throw Cr.NS_ERROR_NO_INTERFACE; 1.34 + }, 1.35 + getInterface: function(iid) { return this.QueryInterface(iid); } 1.36 + }; 1.37 + return chan; 1.38 +} 1.39 + 1.40 +var firstTests = [[0, false, 1], [0, true, 1], [1, false, 1], [1, true, 1]]; 1.41 +var secondTests = [[0, false, 0], [0, true, 0], [1, false, 0], [1, true, 1]]; 1.42 +var thirdTests = [[0, false, 0], [0, true, 0], [1, false, 1], [1, true, 1]]; 1.43 + 1.44 +function run_all_tests() { 1.45 + for (let test of firstTests) { 1.46 + handlers_called = 0; 1.47 + var chan = makeChan(URL, test[0], test[1]); 1.48 + chan.asyncOpen(new ChannelListener(doneFirstLoad, test[2]), null); 1.49 + yield undefined; 1.50 + } 1.51 + 1.52 + // We can't easily cause webapp data to be cleared from the child process, so skip 1.53 + // the rest of these tests. 1.54 + let procType = Cc["@mozilla.org/xre/runtime;1"].getService(Ci.nsIXULRuntime).processType; 1.55 + if (procType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) 1.56 + return; 1.57 + 1.58 + let subject = { 1.59 + appId: 1, 1.60 + browserOnly: true, 1.61 + QueryInterface: XPCOMUtils.generateQI([Ci.mozIApplicationClearPrivateDataParams]) 1.62 + }; 1.63 + Services.obs.notifyObservers(subject, "webapps-clear-data", null); 1.64 + 1.65 + for (let test of secondTests) { 1.66 + handlers_called = 0; 1.67 + var chan = makeChan(URL, test[0], test[1]); 1.68 + chan.asyncOpen(new ChannelListener(doneFirstLoad, test[2]), null); 1.69 + yield undefined; 1.70 + } 1.71 + 1.72 + subject = { 1.73 + appId: 1, 1.74 + browserOnly: false, 1.75 + QueryInterface: XPCOMUtils.generateQI([Ci.mozIApplicationClearPrivateDataParams]) 1.76 + }; 1.77 + Services.obs.notifyObservers(subject, "webapps-clear-data", null); 1.78 + 1.79 + for (let test of thirdTests) { 1.80 + handlers_called = 0; 1.81 + var chan = makeChan(URL, test[0], test[1]); 1.82 + chan.asyncOpen(new ChannelListener(doneFirstLoad, test[2]), null); 1.83 + yield undefined; 1.84 + } 1.85 +} 1.86 + 1.87 +let gTests; 1.88 +function run_test() { 1.89 + do_get_profile(); 1.90 + do_test_pending(); 1.91 + httpserv = new HttpServer(); 1.92 + httpserv.registerPathHandler("/cached", cached_handler); 1.93 + httpserv.start(-1); 1.94 + gTests = run_all_tests(); 1.95 + gTests.next(); 1.96 +} 1.97 + 1.98 +function doneFirstLoad(req, buffer, expected) { 1.99 + // Load it again, make sure it hits the cache 1.100 + var chan = makeChan(URL, 0, false); 1.101 + chan.asyncOpen(new ChannelListener(doneSecondLoad, expected), null); 1.102 +} 1.103 + 1.104 +function doneSecondLoad(req, buffer, expected) { 1.105 + do_check_eq(handlers_called, expected); 1.106 + try { 1.107 + gTests.next(); 1.108 + } catch (x) { 1.109 + do_test_finished(); 1.110 + } 1.111 +}