1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/unit/test_bug596443.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,96 @@ 1.4 +Cu.import("resource://testing-common/httpd.js"); 1.5 +var httpserver = new HttpServer(); 1.6 + 1.7 +var expectedOnStopRequests = 3; 1.8 + 1.9 +function setupChannel(suffix, xRequest, flags) { 1.10 + var ios = Components.classes["@mozilla.org/network/io-service;1"] 1.11 + .getService(Ci.nsIIOService); 1.12 + var chan = ios.newChannel("http://localhost:" + 1.13 + httpserver.identity.primaryPort + 1.14 + suffix, "", null); 1.15 + if (flags) 1.16 + chan.loadFlags |= flags; 1.17 + 1.18 + var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); 1.19 + httpChan.setRequestHeader("x-request", xRequest, false); 1.20 + 1.21 + return httpChan; 1.22 +} 1.23 + 1.24 +function Listener(response) { 1.25 + this._response = response; 1.26 +} 1.27 +Listener.prototype = { 1.28 + _response: null, 1.29 + _buffer: null, 1.30 + 1.31 + QueryInterface: function(iid) { 1.32 + if (iid.equals(Components.interfaces.nsIStreamListener) || 1.33 + iid.equals(Components.interfaces.nsIRequestObserver) || 1.34 + iid.equals(Components.interfaces.nsISupports)) 1.35 + return this; 1.36 + throw Components.results.NS_ERROR_NO_INTERFACE; 1.37 + }, 1.38 + 1.39 + onStartRequest: function (request, ctx) { 1.40 + this._buffer = ""; 1.41 + }, 1.42 + onDataAvailable: function (request, ctx, stream, offset, count) { 1.43 + this._buffer = this._buffer.concat(read_stream(stream, count)); 1.44 + }, 1.45 + onStopRequest: function (request, ctx, status) { 1.46 + do_check_eq(this._buffer, this._response); 1.47 + if (--expectedOnStopRequests == 0) 1.48 + do_timeout(10, function() { 1.49 + httpserver.stop(do_test_finished); 1.50 + }); 1.51 + } 1.52 +}; 1.53 + 1.54 +function run_test() { 1.55 + httpserver.registerPathHandler("/bug596443", handler); 1.56 + httpserver.start(-1); 1.57 + 1.58 + // make sure we have a profile so we can use the disk-cache 1.59 + do_get_profile(); 1.60 + 1.61 + // clear cache 1.62 + evict_cache_entries(); 1.63 + 1.64 + var ch0 = setupChannel("/bug596443", "Response0", Ci.nsIRequest.LOAD_BYPASS_CACHE); 1.65 + ch0.asyncOpen(new Listener("Response0"), null); 1.66 + 1.67 + var ch1 = setupChannel("/bug596443", "Response1", Ci.nsIRequest.LOAD_BYPASS_CACHE); 1.68 + ch1.asyncOpen(new Listener("Response1"), null); 1.69 + 1.70 + var ch2 = setupChannel("/bug596443", "Should not be used"); 1.71 + ch2.asyncOpen(new Listener("Response1"), null); // Note param: we expect this to come from cache 1.72 + 1.73 + do_test_pending(); 1.74 +} 1.75 + 1.76 +function triggerHandlers() { 1.77 + do_timeout(100, handlers[1]); 1.78 + do_timeout(100, handlers[0]); 1.79 +} 1.80 + 1.81 +var handlers = []; 1.82 +function handler(metadata, response) { 1.83 + var func = function(body) { 1.84 + return function() { 1.85 + response.setStatusLine(metadata.httpVersion, 200, "Ok"); 1.86 + response.setHeader("Content-Type", "text/plain", false); 1.87 + response.setHeader("Content-Length", "" + body.length, false); 1.88 + response.setHeader("Cache-Control", "max-age=600", false); 1.89 + response.bodyOutputStream.write(body, body.length); 1.90 + response.finish(); 1.91 + }}; 1.92 + 1.93 + response.processAsync(); 1.94 + var request = metadata.getHeader("x-request"); 1.95 + handlers.push(func(request)); 1.96 + 1.97 + if (handlers.length > 1) 1.98 + triggerHandlers(); 1.99 +}