4 // Transactions in one pending queue are splited into two groups:
5 // [(Blocking Group)|(Non Blocking Group)]
6 // In each group, the transactions are ordered by its priority.
7 // This test will check if the transaction's order in pending queue is correct.
10 // 1. Create 6 dummy http requests. Server would not process responses until get
12 // 2. Once server receive 6 dummy requests, create another 6 http requests with the
13 // defined priority and class flag in |transactionQueue|.
14 // 3. Server starts to process the 6 dummy http requests, so the client can start to
15 // process the pending queue. Server will queue those http requests and put them in
17 // 4. When the server receive all 6 requests, check if the order in |responseQueue| is
18 // equal to |transactionQueue| by comparing the value of X-ID.
22 const { HttpServer
} = ChromeUtils
.importESModule(
23 "resource://testing-common/httpd.sys.mjs"
26 var server
= new HttpServer();
28 var baseURL
= "http://localhost:" + server
.identity
.primaryPort
+ "/";
29 var maxConnections
= 0;
31 var dummyResponseQueue
= [];
32 var responseQueue
= [];
40 dump("TEST INFO | " + msg
+ "\n");
44 function make_channel(url
) {
45 var request
= NetUtil
.newChannel({
47 loadUsingSystemPrincipal
: true,
49 request
.QueryInterface(Ci
.nsIHttpChannel
);
53 function serverStopListener() {
57 function createHttpRequest(requestId
, priority
, isBlocking
, callback
) {
59 var chan
= make_channel(uri
);
60 var listner
= new HttpResponseListener(requestId
, callback
);
61 chan
.setRequestHeader("X-ID", requestId
, false);
62 chan
.setRequestHeader("Cache-control", "no-store", false);
63 chan
.QueryInterface(Ci
.nsISupportsPriority
).priority
= priority
;
65 var cos
= chan
.QueryInterface(Ci
.nsIClassOfService
);
66 cos
.addClassFlags(Ci
.nsIClassOfService
.Leader
);
68 chan
.asyncOpen(listner
);
69 log("Create http request id=" + requestId
);
72 function setup_dummyHttpRequests(callback
) {
73 log("setup_dummyHttpRequests");
74 for (var i
= 0; i
< maxConnections
; i
++) {
75 createHttpRequest(i
, i
, false, callback
);
80 var transactionQueue
= [
83 priority
: Ci
.nsISupportsPriority
.PRIORITY_HIGH
,
88 priority
: Ci
.nsISupportsPriority
.PRIORITY_NORMAL
,
93 priority
: Ci
.nsISupportsPriority
.PRIORITY_LOW
,
98 priority
: Ci
.nsISupportsPriority
.PRIORITY_HIGH
,
103 priority
: Ci
.nsISupportsPriority
.PRIORITY_NORMAL
,
108 priority
: Ci
.nsISupportsPriority
.PRIORITY_LOW
,
113 function setup_HttpRequests() {
114 log("setup_HttpRequests");
115 // Create channels in reverse order
116 for (var i
= transactionQueue
.length
- 1; i
> -1; ) {
117 var e
= transactionQueue
[i
];
118 createHttpRequest(e
.requestId
, e
.priority
, e
.isBlocking
);
124 function check_response_id(responses
) {
125 for (var i
= 0; i
< responses
.length
; i
++) {
126 var id
= responses
[i
].getHeader("X-ID");
127 Assert
.equal(id
, transactionQueue
[i
].requestId
);
131 function HttpResponseListener(id
, onStopCallback
) {
133 this.stopCallback
= onStopCallback
;
136 HttpResponseListener
.prototype = {
139 onDataAvailable() {},
142 log("STOP id=" + this.id
);
144 if (this.stopCallback
) {
150 function setup_http_server() {
151 log("setup_http_server");
152 maxConnections
= Services
.prefs
.getIntPref(
153 "network.http.max-persistent-connections-per-server"
156 var allDummyHttpRequestReceived
= false;
157 // Start server; will be stopped at test cleanup time.
158 server
.registerPathHandler("/", function (metadata
, response
) {
159 var id
= metadata
.getHeader("X-ID");
160 log("Server recived the response id=" + id
);
162 response
.processAsync();
163 response
.setHeader("X-ID", id
);
165 if (!allDummyHttpRequestReceived
) {
166 dummyResponseQueue
.push(response
);
168 responseQueue
.push(response
);
171 if (dummyResponseQueue
.length
== maxConnections
) {
172 log("received all dummy http requets");
173 allDummyHttpRequestReceived
= true;
174 setup_HttpRequests();
175 processDummyResponse();
176 } else if (responseQueue
.length
== maxConnections
) {
177 log("received all http requets");
178 check_response_id(responseQueue
);
183 registerCleanupFunction(function () {
184 server
.stop(serverStopListener
);
188 function processDummyResponse() {
189 if (!dummyResponseQueue
.length
) {
192 var resposne
= dummyResponseQueue
.pop();
196 function processResponses() {
197 while (responseQueue
.length
) {
198 var resposne
= responseQueue
.pop();
203 function run_test() {
205 setup_dummyHttpRequests(processDummyResponse
);