goProject/trunk/goutil/redisUtil/redisPool_hash_test.go

1502 lines
31 KiB
Go
Raw Permalink Normal View History

2025-01-06 16:01:02 +08:00
package redisUtil
import (
"fmt"
"testing"
"time"
"github.com/gomodule/redigo/redis"
)
var (
redisPoolObj_hash *RedisPool
)
func init() {
redisPoolObj_hash = NewRedisPool("testPool", "10.1.0.21:6379", "redis_pwd", 5, 500, 200, 10*time.Second, 5*time.Second)
}
func TestHSet(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> HSET website google "www.g.cn"
(integer) 1
*/
key := "website"
field := "google"
value := "www.g.cn"
expected := 1
got, err := redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HGET website google
"www.g.cn"
*/
expected2 := "www.g.cn"
got2, exist, err := redisPoolObj_hash.HGet(key, field)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s and field:%s should exist, but now it doesn't", key, field)
return
}
got2_str, err := redis.String(got2, err)
if err != nil {
t.Fail()
}
if got2_str != expected2 {
t.Errorf("Expected to get %s, but got %s", expected2, got2_str)
return
}
/*
对一个已存在的域进行更新
redis> HSET website google "www.google.com"
(integer) 0
*/
field = "google"
value = "www.google.com"
expected = 0
got, err = redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but got %d", expected, got)
return
}
/*
redis> HGET website google
"www.google.com"
*/
expected3 := "www.google.com"
got3, exist, err := redisPoolObj_hash.HGet(key, field)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s and field:%s should exist, but now it doesn't", key, field)
return
}
got3_str, err := redis.String(got3, nil)
if err != nil {
t.Fail()
}
if got3_str != expected3 {
t.Errorf("Expected to get %s, but got %s", expected3, got3_str)
return
}
/*
对一个已存在的域进行更新
redis> HSET website google 1
(integer) 0
*/
field = "google"
value4 := 1
expected = 0
got, err = redisPoolObj_hash.HSet(key, field, value4)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but got %d", expected, got)
return
}
/*
redis> HGET website google
"www.google.com"
*/
expected4 := 1
got4, exist, err := redisPoolObj_hash.HGet(key, field)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s and field:%s should exist, but now it doesn't", key, field)
return
}
got4_int, err := redis.Int(got4, nil)
if err != nil {
t.Fail()
}
if got4_int != expected4 {
t.Errorf("Expected to get %d, but got %d", expected4, got4_int)
return
}
}
func TestHSetNX(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> HSETNX database key-value-store Redis
(integer) 1
*/
key := "database"
field := "key-value-store"
value := "Redis"
successful, err := redisPoolObj_hash.HSetNX(key, field, value)
if err != nil {
t.Fail()
}
if !successful {
t.Errorf("HSetNX key:%s, field:%s should be successful, but now it's not.", key, field)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HGET database key-value-store
"Redis"
*/
expected := "Redis"
gottmp, exist, err := redisPoolObj_hash.HGet(key, field)
got, err := redis.String(gottmp, err)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("Key:%s, field:%s should exist, but now it doesn't.", key, field)
return
}
if got != expected {
t.Errorf("Expected to get %s, but got %s", expected, got)
return
}
/*
域已经存在 设置未成功 域原有的值未被改变
redis> HSETNX database key-value-store Riak
(integer) 0
*/
value = "Riak"
successful, err = redisPoolObj_hash.HSetNX(key, field, value)
if err != nil {
t.Fail()
}
if successful {
t.Errorf("HSetNX key:%s, field:%s should be not successful, but now it is.", key, field)
return
}
/*
redis> HGET database key-value-store
"Redis"
*/
expected = "Redis"
gottmp, exist, err = redisPoolObj_hash.HGet(key, field)
got, err = redis.String(gottmp, err)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("Key:%s, field:%s should exist, but now it doesn't.", key, field)
return
}
if got != expected {
t.Errorf("Expected to get %s, but got %s", expected, got)
return
}
}
func TestHGet(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> HSET homepage redis redis.com
(integer) 1
*/
key := "homepage"
field := "redis"
value := "redis.com"
expected := 1
got, err := redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HGET homepage redis
"redis.com"
*/
expected2 := "redis.com"
got2, exist, err := redisPoolObj_hash.HGet(key, field)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s and field:%s should exist, but now it doesn't", key, field)
return
}
got2_str, err := redis.String(got2, err)
if err != nil {
t.Fail()
}
if got2_str != expected2 {
t.Errorf("Expected to get %s, but got %s", expected2, got2_str)
return
}
/*
域不存在的情况
redis> HGET site mysql
(nil)
*/
key = "site"
field = "mysql"
_, exist, err = redisPoolObj_hash.HGet(key, field)
if err != nil {
t.Fail()
}
if exist {
t.Errorf("The key:%s and field:%s should not exist, but now it does", key, field)
return
}
}
func TestHExists(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> HEXISTS phone myphone
(integer) 0
给定域存在
*/
key := "phone"
field := "myphone"
expected := false
got, err := redisPoolObj_hash.HExists(key, field)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %t, but now got %t", expected, got)
return
}
/*
redis> HSET phone myphone nokia-1110
(integer) 1
*/
value := "nokia-1110"
expected2 := 1
got2, err := redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %d, but now got %d", expected2, got2)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HEXISTS phone myphone
(integer) 1
*/
expected3 := true
got3, err := redisPoolObj_hash.HExists(key, field)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected to get %t, but now got %t", expected3, got3)
return
}
}
func TestHDel(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 := "abbr"
redisPoolObj_hash.HSet(key, "a", "apple")
redisPoolObj_hash.HSet(key, "b", "banana")
redisPoolObj_hash.HSet(key, "c", "cat")
redisPoolObj_hash.HSet(key, "d", "dog")
deleteKeys = append(deleteKeys, key)
/*
# 删除单个域
redis> HDEL abbr a
(integer) 1
*/
field := "a"
expected := 1
got, err := redisPoolObj_hash.HDel(key, field)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
# 删除不存在的域
redis> HDEL abbr not-exists-field
(integer) 0
*/
field = "not-exists-field"
expected = 0
got, err = redisPoolObj_hash.HDel(key, field)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
# 删除多个域
redis> HDEL abbr b c
(integer) 2
*/
fields := []string{"b", "c"}
expected = 2
got, err = redisPoolObj_hash.HDel(key, fields...)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> HGETALL abbr
1) "d"
2) "dog"
*/
}
func TestHLen(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> HSET db redis redis.com
(integer) 1
*/
key := "db"
field := "redis"
value := "redis.com"
expected := 1
got, err := redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HSET db mysql mysql.com
(integer) 1
*/
field = "mysql"
value = "mysql.com"
expected = 1
got, err = redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> HLEN db
(integer) 2
*/
expected = 2
got, err = redisPoolObj_hash.HLen(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> HSET db mongodb mongodb.org
(integer) 1
*/
field = "mongodb"
value = "mongodb.org"
expected = 1
got, err = redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> HLEN db
(integer) 3
*/
expected = 3
got, err = redisPoolObj_hash.HLen(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
}
func TestHStrlen(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> HMSET myhash f1 "HelloWorld" f2 "99" f3 "-256"
OK
*/
key := "myhash"
redisPoolObj_hash.HSet(key, "f1", "HelloWorld")
redisPoolObj_hash.HSet(key, "f2", "99")
redisPoolObj_hash.HSet(key, "f3", "-256")
deleteKeys = append(deleteKeys, key)
/*
redis> HSTRLEN myhash f1
(integer) 10
*/
expected := 10
field := "f1"
got, err := redisPoolObj_hash.HStrlen(key, field)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> HSTRLEN myhash f2
(integer) 2
*/
expected = 2
field = "f2"
got, err = redisPoolObj_hash.HStrlen(key, field)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> HSTRLEN myhash f3
(integer) 4
*/
expected = 4
field = "f3"
got, err = redisPoolObj_hash.HStrlen(key, field)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
}
func TestHIncrBy(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
}
}()
/*
# increment 为正数
redis> HEXISTS counter page_view # 对空域进行设置
(integer) 0
*/
key := "counter"
field := "page_view"
exist, err := redisPoolObj_hash.HExists(key, field)
if err != nil {
t.Fail()
}
if exist {
t.Errorf("The key:%s, field:%s should not exist, but now it does.", key, field)
return
}
/*
redis> HINCRBY counter page_view 200
(integer) 200
*/
increment := int64(200)
expected := int64(200)
got, err := redisPoolObj_hash.HIncrBy(key, field, increment)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HGET counter page_view
"200"
*/
expected = 200
got2, exist, err := redisPoolObj_hash.HGet(key, field)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field)
return
}
got2_int64, err := redis.Int64(got2, err)
if err != nil {
t.Fail()
}
if got2_int64 != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got2_int64)
return
}
/*
# increment 为负数
redis> HGET counter page_view
"200"
*/
/*
redis> HINCRBY counter page_view -50
(integer) 150
*/
increment = -50
expected = 150
got, err = redisPoolObj_hash.HIncrBy(key, field, increment)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HGET counter page_view
"150"
*/
expected = 150
got3, exist, err := redisPoolObj_hash.HGet(key, field)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field)
return
}
got3_int64, err := redis.Int64(got3, err)
if err != nil {
t.Fail()
}
if got3_int64 != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got3_int64)
return
}
/*
# 尝试对字符串值的域执行HINCRBY命令
redis> HSET myhash string hello,world # 设定一个字符串值
(integer) 1
*/
key2 := "myhash"
field2 := "string"
value2 := "hello,world"
expected4 := 1
got4, err := redisPoolObj_hash.HSet(key2, field2, value2)
if err != nil {
t.Fail()
}
if got4 != expected4 {
t.Errorf("Expected to get %d, but now got %d", expected4, got4)
return
}
deleteKeys = append(deleteKeys, key2)
/*
redis> HGET myhash string
"hello,world"
*/
expected5 := "hello,world"
got5_interface, exist, err := redisPoolObj_hash.HGet(key2, field2)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field)
return
}
got5, err := redis.String(got5_interface, err)
if err != nil {
t.Fail()
}
if got5 != expected5 {
t.Errorf("Expected to get %s, but now got %s", expected5, got5)
return
}
/*
redis> HINCRBY myhash string 1 # 命令执行失败错误
(error) ERR hash value is not an integer
*/
increment = 1
got, err = redisPoolObj_hash.HIncrBy(key2, field2, increment)
if err == nil {
t.Errorf("There should be an error, but now there isn't.")
return
}
/*
redis> HGET myhash string # 原值不变
"hello,world"
*/
expected6 := "hello,world"
got6_interface, exist, err := redisPoolObj_hash.HGet(key2, field2)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field)
return
}
got6, err := redis.String(got6_interface, err)
if err != nil {
t.Fail()
}
if got6 != expected6 {
t.Errorf("Expected to get %s, but now got %s", expected6, got6)
return
}
}
func TestHIncrByFloat(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> HSET mykey field 10.50
(integer) 1
redis> HINCRBYFLOAT mykey field 0.1
"10.6"
*/
key := "mykey"
field := "field"
value := 10.50
expected := 1
got, err := redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
increment := 0.1
expected2 := 10.6
got2, err := redisPoolObj_hash.HIncrByFloat(key, field, increment)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %f, but now got %f", expected2, got2)
return
}
deleteKeys = append(deleteKeys, key)
/*
# 值和增量都是指数符号
redis> HSET mykey field 5.0e3
(integer) 0
redis> HINCRBYFLOAT mykey field 2.0e2
"5200"
*/
value3 := 5.0e3
expected3 := 0
got3, err := redisPoolObj_hash.HSet(key, field, value3)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected to get %d, but now got %d", expected3, got3)
return
}
increment4 := 2.0e2
expected4 := 5200.0
got4, err := redisPoolObj_hash.HIncrByFloat(key, field, increment4)
if err != nil {
t.Fail()
}
if got4 != expected4 {
t.Errorf("Expected to get %f, but now got %f", expected4, got4)
return
}
/*
# 对不存在的键执行 HINCRBYFLOAT
redis> EXISTS price
(integer) 0
redis> HINCRBYFLOAT price milk 3.5
"3.5"
redis> HGETALL price
1) "milk"
2) "3.5"
*/
key5 := "price"
exist5, err := redisPoolObj_hash.Exists(key5)
if err != nil {
t.Fail()
}
if exist5 {
t.Errorf("The key:%s should not exist, but now it does.", key5)
return
}
field5 := "milk"
increment5 := 3.5
expected5 := 3.5
got5, err := redisPoolObj_hash.HIncrByFloat(key5, field5, increment5)
if err != nil {
t.Fail()
}
if got5 != expected5 {
t.Errorf("Expected to get %f, but now got %f", expected5, got5)
return
}
got5_interface, exist, err := redisPoolObj_hash.HGet(key5, field5)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't", key5, field5)
return
}
got5, err = redis.Float64(got5_interface, err)
if err != nil {
t.Fail()
}
if got5 != expected5 {
t.Errorf("Expected to get %f, but now got %f", expected5, got5)
return
}
deleteKeys = append(deleteKeys, key5)
/*
# 对不存在的域进行 HINCRBYFLOAT
redis> HGETALL price
1) "milk"
2) "3.5"
redis> HINCRBYFLOAT price coffee 4.5 # 新增 coffee
"4.5"
redis> HGETALL price
1) "milk"
2) "3.5"
3) "coffee"
4) "4.5"
*/
key6 := "price"
field6 := "coffee"
increment6 := 4.5
expected6 := 4.5
got6, err := redisPoolObj_hash.HIncrByFloat(key6, field6, increment6)
if err != nil {
t.Fail()
}
if got6 != expected6 {
t.Errorf("Expected to get %f, but now got %f", expected6, got6)
return
}
got6_interface, exist, err := redisPoolObj_hash.HGet(key6, field6)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't", key6, field6)
return
}
got6, err = redis.Float64(got6_interface, err)
if got6 != expected6 {
t.Errorf("Expected to get %f, but now got %f", expected6, got6)
return
}
}
func TestHMSet(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
}
}()
// HMSet
key := "people"
people := &People{
Jack: "Jack Ma",
Gump: "Gump Li",
}
err := redisPoolObj_hash.HMSet(key, people)
if err != nil {
t.Fail()
}
data := make(map[string]interface{})
data["Jordan"] = "Jordan Zuo"
err = redisPoolObj_hash.HMSet(key, data)
if err != nil {
t.Fail()
}
deleteKeys = append(deleteKeys, key)
// HGet
field1 := "Jack"
expected1 := "Jack Ma"
got1_interface, exist1, err := redisPoolObj_hash.HGet(key, field1)
if err != nil {
t.Fail()
}
if !exist1 {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field1)
return
}
got1, err := redis.String(got1_interface, nil)
if err != nil {
t.Fail()
}
if got1 != expected1 {
t.Errorf("Expected to get %s, but now got %s", expected1, got1)
return
}
// HGet
field2 := "Gump"
expected2 := "Gump Li"
got2_interface, exist2, err := redisPoolObj_hash.HGet(key, field2)
if err != nil {
t.Fail()
}
if !exist2 {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field2)
return
}
got2, err := redis.String(got2_interface, nil)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %s, but now got %s", expected2, got2)
return
}
field3 := "Jordan"
expected3 := "Jordan Zuo"
got3_interface, exist3, err := redisPoolObj_hash.HGet(key, field3)
if err != nil {
t.Fail()
}
if !exist3 {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field3)
return
}
got3, err := redis.String(got3_interface, nil)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected to get %s, but now got %s", expected3, got3)
return
}
}
func TestHMGet(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> HMSET pet dog "doudou" cat "nounou" # 一次设置多个域
OK
*/
key := "pet"
field_value_map := make(map[string]interface{})
field_value_map["dog"] = "doudou"
field_value_map["cat"] = "nounou"
err := redisPoolObj_hash.HMSet(key, field_value_map)
if err != nil {
t.Fail()
}
deleteKeys = append(deleteKeys, key)
/*
redis> HMGET pet dog cat fake_pet # 返回值的顺序和传入参数的顺序一样
1) "doudou"
2) "nounou"
3) (nil) # 不存在的域返回nil值
*/
expected := []string{"doudou", "nounou", ""}
reply, exist, err := redisPoolObj_hash.HMGet(key, "dog", "cat", "fake_pet")
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s should have items, but now it doesn't.", key)
return
}
got, err := redisPoolObj_hash.Strings(reply)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(got, expected) == false {
t.Errorf("Expected to get %v, but got %v", expected, got)
}
}
func TestHKeys(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> HMSET website google www.google.com yahoo www.yahoo.com
OK
*/
key := "website"
field_value_map := make(map[string]interface{})
field_value_map["google"] = "www.google.com"
field_value_map["yahoo"] = "www.yahoo.com"
err := redisPoolObj_hash.HMSet(key, field_value_map)
if err != nil {
t.Fail()
}
deleteKeys = append(deleteKeys, key)
/*
redis> HKEYS website
1) "google"
2) "yahoo"
*/
expected := make([]string, 0, len(field_value_map))
for k := range field_value_map {
expected = append(expected, k)
}
got, err := redisPoolObj_hash.HKeys(key)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(got, expected) == false {
t.Errorf("Expected to get %v, but got %v", expected, got)
}
/*
# 空哈希表/key不存在
redis> EXISTS fake_key
(integer) 0
*/
key2 := "fake_key"
exist, err := redisPoolObj_hash.Exists(key2)
if err != nil {
t.Fail()
}
if exist {
t.Errorf("The key:%s should not exist, but now it does.", key2)
return
}
/*
redis> HKEYS fake_key
(empty list or set)*
*/
expected2 := make([]string, 0, len(field_value_map))
got2, err := redisPoolObj_hash.HKeys(key2)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(got2, expected2) == false {
t.Errorf("Expected to get %v, but got %v", expected2, got2)
}
}
func TestHVals(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> HMSET website google www.google.com yahoo www.yahoo.com
OK
*/
key := "website"
field_value_map := make(map[string]interface{})
field_value_map["google"] = "www.google.com"
field_value_map["yahoo"] = "www.yahoo.com"
err := redisPoolObj_hash.HMSet(key, field_value_map)
if err != nil {
t.Fail()
}
deleteKeys = append(deleteKeys, key)
/*
redis> HVALS website
1) "www.google.com"
2) "www.yahoo.com"
*/
expected := make([]string, 0, len(field_value_map))
for _, v := range field_value_map {
if v_str, ok := v.(string); ok {
expected = append(expected, v_str)
}
}
reply, err := redisPoolObj_hash.HVals(key)
if err != nil {
t.Fail()
}
got, err := redisPoolObj_hash.Strings(reply)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(got, expected) == false {
t.Errorf("Expected to get %v, but got %v", expected, got)
}
/*
# 空哈希表/不存在的key
redis> EXISTS not_exists
(integer) 0
*/
key2 := "fake_key"
exist, err := redisPoolObj_hash.Exists(key2)
if err != nil {
t.Fail()
}
if exist {
t.Errorf("The key:%s should not exist, but now it does.", key2)
return
}
/*
redis> HVALS not_exists
(empty list or set)
*/
expected2 := make([]string, 0, len(field_value_map))
for _, v := range field_value_map {
if v_str, ok := v.(string); ok {
expected2 = append(expected2, v_str)
}
}
reply2, err := redisPoolObj_hash.HVals(key)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_hash.Strings(reply2)
if err != nil {
t.Fail()
}
if isTwoUnorderedSliceEqual(got2, expected2) == false {
t.Errorf("Expected to get %v, but got %v", expected2, got2)
}
}
func TestHGetAll(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> HSET people jack "Jack Sparrow"
(integer) 1
*/
key := "people"
field1 := "Jack"
value1 := "Jack Sparrow"
expected := 1
got, err := redisPoolObj_hash.HSet(key, field1, value1)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HSET people gump "Forrest Gump"
(integer) 1
*/
field2 := "Gump"
value2 := "Forrest Gump"
expected = 1
got, err = redisPoolObj_hash.HSet(key, field2, value2)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> HGETALL people
1) "Jack" #
2) "Jack Sparrow" #
3) "Gump"
4) "Forrest Gump"
*/
reply, err := redisPoolObj_hash.HGetAll(key)
if err != nil {
t.Fail()
}
field_value_map, err := redisPoolObj_hash.StringMap(reply)
if err != nil {
t.Fail()
}
expected1 := "Jack Sparrow"
got1, exist1 := field_value_map[field1]
if !exist1 {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field1)
return
}
if got1 != expected1 {
t.Errorf("Expected to get %s, but now got %s", expected1, got1)
return
}
expected2 := "Forrest Gump"
got2, exist2 := field_value_map[field2]
if !exist2 {
t.Errorf("The key:%s, field:%s should exist, but now it doesn't.", key, field2)
return
}
if got2 != expected2 {
t.Errorf("Expected to get %s, but now got %s", expected2, got2)
return
}
}
func TestHGetAll_Struct(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> HSET people jack "Jack Sparrow"
(integer) 1
*/
key := "people"
field := "Jack"
value := "Jack Sparrow"
expected := 1
got, err := redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> HSET people gump "Forrest Gump"
(integer) 1
*/
field = "Gump"
value = "Forrest Gump"
expected = 1
got, err = redisPoolObj_hash.HSet(key, field, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> HGETALL people
1) "Jack" #
2) "Jack Sparrow" #
3) "Gump"
4) "Forrest Gump"
*/
got2 := new(People)
expected2 := &People{
Jack: "Jack Sparrow",
Gump: "Forrest Gump",
}
exist, err := redisPoolObj_hash.HGetAll_Struct(key, got2)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s should exist, but now it doesn't.", key)
return
}
if got2.TheSame(expected2) == false {
t.Errorf("Expected to get:%s, but now got %s", expected2, got2)
}
}
type People struct {
Jack string
Gump string
}
func (this *People) TheSame(other *People) bool {
return this.Jack == other.Jack && this.Gump == other.Gump
}
func (this *People) String() string {
return fmt.Sprintf("{\"Jack\": %s, \"Gump\":%s}", this.Jack, this.Gump)
}