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 }