commit 1145d1dda4368437215783b01e1de1a805a62265
parent ba6fe1dd163d272656332a3d825c716a3ad9dedc
Author: Kershaw Chang <kershaw@mozilla.com>
Date: Tue, 14 Oct 2025 08:25:01 +0000
Bug 1993438 - Run tests in http3_common.js with HTTP/3 proxy, r=necko-reviewers,valentin,jesup
Differential Revision: https://phabricator.services.mozilla.com/D268122
Diffstat:
2 files changed, 190 insertions(+), 0 deletions(-)
diff --git a/netwerk/test/unit/test_http3_with_proxy.js b/netwerk/test/unit/test_http3_with_proxy.js
@@ -0,0 +1,180 @@
+"use strict";
+
+/* import-globals-from http3_common.js */
+
+const { Http3ProxyFilter, NodeHTTP2ProxyServer } = ChromeUtils.importESModule(
+ "resource://testing-common/NodeServer.sys.mjs"
+);
+
+// Max concurent stream number in neqo is 100.
+// Openning 120 streams will test queuing of streams.
+let number_of_parallel_requests = 120;
+let h3Route;
+let httpsOrigin;
+let h3AltSvc;
+let h3Port;
+let h3ServerDomain;
+let prefs;
+
+let pps = Cc["@mozilla.org/network/protocol-proxy-service;1"].getService();
+let proxyHost;
+let proxyPort;
+let proxyFilter;
+
+add_setup(async function () {
+ let h2Port = Services.env.get("MOZHTTP2_PORT");
+ Assert.notEqual(h2Port, null);
+ Assert.notEqual(h2Port, "");
+ h3Port = await create_h3_server();
+ Assert.notEqual(h3Port, null);
+ Assert.notEqual(h3Port, "");
+ h3AltSvc = ":" + h3Port;
+ h3ServerDomain = "foo.example.com";
+ h3Route = `${h3ServerDomain}:${h3Port}`;
+ do_get_profile();
+ prefs = Services.prefs;
+
+ prefs.setBoolPref("network.http.http3.enable", true);
+ // We always resolve elements of localDomains as it's hardcoded without the
+ // following pref:
+ prefs.setBoolPref("network.proxy.allow_hijacking_localhost", true);
+ prefs.setBoolPref("network.http.altsvc.oe", true);
+
+ if (mozinfo.os == "android") {
+ // Set necessary prefs to make Firefox connect to the http3Server on the
+ // host machine.
+ prefs.setCharPref("network.dns.localDomains", "");
+ const overrideService = Cc[
+ "@mozilla.org/network/native-dns-override;1"
+ ].getService(Ci.nsINativeDNSResolverOverride);
+ overrideService.addIPOverride(h3ServerDomain, "10.0.2.2");
+ prefs.setCharPref(
+ "network.http.http3.alt-svc-mapping-for-testing",
+ `${h3ServerDomain};h3=:${h3Port}`
+ );
+ } else {
+ prefs.setCharPref(
+ "network.dns.localDomains",
+ "foo.example.com, alt1.example.com"
+ );
+ }
+
+ // 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");
+ addCertFromFile(certdb, "proxy-ca.pem", "CTu,u,u");
+ httpsOrigin = `https://${h3ServerDomain}:${h2Port}/`;
+
+ proxyHost = "alt1.example.com";
+ proxyPort = (await create_masque_proxy_server()).masqueProxyPort;
+ Assert.notEqual(proxyPort, null);
+ Assert.notEqual(proxyPort, "");
+ proxyFilter = new Http3ProxyFilter(
+ proxyHost,
+ proxyPort,
+ 0,
+ "/.well-known/masque/udp/{target_host}/{target_port}/",
+ ""
+ );
+ pps.registerFilter(proxyFilter, 10);
+
+ registerCleanupFunction(() => {
+ prefs.clearUserPref("network.http.http3.enable");
+ prefs.clearUserPref("network.dns.localDomains");
+ prefs.clearUserPref("network.proxy.allow_hijacking_localhost");
+ prefs.clearUserPref("network.http.altsvc.oe");
+ prefs.clearUserPref("network.http.http3.alt-svc-mapping-for-testing");
+ pps.unregisterFilter(proxyFilter);
+ if (mozinfo.os == "android") {
+ const overrideService = Cc[
+ "@mozilla.org/network/native-dns-override;1"
+ ].getService(Ci.nsINativeDNSResolverOverride);
+ overrideService.clearOverrides();
+ }
+ });
+});
+
+add_task(async function test_https_alt_svc() {
+ await waitForHttp3Route(httpsOrigin + "http3-test", h3Route, h3AltSvc, {
+ delayMs: 500,
+ });
+});
+
+add_task(async function test_multiple_requests() {
+ await do_test_multiple_requests(
+ number_of_parallel_requests,
+ h3Route,
+ httpsOrigin
+ );
+});
+
+add_task(async function test_request_cancelled_by_server() {
+ await do_test_request_cancelled_by_server(h3Route, httpsOrigin);
+});
+
+add_task(async function test_stream_cancelled_by_necko() {
+ await do_test_stream_cancelled_by_necko(h3Route, httpsOrigin);
+});
+
+add_task(async function test_multiple_request_one_is_cancelled() {
+ await do_test_multiple_request_one_is_cancelled(
+ number_of_parallel_requests,
+ h3Route,
+ httpsOrigin
+ );
+});
+
+add_task(async function test_multiple_request_one_is_cancelled_by_necko() {
+ await do_test_multiple_request_one_is_cancelled_by_necko(
+ number_of_parallel_requests,
+ h3Route,
+ httpsOrigin
+ );
+});
+
+add_task(async function test_post() {
+ await do_test_post(httpsOrigin, h3Route);
+});
+
+add_task(async function test_patch() {
+ await do_test_patch(httpsOrigin, h3Route);
+});
+
+add_task(
+ {
+ // Skip this test on Android because the httpOrigin (http://foo.example.com)
+ // is on 127.0.0.1, while the http3Server (https://foo.example.com) is
+ // on 10.0.2.2. Currently, we can't change the IP mapping dynamically.
+ skip_if: () => mozinfo.os == "android",
+ },
+ async function test_http_alt_svc() {
+ setup_h1_server(h3ServerDomain);
+ await waitForHttp3Route(httpOrigin + "http3-test", h3Route, h3AltSvc, {
+ delayMs: 500,
+ });
+ }
+);
+
+add_task(async function test_slow_receiver() {
+ await do_test_slow_receiver(httpsOrigin, h3Route);
+});
+
+// This test should be at the end, because it will close http3
+// connection and the transaction will switch to already existing http2
+// connection.
+// TODO: Bug 1582667 should try to fix issue with connection being closed.
+add_task(async function test_version_fallback() {
+ let proxy = new NodeHTTP2ProxyServer();
+ await proxy.startWithoutProxyFilter(proxyPort);
+ registerCleanupFunction(async () => {
+ await proxy.stop();
+ });
+ Assert.equal(proxyPort, proxy.port());
+ info(`proxy port=${proxy.port()}\n`);
+
+ await do_test_version_fallback(httpsOrigin);
+});
diff --git a/netwerk/test/unit/xpcshell.toml b/netwerk/test/unit/xpcshell.toml
@@ -719,6 +719,16 @@ skip-if = [
"os == 'win' && os_version == '11.26100' && processor == 'x86_64' && msix", # Bug 1807931
]
+["test_http3_with_proxy.js"]
+head = "head_cookies.js head_channels.js head_cache.js head_http3.js http3_common.js"
+run-sequentially = ["true"] # http3server
+skip-if = [
+ "os == 'android' && os_version == '14' && processor == 'x86_64'", # Bug 1982955
+ "os == 'win' && os_version == '10.2009' && processor == 'x86_64'", # Bug 1807931
+ "os == 'win' && os_version == '11.26100' && processor == 'x86'", # Bug 1807931
+ "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && msix", # Bug 1807931
+]
+
["test_http3_0rtt.js"]
skip-if = [
"os == 'win' && os_version == '10.2009' && processor == 'x86_64'",