1 start_server 
{tags 
{"basic"}} { 
   2     test 
{DEL all keys to start with a clean DB
} { 
   3         foreach key 
[r keys 
*] {r del 
$key} 
   7     test 
{SET and GET an item
} { 
  12     test 
{SET and GET an empty item
} { 
  17     test 
{DEL against a single item
} { 
  26         list [r del foo1 foo2 foo3 foo4
] [r mget foo1 foo2 foo3
] 
  29     test 
{KEYS with pattern
} { 
  30         foreach key 
{key_x key_y key_z foo_a foo_b foo_c
} { 
  36     test 
{KEYS to get all keys
} { 
  38     } {foo_a foo_b foo_c key_x key_y key_z
} 
  45         foreach key 
[r keys 
*] {r del 
$key} 
  49     test 
{Very big payload in GET
/SET
} { 
  50         set buf 
[string repeat 
"abcd" 1000000] 
  53     } [string repeat 
"abcd" 1000000] 
  56         test 
{Very big payload random access
} { 
  59             for {set j 
0} {$j < 100} {incr j
} { 
  60                 set size 
[expr 1+[randomInt 
100000]] 
  61                 set buf 
[string repeat 
"pl-$j" $size] 
  63                 r 
set bigpayload_
$j $buf 
  65             for {set j 
0} {$j < 1000} {incr j
} { 
  66                 set index 
[randomInt 
100] 
  67                 set buf 
[r get bigpayload_
$index] 
  68                 if {$buf != $payload($index)} { 
  69                     set err 
"Values differ: I set '$payload($index)' but I read back '$buf'" 
  77         test 
{SET 
10000 numeric keys and access all them in reverse order
} { 
  79             for {set x 
0} {$x < 10000} {incr x
} { 
  83             for {set x 
9999} {$x >= 0} {incr x 
-1} { 
  86                     set err 
"Eleemnt at position $x is $val instead of $x" 
  93         test 
{DBSIZE should be 
10101 now
} { 
  98     test 
{INCR against non existing key
} { 
 100         append res 
[r 
incr novar
] 
 101         append res 
[r get novar
] 
 104     test 
{INCR against key created by 
incr itself
} { 
 108     test 
{INCR against key originally 
set with SET
} { 
 113     test 
{INCR over 
32bit value
} { 
 114         r 
set novar 
17179869184 
 118     test 
{INCRBY over 
32bit value with over 
32bit increment
} { 
 119         r 
set novar 
17179869184 
 120         r incrby novar 
17179869184 
 123     test 
{INCR fails against key with spaces 
(left
)} { 
 125         catch {r 
incr novar
} err
 
 129     test 
{INCR fails against key with spaces 
(right
)} { 
 131         catch {r 
incr novar
} err
 
 135     test 
{INCR fails against key with spaces 
(both
)} { 
 137         catch {r 
incr novar
} err
 
 141     test 
{INCR fails against a key holding a 
list} { 
 143         catch {r 
incr mylist
} err
 
 148     test 
{DECRBY over 
32bit value with over 
32bit increment
, negative res
} { 
 149         r 
set novar 
17179869184 
 150         r decrby novar 
17179869185 
 153     test 
{INCRBYFLOAT against non existing key
} { 
 155         list    [roundFloat 
[r incrbyfloat novar 
1]] \ 
 156                 [roundFloat 
[r get novar
]] \ 
 157                 [roundFloat 
[r incrbyfloat novar 
0.25]] \ 
 158                 [roundFloat 
[r get novar
]] 
 161     test 
{INCRBYFLOAT against key originally 
set with SET
} { 
 163         roundFloat 
[r incrbyfloat novar 
1.5] 
 166     test 
{INCRBYFLOAT over 
32bit value
} { 
 167         r 
set novar 
17179869184 
 168         r incrbyfloat novar 
1.5 
 171     test 
{INCRBYFLOAT over 
32bit value with over 
32bit increment
} { 
 172         r 
set novar 
17179869184 
 173         r incrbyfloat novar 
17179869184 
 176     test 
{INCRBYFLOAT fails against key with spaces 
(left
)} { 
 179         catch {r incrbyfloat novar 
1.0} err
 
 183     test 
{INCRBYFLOAT fails against key with spaces 
(right
)} { 
 186         catch {r incrbyfloat novar 
1.0} err
 
 190     test 
{INCRBYFLOAT fails against key with spaces 
(both
)} { 
 193         catch {r incrbyfloat novar 
1.0} err
 
 197     test 
{INCRBYFLOAT fails against a key holding a 
list} { 
 201         catch {r incrbyfloat mylist 
1.0} err
 
 206     test 
{INCRBYFLOAT does not allow NaN or Infinity
} { 
 209         catch {r incrbyfloat foo 
+inf
} err
 
 211         # p.s. no way I can force NaN to test it from the API because 
 212         # there is no way to increment / decrement by infinity nor to 
 214     } {ERR
*would produce
*} 
 216     test 
{INCRBYFLOAT decrement
} { 
 218         roundFloat 
[r incrbyfloat foo 
-1.1
] 
 221     test 
"SETNX target key missing" { 
 223         assert_equal 
1 [r setnx novar foobared
] 
 224         assert_equal 
"foobared" [r get novar
] 
 227     test 
"SETNX target key exists" { 
 229         assert_equal 
0 [r setnx novar blabla
] 
 230         assert_equal 
"foobared" [r get novar
] 
 233     test 
"SETNX against not-expired volatile key" { 
 236         assert_equal 
0 [r setnx x 
20] 
 237         assert_equal 
10 [r get x
] 
 240     test 
"SETNX against expired volatile key" { 
 241         # Make it very unlikely for the key this test uses to be expired by the 
 242         # active expiry cycle. This is tightly coupled to the implementation of 
 243         # active expiry and dbAdd() but currently the only way to test that 
 244         # SETNX expires a key when it should have been. 
 245         for {set x 
0} {$x < 9999} {incr x
} { 
 246             r setex key-
$x 3600 value
 
 249         # This will be one of 10000 expiring keys. A cycle is executed every 
 250         # 100ms, sampling 10 keys for being expired or not.  This key will be 
 251         # expired for at most 1s when we wait 2s, resulting in a total sample 
 252         # of 100 keys. The probability of the success of this test being a 
 253         # false positive is therefore approx. 1%. 
 257         # Wait for the key to expire 
 260         assert_equal 
1 [r setnx x 
20] 
 261         assert_equal 
20 [r get x
] 
 267         append res 
[r exists newkey
] 
 269         append res 
[r exists newkey
] 
 272     test 
{Zero length value in key. SET
/GET
/EXISTS
} { 
 274         set res 
[r get emptykey
] 
 275         append res 
[r exists emptykey
] 
 277         append res 
[r exists emptykey
] 
 280     test 
{Commands pipelining
} { 
 282         puts -nonewline $fd "SET k1 xyzk\r\nGET k1\r\nPING\r\n" 
 285         append res 
[string match OK
* [::redis::redis_read_reply $fd]] 
 286         append res 
[::redis::redis_read_reply $fd] 
 287         append res 
[string match PONG
* [::redis::redis_read_reply $fd]] 
 291     test 
{Non existing command
} { 
 292         catch {r foobaredcommand
} err
 
 293         string match ERR
* $err 
 296     test 
{RENAME basic usage
} { 
 298         r 
rename mykey mykey1
 
 299         r 
rename mykey1 mykey2
 
 303     test 
{RENAME 
source key should no longer exist
} { 
 307     test 
{RENAME against already existing key
} { 
 310         r 
rename mykey2 mykey
 
 311         set res 
[r get mykey
] 
 312         append res 
[r exists mykey2
] 
 315     test 
{RENAMENX basic usage
} { 
 319         r renamenx mykey mykey2
 
 320         set res 
[r get mykey2
] 
 321         append res 
[r exists mykey
] 
 324     test 
{RENAMENX against already existing key
} { 
 327         r renamenx mykey mykey2
 
 330     test 
{RENAMENX against already existing key 
(2)} { 
 331         set res 
[r get mykey
] 
 332         append res 
[r get mykey2
] 
 335     test 
{RENAME against non existing 
source key
} { 
 336         catch {r 
rename nokey foobar
} err
 
 340     test 
{RENAME where 
source and dest key is the same
} { 
 341         catch {r 
rename mykey mykey
} err
 
 345     test 
{RENAME with volatile key
, should move the TTL as well
} { 
 349         assert 
{[r ttl mykey
] > 95 && [r ttl mykey
] <= 100} 
 350         r 
rename mykey mykey2
 
 351         assert 
{[r ttl mykey2
] > 95 && [r ttl mykey2
] <= 100} 
 354     test 
{RENAME with volatile key
, should not inherit TTL of target key
} { 
 359         assert 
{[r ttl mykey
] == -1 && [r ttl mykey2
] > 0} 
 360         r 
rename mykey mykey2
 
 364     test 
{DEL all keys again 
(DB 
0)} { 
 365         foreach key 
[r keys 
*] { 
 371     test 
{DEL all keys again 
(DB 
1)} { 
 373         foreach key 
[r keys 
*] { 
 381     test 
{MOVE basic usage
} { 
 385         lappend res 
[r exists mykey
] 
 386         lappend res 
[r dbsize
] 
 388         lappend res 
[r get mykey
] 
 389         lappend res 
[r dbsize
] 
 392     } [list 0 0 foobar 
1] 
 394     test 
{MOVE against key existing in the target DB
} { 
 399     test 
{SET
/GET keys in different DBs
} { 
 407         lappend res 
[r get a
] 
 408         lappend res 
[r get b
] 
 410         lappend res 
[r get a
] 
 411         lappend res 
[r get b
] 
 414     } {hello world foo bared
} 
 423     test 
{MGET against non existing key
} { 
 427     test 
{MGET against non-string key
} { 
 430         r mget foo baazz bar myset
 
 439         for {set i 
0} {$i < 100} {incr i
} { 
 440             set rkey 
[r randomkey
] 
 441             if {$rkey eq 
{foo
}} { 
 444             if {$rkey eq 
{bar
}} { 
 448         list $foo_seen $bar_seen 
 451     test 
{RANDOMKEY against empty DB
} { 
 456     test 
{RANDOMKEY regression 
1} { 
 463     test 
{GETSET 
(set new value
)} { 
 464         list [r getset foo xyz
] [r get foo
] 
 467     test 
{GETSET 
(replace old value
)} { 
 469         list [r getset foo xyz
] [r get foo
] 
 472     test 
{MSET base case
} { 
 473         r mset x 
10 y 
"foo bar" z 
"x x x x x x x\n\n\r\n" 
 475     } [list 10 {foo bar
} "x x x x x x x\n\n\r\n"] 
 477     test 
{MSET wrong number of args
} { 
 478         catch {r mset x 
10 y 
"foo bar" z
} err
 
 482     test 
{MSETNX with already existent key
} { 
 483         list [r msetnx x1 xxx y2 yyy x 
20] [r exists x1
] [r exists y2
] 
 486     test 
{MSETNX with not existing keys
} { 
 487         list [r msetnx x1 xxx y2 yyy
] [r get x1
] [r get y2
] 
 490     test 
"STRLEN against non-existing key" { 
 491         assert_equal 
0 [r strlen notakey
] 
 494     test 
"STRLEN against integer-encoded value" { 
 496         assert_equal 
4 [r strlen myinteger
] 
 499     test 
"STRLEN against plain string" { 
 500         r 
set mystring 
"foozzz0123456789 baz" 
 501         assert_equal 
20 [r strlen mystring
] 
 504     test 
"SETBIT against non-existing key" { 
 506         assert_equal 
0 [r setbit mykey 
1 1] 
 507         assert_equal 
[binary format B
* 01000000] [r get mykey
] 
 510     test 
"SETBIT against string-encoded key" { 
 511         # Ascii "@" is integer 64 = 01 00 00 00 
 514         assert_equal 
0 [r setbit mykey 
2 1] 
 515         assert_equal 
[binary format B
* 01100000] [r get mykey
] 
 516         assert_equal 
1 [r setbit mykey 
1 0] 
 517         assert_equal 
[binary format B
* 00100000] [r get mykey
] 
 520     test 
"SETBIT against integer-encoded key" { 
 521         # Ascii "1" is integer 49 = 00 11 00 01 
 523         assert_encoding int mykey
 
 525         assert_equal 
0 [r setbit mykey 
6 1] 
 526         assert_equal 
[binary format B
* 00110011] [r get mykey
] 
 527         assert_equal 
1 [r setbit mykey 
2 0] 
 528         assert_equal 
[binary format B
* 00010011] [r get mykey
] 
 531     test 
"SETBIT against key with wrong type" { 
 534         assert_error 
"*wrong kind*" {r setbit mykey 
0 1} 
 537     test 
"SETBIT with out of range bit offset" { 
 539         assert_error 
"*out of range*" {r setbit mykey 
[expr 4*1024*1024*1024] 1} 
 540         assert_error 
"*out of range*" {r setbit mykey 
-1 1} 
 543     test 
"SETBIT with non-bit argument" { 
 545         assert_error 
"*out of range*" {r setbit mykey 
0 -1} 
 546         assert_error 
"*out of range*" {r setbit mykey 
0  2} 
 547         assert_error 
"*out of range*" {r setbit mykey 
0 10} 
 548         assert_error 
"*out of range*" {r setbit mykey 
0 20} 
 551     test 
"SETBIT fuzzing" { 
 556         for {set i 
0} {$i < 2000} {incr i
} { 
 557             set bitnum 
[randomInt 
$len] 
 558             set bitval 
[randomInt 
2] 
 559             set fmt 
[format "%%-%ds%%d%%-s" $bitnum] 
 560             set head 
[string range 
$str 0 $bitnum-1] 
 561             set tail 
[string range 
$str $bitnum+1 end
] 
 562             set str 
[string map 
{" " 0} [format $fmt $head $bitval $tail]] 
 564             r setbit mykey 
$bitnum $bitval 
 565             assert_equal 
[binary format B
* $str] [r get mykey
] 
 569     test 
"GETBIT against non-existing key" { 
 571         assert_equal 
0 [r getbit mykey 
0] 
 574     test 
"GETBIT against string-encoded key" { 
 575         # Single byte with 2nd and 3rd bit set 
 579         assert_equal 
0 [r getbit mykey 
0] 
 580         assert_equal 
1 [r getbit mykey 
1] 
 581         assert_equal 
1 [r getbit mykey 
2] 
 582         assert_equal 
0 [r getbit mykey 
3] 
 585         assert_equal 
0 [r getbit mykey 
8] 
 586         assert_equal 
0 [r getbit mykey 
100] 
 587         assert_equal 
0 [r getbit mykey 
10000] 
 590     test 
"GETBIT against integer-encoded key" { 
 592         assert_encoding int mykey
 
 594         # Ascii "1" is integer 49 = 00 11 00 01 
 595         assert_equal 
0 [r getbit mykey 
0] 
 596         assert_equal 
0 [r getbit mykey 
1] 
 597         assert_equal 
1 [r getbit mykey 
2] 
 598         assert_equal 
1 [r getbit mykey 
3] 
 601         assert_equal 
0 [r getbit mykey 
8] 
 602         assert_equal 
0 [r getbit mykey 
100] 
 603         assert_equal 
0 [r getbit mykey 
10000] 
 606     test 
"SETRANGE against non-existing key" { 
 608         assert_equal 
3 [r setrange mykey 
0 foo
] 
 609         assert_equal 
"foo" [r get mykey
] 
 612         assert_equal 
0 [r setrange mykey 
0 ""] 
 613         assert_equal 
0 [r exists mykey
] 
 616         assert_equal 
4 [r setrange mykey 
1 foo
] 
 617         assert_equal 
"\000foo" [r get mykey
] 
 620     test 
"SETRANGE against string-encoded key" { 
 622         assert_equal 
3 [r setrange mykey 
0 b
] 
 623         assert_equal 
"boo" [r get mykey
] 
 626         assert_equal 
3 [r setrange mykey 
0 ""] 
 627         assert_equal 
"foo" [r get mykey
] 
 630         assert_equal 
3 [r setrange mykey 
1 b
] 
 631         assert_equal 
"fbo" [r get mykey
] 
 634         assert_equal 
7 [r setrange mykey 
4 bar
] 
 635         assert_equal 
"foo\000bar" [r get mykey
] 
 638     test 
"SETRANGE against integer-encoded key" { 
 640         assert_encoding int mykey
 
 641         assert_equal 
4 [r setrange mykey 
0 2] 
 642         assert_encoding raw mykey
 
 643         assert_equal 
2234 [r get mykey
] 
 645         # Shouldn't change encoding when nothing is set 
 647         assert_encoding int mykey
 
 648         assert_equal 
4 [r setrange mykey 
0 ""] 
 649         assert_encoding int mykey
 
 650         assert_equal 
1234 [r get mykey
] 
 653         assert_encoding int mykey
 
 654         assert_equal 
4 [r setrange mykey 
1 3] 
 655         assert_encoding raw mykey
 
 656         assert_equal 
1334 [r get mykey
] 
 659         assert_encoding int mykey
 
 660         assert_equal 
6 [r setrange mykey 
5 2] 
 661         assert_encoding raw mykey
 
 662         assert_equal 
"1234\0002" [r get mykey
] 
 665     test 
"SETRANGE against key with wrong type" { 
 668         assert_error 
"*wrong kind*" {r setrange mykey 
0 bar
} 
 671     test 
"SETRANGE with out of range offset" { 
 673         assert_error 
"*maximum allowed size*" {r setrange mykey 
[expr 512*1024*1024-4] world
} 
 676         assert_error 
"*out of range*" {r setrange mykey 
-1 world
} 
 677         assert_error 
"*maximum allowed size*" {r setrange mykey 
[expr 512*1024*1024-4] world
} 
 680     test 
"GETRANGE against non-existing key" { 
 682         assert_equal 
"" [r getrange mykey 
0 -1] 
 685     test 
"GETRANGE against string value" { 
 686         r 
set mykey 
"Hello World" 
 687         assert_equal 
"Hell" [r getrange mykey 
0 3] 
 688         assert_equal 
"Hello World" [r getrange mykey 
0 -1] 
 689         assert_equal 
"orld" [r getrange mykey 
-4 -1] 
 690         assert_equal 
"" [r getrange mykey 
5 3] 
 691         assert_equal 
" World" [r getrange mykey 
5 5000] 
 692         assert_equal 
"Hello World" [r getrange mykey 
-5000 10000] 
 695     test 
"GETRANGE against integer-encoded value" { 
 697         assert_equal 
"123" [r getrange mykey 
0 2] 
 698         assert_equal 
"1234" [r getrange mykey 
0 -1] 
 699         assert_equal 
"234" [r getrange mykey 
-3 -1] 
 700         assert_equal 
"" [r getrange mykey 
5 3] 
 701         assert_equal 
"4" [r getrange mykey 
3 5000] 
 702         assert_equal 
"1234" [r getrange mykey 
-5000 10000] 
 705     test 
"GETRANGE fuzzing" { 
 706         for {set i 
0} {$i < 1000} {incr i
} { 
 707             r 
set bin 
[set bin 
[randstring 
0 1024 binary]] 
 708             set _start 
[set start 
[randomInt 
1500]] 
 709             set _end 
[set end 
[randomInt 
1500]] 
 710             if {$_start < 0} {set _start 
"end-[abs($_start)-1]"} 
 711             if {$_end < 0} {set _end 
"end-[abs($_end)-1]"} 
 712             assert_equal 
[string range 
$bin $_start $_end] [r getrange bin 
$start $end]