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 }