80 lines
1.3 KiB
Go
80 lines
1.3 KiB
Go
package hw04_lru_cache //nolint:golint,stylecheck
|
|
|
|
import (
|
|
"math/rand"
|
|
"strconv"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestCache(t *testing.T) {
|
|
t.Run("empty cache", func(t *testing.T) {
|
|
c := NewCache(10)
|
|
|
|
_, ok := c.Get("aaa")
|
|
require.False(t, ok)
|
|
|
|
_, ok = c.Get("bbb")
|
|
require.False(t, ok)
|
|
})
|
|
|
|
t.Run("simple", func(t *testing.T) {
|
|
c := NewCache(5)
|
|
|
|
wasInCache := c.Set("aaa", 100)
|
|
require.False(t, wasInCache)
|
|
|
|
wasInCache = c.Set("bbb", 200)
|
|
require.False(t, wasInCache)
|
|
|
|
val, ok := c.Get("aaa")
|
|
require.True(t, ok)
|
|
require.Equal(t, 100, val)
|
|
|
|
val, ok = c.Get("bbb")
|
|
require.True(t, ok)
|
|
require.Equal(t, 200, val)
|
|
|
|
wasInCache = c.Set("aaa", 300)
|
|
require.True(t, wasInCache)
|
|
|
|
val, ok = c.Get("aaa")
|
|
require.True(t, ok)
|
|
require.Equal(t, 300, val)
|
|
|
|
val, ok = c.Get("ccc")
|
|
require.False(t, ok)
|
|
require.Nil(t, val)
|
|
})
|
|
|
|
t.Run("purge logic", func(t *testing.T) {
|
|
// Write me
|
|
})
|
|
}
|
|
|
|
func TestCacheMultithreading(t *testing.T) {
|
|
t.Skip() // Remove if task with asterisk completed
|
|
|
|
c := NewCache(10)
|
|
wg := &sync.WaitGroup{}
|
|
wg.Add(2)
|
|
|
|
go func() {
|
|
defer wg.Done()
|
|
for i := 0; i < 1_000_000; i++ {
|
|
c.Set(Key(strconv.Itoa(i)), i)
|
|
}
|
|
}()
|
|
|
|
go func() {
|
|
defer wg.Done()
|
|
for i := 0; i < 1_000_000; i++ {
|
|
c.Get(Key(strconv.Itoa(rand.Intn(1_000_000))))
|
|
}
|
|
}()
|
|
|
|
wg.Wait()
|
|
}
|