storage/redis covered with unit tests (#157)
* storage/redis covered with unit tests * updated tests for redis
This commit is contained in:
parent
389e65d742
commit
7298c16f35
@ -4,8 +4,14 @@
|
|||||||
package redis
|
package redis
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-redis/redis"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
"storj.io/storj/internal/test"
|
"storj.io/storj/internal/test"
|
||||||
"storj.io/storj/storage"
|
"storj.io/storj/storage"
|
||||||
)
|
)
|
||||||
@ -81,3 +87,249 @@ func TestListWithStartKey(t *testing.T) {
|
|||||||
rt.HandleErr(err, "Failed to list")
|
rt.HandleErr(err, "Failed to list")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
validConnection = "127.0.0.1:6379"
|
||||||
|
unexistingKey = "unexistingKey"
|
||||||
|
validKey = "validKey"
|
||||||
|
validValue = "validValue"
|
||||||
|
keysList = []string{"key1", "key2", "key3"}
|
||||||
|
dbTest = 1
|
||||||
|
)
|
||||||
|
|
||||||
|
type TestFunc func(t *testing.T, st storage.KeyValueStore)
|
||||||
|
|
||||||
|
func testWithRedis(t *testing.T, testFunc TestFunc) {
|
||||||
|
st, err := NewClient(validConnection, "", dbTest)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NotNil(t, st)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
st.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
testFunc(t, st)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testWithInvalidConnection(t *testing.T, testFunc TestFunc) {
|
||||||
|
st := &redisClient{
|
||||||
|
db: redis.NewClient(&redis.Options{
|
||||||
|
Addr: "",
|
||||||
|
Password: "",
|
||||||
|
DB: dbTest,
|
||||||
|
}),
|
||||||
|
TTL: defaultNodeExpiration,
|
||||||
|
}
|
||||||
|
|
||||||
|
testFunc(t, st)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCloseRedis(t *testing.T) {
|
||||||
|
testWithRedis(t, func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
err := st.Close()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewClient(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
testName, address string
|
||||||
|
testFunc func(storage.KeyValueStore, error)
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"NotValidConnection",
|
||||||
|
"",
|
||||||
|
func(st storage.KeyValueStore, err error) {
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, st)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ValidConnection",
|
||||||
|
validConnection,
|
||||||
|
func(st storage.KeyValueStore, err error) {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NotNil(t, st)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
t.Run(c.testName, func(t *testing.T) {
|
||||||
|
storage, err := NewClient(c.address, "", dbTest)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err == nil {
|
||||||
|
storage.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
c.testFunc(storage, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCrudValidConnection(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
testName string
|
||||||
|
testFunc TestFunc
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"GetUnexistingKey",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
err := st.Delete(storage.Key(unexistingKey))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
value, err := st.Get(storage.Key(unexistingKey))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Nil(t, value)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GetValidKey",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
key := storage.Key(validKey)
|
||||||
|
orgValue := storage.Value(validValue)
|
||||||
|
|
||||||
|
err := st.Put(key, orgValue)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
value, err := st.Get(key)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, orgValue, value)
|
||||||
|
|
||||||
|
err = st.Delete(key)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"UpdateKey",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
key := storage.Key(validKey)
|
||||||
|
orgValue := storage.Value(validValue)
|
||||||
|
|
||||||
|
err := st.Put(key, orgValue)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
err = st.Put(key, orgValue)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = st.Delete(key)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GetKeysList",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
orgValue := storage.Value(validValue)
|
||||||
|
|
||||||
|
list := storage.Keys{}
|
||||||
|
for _, key := range keysList {
|
||||||
|
list = append(list, storage.Key(key))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, key := range list {
|
||||||
|
err := st.Put(key, orgValue)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
keys, err := st.List(list[0], storage.Limit(len(keysList)))
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.ElementsMatch(t, list, keys)
|
||||||
|
assert.Equal(t, len(list), len(keys))
|
||||||
|
|
||||||
|
for _, key := range list {
|
||||||
|
err := st.Delete(key)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GetKeysListWithFirstArgNil",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
keys, err := st.List(nil, storage.Limit(len(keysList)))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, len(keys), 0)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
t.Run(c.testName, func(t *testing.T) {
|
||||||
|
testWithRedis(t, c.testFunc)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCrudInvalidConnection(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
testName string
|
||||||
|
testFunc TestFunc
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"Get",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
_, err := st.Get(storage.Key(validKey))
|
||||||
|
assert.Error(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Put",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
err := st.Put(storage.Key(validKey), storage.Value(validValue))
|
||||||
|
assert.Error(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Delete",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
err := st.Delete(storage.Key(validKey))
|
||||||
|
assert.Error(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ListArgValid",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
keys, err := st.List(storage.Key(validKey), 1)
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, keys)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ListArgInvalid",
|
||||||
|
func(t *testing.T, st storage.KeyValueStore) {
|
||||||
|
keys, err := st.List(nil, 1)
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, keys)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
t.Run(c.testName, func(t *testing.T) {
|
||||||
|
testWithInvalidConnection(t, c.testFunc)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
cmd := exec.Command("redis-server")
|
||||||
|
|
||||||
|
err := cmd.Start()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//waiting for "redis-server command" to start
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
|
||||||
|
retCode := m.Run()
|
||||||
|
|
||||||
|
err = cmd.Process.Kill()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Print(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
os.Exit(retCode)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user