forked from quic-go/quic-go
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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user