Backed out changeset 5c7de47bcacb (bug 1927094) for causing Bug 1928689. a=backout
[gecko.git] / netwerk / test / unit / test_bug1312774_http1.js
blob9232e0042be0213e0bc5e0e1d5cdecf54919f030
1 // test bug 1312774.
2 // Create 6 (=network.http.max-persistent-connections-per-server)
3 // common Http requests and 2 urgent-start Http requests to a single
4 // host and path, in parallel.
5 // Let all the requests unanswered by the server handler. (process them
6 // async and don't finish)
7 // The first 6 pending common requests will fill the limit for per-server
8 // parallelism.
9 // But the two urgent requests must reach the server despite those 6 common
10 // pending requests.
11 // The server handler doesn't let the test finish until all 8 expected requests
12 // arrive.
13 // Note: if the urgent request handling is broken (the urgent-marked requests
14 // get blocked by queuing) this test will time out
16 "use strict";
18 const { HttpServer } = ChromeUtils.importESModule(
19   "resource://testing-common/httpd.sys.mjs"
21 var server = new HttpServer();
22 server.start(-1);
23 var baseURL = "http://localhost:" + server.identity.primaryPort + "/";
24 var maxConnections = 0;
25 var urgentRequests = 0;
26 var debug = false;
28 function log(msg) {
29   if (!debug) {
30     return;
31   }
33   if (msg) {
34     dump("TEST INFO | " + msg + "\n");
35   }
38 function make_channel(url) {
39   var request = NetUtil.newChannel({
40     uri: url,
41     loadUsingSystemPrincipal: true,
42   });
43   request.QueryInterface(Ci.nsIHttpChannel);
44   return request;
47 function serverStopListener() {
48   server.stop();
51 function commonHttpRequest(id) {
52   let uri = baseURL;
53   var chan = make_channel(uri);
54   var listner = new HttpResponseListener(id);
55   chan.setRequestHeader("X-ID", id, false);
56   chan.setRequestHeader("Cache-control", "no-store", false);
57   chan.asyncOpen(listner);
58   log("Create common http request id=" + id);
61 function urgentStartHttpRequest(id) {
62   let uri = baseURL;
63   var chan = make_channel(uri);
64   var listner = new HttpResponseListener(id);
65   var cos = chan.QueryInterface(Ci.nsIClassOfService);
66   cos.addClassFlags(Ci.nsIClassOfService.UrgentStart);
67   chan.setRequestHeader("X-ID", id, false);
68   chan.setRequestHeader("Cache-control", "no-store", false);
69   chan.asyncOpen(listner);
70   log("Create urgent-start http request id=" + id);
73 function setup_httpRequests() {
74   log("setup_httpRequests");
75   for (var i = 0; i < maxConnections; i++) {
76     commonHttpRequest(i);
77     do_test_pending();
78   }
81 function setup_urgentStartRequests() {
82   for (var i = 0; i < urgentRequests; i++) {
83     urgentStartHttpRequest(1000 + i);
84     do_test_pending();
85   }
88 function HttpResponseListener(id) {
89   this.id = id;
92 HttpResponseListener.prototype = {
93   onStartRequest() {},
95   onDataAvailable() {},
97   onStopRequest() {
98     log("STOP id=" + this.id);
99     do_test_finished();
100   },
103 var responseQueue = [];
104 function setup_http_server() {
105   log("setup_http_server");
106   maxConnections = Services.prefs.getIntPref(
107     "network.http.max-persistent-connections-per-server"
108   );
109   urgentRequests = 2;
110   var allCommonHttpRequestReceived = false;
111   // Start server; will be stopped at test cleanup time.
112   server.registerPathHandler("/", function (metadata, response) {
113     var id = metadata.getHeader("X-ID");
114     log("Server recived the response id=" + id);
115     response.processAsync();
116     responseQueue.push(response);
118     if (
119       responseQueue.length == maxConnections &&
120       !allCommonHttpRequestReceived
121     ) {
122       allCommonHttpRequestReceived = true;
123       setup_urgentStartRequests();
124     }
125     // Wait for all expected requests to come but don't process then.
126     // Collect them in a queue for later processing.  We don't want to
127     // respond to the client until all the expected requests are made
128     // to the server.
129     if (responseQueue.length == maxConnections + urgentRequests) {
130       processResponse();
131     }
132   });
134   registerCleanupFunction(function () {
135     server.stop(serverStopListener);
136   });
139 function processResponse() {
140   while (responseQueue.length) {
141     var resposne = responseQueue.pop();
142     resposne.finish();
143   }
146 function run_test() {
147   setup_http_server();
148   setup_httpRequests();