package quic import ( "bytes" "fmt" "io" "log" "net" "os" "runtime/pprof" "strconv" "strings" "testing" "time" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) func TestQuicGo(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "QUIC Suite") } var mockCtrl *gomock.Controller var _ = BeforeEach(func() { mockCtrl = gomock.NewController(GinkgoT()) }) var _ = BeforeSuite(func() { log.SetOutput(io.Discard) }) // in the tests for the stream deadlines we set a deadline // and wait to make an assertion when Read / Write was unblocked // on the CIs, the timing is a lot less precise, so scale every duration by this factor func scaleDuration(t time.Duration) time.Duration { scaleFactor := 1 if f, err := strconv.Atoi(os.Getenv("TIMESCALE_FACTOR")); err == nil { // parsing "" errors, so this works fine if the env is not set scaleFactor = f } if scaleFactor == 0 { panic("TIMESCALE_FACTOR is 0") } return time.Duration(scaleFactor) * t } func newUPDConnLocalhost(t testing.TB) *net.UDPConn { t.Helper() conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0}) require.NoError(t, err) t.Cleanup(func() { conn.Close() }) return conn } func areConnsRunning() bool { var b bytes.Buffer pprof.Lookup("goroutine").WriteTo(&b, 1) return strings.Contains(b.String(), "uquic.(*connection).run") // [uQUIC] } func areServersRunning() bool { var b bytes.Buffer pprof.Lookup("goroutine").WriteTo(&b, 1) return strings.Contains(b.String(), "uquic.(*baseServer).run") // [uQUIC] } func areTransportsRunning() bool { var b bytes.Buffer pprof.Lookup("goroutine").WriteTo(&b, 1) return strings.Contains(b.String(), "uquic.(*Transport).listen") // [uQUIC] } var _ = AfterEach(func() { mockCtrl.Finish() Eventually(areServersRunning).Should(BeFalse()) Eventually(areTransportsRunning()).Should(BeFalse()) }) func TestMain(m *testing.M) { status := m.Run() if status != 0 { os.Exit(status) } if areConnsRunning() { fmt.Println("stray connection goroutines found") os.Exit(1) } if areTransportsRunning() { fmt.Println("stray transport goroutines found") os.Exit(1) } os.Exit(status) }