github.com/lingyao2333/mo-zero@v1.4.1/core/stores/redis/redis_test.go (about)

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