internal/http3: fix build of tests with GOEXPERIMENT=nosynctest
The tests in qpack_decode_test.go require synctest helpers from
http3_test.go, but that file has a goexperiment.synctest build
constraint.
To make builds work when GOEXPERIMENT=nosynctest is specified the
synctest helpers are refactored into http3_synctest_test.go (with the
same build constraint) and the non-synctest related functionality is
kept in http3_test.go.
Change-Id: Iae339dc1895f27e7ac5ba985e204f4868c229a4d
Reviewed-on: https://go-review.googlesource.com/c/net/+/660535
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/http3/http3_synctest_test.go b/internal/http3/http3_synctest_test.go
new file mode 100644
index 0000000..ad26c6d
--- /dev/null
+++ b/internal/http3/http3_synctest_test.go
@@ -0,0 +1,48 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build go1.24 && goexperiment.synctest
+
+package http3
+
+import (
+ "slices"
+ "testing"
+ "testing/synctest"
+)
+
+// runSynctest runs f in a synctest.Run bubble.
+// It arranges for t.Cleanup functions to run within the bubble.
+func runSynctest(t *testing.T, f func(t testing.TB)) {
+ synctest.Run(func() {
+ ct := &cleanupT{T: t}
+ defer ct.done()
+ f(ct)
+ })
+}
+
+// runSynctestSubtest runs f in a subtest in a synctest.Run bubble.
+func runSynctestSubtest(t *testing.T, name string, f func(t testing.TB)) {
+ t.Run(name, func(t *testing.T) {
+ runSynctest(t, f)
+ })
+}
+
+// cleanupT wraps a testing.T and adds its own Cleanup method.
+// Used to execute cleanup functions within a synctest bubble.
+type cleanupT struct {
+ *testing.T
+ cleanups []func()
+}
+
+// Cleanup replaces T.Cleanup.
+func (t *cleanupT) Cleanup(f func()) {
+ t.cleanups = append(t.cleanups, f)
+}
+
+func (t *cleanupT) done() {
+ for _, f := range slices.Backward(t.cleanups) {
+ f()
+ }
+}
diff --git a/internal/http3/http3_test.go b/internal/http3/http3_test.go
index f490ad3..f6fb2e9 100644
--- a/internal/http3/http3_test.go
+++ b/internal/http3/http3_test.go
@@ -2,17 +2,14 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build go1.24 && goexperiment.synctest
+//go:build go1.24
package http3
import (
"encoding/hex"
"os"
- "slices"
"strings"
- "testing"
- "testing/synctest"
)
func init() {
@@ -25,41 +22,6 @@
os.Setenv("GODEBUG", os.Getenv("GODEBUG")+",asynctimerchan=0")
}
-// runSynctest runs f in a synctest.Run bubble.
-// It arranges for t.Cleanup functions to run within the bubble.
-func runSynctest(t *testing.T, f func(t testing.TB)) {
- synctest.Run(func() {
- ct := &cleanupT{T: t}
- defer ct.done()
- f(ct)
- })
-}
-
-// runSynctestSubtest runs f in a subtest in a synctest.Run bubble.
-func runSynctestSubtest(t *testing.T, name string, f func(t testing.TB)) {
- t.Run(name, func(t *testing.T) {
- runSynctest(t, f)
- })
-}
-
-// cleanupT wraps a testing.T and adds its own Cleanup method.
-// Used to execute cleanup functions within a synctest bubble.
-type cleanupT struct {
- *testing.T
- cleanups []func()
-}
-
-// Cleanup replaces T.Cleanup.
-func (t *cleanupT) Cleanup(f func()) {
- t.cleanups = append(t.cleanups, f)
-}
-
-func (t *cleanupT) done() {
- for _, f := range slices.Backward(t.cleanups) {
- f()
- }
-}
-
func unhex(s string) []byte {
b, err := hex.DecodeString(strings.Map(func(c rune) rune {
switch c {
diff --git a/internal/http3/qpack_decode_test.go b/internal/http3/qpack_decode_test.go
index 1b779aa..3b9a995 100644
--- a/internal/http3/qpack_decode_test.go
+++ b/internal/http3/qpack_decode_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build go1.24
+//go:build go1.24 && goexperiment.synctest
package http3