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