michael@0: // michael@0: // Test that "max_entry_size" prefs for disk- and memory-cache prevents michael@0: // caching resources with size out of bounds michael@0: // michael@0: michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: do_get_profile(); michael@0: michael@0: const prefService = Cc["@mozilla.org/preferences-service;1"] michael@0: .getService(Ci.nsIPrefBranch); michael@0: michael@0: const httpserver = new HttpServer(); michael@0: michael@0: // Repeats the given data until the total size is larger than 1K michael@0: function repeatToLargerThan1K(data) { michael@0: while(data.length <= 1024) michael@0: data += data; michael@0: return data; michael@0: } michael@0: michael@0: function setupChannel(suffix, value) { michael@0: var ios = Components.classes["@mozilla.org/network/io-service;1"] michael@0: .getService(Ci.nsIIOService); michael@0: var chan = ios.newChannel("http://localhost:" + michael@0: httpserver.identity.primaryPort + michael@0: suffix, "", null); michael@0: var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); michael@0: httpChan.setRequestHeader("x-request", value, false); michael@0: michael@0: return httpChan; michael@0: } michael@0: michael@0: var tests = [ michael@0: new InitializeCacheDevices(true, false), // enable and create mem-device michael@0: new TestCacheEntrySize( michael@0: function() { prefService.setIntPref("browser.cache.memory.max_entry_size", 1); }, michael@0: "012345", "9876543210", "012345"), // expect cached value michael@0: new TestCacheEntrySize( michael@0: function() { prefService.setIntPref("browser.cache.memory.max_entry_size", 1); }, michael@0: "0123456789a", "9876543210", "9876543210"), // expect fresh value michael@0: new TestCacheEntrySize( michael@0: function() { prefService.setIntPref("browser.cache.memory.max_entry_size", -1); }, michael@0: "0123456789a", "9876543210", "0123456789a"), // expect cached value michael@0: michael@0: new InitializeCacheDevices(false, true), // enable and create disk-device michael@0: new TestCacheEntrySize( michael@0: function() { prefService.setIntPref("browser.cache.disk.max_entry_size", 1); }, michael@0: "012345", "9876543210", "012345"), // expect cached value michael@0: new TestCacheEntrySize( michael@0: function() { prefService.setIntPref("browser.cache.disk.max_entry_size", 1); }, michael@0: "0123456789a", "9876543210", "9876543210"), // expect fresh value michael@0: new TestCacheEntrySize( michael@0: function() { prefService.setIntPref("browser.cache.disk.max_entry_size", -1); }, michael@0: "0123456789a", "9876543210", "0123456789a"), // expect cached value michael@0: ]; michael@0: michael@0: function nextTest() { michael@0: // We really want each test to be self-contained. Make sure cache is michael@0: // cleared and also let all operations finish before starting a new test michael@0: syncWithCacheIOThread(function() { michael@0: get_cache_service().clear(); michael@0: syncWithCacheIOThread(runNextTest); michael@0: }); michael@0: } michael@0: michael@0: function runNextTest() { michael@0: var aTest = tests.shift(); michael@0: if (!aTest) { michael@0: httpserver.stop(do_test_finished); michael@0: return; michael@0: } michael@0: do_execute_soon(function() { aTest.start(); } ); michael@0: } michael@0: michael@0: // Just make sure devices are created michael@0: function InitializeCacheDevices(memDevice, diskDevice) { michael@0: this.start = function() { michael@0: prefService.setBoolPref("browser.cache.memory.enable", memDevice); michael@0: if (memDevice) { michael@0: try { michael@0: cap = prefService.getIntPref("browser.cache.memory.capacity"); michael@0: } michael@0: catch(ex) { michael@0: cap = 0; michael@0: } michael@0: if (cap == 0) { michael@0: prefService.setIntPref("browser.cache.memory.capacity", 1024); michael@0: } michael@0: } michael@0: prefService.setBoolPref("browser.cache.disk.enable", diskDevice); michael@0: if (diskDevice) { michael@0: try { michael@0: cap = prefService.getIntPref("browser.cache.disk.capacity"); michael@0: } michael@0: catch(ex) { michael@0: cap = 0; michael@0: } michael@0: if (cap == 0) { michael@0: prefService.setIntPref("browser.cache.disk.capacity", 1024); michael@0: } michael@0: } michael@0: var channel = setupChannel("/bug650995", "Initial value"); michael@0: channel.asyncOpen(new ChannelListener( michael@0: nextTest, null), michael@0: null); michael@0: } michael@0: } michael@0: michael@0: function TestCacheEntrySize(setSizeFunc, firstRequest, secondRequest, secondExpectedReply) { michael@0: michael@0: // Initially, this test used 10 bytes as the limit for caching entries. michael@0: // Since we now use 1K granularity we have to extend lengths to be larger michael@0: // than 1K if it is larger than 10 michael@0: if (firstRequest.length > 10) michael@0: firstRequest = repeatToLargerThan1K(firstRequest); michael@0: if (secondExpectedReply.length > 10) michael@0: secondExpectedReply = repeatToLargerThan1K(secondExpectedReply); michael@0: michael@0: this.start = function() { michael@0: setSizeFunc(); michael@0: var channel = setupChannel("/bug650995", firstRequest); michael@0: channel.asyncOpen(new ChannelListener(this.initialLoad, this), null); michael@0: }, michael@0: michael@0: this.initialLoad = function(request, data, ctx) { michael@0: do_check_eq(firstRequest, data); michael@0: var channel = setupChannel("/bug650995", secondRequest); michael@0: do_execute_soon(function() { michael@0: channel.asyncOpen(new ChannelListener(ctx.testAndTriggerNext, ctx), null); michael@0: }); michael@0: }, michael@0: michael@0: this.testAndTriggerNext = function(request, data, ctx) { michael@0: do_check_eq(secondExpectedReply, data); michael@0: do_execute_soon(nextTest); michael@0: } michael@0: } michael@0: michael@0: function run_test() michael@0: { michael@0: httpserver.registerPathHandler("/bug650995", handler); michael@0: httpserver.start(-1); michael@0: michael@0: prefService.setBoolPref("browser.cache.offline.enable", false); michael@0: michael@0: nextTest(); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function handler(metadata, response) { michael@0: var body = "BOOM!"; michael@0: try { michael@0: body = metadata.getHeader("x-request"); michael@0: } catch(e) {} michael@0: michael@0: response.setStatusLine(metadata.httpVersion, 200, "Ok"); michael@0: response.setHeader("Content-Type", "text/plain", false); michael@0: response.setHeader("Cache-Control", "max-age=3600", false); michael@0: response.bodyOutputStream.write(body, body.length); michael@0: }