migrate the TokenStore tests away from Ginkgo (#4795)

This commit is contained in:
Marten Seemann
2024-12-24 18:25:15 +08:00
committed by GitHub
parent abfd38d3f6
commit 29ad06c8fa

View File

@@ -2,107 +2,75 @@ package quic
import (
"fmt"
"testing"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/stretchr/testify/require"
)
var _ = Describe("Token Cache", func() {
var s TokenStore
func mockToken(num int) *ClientToken { return &ClientToken{data: []byte(fmt.Sprintf("%d", num))} }
BeforeEach(func() {
s = NewLRUTokenStore(3, 4)
})
func TestTokenStoreSingleOrigin(t *testing.T) {
const origin = "localhost"
mockToken := func(num int) *ClientToken {
return &ClientToken{data: []byte(fmt.Sprintf("%d", num))}
}
s := NewLRUTokenStore(1, 3)
s.Put(origin, mockToken(1))
s.Put(origin, mockToken(2))
require.Equal(t, mockToken(2), s.Pop(origin))
require.Equal(t, mockToken(1), s.Pop(origin))
require.Nil(t, s.Pop(origin))
Context("for a single origin", func() {
const origin = "localhost"
// now add more tokens than the cache size
s.Put(origin, mockToken(1))
s.Put(origin, mockToken(2))
s.Put(origin, mockToken(3))
require.Equal(t, mockToken(3), s.Pop(origin))
s.Put(origin, mockToken(4))
s.Put(origin, mockToken(5))
require.Equal(t, mockToken(5), s.Pop(origin))
require.Equal(t, mockToken(4), s.Pop(origin))
require.Equal(t, mockToken(2), s.Pop(origin))
require.Nil(t, s.Pop(origin))
}
It("adds and gets tokens", func() {
s.Put(origin, mockToken(1))
s.Put(origin, mockToken(2))
Expect(s.Pop(origin)).To(Equal(mockToken(2)))
Expect(s.Pop(origin)).To(Equal(mockToken(1)))
Expect(s.Pop(origin)).To(BeNil())
})
func TestTokenStoreMultipleOrigins(t *testing.T) {
s := NewLRUTokenStore(3, 4)
It("overwrites old tokens", func() {
s.Put(origin, mockToken(1))
s.Put(origin, mockToken(2))
s.Put(origin, mockToken(3))
s.Put(origin, mockToken(4))
s.Put(origin, mockToken(5))
Expect(s.Pop(origin)).To(Equal(mockToken(5)))
Expect(s.Pop(origin)).To(Equal(mockToken(4)))
Expect(s.Pop(origin)).To(Equal(mockToken(3)))
Expect(s.Pop(origin)).To(Equal(mockToken(2)))
Expect(s.Pop(origin)).To(BeNil())
})
s.Put("host1", mockToken(1))
s.Put("host2", mockToken(2))
s.Put("host3", mockToken(3))
s.Put("host4", mockToken(4))
require.Nil(t, s.Pop("host1"))
require.Equal(t, mockToken(2), s.Pop("host2"))
require.Equal(t, mockToken(3), s.Pop("host3"))
require.Equal(t, mockToken(4), s.Pop("host4"))
}
It("continues after getting a token", func() {
s.Put(origin, mockToken(1))
s.Put(origin, mockToken(2))
s.Put(origin, mockToken(3))
Expect(s.Pop(origin)).To(Equal(mockToken(3)))
s.Put(origin, mockToken(4))
s.Put(origin, mockToken(5))
Expect(s.Pop(origin)).To(Equal(mockToken(5)))
Expect(s.Pop(origin)).To(Equal(mockToken(4)))
Expect(s.Pop(origin)).To(Equal(mockToken(2)))
Expect(s.Pop(origin)).To(Equal(mockToken(1)))
Expect(s.Pop(origin)).To(BeNil())
})
})
func TestTokenStoreUpdates(t *testing.T) {
s := NewLRUTokenStore(3, 4)
s.Put("host1", mockToken(1))
s.Put("host2", mockToken(2))
s.Put("host3", mockToken(3))
s.Put("host1", mockToken(11))
// make sure one is evicted
s.Put("host4", mockToken(4))
require.Nil(t, s.Pop("host2"))
require.Equal(t, mockToken(11), s.Pop("host1"))
require.Equal(t, mockToken(1), s.Pop("host1"))
require.Equal(t, mockToken(3), s.Pop("host3"))
require.Equal(t, mockToken(4), s.Pop("host4"))
}
Context("for multiple origins", func() {
It("adds and gets tokens", func() {
s.Put("host1", mockToken(1))
s.Put("host2", mockToken(2))
Expect(s.Pop("host1")).To(Equal(mockToken(1)))
Expect(s.Pop("host1")).To(BeNil())
Expect(s.Pop("host2")).To(Equal(mockToken(2)))
Expect(s.Pop("host2")).To(BeNil())
})
func TestTokenStoreEviction(t *testing.T) {
s := NewLRUTokenStore(3, 4)
It("evicts old entries", func() {
s.Put("host1", mockToken(1))
s.Put("host2", mockToken(2))
s.Put("host3", mockToken(3))
s.Put("host4", mockToken(4))
Expect(s.Pop("host1")).To(BeNil())
Expect(s.Pop("host2")).To(Equal(mockToken(2)))
Expect(s.Pop("host3")).To(Equal(mockToken(3)))
Expect(s.Pop("host4")).To(Equal(mockToken(4)))
})
It("moves old entries to the front, when new tokens are added", func() {
s.Put("host1", mockToken(1))
s.Put("host2", mockToken(2))
s.Put("host3", mockToken(3))
s.Put("host1", mockToken(11))
// make sure one is evicted
s.Put("host4", mockToken(4))
Expect(s.Pop("host2")).To(BeNil())
Expect(s.Pop("host1")).To(Equal(mockToken(11)))
Expect(s.Pop("host1")).To(Equal(mockToken(1)))
Expect(s.Pop("host3")).To(Equal(mockToken(3)))
Expect(s.Pop("host4")).To(Equal(mockToken(4)))
})
It("deletes hosts that are empty", func() {
s.Put("host1", mockToken(1))
s.Put("host2", mockToken(2))
s.Put("host3", mockToken(3))
Expect(s.Pop("host2")).To(Equal(mockToken(2)))
Expect(s.Pop("host2")).To(BeNil())
// host2 is now empty and should have been deleted, making space for host4
s.Put("host4", mockToken(4))
Expect(s.Pop("host1")).To(Equal(mockToken(1)))
Expect(s.Pop("host3")).To(Equal(mockToken(3)))
Expect(s.Pop("host4")).To(Equal(mockToken(4)))
})
})
})
s.Put("host1", mockToken(1))
s.Put("host2", mockToken(2))
s.Put("host3", mockToken(3))
require.Equal(t, mockToken(2), s.Pop("host2"))
require.Nil(t, s.Pop("host2"))
// host2 is now empty and should have been deleted, making space for host4
s.Put("host4", mockToken(4))
require.Equal(t, mockToken(1), s.Pop("host1"))
require.Equal(t, mockToken(3), s.Pop("host3"))
require.Equal(t, mockToken(4), s.Pop("host4"))
}