parent
cb61945125
commit
6d6255e759
@ -0,0 +1,44 @@
|
|||||||
|
package cache
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSet(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
|
||||||
|
asserts.NoError(Set("123", "321"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
asserts.NoError(Set("123", "321"))
|
||||||
|
|
||||||
|
value, ok := Get("123")
|
||||||
|
asserts.True(ok)
|
||||||
|
asserts.Equal("321", value)
|
||||||
|
|
||||||
|
value, ok = Get("not_exist")
|
||||||
|
asserts.False(ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetSettings(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
asserts.NoError(Set("test_1", "1"))
|
||||||
|
|
||||||
|
values, missed := GetSettings([]string{"1", "2"}, "test_")
|
||||||
|
asserts.Equal(map[string]string{"1": "1"}, values)
|
||||||
|
asserts.Equal([]string{"2"}, missed)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSetSettings(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
|
||||||
|
err := SetSettings(map[string]string{"3": "3", "4": "4"}, "test_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
value1, _ := Get("test_3")
|
||||||
|
value2, _ := Get("test_4")
|
||||||
|
asserts.Equal("3", value1)
|
||||||
|
asserts.Equal("4", value2)
|
||||||
|
}
|
@ -0,0 +1,254 @@
|
|||||||
|
package cache
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"github.com/gomodule/redigo/redis"
|
||||||
|
"github.com/rafaeljusto/redigomock"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewRedisStore(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
|
||||||
|
store := NewRedisStore(10, "tcp", ":2333", "", "0")
|
||||||
|
asserts.NotNil(store)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRedisStore_Set(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
conn := redigomock.NewConn()
|
||||||
|
pool := &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return conn, nil },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
store := &RedisStore{pool: pool}
|
||||||
|
|
||||||
|
// 正常情况
|
||||||
|
{
|
||||||
|
cmd := conn.Command("SET", "test", redigomock.NewAnyData()).ExpectStringSlice("OK")
|
||||||
|
err := store.Set("test", "test val")
|
||||||
|
asserts.NoError(err)
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 序列化出错
|
||||||
|
{
|
||||||
|
value := struct {
|
||||||
|
Key string
|
||||||
|
}{
|
||||||
|
Key: "123",
|
||||||
|
}
|
||||||
|
err := store.Set("test", value)
|
||||||
|
asserts.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 命令执行失败
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
cmd := conn.Command("SET", "test", redigomock.NewAnyData()).ExpectError(errors.New("error"))
|
||||||
|
err := store.Set("test", "test val")
|
||||||
|
asserts.Error(err)
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 获取连接失败
|
||||||
|
{
|
||||||
|
store.pool = &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return nil, errors.New("error") },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
err := store.Set("test", "123")
|
||||||
|
asserts.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRedisStore_Get(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
conn := redigomock.NewConn()
|
||||||
|
pool := &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return conn, nil },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
store := &RedisStore{pool: pool}
|
||||||
|
|
||||||
|
// 正常情况
|
||||||
|
{
|
||||||
|
expectVal, _ := serializer("test val")
|
||||||
|
cmd := conn.Command("GET", "test").Expect(expectVal)
|
||||||
|
val, ok := store.Get("test")
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
asserts.True(ok)
|
||||||
|
asserts.Equal("test val", val.(string))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Key不存在
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
cmd := conn.Command("GET", "test").Expect(nil)
|
||||||
|
val, ok := store.Get("test")
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
asserts.False(ok)
|
||||||
|
asserts.Nil(val)
|
||||||
|
}
|
||||||
|
// 解码错误
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
cmd := conn.Command("GET", "test").Expect([]byte{0x20})
|
||||||
|
val, ok := store.Get("test")
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
asserts.False(ok)
|
||||||
|
asserts.Nil(val)
|
||||||
|
}
|
||||||
|
// 获取连接失败
|
||||||
|
{
|
||||||
|
store.pool = &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return nil, errors.New("error") },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
val, ok := store.Get("test")
|
||||||
|
asserts.False(ok)
|
||||||
|
asserts.Nil(val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRedisStore_Gets(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
conn := redigomock.NewConn()
|
||||||
|
pool := &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return conn, nil },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
store := &RedisStore{pool: pool}
|
||||||
|
|
||||||
|
// 全部命中
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
value1, _ := serializer("1")
|
||||||
|
value2, _ := serializer("2")
|
||||||
|
cmd := conn.Command("MGET", "test_1", "test_2").ExpectSlice(
|
||||||
|
value1, value2)
|
||||||
|
res, missed := store.Gets([]string{"1", "2"}, "test_")
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
asserts.Len(missed, 0)
|
||||||
|
asserts.Len(res, 2)
|
||||||
|
asserts.Equal("1", res["1"].(string))
|
||||||
|
asserts.Equal("2", res["2"].(string))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 命中一个
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
value2, _ := serializer("2")
|
||||||
|
cmd := conn.Command("MGET", "test_1", "test_2").ExpectSlice(
|
||||||
|
nil, value2)
|
||||||
|
res, missed := store.Gets([]string{"1", "2"}, "test_")
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
asserts.Len(missed, 1)
|
||||||
|
asserts.Len(res, 1)
|
||||||
|
asserts.Equal("1", missed[0])
|
||||||
|
asserts.Equal("2", res["2"].(string))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 命令出错
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
cmd := conn.Command("MGET", "test_1", "test_2").ExpectError(errors.New("error"))
|
||||||
|
res, missed := store.Gets([]string{"1", "2"}, "test_")
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
asserts.Len(missed, 2)
|
||||||
|
asserts.Len(res, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 连接出错
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
store.pool = &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return nil, errors.New("error") },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
res, missed := store.Gets([]string{"1", "2"}, "test_")
|
||||||
|
asserts.Len(missed, 2)
|
||||||
|
asserts.Len(res, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRedisStore_Sets(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
conn := redigomock.NewConn()
|
||||||
|
pool := &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return conn, nil },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
store := &RedisStore{pool: pool}
|
||||||
|
|
||||||
|
// 正常
|
||||||
|
{
|
||||||
|
cmd := conn.Command("MSET", redigomock.NewAnyData(), redigomock.NewAnyData(), redigomock.NewAnyData(), redigomock.NewAnyData()).ExpectSlice("OK")
|
||||||
|
err := store.Sets(map[string]interface{}{"1": "1", "2": "2"}, "test_")
|
||||||
|
asserts.NoError(err)
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 序列化失败
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
value := struct {
|
||||||
|
Key string
|
||||||
|
}{
|
||||||
|
Key: "123",
|
||||||
|
}
|
||||||
|
err := store.Sets(map[string]interface{}{"1": value, "2": "2"}, "test_")
|
||||||
|
asserts.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行失败
|
||||||
|
{
|
||||||
|
cmd := conn.Command("MSET", redigomock.NewAnyData(), redigomock.NewAnyData(), redigomock.NewAnyData(), redigomock.NewAnyData()).ExpectError(errors.New("error"))
|
||||||
|
err := store.Sets(map[string]interface{}{"1": "1", "2": "2"}, "test_")
|
||||||
|
asserts.Error(err)
|
||||||
|
if conn.Stats(cmd) != 1 {
|
||||||
|
fmt.Println("Command was not used")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 连接失败
|
||||||
|
{
|
||||||
|
conn.Clear()
|
||||||
|
store.pool = &redis.Pool{
|
||||||
|
Dial: func() (redis.Conn, error) { return nil, errors.New("error") },
|
||||||
|
MaxIdle: 10,
|
||||||
|
}
|
||||||
|
err := store.Sets(map[string]interface{}{"1": "1", "2": "2"}, "test_")
|
||||||
|
asserts.Error(err)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue