"use strict";
let h3Port;
let h3Route;
let h3AltSvc;
let prefs;
let httpsOrigin;
let tests = [
// The altSvc storage may not be up imediately, therefore run test_no_altsvc_pref
// for a couple times to wait for the storage.
test_no_altsvc_pref,
test_no_altsvc_pref,
test_no_altsvc_pref,
test_altsvc_pref,
testsDone,
];
let current_test = 0;
function run_next_test() {
if (current_test < tests.length) {
dump(
"starting test number " + current_test +
"\n");
tests[current_test]();
current_test++;
}
}
function run_test() {
h3Port = Services.env.get(
"MOZHTTP3_PORT");
Assert.notEqual(h3Port,
null);
Assert.notEqual(h3Port,
"");
h3AltSvc =
":" + h3Port;
h3Route =
"foo.example.com:" + h3Port;
do_get_profile();
prefs = Services.prefs;
prefs.setBoolPref(
"network.http.http3.enable",
true);
prefs.setCharPref(
"network.dns.localDomains",
"foo.example.com");
prefs.setBoolPref(
"network.dns.disableIPv6",
true);
// The certificate for the http3server server is for foo.example.com and
// is signed by http2-ca.pem so add that cert to the trust list as a
// signing cert.
let certdb = Cc[
"@mozilla.org/security/x509certdb;1"].getService(
Ci.nsIX509CertDB
);
addCertFromFile(certdb,
"http2-ca.pem",
"CTu,u,u");
httpsOrigin =
"https://foo.example.com/";
run_next_test();
}
let Http3CheckListener =
function () {};
Http3CheckListener.prototype = {
expectedRoute:
"",
expectedStatus: Cr.NS_OK,
onStartRequest:
function testOnStartRequest(request) {
Assert.ok(request
instanceof Ci.nsIHttpChannel);
Assert.equal(request.status,
this.expectedStatus);
if (Components.isSuccessCode(
this.expectedStatus)) {
Assert.equal(request.responseStatus, 200);
}
},
onDataAvailable:
function testOnDataAvailable(request, stream, off, cnt) {
read_stream(stream, cnt);
},
onStopRequest:
function testOnStopRequest(request, status) {
Assert.equal(status,
this.expectedStatus);
if (Components.isSuccessCode(
this.expectedStatus)) {
Assert.equal(request.responseStatus, 200);
let routed =
"NA";
try {
routed = request.getRequestHeader(
"Alt-Used");
}
catch (e) {}
dump(
"routed is " + routed +
"\n");
Assert.equal(routed,
this.expectedRoute);
let httpVersion =
"";
try {
httpVersion = request.protocolVersion;
}
catch (e) {}
Assert.equal(httpVersion,
"h3");
}
do_test_finished();
},
};
function makeChan(uri) {
let chan = NetUtil.newChannel({
uri,
loadUsingSystemPrincipal:
true,
}).QueryInterface(Ci.nsIHttpChannel);
chan.loadFlags = Ci.nsIChannel.LOAD_INITIAL_DOCUMENT_URI;
return chan;
}
function test_no_altsvc_pref() {
dump(
"test_no_altsvc_pref");
do_test_pending();
let chan = makeChan(httpsOrigin +
"http3-test");
let listener =
new Http3CheckListener();
listener.expectedStatus = Cr.NS_ERROR_CONNECTION_REFUSED;
chan.asyncOpen(listener);
}
function test_altsvc_pref() {
dump(
"test_altsvc_pref");
do_test_pending();
prefs.setCharPref(
"network.http.http3.alt-svc-mapping-for-testing",
"foo.example.com;h3=" + h3AltSvc
);
let chan = makeChan(httpsOrigin +
"http3-test");
let listener =
new Http3CheckListener();
listener.expectedRoute = h3Route;
chan.asyncOpen(listener);
}
function testsDone() {
prefs.clearUserPref(
"network.http.http3.enable");
prefs.clearUserPref(
"network.dns.localDomains");
prefs.clearUserPref(
"network.dns.disableIPv6");
prefs.clearUserPref(
"network.http.http3.alt-svc-mapping-for-testing");
dump(
"testDone\n");
}