1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/unit/test_reentrancy.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,105 @@ 1.4 +Cu.import("resource://testing-common/httpd.js"); 1.5 + 1.6 +XPCOMUtils.defineLazyGetter(this, "URL", function() { 1.7 + return "http://localhost:" + httpserver.identity.primaryPort; 1.8 +}); 1.9 + 1.10 +var httpserver = new HttpServer(); 1.11 +var testpath = "/simple"; 1.12 +var httpbody = "<?xml version='1.0' ?><root>0123456789</root>"; 1.13 + 1.14 +function syncXHR() 1.15 +{ 1.16 + var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"] 1.17 + .createInstance(Ci.nsIXMLHttpRequest); 1.18 + xhr.open("GET", URL + testpath, false); 1.19 + xhr.send(null); 1.20 +} 1.21 + 1.22 +const MAX_TESTS = 2; 1.23 + 1.24 +var listener = { 1.25 + _done_onStart: false, 1.26 + _done_onData: false, 1.27 + _test: 0, 1.28 + 1.29 + QueryInterface: function(iid) { 1.30 + if (iid.equals(Components.interfaces.nsIStreamListener) || 1.31 + iid.equals(Components.interfaces.nsIRequestObserver) || 1.32 + iid.equals(Components.interfaces.nsISupports)) 1.33 + return this; 1.34 + throw Components.results.NS_ERROR_NO_INTERFACE; 1.35 + }, 1.36 + 1.37 + onStartRequest: function(request, ctx) { 1.38 + switch(this._test) { 1.39 + case 0: 1.40 + request.suspend(); 1.41 + syncXHR(); 1.42 + request.resume(); 1.43 + break; 1.44 + case 1: 1.45 + request.suspend(); 1.46 + syncXHR(); 1.47 + do_execute_soon(function() request.resume()); 1.48 + break; 1.49 + case 2: 1.50 + do_execute_soon(function() request.suspend()); 1.51 + do_execute_soon(function() request.resume()); 1.52 + syncXHR(); 1.53 + break; 1.54 + } 1.55 + 1.56 + this._done_onStart = true; 1.57 + }, 1.58 + 1.59 + onDataAvailable: function(request, context, stream, offset, count) { 1.60 + do_check_true(this._done_onStart); 1.61 + read_stream(stream, count); 1.62 + this._done_onData = true; 1.63 + }, 1.64 + 1.65 + onStopRequest: function(request, ctx, status) { 1.66 + do_check_true(this._done_onData); 1.67 + this._reset(); 1.68 + if (this._test <= MAX_TESTS) 1.69 + next_test(); 1.70 + else 1.71 + httpserver.stop(do_test_finished); 1.72 + }, 1.73 + 1.74 + _reset: function() { 1.75 + this._done_onStart = false; 1.76 + this._done_onData = false; 1.77 + this._test++; 1.78 + } 1.79 +}; 1.80 + 1.81 +function makeChan(url) { 1.82 + var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 1.83 + var chan = ios.newChannel(url, null, null).QueryInterface(Ci.nsIHttpChannel); 1.84 + return chan; 1.85 +} 1.86 + 1.87 +function next_test() 1.88 +{ 1.89 + var chan = makeChan(URL + testpath); 1.90 + chan.QueryInterface(Ci.nsIRequest); 1.91 + chan.asyncOpen(listener, null); 1.92 +} 1.93 + 1.94 +function run_test() 1.95 +{ 1.96 + httpserver.registerPathHandler(testpath, serverHandler); 1.97 + httpserver.start(-1); 1.98 + 1.99 + next_test(); 1.100 + 1.101 + do_test_pending(); 1.102 +} 1.103 + 1.104 +function serverHandler(metadata, response) 1.105 +{ 1.106 + response.setHeader("Content-Type", "text/xml", false); 1.107 + response.bodyOutputStream.write(httpbody, httpbody.length); 1.108 +}