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]