mirror of
https://github.com/eosswedenorg/thalos
synced 2026-06-17 04:30:03 +02:00
Adding app/cache/memory_store.go
This commit is contained in:
parent
23d05e5512
commit
ed1009062d
2 changed files with 142 additions and 0 deletions
55
app/cache/memory_store.go
vendored
Normal file
55
app/cache/memory_store.go
vendored
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
package cache
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"time"
|
||||
)
|
||||
|
||||
var now = time.Now
|
||||
|
||||
type memoryStoreItem struct {
|
||||
value any
|
||||
expired time.Time
|
||||
}
|
||||
|
||||
type MemoryStore struct {
|
||||
data map[string]memoryStoreItem
|
||||
}
|
||||
|
||||
func NewMemoryStore() *MemoryStore {
|
||||
return &MemoryStore{make(map[string]memoryStoreItem)}
|
||||
}
|
||||
|
||||
func (s *MemoryStore) Get(key string, value any) error {
|
||||
if item, ok := s.data[key]; ok {
|
||||
|
||||
if item.expired.Before(now()) {
|
||||
delete(s.data, key)
|
||||
return fmt.Errorf("key: %s does not exist", key)
|
||||
}
|
||||
|
||||
v := reflect.ValueOf(value)
|
||||
if v.Kind() != reflect.Pointer {
|
||||
return fmt.Errorf("value must be of pointer type, '%s' passed", v.Kind().String())
|
||||
}
|
||||
|
||||
v.Elem().Set(reflect.ValueOf(item.value))
|
||||
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("key: %s does not exist", key)
|
||||
}
|
||||
|
||||
func (s *MemoryStore) Has(key string) bool {
|
||||
_, hit := s.data[key]
|
||||
return hit
|
||||
}
|
||||
|
||||
func (s *MemoryStore) Set(key string, value any, ttl time.Duration) error {
|
||||
s.data[key] = memoryStoreItem{
|
||||
value: value,
|
||||
expired: now().Add(ttl),
|
||||
}
|
||||
return nil
|
||||
}
|
||||
87
app/cache/memory_store_test.go
vendored
Normal file
87
app/cache/memory_store_test.go
vendored
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
package cache
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
type memoryTestItem struct {
|
||||
String string
|
||||
Num uint32
|
||||
Float float32
|
||||
}
|
||||
|
||||
func TestMemoryStore_Set(t *testing.T) {
|
||||
now = func() time.Time { return time.Unix(1581315270, 0) }
|
||||
|
||||
item := memoryTestItem{
|
||||
String: "MyString",
|
||||
Num: 23,
|
||||
Float: 3.14,
|
||||
}
|
||||
|
||||
expected := map[string]memoryStoreItem{
|
||||
"key1": {
|
||||
value: item,
|
||||
expired: now().Add(time.Hour),
|
||||
},
|
||||
}
|
||||
|
||||
store := NewMemoryStore()
|
||||
err := store.Set("key1", item, time.Hour)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, expected, store.data)
|
||||
}
|
||||
|
||||
func TestMemoryStore_GetMiss(t *testing.T) {
|
||||
store := NewMemoryStore()
|
||||
|
||||
var v any
|
||||
err := store.Get("Key2", &v)
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestMemoryStore_GetHit(t *testing.T) {
|
||||
expected := memoryTestItem{
|
||||
String: "MyString",
|
||||
Num: 23,
|
||||
Float: 3.14,
|
||||
}
|
||||
|
||||
store := NewMemoryStore()
|
||||
err := store.Set("key1", expected, time.Hour)
|
||||
assert.NoError(t, err)
|
||||
|
||||
var actual memoryTestItem
|
||||
err = store.Get("key1", &actual)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, expected, actual)
|
||||
}
|
||||
|
||||
func TestMemoryStore_GetNonPointer(t *testing.T) {
|
||||
expected := memoryTestItem{
|
||||
String: "MyString",
|
||||
Num: 23,
|
||||
Float: 3.14,
|
||||
}
|
||||
|
||||
store := NewMemoryStore()
|
||||
err := store.Set("key1", expected, time.Hour)
|
||||
assert.NoError(t, err)
|
||||
|
||||
var actual string
|
||||
err = store.Get("key1", actual)
|
||||
assert.EqualError(t, err, "value must be of pointer type, 'string' passed")
|
||||
}
|
||||
|
||||
func TestMemoryStore_Has(t *testing.T) {
|
||||
store := NewMemoryStore()
|
||||
err := store.Set("key1", "value", time.Hour)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.True(t, store.Has("key1"))
|
||||
assert.False(t, store.Has("key2"))
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue