2019-03-08 20:49:16 +01:00
|
|
|
package remotecache
|
2019-02-15 14:31:52 +01:00
|
|
|
|
|
|
|
|
import (
|
2021-12-22 11:02:42 +01:00
|
|
|
"context"
|
2019-02-15 14:31:52 +01:00
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
2019-04-17 10:25:58 +02:00
|
|
|
"github.com/stretchr/testify/assert"
|
2023-02-21 16:21:18 +01:00
|
|
|
"github.com/stretchr/testify/require"
|
2022-10-19 09:02:15 -04:00
|
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/infra/db"
|
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
2019-02-15 14:31:52 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestDatabaseStorageGarbageCollection(t *testing.T) {
|
2022-10-19 09:02:15 -04:00
|
|
|
sqlstore := db.InitTestDB(t)
|
2019-02-15 14:31:52 +01:00
|
|
|
|
|
|
|
|
db := &databaseCache{
|
|
|
|
|
SQLStore: sqlstore,
|
2019-03-14 09:23:35 +01:00
|
|
|
log: log.New("remotecache.database"),
|
2019-02-15 14:31:52 +01:00
|
|
|
}
|
|
|
|
|
|
2023-03-10 13:57:29 +01:00
|
|
|
obj := []byte("foolbar")
|
2019-02-15 14:31:52 +01:00
|
|
|
|
2020-09-22 16:22:19 +02:00
|
|
|
// set time.now to 2 weeks ago
|
2019-03-07 19:07:11 +01:00
|
|
|
var err error
|
2019-02-15 14:31:52 +01:00
|
|
|
getTime = func() time.Time { return time.Now().AddDate(0, 0, -2) }
|
2021-12-22 11:02:42 +01:00
|
|
|
err = db.Set(context.Background(), "key1", obj, 1000*time.Second)
|
2019-03-07 19:07:11 +01:00
|
|
|
assert.Equal(t, err, nil)
|
|
|
|
|
|
2021-12-22 11:02:42 +01:00
|
|
|
err = db.Set(context.Background(), "key2", obj, 1000*time.Second)
|
2019-03-07 19:07:11 +01:00
|
|
|
assert.Equal(t, err, nil)
|
|
|
|
|
|
2021-12-22 11:02:42 +01:00
|
|
|
err = db.Set(context.Background(), "key3", obj, 1000*time.Second)
|
2019-03-07 19:07:11 +01:00
|
|
|
assert.Equal(t, err, nil)
|
2019-02-15 14:31:52 +01:00
|
|
|
|
|
|
|
|
// insert object that should never expire
|
2021-12-22 11:02:42 +01:00
|
|
|
err = db.Set(context.Background(), "key4", obj, 0)
|
2019-10-10 16:42:11 +02:00
|
|
|
assert.Equal(t, err, nil)
|
2019-02-15 14:31:52 +01:00
|
|
|
|
|
|
|
|
getTime = time.Now
|
2021-12-22 11:02:42 +01:00
|
|
|
err = db.Set(context.Background(), "key5", obj, 1000*time.Second)
|
2019-10-10 16:42:11 +02:00
|
|
|
assert.Equal(t, err, nil)
|
2019-02-15 14:31:52 +01:00
|
|
|
|
2020-09-22 16:22:19 +02:00
|
|
|
// run GC
|
2019-02-15 14:31:52 +01:00
|
|
|
db.internalRunGC()
|
|
|
|
|
|
2020-09-22 16:22:19 +02:00
|
|
|
// try to read values
|
2021-12-22 11:02:42 +01:00
|
|
|
_, err = db.Get(context.Background(), "key1")
|
2019-03-07 19:07:11 +01:00
|
|
|
assert.Equal(t, err, ErrCacheItemNotFound, "expected cache item not found. got: ", err)
|
2021-12-22 11:02:42 +01:00
|
|
|
_, err = db.Get(context.Background(), "key2")
|
2019-02-15 14:31:52 +01:00
|
|
|
assert.Equal(t, err, ErrCacheItemNotFound)
|
2021-12-22 11:02:42 +01:00
|
|
|
_, err = db.Get(context.Background(), "key3")
|
2019-02-15 14:31:52 +01:00
|
|
|
assert.Equal(t, err, ErrCacheItemNotFound)
|
|
|
|
|
|
2021-12-22 11:02:42 +01:00
|
|
|
_, err = db.Get(context.Background(), "key4")
|
2019-02-15 14:31:52 +01:00
|
|
|
assert.Equal(t, err, nil)
|
2021-12-22 11:02:42 +01:00
|
|
|
_, err = db.Get(context.Background(), "key5")
|
2019-02-15 14:31:52 +01:00
|
|
|
assert.Equal(t, err, nil)
|
|
|
|
|
}
|
2019-03-20 11:36:28 +01:00
|
|
|
|
|
|
|
|
func TestSecondSet(t *testing.T) {
|
|
|
|
|
var err error
|
2022-10-19 09:02:15 -04:00
|
|
|
sqlstore := db.InitTestDB(t)
|
2019-03-20 11:36:28 +01:00
|
|
|
|
|
|
|
|
db := &databaseCache{
|
|
|
|
|
SQLStore: sqlstore,
|
|
|
|
|
log: log.New("remotecache.database"),
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-10 13:57:29 +01:00
|
|
|
obj := []byte("hey!")
|
2019-03-20 11:36:28 +01:00
|
|
|
|
2021-12-22 11:02:42 +01:00
|
|
|
err = db.Set(context.Background(), "killa-gorilla", obj, 0)
|
2019-04-16 10:27:07 +02:00
|
|
|
assert.Equal(t, err, nil)
|
2019-03-20 11:36:28 +01:00
|
|
|
|
2021-12-22 11:02:42 +01:00
|
|
|
err = db.Set(context.Background(), "killa-gorilla", obj, 0)
|
2019-03-20 11:36:28 +01:00
|
|
|
assert.Equal(t, err, nil)
|
|
|
|
|
}
|
2023-02-21 16:21:18 +01:00
|
|
|
|
|
|
|
|
func TestDatabaseStorageCount(t *testing.T) {
|
|
|
|
|
sqlstore := db.InitTestDB(t)
|
|
|
|
|
|
|
|
|
|
db := &databaseCache{
|
|
|
|
|
SQLStore: sqlstore,
|
|
|
|
|
log: log.New("remotecache.database"),
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-10 13:57:29 +01:00
|
|
|
obj := []byte("foolbar")
|
2023-02-21 16:21:18 +01:00
|
|
|
|
|
|
|
|
// set time.now to 2 weeks ago
|
|
|
|
|
var err error
|
|
|
|
|
getTime = func() time.Time { return time.Now().AddDate(0, 0, -2) }
|
|
|
|
|
err = db.Set(context.Background(), "pref-key1", obj, 1000*time.Second)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
err = db.Set(context.Background(), "pref-key2", obj, 1000*time.Second)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
err = db.Set(context.Background(), "pref-key3", obj, 1000*time.Second)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
// insert object that should never expire
|
|
|
|
|
err = db.Set(context.Background(), "pref-key4", obj, 0)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
getTime = time.Now
|
|
|
|
|
err = db.Set(context.Background(), "pref-key5", obj, 1000*time.Second)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
// run GC
|
|
|
|
|
db.internalRunGC()
|
|
|
|
|
|
|
|
|
|
// try to read values
|
|
|
|
|
n, errC := db.Count(context.Background(), "pref-")
|
|
|
|
|
require.NoError(t, errC)
|
|
|
|
|
assert.Equal(t, int64(2), n)
|
|
|
|
|
}
|