aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/clientserver_test.go
diff options
context:
space:
mode:
authorNicholas S. Husin <nsh@golang.org>2026-03-30 19:17:03 -0400
committerNicholas Husin <nsh@golang.org>2026-04-10 08:24:28 -0700
commit2f3c778b232dd53c41e1b623d25cd9f4ab28aaa5 (patch)
tree3959d70ffde2c7c385b0cc5c62cb3ac56dbe1516 /src/net/http/clientserver_test.go
parentce4459cf0ee339b3bcf0ed10427079a234aade36 (diff)
downloadgo-2f3c778b232dd53c41e1b623d25cd9f4ab28aaa5.tar.xz
net/http: add support for running HTTP tests against HTTP/3
Add support within clientserver_test.go to bring up a test HTTP/3 server and client when http3Mode testMode option is passed. To be able to reuse net/http/httptest, net/http/httptest.Server.StartTLS (and Start) have been modified so they can be called with a nil Listener. In such cases, both methods will behave identically as usual, but will not actually make its server serve or set its transport dialer, both of which requires having a listener. This should be a no-op for regular users of the package, whose entrypoint via functions such as NewServer will automatically set a local listener. Actually enabling HTTP/3 for our tests will be done in a separate CL. For #70914 Change-Id: Ibc5fc83287b6a04b46e668a54924761a92b620a4 Reviewed-on: https://go-review.googlesource.com/c/go/+/740122 Reviewed-by: Damien Neil <dneil@google.com> Reviewed-by: Nicholas Husin <husin@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/net/http/clientserver_test.go')
-rw-r--r--src/net/http/clientserver_test.go44
1 files changed, 41 insertions, 3 deletions
diff --git a/src/net/http/clientserver_test.go b/src/net/http/clientserver_test.go
index c25db82fe4..aadd8e3dc0 100644
--- a/src/net/http/clientserver_test.go
+++ b/src/net/http/clientserver_test.go
@@ -19,6 +19,7 @@ import (
"log"
"maps"
"net"
+ "net/http"
. "net/http"
"net/http/httptest"
"net/http/httptrace"
@@ -35,8 +36,17 @@ import (
"testing"
"testing/synctest"
"time"
+ _ "unsafe" // for linkname
+
+ _ "golang.org/x/net/http3"
)
+//go:linkname registerHTTP3Transport
+func registerHTTP3Transport(*http.Transport)
+
+//go:linkname registerHTTP3Server
+func registerHTTP3Server(*http.Server) <-chan string
+
type testMode string
const (
@@ -44,13 +54,14 @@ const (
https1Mode = testMode("https1") // HTTPS/1.1
http2Mode = testMode("h2") // HTTP/2
http2UnencryptedMode = testMode("h2unencrypted") // HTTP/2
+ http3Mode = testMode("h3") // HTTP/3
)
func (m testMode) Scheme() string {
switch m {
case http1Mode, http2UnencryptedMode:
return "http"
- case https1Mode, http2Mode:
+ case https1Mode, http2Mode, http3Mode:
return "https"
}
panic("unknown testMode")
@@ -189,7 +200,8 @@ func newClientServerTest(t testing.TB, mode testMode, h Handler, opts ...any) *c
var transportFuncs []func(*Transport)
- if idx := slices.Index(opts, any(optFakeNet)); idx >= 0 {
+ switch idx := slices.Index(opts, any(optFakeNet)); {
+ case idx >= 0:
opts = slices.Delete(opts, idx, idx+1)
cst.li = fakeNetListen()
cst.ts = &httptest.Server{
@@ -201,7 +213,12 @@ func newClientServerTest(t testing.TB, mode testMode, h Handler, opts ...any) *c
return cst.li.connect(), nil
}
})
- } else {
+ case mode == http3Mode:
+ // TODO: support testing HTTP/3 using fakenet.
+ cst.ts = &httptest.Server{
+ Config: &Server{Handler: h},
+ }
+ default:
cst.ts = httptest.NewUnstartedServer(h)
}
@@ -241,6 +258,24 @@ func newClientServerTest(t testing.TB, mode testMode, h Handler, opts ...any) *c
cst.ts.EnableHTTP2 = true
cst.ts.TLS = cst.ts.Config.TLSConfig
cst.ts.StartTLS()
+ case http3Mode:
+ http.ProtocolSetHTTP3(p)
+ cst.ts.TLS = cst.ts.Config.TLSConfig
+ cst.ts.StartTLS()
+ listenAddrCh := registerHTTP3Server(cst.ts.Config)
+
+ cst.ts.Config.TLSConfig = cst.ts.TLS
+ cst.ts.Config.Addr = "localhost:0"
+ go cst.ts.Config.ListenAndServeTLS("", "")
+
+ listenAddr := <-listenAddrCh
+ cst.ts.URL = "https://" + listenAddr
+ t.Cleanup(func() {
+ // Same timeout as in HTTP/2 goAwayTimeout when shutting down in tests.
+ ctx, cancel := context.WithTimeout(t.Context(), 25*time.Millisecond)
+ defer cancel()
+ cst.ts.Config.Shutdown(ctx)
+ })
default:
t.Fatalf("unknown test mode %v", mode)
}
@@ -252,6 +287,9 @@ func newClientServerTest(t testing.TB, mode testMode, h Handler, opts ...any) *c
if cst.tr.Protocols == nil {
cst.tr.Protocols = p
}
+ if mode == http3Mode {
+ registerHTTP3Transport(cst.tr)
+ }
t.Cleanup(func() {
cst.close()