qtls: migrate tests away from Ginkgo (#4642)

* qtls: migrate tests away from Ginkgo

* qtls: simplify the quic.EncryptionLevel <-> tls.EncryptionLevel test

* qtls: improve naming of tests
This commit is contained in:
Marten Seemann
2024-09-12 11:40:26 +08:00
committed by GitHub
parent a21f6c1c41
commit 889dc81333
4 changed files with 217 additions and 233 deletions

View File

@@ -4,81 +4,81 @@ import (
"crypto/tls"
"fmt"
"net"
"testing"
"github.com/quic-go/quic-go/internal/testdata"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/stretchr/testify/require"
)
var _ = Describe("Client Session Cache", func() {
It("adds data to and restores data from a session ticket", func() {
ln, err := tls.Listen("tcp4", "localhost:0", testdata.GetTLSConfig())
Expect(err).ToNot(HaveOccurred())
func TestClientSessionCacheAddAndRestoreData(t *testing.T) {
ln, err := tls.Listen("tcp4", "localhost:0", testdata.GetTLSConfig())
require.NoError(t, err)
done := make(chan struct{})
go func() {
defer GinkgoRecover()
defer close(done)
done := make(chan struct{})
go func() {
defer close(done)
for {
conn, err := ln.Accept()
if err != nil {
return
}
_, err = conn.Read(make([]byte, 10))
Expect(err).ToNot(HaveOccurred())
_, err = conn.Write([]byte("foobar"))
Expect(err).ToNot(HaveOccurred())
for {
conn, err := ln.Accept()
if err != nil {
return
}
}()
restored := make(chan []byte, 1)
clientConf := &tls.Config{
RootCAs: testdata.GetRootCA(),
ClientSessionCache: &clientSessionCache{
wrapped: tls.NewLRUClientSessionCache(10),
getData: func(bool) []byte { return []byte("session") },
setData: func(data []byte, earlyData bool) bool {
Expect(earlyData).To(BeFalse()) // running on top of TCP, we can only test non-0-RTT here
restored <- data
return true
},
},
_, err = conn.Read(make([]byte, 10))
require.NoError(t, err)
_, err = conn.Write([]byte("foobar"))
require.NoError(t, err)
}
conn, err := tls.Dial(
"tcp4",
fmt.Sprintf("localhost:%d", ln.Addr().(*net.TCPAddr).Port),
clientConf,
)
Expect(err).ToNot(HaveOccurred())
_, err = conn.Write([]byte("foobar"))
Expect(err).ToNot(HaveOccurred())
Expect(conn.ConnectionState().DidResume).To(BeFalse())
Expect(restored).To(HaveLen(0))
_, err = conn.Read(make([]byte, 10))
Expect(err).ToNot(HaveOccurred())
Expect(conn.Close()).To(Succeed())
}()
// make sure the cache can deal with nonsensical inputs
clientConf.ClientSessionCache.Put("foo", nil)
clientConf.ClientSessionCache.Put("bar", &tls.ClientSessionState{})
restored := make(chan []byte, 1)
clientConf := &tls.Config{
RootCAs: testdata.GetRootCA(),
ClientSessionCache: &clientSessionCache{
wrapped: tls.NewLRUClientSessionCache(10),
getData: func(bool) []byte { return []byte("session") },
setData: func(data []byte, earlyData bool) bool {
require.False(t, earlyData) // running on top of TCP, we can only test non-0-RTT here
restored <- data
return true
},
},
}
conn, err := tls.Dial(
"tcp4",
fmt.Sprintf("localhost:%d", ln.Addr().(*net.TCPAddr).Port),
clientConf,
)
require.NoError(t, err)
_, err = conn.Write([]byte("foobar"))
require.NoError(t, err)
require.False(t, conn.ConnectionState().DidResume)
require.Len(t, restored, 0)
_, err = conn.Read(make([]byte, 10))
require.NoError(t, err)
require.NoError(t, conn.Close())
conn, err = tls.Dial(
"tcp4",
fmt.Sprintf("localhost:%d", ln.Addr().(*net.TCPAddr).Port),
clientConf,
)
Expect(err).ToNot(HaveOccurred())
_, err = conn.Write([]byte("foobar"))
Expect(err).ToNot(HaveOccurred())
Expect(conn.ConnectionState().DidResume).To(BeTrue())
var restoredData []byte
Expect(restored).To(Receive(&restoredData))
Expect(restoredData).To(Equal([]byte("session")))
Expect(conn.Close()).To(Succeed())
// make sure the cache can deal with nonsensical inputs
clientConf.ClientSessionCache.Put("foo", nil)
clientConf.ClientSessionCache.Put("bar", &tls.ClientSessionState{})
Expect(ln.Close()).To(Succeed())
Eventually(done).Should(BeClosed())
})
})
conn, err = tls.Dial(
"tcp4",
fmt.Sprintf("localhost:%d", ln.Addr().(*net.TCPAddr).Port),
clientConf,
)
require.NoError(t, err)
_, err = conn.Write([]byte("foobar"))
require.NoError(t, err)
require.True(t, conn.ConnectionState().DidResume)
var restoredData []byte
select {
case restoredData = <-restored:
default:
t.Fatal("no data restored")
}
require.Equal(t, []byte("session"), restoredData)
require.NoError(t, conn.Close())
require.NoError(t, ln.Close())
<-done
}