diff options
Diffstat (limited to 'netwerk/test/unit/test_cache_jar.js')
-rw-r--r-- | netwerk/test/unit/test_cache_jar.js | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_cache_jar.js b/netwerk/test/unit/test_cache_jar.js new file mode 100644 index 000000000..126e811f8 --- /dev/null +++ b/netwerk/test/unit/test_cache_jar.js @@ -0,0 +1,126 @@ +Cu.import("resource://testing-common/httpd.js"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/NetUtil.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyGetter(this, "URL", function() { + return "http://localhost:" + httpserv.identity.primaryPort + "/cached"; +}); + +var httpserv = null; +var handlers_called = 0; + +function cached_handler(metadata, response) { + response.setHeader("Content-Type", "text/plain", false); + response.setHeader("Cache-Control", "max-age=10000", false); + response.setStatusLine(metadata.httpVersion, 200, "OK"); + var body = "0123456789"; + response.bodyOutputStream.write(body, body.length); + handlers_called++; +} + +function makeChan(url, appId, inIsolatedMozBrowser, userContextId) { + var chan = NetUtil.newChannel({uri: url, loadUsingSystemPrincipal: true}) + .QueryInterface(Ci.nsIHttpChannel); + chan.loadInfo.originAttributes = { appId: appId, + inIsolatedMozBrowser: inIsolatedMozBrowser, + userContextId: userContextId, + }; + return chan; +} + +// [appId, inIsolatedMozBrowser, userContextId, expected_handlers_called] +var firstTests = [ + [0, false, 0, 1], [0, true, 0, 1], [1, false, 0, 1], [1, true, 0, 1], + [0, false, 1, 1], [0, true, 1, 1], [1, false, 1, 1], [1, true, 1, 1] +]; +var secondTests = [ + [0, false, 0, 0], [0, true, 0, 0], [1, false, 0, 0], [1, true, 0, 1], + [0, false, 1, 0], [0, true, 1, 0], [1, false, 1, 0], [1, true, 1, 0] +]; +var thirdTests = [ + [0, false, 0, 0], [0, true, 0, 0], [1, false, 0, 1], [1, true, 0, 1], + [0, false, 1, 0], [0, true, 1, 0], [1, false, 1, 0], [1, true, 1, 0] +]; +var fourthTests = [ + [0, false, 0, 0], [0, true, 0, 0], [1, false, 0, 0], [1, true, 0, 0], + [0, false, 1, 1], [0, true, 1, 0], [1, false, 1, 0], [1, true, 1, 0] +]; + +function run_all_tests() { + for (let test of firstTests) { + handlers_called = 0; + var chan = makeChan(URL, test[0], test[1], test[2]); + chan.asyncOpen2(new ChannelListener(doneFirstLoad, test[3])); + yield undefined; + } + + // We can't easily cause webapp data to be cleared from the child process, so skip + // the rest of these tests. + let procType = Cc["@mozilla.org/xre/runtime;1"].getService(Ci.nsIXULRuntime).processType; + if (procType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) + return; + + let attrs_inBrowser = JSON.stringify({ appId:1, inIsolatedMozBrowser:true }); + let attrs_notInBrowser = JSON.stringify({ appId:1 }); + + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_inBrowser); + + for (let test of secondTests) { + handlers_called = 0; + var chan = makeChan(URL, test[0], test[1], test[2]); + chan.asyncOpen2(new ChannelListener(doneFirstLoad, test[3])); + yield undefined; + } + + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_notInBrowser); + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_inBrowser); + + for (let test of thirdTests) { + handlers_called = 0; + var chan = makeChan(URL, test[0], test[1], test[2]); + chan.asyncOpen2(new ChannelListener(doneFirstLoad, test[3])); + yield undefined; + } + + let attrs_userContextId = JSON.stringify({ userContextId: 1 }); + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_userContextId); + + for (let test of fourthTests) { + handlers_called = 0; + var chan = makeChan(URL, test[0], test[1], test[2]); + chan.asyncOpen2(new ChannelListener(doneFirstLoad, test[3])); + yield undefined; + } +} + +var gTests; +function run_test() { + do_get_profile(); + if (!newCacheBackEndUsed()) { + do_check_true(true, "This test checks only cache2 specific behavior."); + return; + } + do_test_pending(); + httpserv = new HttpServer(); + httpserv.registerPathHandler("/cached", cached_handler); + httpserv.start(-1); + gTests = run_all_tests(); + gTests.next(); +} + +function doneFirstLoad(req, buffer, expected) { + // Load it again, make sure it hits the cache + var oa = req.loadInfo.originAttributes; + var chan = makeChan(URL, oa.appId, oa.isInIsolatedMozBrowserElement, oa.userContextId); + chan.asyncOpen2(new ChannelListener(doneSecondLoad, expected)); +} + +function doneSecondLoad(req, buffer, expected) { + do_check_eq(handlers_called, expected); + try { + gTests.next(); + } catch (x) { + do_test_finished(); + } +} |