package ristretto import ( "sync" "testing" "github.com/stretchr/testify/require" ) type testConsumer struct { push func([]uint64) save bool } func (c *testConsumer) Push(items []uint64) bool { if c.save { c.push(items) return true } return false } func TestRingDrain(t *testing.T) { drains := 0 r := newRingBuffer(&testConsumer{ push: func(items []uint64) { drains++ }, save: true, }, 1) for i := 0; i < 100; i++ { r.Push(uint64(i)) } require.Equal(t, 100, drains, "buffers shouldn't be dropped with BufferItems == 1") } func TestRingReset(t *testing.T) { drains := 0 r := newRingBuffer(&testConsumer{ push: func(items []uint64) { drains++ }, save: false, }, 4) for i := 0; i < 100; i++ { r.Push(uint64(i)) } require.Equal(t, 0, drains, "testConsumer shouldn't be draining") } func TestRingConsumer(t *testing.T) { mu := &sync.Mutex{} drainItems := make(map[uint64]struct{}) r := newRingBuffer(&testConsumer{ push: func(items []uint64) { mu.Lock() defer mu.Unlock() for i := range items { drainItems[items[i]] = struct{}{} } }, save: true, }, 4) for i := 0; i < 100; i++ { r.Push(uint64(i)) } l := len(drainItems) require.NotEqual(t, 0, l) require.True(t, l <= 100) }