1
0
Fork 0
mirror of https://github.com/eosswedenorg/thalos synced 2026-07-02 11:43:40 +02:00

app/cache: implement store interface.

This commit is contained in:
Henrik Hautakoski 2023-12-17 17:51:50 +01:00
parent 8b3202e4d3
commit 6106481417
4 changed files with 30 additions and 29 deletions

View file

@ -1,6 +1,7 @@
package cache package cache
import ( import (
"context"
"fmt" "fmt"
"reflect" "reflect"
"time" "time"
@ -21,7 +22,7 @@ func NewMemoryStore() *MemoryStore {
return &MemoryStore{make(map[string]memoryStoreItem)} return &MemoryStore{make(map[string]memoryStoreItem)}
} }
func (s *MemoryStore) Get(key string, value any) error { func (s *MemoryStore) Get(ctx context.Context, key string, value any) error {
if item, ok := s.data[key]; ok { if item, ok := s.data[key]; ok {
if item.expired.Before(now()) { if item.expired.Before(now()) {
@ -41,12 +42,12 @@ func (s *MemoryStore) Get(key string, value any) error {
return fmt.Errorf("key: %s does not exist", key) return fmt.Errorf("key: %s does not exist", key)
} }
func (s *MemoryStore) Has(key string) bool { func (s *MemoryStore) Has(ctx context.Context, key string) bool {
_, hit := s.data[key] _, hit := s.data[key]
return hit return hit
} }
func (s *MemoryStore) Set(key string, value any, ttl time.Duration) error { func (s *MemoryStore) Set(ctx context.Context, key string, value any, ttl time.Duration) error {
s.data[key] = memoryStoreItem{ s.data[key] = memoryStoreItem{
value: value, value: value,
expired: now().Add(ttl), expired: now().Add(ttl),

View file

@ -1,6 +1,7 @@
package cache package cache
import ( import (
"context"
"testing" "testing"
"time" "time"
@ -30,7 +31,7 @@ func TestMemoryStore_Set(t *testing.T) {
} }
store := NewMemoryStore() store := NewMemoryStore()
err := store.Set("key1", item, time.Hour) err := store.Set(context.Background(), "key1", item, time.Hour)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, expected, store.data) assert.Equal(t, expected, store.data)
@ -40,7 +41,7 @@ func TestMemoryStore_GetMiss(t *testing.T) {
store := NewMemoryStore() store := NewMemoryStore()
var v any var v any
err := store.Get("Key2", &v) err := store.Get(context.Background(), "Key2", &v)
assert.Error(t, err) assert.Error(t, err)
} }
@ -52,11 +53,11 @@ func TestMemoryStore_GetHit(t *testing.T) {
} }
store := NewMemoryStore() store := NewMemoryStore()
err := store.Set("key1", expected, time.Hour) err := store.Set(context.Background(), "key1", expected, time.Hour)
assert.NoError(t, err) assert.NoError(t, err)
var actual memoryTestItem var actual memoryTestItem
err = store.Get("key1", &actual) err = store.Get(context.Background(), "key1", &actual)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, expected, actual) assert.Equal(t, expected, actual)
} }
@ -69,19 +70,19 @@ func TestMemoryStore_GetNonPointer(t *testing.T) {
} }
store := NewMemoryStore() store := NewMemoryStore()
err := store.Set("key1", expected, time.Hour) err := store.Set(context.Background(), "key1", expected, time.Hour)
assert.NoError(t, err) assert.NoError(t, err)
var actual string var actual string
err = store.Get("key1", actual) err = store.Get(context.Background(), "key1", actual)
assert.EqualError(t, err, "value must be of pointer type, 'string' passed") assert.EqualError(t, err, "value must be of pointer type, 'string' passed")
} }
func TestMemoryStore_Has(t *testing.T) { func TestMemoryStore_Has(t *testing.T) {
store := NewMemoryStore() store := NewMemoryStore()
err := store.Set("key1", "value", time.Hour) err := store.Set(context.Background(), "key1", "value", time.Hour)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, store.Has("key1")) assert.True(t, store.Has(context.Background(), "key1"))
assert.False(t, store.Has("key2")) assert.False(t, store.Has(context.Background(), "key2"))
} }

View file

@ -9,27 +9,25 @@ import (
type RedisStore struct { type RedisStore struct {
c *cache.Cache c *cache.Cache
ctx context.Context
} }
func NewRedisStore(options *cache.Options) *RedisStore { func NewRedisStore(options *cache.Options) *RedisStore {
return &RedisStore{ return &RedisStore{
c: cache.New(options), c: cache.New(options),
ctx: context.Background(),
} }
} }
func (s *RedisStore) Get(key string, value interface{}) error { func (s *RedisStore) Get(ctx context.Context, key string, value interface{}) error {
return s.c.Get(s.ctx, key, value) return s.c.Get(ctx, key, value)
} }
func (s *RedisStore) Has(key string) bool { func (s *RedisStore) Has(ctx context.Context, key string) bool {
return s.c.Exists(s.ctx, key) return s.c.Exists(ctx, key)
} }
func (s *RedisStore) Set(key string, value any, ttl time.Duration) error { func (s *RedisStore) Set(ctx context.Context, key string, value any, ttl time.Duration) error {
return s.c.Set(&cache.Item{ return s.c.Set(&cache.Item{
Ctx: s.ctx, Ctx: ctx,
Key: key, Key: key,
Value: value, Value: value,
TTL: ttl, TTL: ttl,

View file

@ -1,6 +1,7 @@
package cache package cache
import ( import (
"context"
"testing" "testing"
"time" "time"
@ -32,7 +33,7 @@ func TestRedisStore_Set(t *testing.T) {
mock.ExpectSet("mykey", bytes, time.Minute).SetVal("OK") mock.ExpectSet("mykey", bytes, time.Minute).SetVal("OK")
err = store.Set("mykey", expected, time.Minute) err = store.Set(context.Background(), "mykey", expected, time.Minute)
assert.NoError(t, err) assert.NoError(t, err)
assert.NoError(t, mock.ExpectationsWereMet()) assert.NoError(t, mock.ExpectationsWereMet())
@ -48,7 +49,7 @@ func TestRedisStore_GetMiss(t *testing.T) {
mock.ExpectGet("mykey").SetErr(redis_cache.ErrCacheMiss) mock.ExpectGet("mykey").SetErr(redis_cache.ErrCacheMiss)
expected := testItem{} expected := testItem{}
err := store.Get("mykey", &expected) err := store.Get(context.Background(), "mykey", &expected)
assert.ErrorIs(t, err, redis_cache.ErrCacheMiss) assert.ErrorIs(t, err, redis_cache.ErrCacheMiss)
assert.NoError(t, mock.ExpectationsWereMet()) assert.NoError(t, mock.ExpectationsWereMet())
} }
@ -71,11 +72,11 @@ func TestRedisStore_GetHit(t *testing.T) {
mock.ExpectSet("mykey2", bytes, time.Second*20).SetVal("OK") mock.ExpectSet("mykey2", bytes, time.Second*20).SetVal("OK")
mock.ExpectGet("mykey2").SetVal(string(bytes)) mock.ExpectGet("mykey2").SetVal(string(bytes))
err = store.Set("mykey2", expected, time.Second*20) err = store.Set(context.Background(), "mykey2", expected, time.Second*20)
assert.NoError(t, err) assert.NoError(t, err)
actual := testItem{} actual := testItem{}
err = store.Get("mykey2", &actual) err = store.Get(context.Background(), "mykey2", &actual)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, expected, actual) assert.Equal(t, expected, actual)
assert.NoError(t, mock.ExpectationsWereMet()) assert.NoError(t, mock.ExpectationsWereMet())
@ -95,9 +96,9 @@ func TestRedisStore_Has(t *testing.T) {
mock.ExpectGet("key1").SetVal(string(bytes)) mock.ExpectGet("key1").SetVal(string(bytes))
mock.ExpectGet("key2").RedisNil() mock.ExpectGet("key2").RedisNil()
err = store.Set("key1", "value", time.Minute*15) err = store.Set(context.Background(), "key1", "value", time.Minute*15)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, store.Has("key1")) assert.True(t, store.Has(context.Background(), "key1"))
assert.False(t, store.Has("key2")) assert.False(t, store.Has(context.Background(), "key2"))
assert.NoError(t, mock.ExpectationsWereMet()) assert.NoError(t, mock.ExpectationsWereMet())
} }