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 } }