summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_http3_prio_helpers.js
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/unit/test_http3_prio_helpers.js')
-rw-r--r--netwerk/test/unit/test_http3_prio_helpers.js121
1 files changed, 121 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_http3_prio_helpers.js b/netwerk/test/unit/test_http3_prio_helpers.js
new file mode 100644
index 0000000000..c1f6d06bcb
--- /dev/null
+++ b/netwerk/test/unit/test_http3_prio_helpers.js
@@ -0,0 +1,121 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// uses head_http3.js, which uses http2-ca.pem
+"use strict";
+
+/* exported inChildProcess, test_flag_priority */
+function inChildProcess() {
+ return Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
+}
+
+let Http3Listener = function (
+ closure,
+ expected_priority,
+ expected_incremental,
+ context
+) {
+ this._closure = closure;
+ this._expected_priority = expected_priority;
+ this._expected_incremental = expected_incremental;
+ this._context = context;
+};
+
+// string -> [string, bool]
+// "u=3,i" -> ["u=3", true]
+function parse_priority_response_header(priority) {
+ const priority_array = priority.split(",");
+
+ // parse for urgency string
+ const urgency = priority_array.find(element => element.includes("u="));
+
+ // parse for incremental bool
+ const incremental = !!priority_array.find(element => element == "i");
+
+ return [urgency ? urgency : null, incremental];
+}
+
+Http3Listener.prototype = {
+ resumed: false,
+
+ onStartRequest: function testOnStartRequest(request) {
+ Assert.equal(request.status, Cr.NS_OK);
+ Assert.equal(request.responseStatus, 200);
+
+ let secinfo = request.securityInfo;
+ Assert.equal(secinfo.resumed, this.resumed);
+ Assert.ok(secinfo.serverCert != null);
+
+ // check priority urgency and incremental from response header
+ let priority_urgency = null;
+ let incremental = null;
+ try {
+ const prh = request.getResponseHeader("priority-mirror");
+ [priority_urgency, incremental] = parse_priority_response_header(prh);
+ } catch (e) {
+ console.log("Failed to get priority-mirror from response header");
+ }
+ Assert.equal(priority_urgency, this._expected_priority, this._context);
+ Assert.equal(incremental, this._expected_incremental, this._context);
+ },
+
+ onDataAvailable: function testOnDataAvailable(request, stream, off, cnt) {
+ read_stream(stream, cnt);
+ },
+
+ onStopRequest: function testOnStopRequest(request, status) {
+ let httpVersion = "";
+ try {
+ httpVersion = request.protocolVersion;
+ } catch (e) {}
+ Assert.equal(httpVersion, "h3-29");
+
+ try {
+ this._closure();
+ } catch (ex) {
+ do_throw("Error in closure function: " + ex);
+ }
+ },
+};
+
+function make_channel(url) {
+ var request = NetUtil.newChannel({
+ uri: url,
+ loadUsingSystemPrincipal: true,
+ });
+ request.QueryInterface(Ci.nsIHttpChannel);
+ return request;
+}
+
+async function test_flag_priority(
+ context,
+ flag,
+ expected_priority,
+ incremental,
+ expected_incremental
+) {
+ var chan = make_channel("https://foo.example.com/priority_mirror");
+ var cos = chan.QueryInterface(Ci.nsIClassOfService);
+
+ // configure the channel with flags
+ if (flag != null) {
+ cos.addClassFlags(flag);
+ }
+
+ // configure the channel with incremental
+ if (incremental != null) {
+ cos.incremental = incremental;
+ }
+
+ await new Promise(resolve =>
+ chan.asyncOpen(
+ new Http3Listener(
+ resolve,
+ expected_priority,
+ expected_incremental,
+ context
+ )
+ )
+ );
+}