diff --git a/token_store_test.go b/token_store_test.go index a80b75e5e..02152e124 100644 --- a/token_store_test.go +++ b/token_store_test.go @@ -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")) +}