github.com/shuguocloud/go-zero@v1.3.0/core/stores/redis/redis_test.go (about)

     1  package redis
     2  
     3  import (
     4  	"crypto/tls"
     5  	"errors"
     6  	"io"
     7  	"strconv"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/alicebob/miniredis/v2"
    12  	red "github.com/go-redis/redis"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/shuguocloud/go-zero/core/stringx"
    15  )
    16  
    17  func TestRedis_Decr(t *testing.T) {
    18  	runOnRedis(t, func(client *Redis) {
    19  		_, err := New(client.Addr, badType()).Decr("a")
    20  		assert.NotNil(t, err)
    21  		val, err := client.Decr("a")
    22  		assert.Nil(t, err)
    23  		assert.Equal(t, int64(-1), val)
    24  		val, err = client.Decr("a")
    25  		assert.Nil(t, err)
    26  		assert.Equal(t, int64(-2), val)
    27  	})
    28  }
    29  
    30  func TestRedis_DecrBy(t *testing.T) {
    31  	runOnRedis(t, func(client *Redis) {
    32  		_, err := New(client.Addr, badType()).Decrby("a", 2)
    33  		assert.NotNil(t, err)
    34  		val, err := client.Decrby("a", 2)
    35  		assert.Nil(t, err)
    36  		assert.Equal(t, int64(-2), val)
    37  		val, err = client.Decrby("a", 3)
    38  		assert.Nil(t, err)
    39  		assert.Equal(t, int64(-5), val)
    40  	})
    41  }
    42  
    43  func TestRedis_Exists(t *testing.T) {
    44  	runOnRedis(t, func(client *Redis) {
    45  		_, err := New(client.Addr, badType()).Exists("a")
    46  		assert.NotNil(t, err)
    47  		ok, err := client.Exists("a")
    48  		assert.Nil(t, err)
    49  		assert.False(t, ok)
    50  		assert.Nil(t, client.Set("a", "b"))
    51  		ok, err = client.Exists("a")
    52  		assert.Nil(t, err)
    53  		assert.True(t, ok)
    54  	})
    55  }
    56  
    57  func TestRedisTLS_Exists(t *testing.T) {
    58  	runOnRedisTLS(t, func(client *Redis) {
    59  		_, err := New(client.Addr, badType()).Exists("a")
    60  		assert.NotNil(t, err)
    61  		ok, err := client.Exists("a")
    62  		assert.NotNil(t, err)
    63  		assert.False(t, ok)
    64  		assert.NotNil(t, client.Set("a", "b"))
    65  		ok, err = client.Exists("a")
    66  		assert.NotNil(t, err)
    67  		assert.False(t, ok)
    68  	})
    69  }
    70  
    71  func TestRedis_Eval(t *testing.T) {
    72  	runOnRedis(t, func(client *Redis) {
    73  		_, err := New(client.Addr, badType()).Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})
    74  		assert.NotNil(t, err)
    75  		_, err = client.Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})
    76  		assert.Equal(t, Nil, err)
    77  		err = client.Set("key1", "value1")
    78  		assert.Nil(t, err)
    79  		_, err = client.Eval(`redis.call("EXISTS", KEYS[1])`, []string{"key1"})
    80  		assert.Equal(t, Nil, err)
    81  		val, err := client.Eval(`return redis.call("EXISTS", KEYS[1])`, []string{"key1"})
    82  		assert.Nil(t, err)
    83  		assert.Equal(t, int64(1), val)
    84  	})
    85  }
    86  
    87  func TestRedis_GeoHash(t *testing.T) {
    88  	runOnRedis(t, func(client *Redis) {
    89  		_, err := client.GeoHash("parent", "child1", "child2")
    90  		assert.NotNil(t, err)
    91  	})
    92  }
    93  
    94  func TestRedis_Hgetall(t *testing.T) {
    95  	runOnRedis(t, func(client *Redis) {
    96  		assert.Nil(t, client.Hset("a", "aa", "aaa"))
    97  		assert.Nil(t, client.Hset("a", "bb", "bbb"))
    98  		_, err := New(client.Addr, badType()).Hgetall("a")
    99  		assert.NotNil(t, err)
   100  		vals, err := client.Hgetall("a")
   101  		assert.Nil(t, err)
   102  		assert.EqualValues(t, map[string]string{
   103  			"aa": "aaa",
   104  			"bb": "bbb",
   105  		}, vals)
   106  	})
   107  }
   108  
   109  func TestRedis_Hvals(t *testing.T) {
   110  	runOnRedis(t, func(client *Redis) {
   111  		assert.NotNil(t, New(client.Addr, badType()).Hset("a", "aa", "aaa"))
   112  		assert.Nil(t, client.Hset("a", "aa", "aaa"))
   113  		assert.Nil(t, client.Hset("a", "bb", "bbb"))
   114  		_, err := New(client.Addr, badType()).Hvals("a")
   115  		assert.NotNil(t, err)
   116  		vals, err := client.Hvals("a")
   117  		assert.Nil(t, err)
   118  		assert.ElementsMatch(t, []string{"aaa", "bbb"}, vals)
   119  	})
   120  }
   121  
   122  func TestRedis_Hsetnx(t *testing.T) {
   123  	runOnRedis(t, func(client *Redis) {
   124  		assert.Nil(t, client.Hset("a", "aa", "aaa"))
   125  		assert.Nil(t, client.Hset("a", "bb", "bbb"))
   126  		_, err := New(client.Addr, badType()).Hsetnx("a", "bb", "ccc")
   127  		assert.NotNil(t, err)
   128  		ok, err := client.Hsetnx("a", "bb", "ccc")
   129  		assert.Nil(t, err)
   130  		assert.False(t, ok)
   131  		ok, err = client.Hsetnx("a", "dd", "ddd")
   132  		assert.Nil(t, err)
   133  		assert.True(t, ok)
   134  		vals, err := client.Hvals("a")
   135  		assert.Nil(t, err)
   136  		assert.ElementsMatch(t, []string{"aaa", "bbb", "ddd"}, vals)
   137  	})
   138  }
   139  
   140  func TestRedis_HdelHlen(t *testing.T) {
   141  	runOnRedis(t, func(client *Redis) {
   142  		assert.Nil(t, client.Hset("a", "aa", "aaa"))
   143  		assert.Nil(t, client.Hset("a", "bb", "bbb"))
   144  		_, err := New(client.Addr, badType()).Hlen("a")
   145  		assert.NotNil(t, err)
   146  		num, err := client.Hlen("a")
   147  		assert.Nil(t, err)
   148  		assert.Equal(t, 2, num)
   149  		val, err := client.Hdel("a", "aa")
   150  		assert.Nil(t, err)
   151  		assert.True(t, val)
   152  		vals, err := client.Hvals("a")
   153  		assert.Nil(t, err)
   154  		assert.ElementsMatch(t, []string{"bbb"}, vals)
   155  	})
   156  }
   157  
   158  func TestRedis_HIncrBy(t *testing.T) {
   159  	runOnRedis(t, func(client *Redis) {
   160  		_, err := New(client.Addr, badType()).Hincrby("key", "field", 2)
   161  		assert.NotNil(t, err)
   162  		val, err := client.Hincrby("key", "field", 2)
   163  		assert.Nil(t, err)
   164  		assert.Equal(t, 2, val)
   165  		val, err = client.Hincrby("key", "field", 3)
   166  		assert.Nil(t, err)
   167  		assert.Equal(t, 5, val)
   168  	})
   169  }
   170  
   171  func TestRedis_Hkeys(t *testing.T) {
   172  	runOnRedis(t, func(client *Redis) {
   173  		assert.Nil(t, client.Hset("a", "aa", "aaa"))
   174  		assert.Nil(t, client.Hset("a", "bb", "bbb"))
   175  		_, err := New(client.Addr, badType()).Hkeys("a")
   176  		assert.NotNil(t, err)
   177  		vals, err := client.Hkeys("a")
   178  		assert.Nil(t, err)
   179  		assert.ElementsMatch(t, []string{"aa", "bb"}, vals)
   180  	})
   181  }
   182  
   183  func TestRedis_Hmget(t *testing.T) {
   184  	runOnRedis(t, func(client *Redis) {
   185  		assert.Nil(t, client.Hset("a", "aa", "aaa"))
   186  		assert.Nil(t, client.Hset("a", "bb", "bbb"))
   187  		_, err := New(client.Addr, badType()).Hmget("a", "aa", "bb")
   188  		assert.NotNil(t, err)
   189  		vals, err := client.Hmget("a", "aa", "bb")
   190  		assert.Nil(t, err)
   191  		assert.EqualValues(t, []string{"aaa", "bbb"}, vals)
   192  		vals, err = client.Hmget("a", "aa", "no", "bb")
   193  		assert.Nil(t, err)
   194  		assert.EqualValues(t, []string{"aaa", "", "bbb"}, vals)
   195  	})
   196  }
   197  
   198  func TestRedis_Hmset(t *testing.T) {
   199  	runOnRedis(t, func(client *Redis) {
   200  		assert.NotNil(t, New(client.Addr, badType()).Hmset("a", nil))
   201  		assert.Nil(t, client.Hmset("a", map[string]string{
   202  			"aa": "aaa",
   203  			"bb": "bbb",
   204  		}))
   205  		vals, err := client.Hmget("a", "aa", "bb")
   206  		assert.Nil(t, err)
   207  		assert.EqualValues(t, []string{"aaa", "bbb"}, vals)
   208  	})
   209  }
   210  
   211  func TestRedis_Hscan(t *testing.T) {
   212  	runOnRedis(t, func(client *Redis) {
   213  		key := "hash:test"
   214  		fieldsAndValues := make(map[string]string)
   215  		for i := 0; i < 1550; i++ {
   216  			fieldsAndValues["filed_"+strconv.Itoa(i)] = stringx.Randn(i)
   217  		}
   218  		err := client.Hmset(key, fieldsAndValues)
   219  		assert.Nil(t, err)
   220  
   221  		var cursor uint64 = 0
   222  		sum := 0
   223  		for {
   224  			_, _, err := New(client.Addr, badType()).Hscan(key, cursor, "*", 100)
   225  			assert.NotNil(t, err)
   226  			reMap, next, err := client.Hscan(key, cursor, "*", 100)
   227  			assert.Nil(t, err)
   228  			sum += len(reMap)
   229  			if next == 0 {
   230  				break
   231  			}
   232  			cursor = next
   233  		}
   234  
   235  		assert.Equal(t, sum, 3100)
   236  		_, err = New(client.Addr, badType()).Del(key)
   237  		assert.NotNil(t, err)
   238  		_, err = client.Del(key)
   239  		assert.Nil(t, err)
   240  	})
   241  }
   242  
   243  func TestRedis_Incr(t *testing.T) {
   244  	runOnRedis(t, func(client *Redis) {
   245  		_, err := New(client.Addr, badType()).Incr("a")
   246  		assert.NotNil(t, err)
   247  		val, err := client.Incr("a")
   248  		assert.Nil(t, err)
   249  		assert.Equal(t, int64(1), val)
   250  		val, err = client.Incr("a")
   251  		assert.Nil(t, err)
   252  		assert.Equal(t, int64(2), val)
   253  	})
   254  }
   255  
   256  func TestRedis_IncrBy(t *testing.T) {
   257  	runOnRedis(t, func(client *Redis) {
   258  		_, err := New(client.Addr, badType()).Incrby("a", 2)
   259  		assert.NotNil(t, err)
   260  		val, err := client.Incrby("a", 2)
   261  		assert.Nil(t, err)
   262  		assert.Equal(t, int64(2), val)
   263  		val, err = client.Incrby("a", 3)
   264  		assert.Nil(t, err)
   265  		assert.Equal(t, int64(5), val)
   266  	})
   267  }
   268  
   269  func TestRedis_Keys(t *testing.T) {
   270  	runOnRedis(t, func(client *Redis) {
   271  		err := client.Set("key1", "value1")
   272  		assert.Nil(t, err)
   273  		err = client.Set("key2", "value2")
   274  		assert.Nil(t, err)
   275  		_, err = New(client.Addr, badType()).Keys("*")
   276  		assert.NotNil(t, err)
   277  		keys, err := client.Keys("*")
   278  		assert.Nil(t, err)
   279  		assert.ElementsMatch(t, []string{"key1", "key2"}, keys)
   280  	})
   281  }
   282  
   283  func TestRedis_HyperLogLog(t *testing.T) {
   284  	runOnRedis(t, func(client *Redis) {
   285  		client.Ping()
   286  		r := New(client.Addr)
   287  		ok, err := r.Pfadd("key1", "val1")
   288  		assert.Nil(t, err)
   289  		assert.True(t, ok)
   290  		val, err := r.Pfcount("key1")
   291  		assert.Nil(t, err)
   292  		assert.Equal(t, int64(1), val)
   293  		ok, err = r.Pfadd("key2", "val2")
   294  		assert.Nil(t, err)
   295  		assert.True(t, ok)
   296  		val, err = r.Pfcount("key2")
   297  		assert.Nil(t, err)
   298  		assert.Equal(t, int64(1), val)
   299  		err = r.Pfmerge("key1", "key2")
   300  		assert.Nil(t, err)
   301  		val, err = r.Pfcount("key1")
   302  		assert.Nil(t, err)
   303  		assert.Equal(t, int64(2), val)
   304  	})
   305  }
   306  
   307  func TestRedis_List(t *testing.T) {
   308  	runOnRedis(t, func(client *Redis) {
   309  		_, err := New(client.Addr, badType()).Lpush("key", "value1", "value2")
   310  		assert.NotNil(t, err)
   311  		val, err := client.Lpush("key", "value1", "value2")
   312  		assert.Nil(t, err)
   313  		assert.Equal(t, 2, val)
   314  		_, err = New(client.Addr, badType()).Rpush("key", "value3", "value4")
   315  		assert.NotNil(t, err)
   316  		val, err = client.Rpush("key", "value3", "value4")
   317  		assert.Nil(t, err)
   318  		assert.Equal(t, 4, val)
   319  		_, err = New(client.Addr, badType()).Llen("key")
   320  		assert.NotNil(t, err)
   321  		val, err = client.Llen("key")
   322  		assert.Nil(t, err)
   323  		assert.Equal(t, 4, val)
   324  		_, err = New(client.Addr, badType()).Lindex("key", 1)
   325  		assert.NotNil(t, err)
   326  		value, err := client.Lindex("key", 0)
   327  		assert.Nil(t, err)
   328  		assert.Equal(t, "value2", value)
   329  		vals, err := client.Lrange("key", 0, 10)
   330  		assert.Nil(t, err)
   331  		assert.EqualValues(t, []string{"value2", "value1", "value3", "value4"}, vals)
   332  		_, err = New(client.Addr, badType()).Lpop("key")
   333  		assert.NotNil(t, err)
   334  		v, err := client.Lpop("key")
   335  		assert.Nil(t, err)
   336  		assert.Equal(t, "value2", v)
   337  		val, err = client.Lpush("key", "value1", "value2")
   338  		assert.Nil(t, err)
   339  		assert.Equal(t, 5, val)
   340  		_, err = New(client.Addr, badType()).Rpop("key")
   341  		assert.NotNil(t, err)
   342  		v, err = client.Rpop("key")
   343  		assert.Nil(t, err)
   344  		assert.Equal(t, "value4", v)
   345  		val, err = client.Rpush("key", "value4", "value3", "value3")
   346  		assert.Nil(t, err)
   347  		assert.Equal(t, 7, val)
   348  		_, err = New(client.Addr, badType()).Lrem("key", 2, "value1")
   349  		assert.NotNil(t, err)
   350  		n, err := client.Lrem("key", 2, "value1")
   351  		assert.Nil(t, err)
   352  		assert.Equal(t, 2, n)
   353  		_, err = New(client.Addr, badType()).Lrange("key", 0, 10)
   354  		assert.NotNil(t, err)
   355  		vals, err = client.Lrange("key", 0, 10)
   356  		assert.Nil(t, err)
   357  		assert.EqualValues(t, []string{"value2", "value3", "value4", "value3", "value3"}, vals)
   358  		n, err = client.Lrem("key", -2, "value3")
   359  		assert.Nil(t, err)
   360  		assert.Equal(t, 2, n)
   361  		vals, err = client.Lrange("key", 0, 10)
   362  		assert.Nil(t, err)
   363  		assert.EqualValues(t, []string{"value2", "value3", "value4"}, vals)
   364  		err = client.Ltrim("key", 0, 1)
   365  		assert.Nil(t, err)
   366  		vals, err = client.Lrange("key", 0, 10)
   367  		assert.Nil(t, err)
   368  		assert.EqualValues(t, []string{"value2", "value3"}, vals)
   369  	})
   370  }
   371  
   372  func TestRedis_Mget(t *testing.T) {
   373  	runOnRedis(t, func(client *Redis) {
   374  		err := client.Set("key1", "value1")
   375  		assert.Nil(t, err)
   376  		err = client.Set("key2", "value2")
   377  		assert.Nil(t, err)
   378  		_, err = New(client.Addr, badType()).Mget("key1", "key0", "key2", "key3")
   379  		assert.NotNil(t, err)
   380  		vals, err := client.Mget("key1", "key0", "key2", "key3")
   381  		assert.Nil(t, err)
   382  		assert.EqualValues(t, []string{"value1", "", "value2", ""}, vals)
   383  	})
   384  }
   385  
   386  func TestRedis_SetBit(t *testing.T) {
   387  	runOnRedis(t, func(client *Redis) {
   388  		err := New(client.Addr, badType()).SetBit("key", 1, 1)
   389  		assert.NotNil(t, err)
   390  		err = client.SetBit("key", 1, 1)
   391  		assert.Nil(t, err)
   392  	})
   393  }
   394  
   395  func TestRedis_GetBit(t *testing.T) {
   396  	runOnRedis(t, func(client *Redis) {
   397  		err := client.SetBit("key", 2, 1)
   398  		assert.Nil(t, err)
   399  		_, err = New(client.Addr, badType()).GetBit("key", 2)
   400  		assert.NotNil(t, err)
   401  		val, err := client.GetBit("key", 2)
   402  		assert.Nil(t, err)
   403  		assert.Equal(t, 1, val)
   404  	})
   405  }
   406  
   407  func TestRedis_BitCount(t *testing.T) {
   408  	runOnRedis(t, func(client *Redis) {
   409  		for i := 0; i < 11; i++ {
   410  			err := client.SetBit("key", int64(i), 1)
   411  			assert.Nil(t, err)
   412  		}
   413  
   414  		_, err := New(client.Addr, badType()).BitCount("key", 0, -1)
   415  		assert.NotNil(t, err)
   416  		val, err := client.BitCount("key", 0, -1)
   417  		assert.Nil(t, err)
   418  		assert.Equal(t, int64(11), val)
   419  
   420  		val, err = client.BitCount("key", 0, 0)
   421  		assert.Nil(t, err)
   422  		assert.Equal(t, int64(8), val)
   423  
   424  		val, err = client.BitCount("key", 1, 1)
   425  		assert.Nil(t, err)
   426  		assert.Equal(t, int64(3), val)
   427  
   428  		val, err = client.BitCount("key", 0, 1)
   429  		assert.Nil(t, err)
   430  		assert.Equal(t, int64(11), val)
   431  
   432  		val, err = client.BitCount("key", 2, 2)
   433  		assert.Nil(t, err)
   434  		assert.Equal(t, int64(0), val)
   435  	})
   436  }
   437  
   438  func TestRedis_BitOpAnd(t *testing.T) {
   439  	runOnRedis(t, func(client *Redis) {
   440  		err := client.Set("key1", "0")
   441  		assert.Nil(t, err)
   442  		err = client.Set("key2", "1")
   443  		assert.Nil(t, err)
   444  		_, err = New(client.Addr, badType()).BitOpAnd("destKey", "key1", "key2")
   445  		assert.NotNil(t, err)
   446  		val, err := client.BitOpAnd("destKey", "key1", "key2")
   447  		assert.Nil(t, err)
   448  		assert.Equal(t, int64(1), val)
   449  		valStr, err := client.Get("destKey")
   450  		assert.Nil(t, err)
   451  		// destKey  binary 110000   ascii 0
   452  		assert.Equal(t, "0", valStr)
   453  	})
   454  }
   455  
   456  func TestRedis_BitOpNot(t *testing.T) {
   457  	runOnRedis(t, func(client *Redis) {
   458  		err := client.Set("key1", "\u0000")
   459  		assert.Nil(t, err)
   460  		_, err = New(client.Addr, badType()).BitOpNot("destKey", "key1")
   461  		assert.NotNil(t, err)
   462  		val, err := client.BitOpNot("destKey", "key1")
   463  		assert.Nil(t, err)
   464  		assert.Equal(t, int64(1), val)
   465  		valStr, err := client.Get("destKey")
   466  		assert.Nil(t, err)
   467  		assert.Equal(t, "\xff", valStr)
   468  	})
   469  }
   470  
   471  func TestRedis_BitOpOr(t *testing.T) {
   472  	runOnRedis(t, func(client *Redis) {
   473  		err := client.Set("key1", "1")
   474  		assert.Nil(t, err)
   475  		err = client.Set("key2", "0")
   476  		assert.Nil(t, err)
   477  		_, err = New(client.Addr, badType()).BitOpOr("destKey", "key1", "key2")
   478  		assert.NotNil(t, err)
   479  		val, err := client.BitOpOr("destKey", "key1", "key2")
   480  		assert.Nil(t, err)
   481  		assert.Equal(t, int64(1), val)
   482  		valStr, err := client.Get("destKey")
   483  		assert.Nil(t, err)
   484  		assert.Equal(t, "1", valStr)
   485  	})
   486  }
   487  
   488  func TestRedis_BitOpXor(t *testing.T) {
   489  	runOnRedis(t, func(client *Redis) {
   490  		err := client.Set("key1", "\xff")
   491  		assert.Nil(t, err)
   492  		err = client.Set("key2", "\x0f")
   493  		assert.Nil(t, err)
   494  		_, err = New(client.Addr, badType()).BitOpXor("destKey", "key1", "key2")
   495  		assert.NotNil(t, err)
   496  		val, err := client.BitOpXor("destKey", "key1", "key2")
   497  		assert.Nil(t, err)
   498  		assert.Equal(t, int64(1), val)
   499  		valStr, err := client.Get("destKey")
   500  		assert.Nil(t, err)
   501  		assert.Equal(t, "\xf0", valStr)
   502  	})
   503  }
   504  
   505  func TestRedis_BitPos(t *testing.T) {
   506  	runOnRedis(t, func(client *Redis) {
   507  		// 11111111 11110000 00000000
   508  		err := client.Set("key", "\xff\xf0\x00")
   509  		assert.Nil(t, err)
   510  
   511  		_, err = New(client.Addr, badType()).BitPos("key", 0, 0, -1)
   512  		assert.NotNil(t, err)
   513  		val, err := client.BitPos("key", 0, 0, 2)
   514  		assert.Nil(t, err)
   515  		assert.Equal(t, int64(12), val)
   516  
   517  		val, err = client.BitPos("key", 1, 0, 2)
   518  		assert.Nil(t, err)
   519  		assert.Equal(t, int64(0), val)
   520  
   521  		val, err = client.BitPos("key", 0, 1, 2)
   522  		assert.Nil(t, err)
   523  		assert.Equal(t, int64(12), val)
   524  
   525  		val, err = client.BitPos("key", 1, 1, 2)
   526  		assert.Nil(t, err)
   527  		assert.Equal(t, int64(8), val)
   528  
   529  		val, err = client.BitPos("key", 1, 2, 2)
   530  		assert.Nil(t, err)
   531  		assert.Equal(t, int64(-1), val)
   532  	})
   533  }
   534  
   535  func TestRedis_Persist(t *testing.T) {
   536  	runOnRedis(t, func(client *Redis) {
   537  		_, err := New(client.Addr, badType()).Persist("key")
   538  		assert.NotNil(t, err)
   539  		ok, err := client.Persist("key")
   540  		assert.Nil(t, err)
   541  		assert.False(t, ok)
   542  		err = client.Set("key", "value")
   543  		assert.Nil(t, err)
   544  		ok, err = client.Persist("key")
   545  		assert.Nil(t, err)
   546  		assert.False(t, ok)
   547  		err = New(client.Addr, badType()).Expire("key", 5)
   548  		assert.NotNil(t, err)
   549  		err = client.Expire("key", 5)
   550  		assert.Nil(t, err)
   551  		ok, err = client.Persist("key")
   552  		assert.Nil(t, err)
   553  		assert.True(t, ok)
   554  		err = New(client.Addr, badType()).Expireat("key", time.Now().Unix()+5)
   555  		assert.NotNil(t, err)
   556  		err = client.Expireat("key", time.Now().Unix()+5)
   557  		assert.Nil(t, err)
   558  		ok, err = client.Persist("key")
   559  		assert.Nil(t, err)
   560  		assert.True(t, ok)
   561  	})
   562  }
   563  
   564  func TestRedis_Ping(t *testing.T) {
   565  	runOnRedis(t, func(client *Redis) {
   566  		ok := client.Ping()
   567  		assert.True(t, ok)
   568  	})
   569  }
   570  
   571  func TestRedis_Scan(t *testing.T) {
   572  	runOnRedis(t, func(client *Redis) {
   573  		err := client.Set("key1", "value1")
   574  		assert.Nil(t, err)
   575  		err = client.Set("key2", "value2")
   576  		assert.Nil(t, err)
   577  		_, _, err = New(client.Addr, badType()).Scan(0, "*", 100)
   578  		assert.NotNil(t, err)
   579  		keys, _, err := client.Scan(0, "*", 100)
   580  		assert.Nil(t, err)
   581  		assert.ElementsMatch(t, []string{"key1", "key2"}, keys)
   582  	})
   583  }
   584  
   585  func TestRedis_Sscan(t *testing.T) {
   586  	runOnRedis(t, func(client *Redis) {
   587  		key := "list"
   588  		var list []string
   589  		for i := 0; i < 1550; i++ {
   590  			list = append(list, stringx.Randn(i))
   591  		}
   592  		lens, err := client.Sadd(key, list)
   593  		assert.Nil(t, err)
   594  		assert.Equal(t, lens, 1550)
   595  
   596  		var cursor uint64 = 0
   597  		sum := 0
   598  		for {
   599  			_, _, err := New(client.Addr, badType()).Sscan(key, cursor, "", 100)
   600  			assert.NotNil(t, err)
   601  			keys, next, err := client.Sscan(key, cursor, "", 100)
   602  			assert.Nil(t, err)
   603  			sum += len(keys)
   604  			if next == 0 {
   605  				break
   606  			}
   607  			cursor = next
   608  		}
   609  
   610  		assert.Equal(t, sum, 1550)
   611  		_, err = New(client.Addr, badType()).Del(key)
   612  		assert.NotNil(t, err)
   613  		_, err = client.Del(key)
   614  		assert.Nil(t, err)
   615  	})
   616  }
   617  
   618  func TestRedis_Set(t *testing.T) {
   619  	runOnRedis(t, func(client *Redis) {
   620  		_, err := New(client.Addr, badType()).Sadd("key", 1, 2, 3, 4)
   621  		assert.NotNil(t, err)
   622  		num, err := client.Sadd("key", 1, 2, 3, 4)
   623  		assert.Nil(t, err)
   624  		assert.Equal(t, 4, num)
   625  		_, err = New(client.Addr, badType()).Scard("key")
   626  		assert.NotNil(t, err)
   627  		val, err := client.Scard("key")
   628  		assert.Nil(t, err)
   629  		assert.Equal(t, int64(4), val)
   630  		_, err = New(client.Addr, badType()).Sismember("key", 2)
   631  		assert.NotNil(t, err)
   632  		ok, err := client.Sismember("key", 2)
   633  		assert.Nil(t, err)
   634  		assert.True(t, ok)
   635  		_, err = New(client.Addr, badType()).Srem("key", 3, 4)
   636  		assert.NotNil(t, err)
   637  		num, err = client.Srem("key", 3, 4)
   638  		assert.Nil(t, err)
   639  		assert.Equal(t, 2, num)
   640  		_, err = New(client.Addr, badType()).Smembers("key")
   641  		assert.NotNil(t, err)
   642  		vals, err := client.Smembers("key")
   643  		assert.Nil(t, err)
   644  		assert.ElementsMatch(t, []string{"1", "2"}, vals)
   645  		_, err = New(client.Addr, badType()).Srandmember("key", 1)
   646  		assert.NotNil(t, err)
   647  		members, err := client.Srandmember("key", 1)
   648  		assert.Nil(t, err)
   649  		assert.Len(t, members, 1)
   650  		assert.Contains(t, []string{"1", "2"}, members[0])
   651  		_, err = New(client.Addr, badType()).Spop("key")
   652  		assert.NotNil(t, err)
   653  		member, err := client.Spop("key")
   654  		assert.Nil(t, err)
   655  		assert.Contains(t, []string{"1", "2"}, member)
   656  		_, err = New(client.Addr, badType()).Smembers("key")
   657  		assert.NotNil(t, err)
   658  		vals, err = client.Smembers("key")
   659  		assert.Nil(t, err)
   660  		assert.NotContains(t, vals, member)
   661  		_, err = New(client.Addr, badType()).Sadd("key1", 1, 2, 3, 4)
   662  		assert.NotNil(t, err)
   663  		num, err = client.Sadd("key1", 1, 2, 3, 4)
   664  		assert.Nil(t, err)
   665  		assert.Equal(t, 4, num)
   666  		num, err = client.Sadd("key2", 2, 3, 4, 5)
   667  		assert.Nil(t, err)
   668  		assert.Equal(t, 4, num)
   669  		_, err = New(client.Addr, badType()).Sunion("key1", "key2")
   670  		assert.NotNil(t, err)
   671  		vals, err = client.Sunion("key1", "key2")
   672  		assert.Nil(t, err)
   673  		assert.ElementsMatch(t, []string{"1", "2", "3", "4", "5"}, vals)
   674  		_, err = New(client.Addr, badType()).Sunionstore("key3", "key1", "key2")
   675  		assert.NotNil(t, err)
   676  		num, err = client.Sunionstore("key3", "key1", "key2")
   677  		assert.Nil(t, err)
   678  		assert.Equal(t, 5, num)
   679  		_, err = New(client.Addr, badType()).Sdiff("key1", "key2")
   680  		assert.NotNil(t, err)
   681  		vals, err = client.Sdiff("key1", "key2")
   682  		assert.Nil(t, err)
   683  		assert.EqualValues(t, []string{"1"}, vals)
   684  		_, err = New(client.Addr, badType()).Sdiffstore("key4", "key1", "key2")
   685  		assert.NotNil(t, err)
   686  		num, err = client.Sdiffstore("key4", "key1", "key2")
   687  		assert.Nil(t, err)
   688  		assert.Equal(t, 1, num)
   689  		_, err = New(client.Addr, badType()).Sinter("key1", "key2")
   690  		assert.NotNil(t, err)
   691  		vals, err = client.Sinter("key1", "key2")
   692  		assert.Nil(t, err)
   693  		assert.ElementsMatch(t, []string{"2", "3", "4"}, vals)
   694  		_, err = New(client.Addr, badType()).Sinterstore("key4", "key1", "key2")
   695  		assert.NotNil(t, err)
   696  		num, err = client.Sinterstore("key4", "key1", "key2")
   697  		assert.Nil(t, err)
   698  		assert.Equal(t, 3, num)
   699  	})
   700  }
   701  
   702  func TestRedis_SetGetDel(t *testing.T) {
   703  	runOnRedis(t, func(client *Redis) {
   704  		err := New(client.Addr, badType()).Set("hello", "world")
   705  		assert.NotNil(t, err)
   706  		err = client.Set("hello", "world")
   707  		assert.Nil(t, err)
   708  		_, err = New(client.Addr, badType()).Get("hello")
   709  		assert.NotNil(t, err)
   710  		val, err := client.Get("hello")
   711  		assert.Nil(t, err)
   712  		assert.Equal(t, "world", val)
   713  		ret, err := client.Del("hello")
   714  		assert.Nil(t, err)
   715  		assert.Equal(t, 1, ret)
   716  	})
   717  }
   718  
   719  func TestRedis_SetExNx(t *testing.T) {
   720  	runOnRedis(t, func(client *Redis) {
   721  		err := New(client.Addr, badType()).Setex("hello", "world", 5)
   722  		assert.NotNil(t, err)
   723  		err = client.Setex("hello", "world", 5)
   724  		assert.Nil(t, err)
   725  		_, err = New(client.Addr, badType()).Setnx("hello", "newworld")
   726  		assert.NotNil(t, err)
   727  		ok, err := client.Setnx("hello", "newworld")
   728  		assert.Nil(t, err)
   729  		assert.False(t, ok)
   730  		ok, err = client.Setnx("newhello", "newworld")
   731  		assert.Nil(t, err)
   732  		assert.True(t, ok)
   733  		val, err := client.Get("hello")
   734  		assert.Nil(t, err)
   735  		assert.Equal(t, "world", val)
   736  		val, err = client.Get("newhello")
   737  		assert.Nil(t, err)
   738  		assert.Equal(t, "newworld", val)
   739  		ttl, err := client.Ttl("hello")
   740  		assert.Nil(t, err)
   741  		assert.True(t, ttl > 0)
   742  		_, err = New(client.Addr, badType()).SetnxEx("newhello", "newworld", 5)
   743  		assert.NotNil(t, err)
   744  		ok, err = client.SetnxEx("newhello", "newworld", 5)
   745  		assert.Nil(t, err)
   746  		assert.False(t, ok)
   747  		num, err := client.Del("newhello")
   748  		assert.Nil(t, err)
   749  		assert.Equal(t, 1, num)
   750  		ok, err = client.SetnxEx("newhello", "newworld", 5)
   751  		assert.Nil(t, err)
   752  		assert.True(t, ok)
   753  		val, err = client.Get("newhello")
   754  		assert.Nil(t, err)
   755  		assert.Equal(t, "newworld", val)
   756  	})
   757  }
   758  
   759  func TestRedis_SetGetDelHashField(t *testing.T) {
   760  	runOnRedis(t, func(client *Redis) {
   761  		err := client.Hset("key", "field", "value")
   762  		assert.Nil(t, err)
   763  		_, err = New(client.Addr, badType()).Hget("key", "field")
   764  		assert.NotNil(t, err)
   765  		val, err := client.Hget("key", "field")
   766  		assert.Nil(t, err)
   767  		assert.Equal(t, "value", val)
   768  		_, err = New(client.Addr, badType()).Hexists("key", "field")
   769  		assert.NotNil(t, err)
   770  		ok, err := client.Hexists("key", "field")
   771  		assert.Nil(t, err)
   772  		assert.True(t, ok)
   773  		_, err = New(client.Addr, badType()).Hdel("key", "field")
   774  		assert.NotNil(t, err)
   775  		ret, err := client.Hdel("key", "field")
   776  		assert.Nil(t, err)
   777  		assert.True(t, ret)
   778  		ok, err = client.Hexists("key", "field")
   779  		assert.Nil(t, err)
   780  		assert.False(t, ok)
   781  	})
   782  }
   783  
   784  func TestRedis_SortedSet(t *testing.T) {
   785  	runOnRedis(t, func(client *Redis) {
   786  		ok, err := client.Zadd("key", 1, "value1")
   787  		assert.Nil(t, err)
   788  		assert.True(t, ok)
   789  		ok, err = client.Zadd("key", 2, "value1")
   790  		assert.Nil(t, err)
   791  		assert.False(t, ok)
   792  		val, err := client.Zscore("key", "value1")
   793  		assert.Nil(t, err)
   794  		assert.Equal(t, int64(2), val)
   795  		_, err = New(client.Addr, badType()).Zincrby("key", 3, "value1")
   796  		assert.NotNil(t, err)
   797  		val, err = client.Zincrby("key", 3, "value1")
   798  		assert.Nil(t, err)
   799  		assert.Equal(t, int64(5), val)
   800  		_, err = New(client.Addr, badType()).Zscore("key", "value1")
   801  		assert.NotNil(t, err)
   802  		val, err = client.Zscore("key", "value1")
   803  		assert.Nil(t, err)
   804  		assert.Equal(t, int64(5), val)
   805  		_, err = New(client.Addr, badType()).Zadds("key")
   806  		assert.NotNil(t, err)
   807  		val, err = client.Zadds("key", Pair{
   808  			Key:   "value2",
   809  			Score: 6,
   810  		}, Pair{
   811  			Key:   "value3",
   812  			Score: 7,
   813  		})
   814  		assert.Nil(t, err)
   815  		assert.Equal(t, int64(2), val)
   816  		_, err = New(client.Addr, badType()).ZRevRangeWithScores("key", 1, 3)
   817  		assert.NotNil(t, err)
   818  		pairs, err := client.ZRevRangeWithScores("key", 1, 3)
   819  		assert.Nil(t, err)
   820  		assert.EqualValues(t, []Pair{
   821  			{
   822  				Key:   "value2",
   823  				Score: 6,
   824  			},
   825  			{
   826  				Key:   "value1",
   827  				Score: 5,
   828  			},
   829  		}, pairs)
   830  		rank, err := client.Zrank("key", "value2")
   831  		assert.Nil(t, err)
   832  		assert.Equal(t, int64(1), rank)
   833  		rank, err = client.Zrevrank("key", "value1")
   834  		assert.Nil(t, err)
   835  		assert.Equal(t, int64(2), rank)
   836  		_, err = New(client.Addr, badType()).Zrank("key", "value4")
   837  		assert.NotNil(t, err)
   838  		_, err = client.Zrank("key", "value4")
   839  		assert.Equal(t, Nil, err)
   840  		_, err = New(client.Addr, badType()).Zrem("key", "value2", "value3")
   841  		assert.NotNil(t, err)
   842  		num, err := client.Zrem("key", "value2", "value3")
   843  		assert.Nil(t, err)
   844  		assert.Equal(t, 2, num)
   845  		ok, err = client.Zadd("key", 6, "value2")
   846  		assert.Nil(t, err)
   847  		assert.True(t, ok)
   848  		ok, err = client.Zadd("key", 7, "value3")
   849  		assert.Nil(t, err)
   850  		assert.True(t, ok)
   851  		ok, err = client.Zadd("key", 8, "value4")
   852  		assert.Nil(t, err)
   853  		assert.True(t, ok)
   854  		_, err = New(client.Addr, badType()).Zremrangebyscore("key", 6, 7)
   855  		assert.NotNil(t, err)
   856  		num, err = client.Zremrangebyscore("key", 6, 7)
   857  		assert.Nil(t, err)
   858  		assert.Equal(t, 2, num)
   859  		ok, err = client.Zadd("key", 6, "value2")
   860  		assert.Nil(t, err)
   861  		assert.True(t, ok)
   862  		_, err = New(client.Addr, badType()).Zadd("key", 7, "value3")
   863  		assert.NotNil(t, err)
   864  		ok, err = client.Zadd("key", 7, "value3")
   865  		assert.Nil(t, err)
   866  		assert.True(t, ok)
   867  		_, err = New(client.Addr, badType()).Zcount("key", 6, 7)
   868  		assert.NotNil(t, err)
   869  		num, err = client.Zcount("key", 6, 7)
   870  		assert.Nil(t, err)
   871  		assert.Equal(t, 2, num)
   872  		_, err = New(client.Addr, badType()).Zremrangebyrank("key", 1, 2)
   873  		assert.NotNil(t, err)
   874  		num, err = client.Zremrangebyrank("key", 1, 2)
   875  		assert.Nil(t, err)
   876  		assert.Equal(t, 2, num)
   877  		_, err = New(client.Addr, badType()).Zcard("key")
   878  		assert.NotNil(t, err)
   879  		card, err := client.Zcard("key")
   880  		assert.Nil(t, err)
   881  		assert.Equal(t, 2, card)
   882  		_, err = New(client.Addr, badType()).Zrange("key", 0, -1)
   883  		assert.NotNil(t, err)
   884  		vals, err := client.Zrange("key", 0, -1)
   885  		assert.Nil(t, err)
   886  		assert.EqualValues(t, []string{"value1", "value4"}, vals)
   887  		_, err = New(client.Addr, badType()).Zrevrange("key", 0, -1)
   888  		assert.NotNil(t, err)
   889  		vals, err = client.Zrevrange("key", 0, -1)
   890  		assert.Nil(t, err)
   891  		assert.EqualValues(t, []string{"value4", "value1"}, vals)
   892  		_, err = New(client.Addr, badType()).ZrangeWithScores("key", 0, -1)
   893  		assert.NotNil(t, err)
   894  		pairs, err = client.ZrangeWithScores("key", 0, -1)
   895  		assert.Nil(t, err)
   896  		assert.EqualValues(t, []Pair{
   897  			{
   898  				Key:   "value1",
   899  				Score: 5,
   900  			},
   901  			{
   902  				Key:   "value4",
   903  				Score: 8,
   904  			},
   905  		}, pairs)
   906  		_, err = New(client.Addr, badType()).ZrangebyscoreWithScores("key", 5, 8)
   907  		assert.NotNil(t, err)
   908  		pairs, err = client.ZrangebyscoreWithScores("key", 5, 8)
   909  		assert.Nil(t, err)
   910  		assert.EqualValues(t, []Pair{
   911  			{
   912  				Key:   "value1",
   913  				Score: 5,
   914  			},
   915  			{
   916  				Key:   "value4",
   917  				Score: 8,
   918  			},
   919  		}, pairs)
   920  		_, err = New(client.Addr, badType()).ZrangebyscoreWithScoresAndLimit(
   921  			"key", 5, 8, 1, 1)
   922  		assert.NotNil(t, err)
   923  		pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1)
   924  		assert.Nil(t, err)
   925  		assert.EqualValues(t, []Pair{
   926  			{
   927  				Key:   "value4",
   928  				Score: 8,
   929  			},
   930  		}, pairs)
   931  		pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0)
   932  		assert.Nil(t, err)
   933  		assert.Equal(t, 0, len(pairs))
   934  		_, err = New(client.Addr, badType()).ZrevrangebyscoreWithScores("key", 5, 8)
   935  		assert.NotNil(t, err)
   936  		pairs, err = client.ZrevrangebyscoreWithScores("key", 5, 8)
   937  		assert.Nil(t, err)
   938  		assert.EqualValues(t, []Pair{
   939  			{
   940  				Key:   "value4",
   941  				Score: 8,
   942  			},
   943  			{
   944  				Key:   "value1",
   945  				Score: 5,
   946  			},
   947  		}, pairs)
   948  		_, err = New(client.Addr, badType()).ZrevrangebyscoreWithScoresAndLimit(
   949  			"key", 5, 8, 1, 1)
   950  		assert.NotNil(t, err)
   951  		pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1)
   952  		assert.Nil(t, err)
   953  		assert.EqualValues(t, []Pair{
   954  			{
   955  				Key:   "value1",
   956  				Score: 5,
   957  			},
   958  		}, pairs)
   959  		pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0)
   960  		assert.Nil(t, err)
   961  		assert.Equal(t, 0, len(pairs))
   962  		_, err = New(client.Addr, badType()).Zrevrank("key", "value")
   963  		assert.NotNil(t, err)
   964  		client.Zadd("second", 2, "aa")
   965  		client.Zadd("third", 3, "bbb")
   966  		val, err = client.Zunionstore("union", ZStore{
   967  			Weights:   []float64{1, 2},
   968  			Aggregate: "SUM",
   969  		}, "second", "third")
   970  		assert.Nil(t, err)
   971  		assert.Equal(t, int64(2), val)
   972  		_, err = New(client.Addr, badType()).Zunionstore("union", ZStore{})
   973  		assert.NotNil(t, err)
   974  		vals, err = client.Zrange("union", 0, 10000)
   975  		assert.Nil(t, err)
   976  		assert.EqualValues(t, []string{"aa", "bbb"}, vals)
   977  		ival, err := client.Zcard("union")
   978  		assert.Nil(t, err)
   979  		assert.Equal(t, 2, ival)
   980  	})
   981  }
   982  
   983  func TestRedis_Pipelined(t *testing.T) {
   984  	runOnRedis(t, func(client *Redis) {
   985  		assert.NotNil(t, New(client.Addr, badType()).Pipelined(func(pipeliner Pipeliner) error {
   986  			return nil
   987  		}))
   988  		err := client.Pipelined(
   989  			func(pipe Pipeliner) error {
   990  				pipe.Incr("pipelined_counter")
   991  				pipe.Expire("pipelined_counter", time.Hour)
   992  				pipe.ZAdd("zadd", Z{Score: 12, Member: "zadd"})
   993  				return nil
   994  			},
   995  		)
   996  		assert.Nil(t, err)
   997  		_, err = New(client.Addr, badType()).Ttl("pipelined_counter")
   998  		assert.NotNil(t, err)
   999  		ttl, err := client.Ttl("pipelined_counter")
  1000  		assert.Nil(t, err)
  1001  		assert.Equal(t, 3600, ttl)
  1002  		value, err := client.Get("pipelined_counter")
  1003  		assert.Nil(t, err)
  1004  		assert.Equal(t, "1", value)
  1005  		score, err := client.Zscore("zadd", "zadd")
  1006  		assert.Nil(t, err)
  1007  		assert.Equal(t, int64(12), score)
  1008  	})
  1009  }
  1010  
  1011  func TestRedisString(t *testing.T) {
  1012  	runOnRedis(t, func(client *Redis) {
  1013  		client.Ping()
  1014  		_, err := getRedis(New(client.Addr, Cluster()))
  1015  		assert.Nil(t, err)
  1016  		assert.Equal(t, client.Addr, client.String())
  1017  		assert.NotNil(t, New(client.Addr, badType()).Ping())
  1018  	})
  1019  }
  1020  
  1021  func TestRedisScriptLoad(t *testing.T) {
  1022  	runOnRedis(t, func(client *Redis) {
  1023  		client.Ping()
  1024  		_, err := New(client.Addr, badType()).ScriptLoad("foo")
  1025  		assert.NotNil(t, err)
  1026  		_, err = client.ScriptLoad("foo")
  1027  		assert.NotNil(t, err)
  1028  	})
  1029  }
  1030  
  1031  func TestRedisEvalSha(t *testing.T) {
  1032  	runOnRedis(t, func(client *Redis) {
  1033  		client.Ping()
  1034  		scriptHash, err := client.ScriptLoad(`return redis.call("EXISTS", KEYS[1])`)
  1035  		assert.Nil(t, err)
  1036  		result, err := client.EvalSha(scriptHash, []string{"key1"})
  1037  		assert.Nil(t, err)
  1038  		assert.Equal(t, int64(0), result)
  1039  	})
  1040  }
  1041  
  1042  func TestRedisToPairs(t *testing.T) {
  1043  	pairs := toPairs([]red.Z{
  1044  		{
  1045  			Member: 1,
  1046  			Score:  1,
  1047  		},
  1048  		{
  1049  			Member: 2,
  1050  			Score:  2,
  1051  		},
  1052  	})
  1053  	assert.EqualValues(t, []Pair{
  1054  		{
  1055  			Key:   "1",
  1056  			Score: 1,
  1057  		},
  1058  		{
  1059  			Key:   "2",
  1060  			Score: 2,
  1061  		},
  1062  	}, pairs)
  1063  }
  1064  
  1065  func TestRedisToStrings(t *testing.T) {
  1066  	vals := toStrings([]interface{}{1, 2})
  1067  	assert.EqualValues(t, []string{"1", "2"}, vals)
  1068  }
  1069  
  1070  func TestRedisBlpop(t *testing.T) {
  1071  	runOnRedis(t, func(client *Redis) {
  1072  		client.Ping()
  1073  		var node mockedNode
  1074  		_, err := client.Blpop(nil, "foo")
  1075  		assert.NotNil(t, err)
  1076  		_, err = client.Blpop(node, "foo")
  1077  		assert.NotNil(t, err)
  1078  	})
  1079  }
  1080  
  1081  func TestRedisBlpopEx(t *testing.T) {
  1082  	runOnRedis(t, func(client *Redis) {
  1083  		client.Ping()
  1084  		var node mockedNode
  1085  		_, _, err := client.BlpopEx(nil, "foo")
  1086  		assert.NotNil(t, err)
  1087  		_, _, err = client.BlpopEx(node, "foo")
  1088  		assert.NotNil(t, err)
  1089  	})
  1090  }
  1091  
  1092  func TestRedisGeo(t *testing.T) {
  1093  	runOnRedis(t, func(client *Redis) {
  1094  		client.Ping()
  1095  		geoLocation := []*GeoLocation{{Longitude: 13.361389, Latitude: 38.115556, Name: "Palermo"}, {Longitude: 15.087269, Latitude: 37.502669, Name: "Catania"}}
  1096  		v, err := client.GeoAdd("sicily", geoLocation...)
  1097  		assert.Nil(t, err)
  1098  		assert.Equal(t, int64(2), v)
  1099  		v2, err := client.GeoDist("sicily", "Palermo", "Catania", "m")
  1100  		assert.Nil(t, err)
  1101  		assert.Equal(t, 166274, int(v2))
  1102  		// GeoHash not support
  1103  		v3, err := client.GeoPos("sicily", "Palermo", "Catania")
  1104  		assert.Nil(t, err)
  1105  		assert.Equal(t, int64(v3[0].Longitude), int64(13))
  1106  		assert.Equal(t, int64(v3[0].Latitude), int64(38))
  1107  		assert.Equal(t, int64(v3[1].Longitude), int64(15))
  1108  		assert.Equal(t, int64(v3[1].Latitude), int64(37))
  1109  		v4, err := client.GeoRadius("sicily", 15, 37, &red.GeoRadiusQuery{WithDist: true, Unit: "km", Radius: 200})
  1110  		assert.Nil(t, err)
  1111  		assert.Equal(t, int64(v4[0].Dist), int64(190))
  1112  		assert.Equal(t, int64(v4[1].Dist), int64(56))
  1113  		geoLocation2 := []*GeoLocation{{Longitude: 13.583333, Latitude: 37.316667, Name: "Agrigento"}}
  1114  		v5, err := client.GeoAdd("sicily", geoLocation2...)
  1115  		assert.Nil(t, err)
  1116  		assert.Equal(t, int64(1), v5)
  1117  		v6, err := client.GeoRadiusByMember("sicily", "Agrigento", &red.GeoRadiusQuery{Unit: "km", Radius: 100})
  1118  		assert.Nil(t, err)
  1119  		assert.Equal(t, v6[0].Name, "Agrigento")
  1120  		assert.Equal(t, v6[1].Name, "Palermo")
  1121  	})
  1122  }
  1123  
  1124  func TestSetSlowThreshold(t *testing.T) {
  1125  	assert.Equal(t, defaultSlowThreshold, slowThreshold.Load())
  1126  	SetSlowThreshold(time.Second)
  1127  	assert.Equal(t, time.Second, slowThreshold.Load())
  1128  }
  1129  
  1130  func TestRedis_WithPass(t *testing.T) {
  1131  	runOnRedis(t, func(client *Redis) {
  1132  		err := New(client.Addr, WithPass("any")).Ping()
  1133  		assert.NotNil(t, err)
  1134  	})
  1135  }
  1136  
  1137  func runOnRedis(t *testing.T, fn func(client *Redis)) {
  1138  	s, err := miniredis.Run()
  1139  	assert.Nil(t, err)
  1140  	defer func() {
  1141  		client, err := clientManager.GetResource(s.Addr(), func() (io.Closer, error) {
  1142  			return nil, errors.New("should already exist")
  1143  		})
  1144  		if err != nil {
  1145  			t.Error(err)
  1146  		}
  1147  
  1148  		if client != nil {
  1149  			client.Close()
  1150  		}
  1151  	}()
  1152  	fn(New(s.Addr()))
  1153  }
  1154  
  1155  func runOnRedisTLS(t *testing.T, fn func(client *Redis)) {
  1156  	s, err := miniredis.RunTLS(&tls.Config{
  1157  		Certificates:       make([]tls.Certificate, 1),
  1158  		InsecureSkipVerify: true,
  1159  	})
  1160  	assert.Nil(t, err)
  1161  	defer func() {
  1162  		client, err := clientManager.GetResource(s.Addr(), func() (io.Closer, error) {
  1163  			return nil, errors.New("should already exist")
  1164  		})
  1165  		if err != nil {
  1166  			t.Error(err)
  1167  		}
  1168  		if client != nil {
  1169  			client.Close()
  1170  		}
  1171  	}()
  1172  	fn(New(s.Addr(), WithTLS()))
  1173  }
  1174  
  1175  func badType() Option {
  1176  	return func(r *Redis) {
  1177  		r.Type = "bad"
  1178  	}
  1179  }
  1180  
  1181  type mockedNode struct {
  1182  	RedisNode
  1183  }
  1184  
  1185  func (n mockedNode) BLPop(timeout time.Duration, keys ...string) *red.StringSliceCmd {
  1186  	return red.NewStringSliceCmd("foo", "bar")
  1187  }