netwerk/test/unit/test_bug650995.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/netwerk/test/unit/test_bug650995.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,161 @@
     1.4 +//
     1.5 +// Test that "max_entry_size" prefs for disk- and memory-cache prevents
     1.6 +// caching resources with size out of bounds
     1.7 +//
     1.8 +
     1.9 +Cu.import("resource://testing-common/httpd.js");
    1.10 +
    1.11 +do_get_profile();
    1.12 +
    1.13 +const prefService = Cc["@mozilla.org/preferences-service;1"]
    1.14 +                       .getService(Ci.nsIPrefBranch);
    1.15 +
    1.16 +const httpserver = new HttpServer();
    1.17 +
    1.18 +// Repeats the given data until the total size is larger than 1K
    1.19 +function repeatToLargerThan1K(data) {
    1.20 +    while(data.length <= 1024)
    1.21 +        data += data;
    1.22 +    return data;
    1.23 +}
    1.24 +
    1.25 +function setupChannel(suffix, value) {
    1.26 +    var ios = Components.classes["@mozilla.org/network/io-service;1"]
    1.27 +            .getService(Ci.nsIIOService);
    1.28 +    var chan = ios.newChannel("http://localhost:" +
    1.29 +                              httpserver.identity.primaryPort +
    1.30 +                              suffix, "", null);
    1.31 +    var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel);
    1.32 +    httpChan.setRequestHeader("x-request", value, false);
    1.33 +    
    1.34 +    return httpChan;
    1.35 +}
    1.36 +
    1.37 +var tests = [
    1.38 +             new InitializeCacheDevices(true, false), // enable and create mem-device
    1.39 +             new TestCacheEntrySize(
    1.40 +                 function() { prefService.setIntPref("browser.cache.memory.max_entry_size", 1); },
    1.41 +                              "012345", "9876543210", "012345"), // expect cached value
    1.42 +             new TestCacheEntrySize(
    1.43 +                 function() { prefService.setIntPref("browser.cache.memory.max_entry_size", 1); },
    1.44 +                              "0123456789a", "9876543210", "9876543210"), // expect fresh value
    1.45 +             new TestCacheEntrySize(
    1.46 +                 function() { prefService.setIntPref("browser.cache.memory.max_entry_size", -1); },
    1.47 +                              "0123456789a", "9876543210", "0123456789a"), // expect cached value
    1.48 +
    1.49 +             new InitializeCacheDevices(false, true), // enable and create disk-device
    1.50 +             new TestCacheEntrySize(
    1.51 +                 function() { prefService.setIntPref("browser.cache.disk.max_entry_size", 1); },
    1.52 +                              "012345", "9876543210", "012345"), // expect cached value
    1.53 +             new TestCacheEntrySize(
    1.54 +                 function() { prefService.setIntPref("browser.cache.disk.max_entry_size", 1); },
    1.55 +                              "0123456789a", "9876543210", "9876543210"), // expect fresh value
    1.56 +             new TestCacheEntrySize(
    1.57 +                 function() { prefService.setIntPref("browser.cache.disk.max_entry_size", -1); },
    1.58 +                              "0123456789a", "9876543210", "0123456789a"), // expect cached value
    1.59 +            ];
    1.60 +
    1.61 +function nextTest() {
    1.62 +    // We really want each test to be self-contained. Make sure cache is
    1.63 +    // cleared and also let all operations finish before starting a new test
    1.64 +    syncWithCacheIOThread(function() {
    1.65 +        get_cache_service().clear();
    1.66 +        syncWithCacheIOThread(runNextTest);
    1.67 +    });
    1.68 +}
    1.69 +
    1.70 +function runNextTest() {
    1.71 +    var aTest = tests.shift();
    1.72 +    if (!aTest) {
    1.73 +        httpserver.stop(do_test_finished);
    1.74 +        return;
    1.75 +    }
    1.76 +    do_execute_soon(function() { aTest.start(); } );
    1.77 +}
    1.78 +
    1.79 +// Just make sure devices are created
    1.80 +function InitializeCacheDevices(memDevice, diskDevice) {
    1.81 +    this.start = function() {
    1.82 +        prefService.setBoolPref("browser.cache.memory.enable", memDevice);
    1.83 +        if (memDevice) {
    1.84 +            try {
    1.85 +                cap = prefService.getIntPref("browser.cache.memory.capacity");
    1.86 +            }
    1.87 +            catch(ex) {
    1.88 +                cap = 0;
    1.89 +            }
    1.90 +            if (cap == 0) {
    1.91 +                prefService.setIntPref("browser.cache.memory.capacity", 1024);
    1.92 +            }
    1.93 +        }
    1.94 +        prefService.setBoolPref("browser.cache.disk.enable", diskDevice);
    1.95 +        if (diskDevice) {
    1.96 +            try {
    1.97 +                cap = prefService.getIntPref("browser.cache.disk.capacity");
    1.98 +            }
    1.99 +            catch(ex) {
   1.100 +                cap = 0;
   1.101 +            }
   1.102 +            if (cap == 0) {
   1.103 +                prefService.setIntPref("browser.cache.disk.capacity", 1024);
   1.104 +            }
   1.105 +        }
   1.106 +        var channel = setupChannel("/bug650995", "Initial value");
   1.107 +        channel.asyncOpen(new ChannelListener(
   1.108 +            nextTest, null),
   1.109 +            null);
   1.110 +    }
   1.111 +}
   1.112 +
   1.113 +function TestCacheEntrySize(setSizeFunc, firstRequest, secondRequest, secondExpectedReply) {
   1.114 +
   1.115 +    // Initially, this test used 10 bytes as the limit for caching entries.
   1.116 +    // Since we now use 1K granularity we have to extend lengths to be larger
   1.117 +    // than 1K if it is larger than 10
   1.118 +    if (firstRequest.length > 10)
   1.119 +        firstRequest = repeatToLargerThan1K(firstRequest);
   1.120 +    if (secondExpectedReply.length > 10)
   1.121 +        secondExpectedReply = repeatToLargerThan1K(secondExpectedReply);
   1.122 +
   1.123 +    this.start = function() {
   1.124 +        setSizeFunc();
   1.125 +        var channel = setupChannel("/bug650995", firstRequest);
   1.126 +        channel.asyncOpen(new ChannelListener(this.initialLoad, this), null);
   1.127 +    },
   1.128 +
   1.129 +    this.initialLoad = function(request, data, ctx) {
   1.130 +        do_check_eq(firstRequest, data);
   1.131 +        var channel = setupChannel("/bug650995", secondRequest);
   1.132 +        do_execute_soon(function() {
   1.133 +            channel.asyncOpen(new ChannelListener(ctx.testAndTriggerNext, ctx), null);
   1.134 +            });
   1.135 +    },
   1.136 +
   1.137 +    this.testAndTriggerNext = function(request, data, ctx) {
   1.138 +        do_check_eq(secondExpectedReply, data);
   1.139 +        do_execute_soon(nextTest);
   1.140 +    }
   1.141 +}
   1.142 +
   1.143 +function run_test()
   1.144 +{
   1.145 +    httpserver.registerPathHandler("/bug650995", handler);
   1.146 +    httpserver.start(-1);
   1.147 +
   1.148 +    prefService.setBoolPref("browser.cache.offline.enable", false);
   1.149 +
   1.150 +    nextTest();
   1.151 +    do_test_pending();
   1.152 +}
   1.153 +
   1.154 +function handler(metadata, response) {
   1.155 +    var body = "BOOM!";
   1.156 +    try {
   1.157 +        body = metadata.getHeader("x-request");
   1.158 +    } catch(e) {}
   1.159 +
   1.160 +    response.setStatusLine(metadata.httpVersion, 200, "Ok");
   1.161 +    response.setHeader("Content-Type", "text/plain", false);
   1.162 +    response.setHeader("Cache-Control", "max-age=3600", false);
   1.163 +    response.bodyOutputStream.write(body, body.length);
   1.164 +}

mercurial