netwerk/test/unit/test_reentrancy.js

Wed, 31 Dec 2014 13:27:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 13:27:57 +0100
branch
TOR_BUG_3246
changeset 6
8bccb770b82d
permissions
-rw-r--r--

Ignore runtime configuration files generated during quality assurance.

     1 Cu.import("resource://testing-common/httpd.js");
     3 XPCOMUtils.defineLazyGetter(this, "URL", function() {
     4   return "http://localhost:" + httpserver.identity.primaryPort;
     5 });
     7 var httpserver = new HttpServer();
     8 var testpath = "/simple";
     9 var httpbody = "<?xml version='1.0' ?><root>0123456789</root>";
    11 function syncXHR()
    12 {
    13   var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
    14             .createInstance(Ci.nsIXMLHttpRequest);
    15   xhr.open("GET", URL + testpath, false);
    16   xhr.send(null);    
    17 }
    19 const MAX_TESTS = 2;
    21 var listener = {
    22   _done_onStart: false,
    23   _done_onData: false,
    24   _test: 0,
    26   QueryInterface: function(iid) {
    27     if (iid.equals(Components.interfaces.nsIStreamListener) ||
    28         iid.equals(Components.interfaces.nsIRequestObserver) ||
    29         iid.equals(Components.interfaces.nsISupports))
    30       return this;
    31     throw Components.results.NS_ERROR_NO_INTERFACE;
    32   },
    34   onStartRequest: function(request, ctx) {
    35     switch(this._test) {
    36       case 0:
    37         request.suspend();
    38         syncXHR();
    39         request.resume();
    40         break;
    41       case 1:
    42         request.suspend();
    43         syncXHR();
    44         do_execute_soon(function() request.resume());
    45         break;
    46       case 2:
    47         do_execute_soon(function() request.suspend());
    48         do_execute_soon(function() request.resume());
    49         syncXHR();
    50         break;
    51     }
    53     this._done_onStart = true;
    54   },
    56   onDataAvailable: function(request, context, stream, offset, count) {
    57     do_check_true(this._done_onStart);
    58     read_stream(stream, count);
    59     this._done_onData = true;
    60   },
    62   onStopRequest: function(request, ctx, status) {
    63     do_check_true(this._done_onData);
    64     this._reset();
    65     if (this._test <= MAX_TESTS)
    66       next_test();
    67     else
    68       httpserver.stop(do_test_finished);      
    69   },
    71   _reset: function() {
    72     this._done_onStart = false;
    73     this._done_onData = false;
    74     this._test++;
    75   }
    76 };
    78 function makeChan(url) {
    79   var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
    80   var chan = ios.newChannel(url, null, null).QueryInterface(Ci.nsIHttpChannel);
    81   return chan;
    82 }
    84 function next_test()
    85 {
    86   var chan = makeChan(URL + testpath);
    87   chan.QueryInterface(Ci.nsIRequest);
    88   chan.asyncOpen(listener, null);
    89 }
    91 function run_test()
    92 {
    93   httpserver.registerPathHandler(testpath, serverHandler);
    94   httpserver.start(-1);
    96   next_test();
    98   do_test_pending();
    99 }
   101 function serverHandler(metadata, response)
   102 {
   103   response.setHeader("Content-Type", "text/xml", false);
   104   response.bodyOutputStream.write(httpbody, httpbody.length);
   105 }

mercurial