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