goProject/trunk/goutil/redisUtil/redisPool_db_test.go

861 lines
16 KiB
Go
Raw Normal View History

2025-01-06 16:01:02 +08:00
package redisUtil
import (
"testing"
"time"
)
var (
redisPoolObj_db *RedisPool
)
func init() {
redisPoolObj_db = NewRedisPool("testPool", "10.1.0.21:6379", "redis_pwd", 5, 500, 200, 10*time.Second, 5*time.Second)
}
func TestExists(t *testing.T) {
/*
redis> SET db "redis"
OK
*/
key := "db"
value := "redis"
successful, err := redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if !successful {
t.Errorf("Set the key:%s should be successful, but now it's not.", key)
return
}
/*
redis> EXISTS db
(integer) 1
*/
exist, err := redisPoolObj_db.Exists(key)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("Set the key:%s should exist, but now it doesn't.", key)
return
}
/*
redis> DEL db
(integer) 1
*/
expected := 1
got, err := redisPoolObj_db.Del(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> EXISTS db
(integer) 0
*/
exist, err = redisPoolObj_db.Exists(key)
if err != nil {
t.Fail()
}
if exist {
t.Errorf("Set the key:%s should not exist, but now it does.", key)
return
}
}
func TestType(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_string.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# 字符串
redis> SET weather "sunny"
OK
redis> TYPE weather
string
*/
key := "weather"
value := "sunny"
successful, err := redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if !successful {
t.Errorf("Set the key:%s should be successful, but now it's not.", key)
return
}
expected := "string"
got, err := redisPoolObj_db.Type(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %s, but now got %s", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
# 列表
redis> LPUSH book_list "programming in scala"
(integer) 1
redis> TYPE book_list
list
*/
key = "book_list"
value = "programming in scala"
expected2 := 1
got2, err := redisPoolObj_db.LPush(key, value)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %d, but now got %d", expected2, got2)
return
}
expected = "list"
got, err = redisPoolObj_db.Type(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %s, but now got %s", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
# 集合
redis> SADD pat "dog"
(integer) 1
redis> TYPE pat
set
*/
key = "pat"
value = "dog"
expected3 := 1
got3, err := redisPoolObj_db.SAdd(key, value)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected to get %d, but now got %d", expected3, got3)
return
}
expected = "set"
got, err = redisPoolObj_db.Type(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %s, but now got %s", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
}
func TestRename(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_string.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# key 存在且 newkey 不存在
redis> SET message "hello world"
OK
redis> RENAME message greeting
OK
redis> EXISTS message # message 不复存在
(integer) 0
redis> EXISTS greeting # greeting 取而代之
(integer) 1
*/
key := "message"
value := "hello world"
expected := true
got, err := redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
newkey := "greeting"
err = redisPoolObj_db.Rename(key, newkey)
if err != nil {
t.Fail()
}
expected = false
got, err = redisPoolObj_db.Exists(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
expected = true
got, err = redisPoolObj_db.Exists(newkey)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
deleteKeys = append(deleteKeys, newkey)
/*
# key 不存在时返回错误
redis> RENAME fake_key never_exists
(error) ERR no such key
*/
key = "fake_key"
newkey = "never_exists"
err = redisPoolObj_db.Rename(key, newkey)
if err == nil {
t.Errorf("There should be one error, but now there isn't.")
return
}
/*
# newkey 已存在时 RENAME 会覆盖旧 newkey
redis> SET pc "lenovo"
OK
redis> SET personal_computer "dell"
OK
redis> RENAME pc personal_computer
OK
redis> GET pc
(nil)
redis:1> GET personal_computer # 原来的值 dell 被覆盖了
"lenovo"
*/
key = "pc"
value = "lenovo"
expected = true
got, err = redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
key = "personal_computer"
value = "dell"
expected = true
got, err = redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
key = "pc"
newkey = "personal_computer"
err = redisPoolObj_db.Rename(key, newkey)
if err != nil {
t.Fail()
}
expected = false
got, err = redisPoolObj_db.Exists(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
expected = true
got, err = redisPoolObj_db.Exists(newkey)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
deleteKeys = append(deleteKeys, newkey)
}
func TestRenameNX(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_string.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# newkey 不存在改名成功
redis> SET player "MPlyaer"
OK
redis> EXISTS best_player
(integer) 0
redis> RENAMENX player best_player
(integer) 1
*/
key := "player"
value := "MPlayer"
expected := true
got, err := redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
newkey := "best_player"
expected = false
got, err = redisPoolObj_db.Exists(newkey)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
expected = true
got, err = redisPoolObj_db.RenameNX(key, newkey)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
deleteKeys = append(deleteKeys, newkey)
/*
# newkey存在时失败
redis> SET animal "bear"
OK
redis> SET favorite_animal "butterfly"
OK
redis> RENAMENX animal favorite_animal
(integer) 0
redis> get animal
"bear"
redis> get favorite_animal
"butterfly"
*/
key = "animal"
value = "bear"
expected = true
got, err = redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
key = "favorite_animal"
value = "butterfly"
expected = true
got, err = redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
expected = false
got, err = redisPoolObj_db.RenameNX(key, newkey)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
key2 := "animal"
expected2 := "bear"
got2_interface, exist2, err := redisPoolObj_db.Get(key2)
if err != nil {
t.Fail()
}
if !exist2 {
t.Errorf("The key:%s should exist, but now it doesn't.", key2)
return
}
got2, err := redisPoolObj_db.String(got2_interface)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %s, but now got %s", expected2, got2)
return
}
key3 := "animal"
expected3 := "bear"
got3_interface, exist3, err := redisPoolObj_db.Get(key3)
if err != nil {
t.Fail()
}
if !exist3 {
t.Errorf("The key:%s should exist, but now it doesn't.", key3)
return
}
got3, err := redisPoolObj_db.String(got3_interface)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected to get %s, but now got %s", expected3, got3)
return
}
}
func TestDel(t *testing.T) {
/*
# 删除单个 key
redis> SET name huangz
OK
redis> DEL name
(integer) 1
*/
key := "name"
value := "huangz"
expected := true
got, err := redisPoolObj_db.Set(key, value, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
expected2 := 1
got2, err := redisPoolObj_db.Del(key)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %d, but now got %d", expected2, got2)
return
}
/*
# 删除一个不存在的 key
redis> EXISTS phone
(integer) 0
redis> DEL phone # 失败没有 key 被删除
(integer) 0
*/
key = "phone"
expected = false
got, err = redisPoolObj_db.Exists(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
expected3 := 0
got3, err := redisPoolObj_db.Del(key)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected to get %d, but now got %d", expected3, got3)
return
}
/*
# 同时删除多个 key
redis> SET name "redis"
OK
redis> SET type "key-value store"
OK
redis> SET website "redis.com"
OK
redis> DEL name type website
(integer) 3
*/
key1 := "name"
value1 := "redis"
expected = true
got, err = redisPoolObj_db.Set(key1, value1, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
key2 := "type"
value2 := "key-value store"
expected = true
got, err = redisPoolObj_db.Set(key2, value2, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
key3 := "website"
value3 := "redis.com"
expected = true
got, err = redisPoolObj_db.Set(key3, value3, "", 0, "")
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
expected4 := 3
got4, err := redisPoolObj_db.Del(key1, key2, key3)
if err != nil {
t.Fail()
}
if got4 != expected4 {
t.Errorf("Expected to get %d, but now got %d", expected4, got4)
return
}
}
func TestRandomKey(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# 数据库为空
redis> RANDOMKEY
(nil)
*/
expected := ""
got, exist, err := redisPoolObj_db.RandomKey()
if err != nil {
t.Fail()
}
if exist {
t.Errorf("RandomKey doesn't exist, but now it does.")
return
}
if got != expected {
t.Errorf("Expected to get %s, but now got %s", expected, got)
return
}
/*
# 数据库不为空
redis> MSET fruit "apple" drink "beer" food "cookies" # 设置多个 key
OK
redis> RANDOMKEY
"fruit"
redis> RANDOMKEY
"food"
redis> KEYS * # 查看数据库内所有key证明 RANDOMKEY 并不删除 key
1) "food"
2) "drink"
3) "fruit"
*/
key_value_map := make(map[string]interface{})
key_value_map["fruit"] = "apple"
key_value_map["drink"] = "beer"
key_value_map["food"] = "cookies"
err = redisPoolObj_db.MSet(key_value_map)
if err != nil {
t.Fail()
}
got, exist, err = redisPoolObj_db.RandomKey()
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("RandomKey should exist, but now it doesn't.")
return
}
if _, exist = key_value_map[got]; !exist {
t.Errorf("RandomKey should exist, but now it doesn't.")
return
}
expected2 := make([]string, 0, len(key_value_map))
for k := range key_value_map {
expected2 = append(expected2, k)
deleteKeys = append(deleteKeys, k)
}
got2, err := redisPoolObj_db.Keys("*")
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(expected2, got2) == false {
t.Errorf("Expected to get %v, but got %v\n", expected2, got2)
return
}
}
func TestDBSize(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
redis> DBSIZE
(integer) 0
redis> SET new_key "hello_moto" # 增加一个 key 试试
OK
redis> DBSIZE
(integer) 1
*/
expected := 0
got, err := redisPoolObj_db.DBSize()
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
key := "new_key"
value := "hello_moto"
redisPoolObj_db.Set(key, value, "", 0, "")
deleteKeys = append(deleteKeys, key)
expected = 1
got, err = redisPoolObj_db.DBSize()
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
}
func TestKeys(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
redis> MSET one 1 two 2 three 3 four 4 # 一次设置 4 key
OK
*/
key_value_map := make(map[string]interface{})
key_value_map["one"] = "1"
key_value_map["two"] = "2"
key_value_map["three"] = "3"
key_value_map["four"] = "4"
err := redisPoolObj_db.MSet(key_value_map)
if err != nil {
t.Fail()
}
for k := range key_value_map {
deleteKeys = append(deleteKeys, k)
}
/*
redis> KEYS *o*
1) "four"
2) "two"
3) "one"
*/
pattern := "*o*"
expected := []string{"four", "two", "one"}
got, err := redisPoolObj_db.Keys(pattern)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
/*
redis> KEYS t??
1) "two"
*/
pattern = "t??"
expected = []string{"two"}
got, err = redisPoolObj_db.Keys(pattern)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
/*
redis> KEYS t[w]*
1) "two"
*/
pattern = "t[w]*"
expected = []string{"two"}
got, err = redisPoolObj_db.Keys(pattern)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
/*
redis> KEYS * # 匹配数据库内所有 key
1) "four"
2) "three"
3) "two"
4) "one"
*/
pattern = "*"
expected = []string{"two", "one", "three", "four"}
got, err = redisPoolObj_db.Keys(pattern)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
}