2 # Redis test suite. Copyright (C) 2009 Salvatore Sanfilippo antirez@gmail.com
3 # This softare is released under the BSD License. See the COPYING file for
13 proc test
{name code okpattern
} {
15 if {$::testnum < $::first ||
$::testnum > $::last} return
16 puts -nonewline [format "%-70s " "#$::testnum $name"]
18 set retval
[uplevel 1 $code]
19 if {$okpattern eq
$retval ||
[string match
$okpattern $retval]} {
23 puts "!! ERROR expected\n'$okpattern'\nbut got\n'$retval'"
27 if {![string match
{*0 leaks
*} [exec leaks redis-server
]]} {
28 puts "--------- Test $::testnum LEAKED! --------"
34 proc randstring
{min max
{type
binary}} {
35 set len
[expr {$min+int
(rand
()*($max-$min+1))}]
37 if {$type eq
{binary}} {
40 } elseif
{$type eq
{alpha
}} {
43 } elseif
{$type eq
{compr
}} {
48 append output
[format "%c" [expr {$minval+int
(rand
()*($maxval-$minval+1))}]]
54 # Useful for some test
55 proc zlistAlikeSort
{a b
} {
56 if {[lindex $a 0] > [lindex $b 0]} {return 1}
57 if {[lindex $a 0] < [lindex $b 0]} {return -1}
58 string compare
[lindex $a 1] [lindex $b 1]
61 proc waitForBgsave r
{
64 if {[string match
{*bgsave_in_progress
:1*} $i]} {
65 puts -nonewline "\nWaiting for background save to finish... "
74 proc waitForBgrewriteaof r
{
77 if {[string match
{*bgrewriteaof_in_progress
:1*} $i]} {
78 puts -nonewline "\nWaiting for background AOF rewrite to finish... "
87 proc randomInt
{max
} {
88 expr {int
(rand
()*$max)}
92 set path
[expr {int
(rand
()*[llength $args])}]
93 uplevel 1 [lindex $args $path]
98 # Small enough to likely collide
101 # 32 bit compressible signed/unsigned
102 randpath
{randomInt
2000000000} {randomInt
4000000000}
105 randpath
{randomInt
1000000000000}
108 randpath
{randstring
0 256 alpha
} \
109 {randstring
0 256 compr
} \
110 {randstring
0 256 binary}
116 # Small enough to likely collide
119 # 32 bit compressible signed/unsigned
120 randpath
{randomInt
2000000000} {randomInt
4000000000}
123 randpath
{randomInt
1000000000000}
126 randpath
{randstring
1 256 alpha
} \
127 {randstring
1 256 compr
}
131 proc createComplexDataset
{r ops
} {
132 for {set j
0} {$j < $ops} {incr j
} {
137 set d
[expr {rand
()}]
139 set d
[expr {rand
()}]
141 set d
[expr {rand
()}]
143 set d
[expr {rand
()}]
145 set d
[expr {rand
()}]
147 randpath
{set d
+inf
} {set d
-inf}
171 randpath
{$r lpush
$k $v} \
178 randpath
{$r sadd
$k $v} \
182 randpath
{$r zadd
$k $d $v} \
186 randpath
{$r hset
$k $f $v} \
193 proc datasetDigest r
{
194 set keys
[lsort [$r keys
*]]
200 set aux
[::sha1::sha1 -hex [$r get
$k]]
202 if {[$r llen
$k] == 0} {
205 set aux
[::sha1::sha1 -hex [$r lrange $k 0 -1]]
208 if {[$r scard
$k] == 0} {
211 set aux
[::sha1::sha1 -hex [lsort [$r smembers
$k]]]
214 if {[$r zcard
$k] == 0} {
217 set aux
[::sha1::sha1 -hex [$r zrange
$k 0 -1]]
220 if {[$r hlen
$k] == 0} {
223 set aux
[::sha1::sha1 -hex [lsort [$r hgetall
$k]]]
226 error "Type not supported: $t"
229 if {$aux eq
{}} continue
230 set digest
[::sha1::sha1 -hex [join [list $aux $digest $k] "\n"]]
236 set r
[redis
$::host $::port]
241 # The following AUTH test should be enabled only when requirepass
242 # <PASSWORD> is set in redis.conf and redis-server was started with
243 # redis.conf as the first argument.
245 #test {AUTH with requirepass in redis.conf} {
249 test
{DEL all keys to start with a clean DB
} {
250 foreach key
[$r keys
*] {$r del
$key}
254 test
{SET and GET an item
} {
259 test
{SET and GET an empty item
} {
264 test
{DEL against a single item
} {
273 list [$r del foo1 foo2 foo3 foo4
] [$r mget foo1 foo2 foo3
]
276 test
{KEYS with pattern
} {
277 foreach key
{key_x key_y key_z foo_a foo_b foo_c
} {
281 } {foo_a foo_b foo_c
}
283 test
{KEYS to get all keys
} {
285 } {foo_a foo_b foo_c key_x key_y key_z
}
291 test
{DEL all keys
} {
292 foreach key
[$r keys
*] {$r del
$key}
296 test
{Very big payload in GET
/SET
} {
297 set buf
[string repeat
"abcd" 1000000]
300 } [string repeat
"abcd" 1000000]
302 test
{Very big payload random access
} {
305 for {set j
0} {$j < 100} {incr j
} {
306 set size
[expr 1+[randomInt
100000]]
307 set buf
[string repeat
"pl-$j" $size]
309 $r set bigpayload_
$j $buf
311 for {set j
0} {$j < 1000} {incr j
} {
312 set index
[randomInt
100]
313 set buf
[$r get bigpayload_
$index]
314 if {$buf != $payload($index)} {
315 set err
"Values differ: I set '$payload($index)' but I read back '$buf'"
323 test
{SET
10000 numeric keys and access all them in reverse order
} {
325 for {set x
0} {$x < 10000} {incr x
} {
329 for {set x
9999} {$x >= 0} {incr x
-1} {
332 set err
"Eleemnt at position $x is $val instead of $x"
339 test
{DBSIZE should be
10101 now
} {
343 test
{INCR against non existing key
} {
345 append res
[$r incr novar
]
346 append res
[$r get novar
]
349 test
{INCR against key created by
incr itself
} {
353 test
{INCR against key originally
set with SET
} {
358 test
{INCR over
32bit value
} {
359 $r set novar
17179869184
363 test
{INCRBY over
32bit value with over
32bit increment
} {
364 $r set novar
17179869184
365 $r incrby novar
17179869184
368 test
{INCR fails against key with spaces
(no integer encoded
)} {
370 catch {$r incr novar
} err
374 test
{INCR fails against a key holding a
list} {
376 catch {$r incr novar
} err
381 test
{DECRBY over
32bit value with over
32bit increment
, negative res
} {
382 $r set novar
17179869184
383 $r decrby novar
17179869185
386 test
{SETNX target key missing
} {
387 $r setnx novar2 foobared
391 test
{SETNX target key exists
} {
392 $r setnx novar2 blabla
396 test
{SETNX will overwrite EXPIREing key
} {
406 append res
[$r exists newkey
]
408 append res
[$r exists newkey
]
411 test
{Zero length value in key. SET
/GET
/EXISTS
} {
413 set res
[$r get emptykey
]
414 append res
[$r exists emptykey
]
416 append res
[$r exists emptykey
]
419 test
{Commands pipelining
} {
421 puts -nonewline $fd "SET k1 4\r\nxyzk\r\nGET k1\r\nPING\r\n"
424 append res
[string match OK
* [::redis::redis_read_reply $fd]]
425 append res
[::redis::redis_read_reply $fd]
426 append res
[string match PONG
* [::redis::redis_read_reply $fd]]
430 test
{Non existing command
} {
431 catch {$r foobaredcommand
} err
432 string match ERR
* $err
435 test
{Basic LPUSH
, RPUSH
, LLENGTH
, LINDEX
} {
436 set res
[$r lpush mylist a
]
437 append res
[$r lpush mylist b
]
438 append res
[$r rpush mylist c
]
439 append res
[$r llen mylist
]
440 append res
[$r rpush anotherlist d
]
441 append res
[$r lpush anotherlist e
]
442 append res
[$r llen anotherlist
]
443 append res
[$r lindex mylist
0]
444 append res
[$r lindex mylist
1]
445 append res
[$r lindex mylist
2]
446 append res
[$r lindex anotherlist
0]
447 append res
[$r lindex anotherlist
1]
448 list $res [$r lindex mylist
100]
456 test
{Create a long
list and check every single element with LINDEX
} {
458 for {set i
0} {$i < 1000} {incr i
} {
461 for {set i
0} {$i < 1000} {incr i
} {
462 if {[$r lindex mylist
$i] eq
$i} {incr ok
}
463 if {[$r lindex mylist
[expr (-$i)-1]] eq
[expr 999-$i]} {
470 test
{Test elements with LINDEX in random access
} {
472 for {set i
0} {$i < 1000} {incr i
} {
473 set rint
[expr int
(rand
()*1000)]
474 if {[$r lindex mylist
$rint] eq
$rint} {incr ok
}
475 if {[$r lindex mylist
[expr (-$rint)-1]] eq
[expr 999-$rint]} {
482 test
{Check
if the
list is still ok
after a DEBUG RELOAD
} {
485 for {set i
0} {$i < 1000} {incr i
} {
486 set rint
[expr int
(rand
()*1000)]
487 if {[$r lindex mylist
$rint] eq
$rint} {incr ok
}
488 if {[$r lindex mylist
[expr (-$rint)-1]] eq
[expr 999-$rint]} {
495 test
{LLEN against non-list value
error} {
498 catch {$r llen mylist
} err
502 test
{LLEN against non existing key
} {
506 test
{LINDEX against non-list value
error} {
507 catch {$r lindex mylist
0} err
511 test
{LINDEX against non existing key
} {
512 $r lindex not-a-key
10
515 test
{LPUSH against non-list value
error} {
516 catch {$r lpush mylist
0} err
520 test
{RPUSH against non-list value
error} {
521 catch {$r rpush mylist
0} err
525 test
{RPOPLPUSH base case
} {
531 set v1
[$r rpoplpush mylist newlist
]
532 set v2
[$r rpoplpush mylist newlist
]
533 set l1
[$r lrange mylist
0 -1]
534 set l2
[$r lrange newlist
0 -1]
538 test
{RPOPLPUSH with the same
list as src and dst
} {
543 set l1
[$r lrange mylist
0 -1]
544 set v
[$r rpoplpush mylist mylist
]
545 set l2
[$r lrange mylist
0 -1]
547 } {{a b c
} c
{c a b
}}
549 test
{RPOPLPUSH target
list already exists
} {
557 set v1
[$r rpoplpush mylist newlist
]
558 set v2
[$r rpoplpush mylist newlist
]
559 set l1
[$r lrange mylist
0 -1]
560 set l2
[$r lrange newlist
0 -1]
562 } {d c
{a b
} {c d x
}}
564 test
{RPOPLPUSH against non existing key
} {
567 set v1
[$r rpoplpush mylist newlist
]
568 list $v1 [$r exists mylist
] [$r exists newlist
]
571 test
{RPOPLPUSH against non
list src key
} {
575 catch {$r rpoplpush mylist newlist
} err
576 list [$r type mylist
] [$r exists newlist
] [string range
$err 0 2]
579 test
{RPOPLPUSH against non
list dst key
} {
587 catch {$r rpoplpush mylist newlist
} err
588 list [$r lrange mylist
0 -1] [$r type newlist
] [string range
$err 0 2]
589 } {{a b c d
} string ERR
}
591 test
{RPOPLPUSH against non existing src key
} {
594 $r rpoplpush mylist newlist
597 test
{RENAME basic usage
} {
599 $r rename mykey mykey1
600 $r rename mykey1 mykey2
604 test
{RENAME
source key should no longer exist
} {
608 test
{RENAME against already existing key
} {
611 $r rename mykey2 mykey
612 set res
[$r get mykey
]
613 append res
[$r exists mykey2
]
616 test
{RENAMENX basic usage
} {
620 $r renamenx mykey mykey2
621 set res
[$r get mykey2
]
622 append res
[$r exists mykey
]
625 test
{RENAMENX against already existing key
} {
628 $r renamenx mykey mykey2
631 test
{RENAMENX against already existing key
(2)} {
632 set res
[$r get mykey
]
633 append res
[$r get mykey2
]
636 test
{RENAME against non existing
source key
} {
637 catch {$r rename nokey foobar
} err
641 test
{RENAME where
source and dest key is the same
} {
642 catch {$r rename mykey mykey
} err
646 test
{DEL all keys again
(DB
0)} {
647 foreach key
[$r keys
*] {
653 test
{DEL all keys again
(DB
1)} {
655 foreach key
[$r keys
*] {
663 test
{MOVE basic usage
} {
667 lappend res
[$r exists mykey
]
668 lappend res
[$r dbsize
]
670 lappend res
[$r get mykey
]
671 lappend res
[$r dbsize
]
674 } [list 0 0 foobar
1]
676 test
{MOVE against key existing in the target DB
} {
681 test
{SET
/GET keys in different DBs
} {
689 lappend res
[$r get a
]
690 lappend res
[$r get b
]
692 lappend res
[$r get a
]
693 lappend res
[$r get b
]
696 } {hello world foo bared
}
698 test
{Basic LPOP
/RPOP
} {
703 list [$r lpop mylist
] [$r rpop mylist
] [$r lpop mylist
] [$r llen mylist
]
706 test
{LPOP
/RPOP against empty
list} {
710 test
{LPOP against non
list value
} {
712 catch {$r lpop notalist
} err
716 test
{Mass LPUSH
/LPOP
} {
718 for {set i
0} {$i < 1000} {incr i
} {
723 for {set i
0} {$i < 500} {incr i
} {
724 incr sum2
[$r lpop mylist
]
725 incr sum2
[$r rpop mylist
]
730 test
{LRANGE basics
} {
731 for {set i
0} {$i < 10} {incr i
} {
734 list [$r lrange mylist
1 -2] \
735 [$r lrange mylist
-3 -1] \
736 [$r lrange mylist
4 4]
737 } {{1 2 3 4 5 6 7 8} {7 8 9} 4}
739 test
{LRANGE inverted indexes
} {
743 test
{LRANGE out of range indexes including the full
list} {
744 $r lrange mylist
-1000 1000
745 } {0 1 2 3 4 5 6 7 8 9}
747 test
{LRANGE against non existing key
} {
748 $r lrange nosuchkey
0 1
751 test
{LTRIM basics
} {
753 for {set i
0} {$i < 100} {incr i
} {
757 $r lrange mylist
0 -1
760 test
{LTRIM stress testing
} {
763 for {set i
0} {$i < 20} {incr i
} {
767 for {set j
0} {$j < 100} {incr j
} {
770 for {set i
0} {$i < 20} {incr i
} {
776 $r ltrim mylist
$a $b
777 if {[$r lrange mylist
0 -1] ne
[lrange $mylist $a $b]} {
778 set err
"[$r lrange mylist 0 -1] != [lrange $mylist $a $b]"
787 foreach x
{99 98 97 96 95} {
791 $r lset mylist
-1 bar
792 $r lrange mylist
0 -1
795 test
{LSET out of range index
} {
796 catch {$r lset mylist
10 foo
} err
800 test
{LSET against non existing key
} {
801 catch {$r lset nosuchkey
10 foo
} err
805 test
{LSET against non
list value
} {
807 catch {$r lset nolist
0 foo
} err
811 test
{SADD
, SCARD
, SISMEMBER
, SMEMBERS basics
} {
814 list [$r scard myset
] [$r sismember myset foo
] \
815 [$r sismember myset bar
] [$r sismember myset bla
] \
816 [lsort [$r smembers myset
]]
817 } {2 1 1 0 {bar foo
}}
819 test
{SADD adding the same element multiple times
} {
826 test
{SADD against non
set} {
827 catch {$r sadd mylist foo
} err
834 lsort [$r smembers myset
]
837 test
{Mass SADD and SINTER with two sets
} {
838 for {set i
0} {$i < 1000} {incr i
} {
840 $r sadd set2
[expr $i+995]
842 lsort [$r sinter set1 set2
]
843 } {995 996 997 998 999}
845 test
{SUNION with two sets
} {
846 lsort [$r sunion set1 set2
]
847 } [lsort -uniq "[$r smembers set1] [$r smembers set2]"]
849 test
{SINTERSTORE with two sets
} {
850 $r sinterstore setres set1 set2
851 lsort [$r smembers setres
]
852 } {995 996 997 998 999}
854 test
{SINTERSTORE with two sets
, after a DEBUG RELOAD
} {
856 $r sinterstore setres set1 set2
857 lsort [$r smembers setres
]
858 } {995 996 997 998 999}
860 test
{SUNIONSTORE with two sets
} {
861 $r sunionstore setres set1 set2
862 lsort [$r smembers setres
]
863 } [lsort -uniq "[$r smembers set1] [$r smembers set2]"]
865 test
{SUNIONSTORE against non existing keys
} {
867 list [$r sunionstore setres foo111 bar222
] [$r exists xxx
]
870 test
{SINTER against three sets
} {
875 lsort [$r sinter set1 set2 set3
]
878 test
{SINTERSTORE with three sets
} {
879 $r sinterstore setres set1 set2 set3
880 lsort [$r smembers setres
]
883 test
{SUNION with non existing keys
} {
884 lsort [$r sunion nokey1 set1 set2 nokey2
]
885 } [lsort -uniq "[$r smembers set1] [$r smembers set2]"]
887 test
{SDIFF with two sets
} {
888 for {set i
5} {$i < 1000} {incr i
} {
891 lsort [$r sdiff set1 set4
]
894 test
{SDIFF with three sets
} {
896 lsort [$r sdiff set1 set4 set5
]
899 test
{SDIFFSTORE with three sets
} {
900 $r sdiffstore sres set1 set4 set5
901 lsort [$r smembers sres
]
909 list [lsort [list [$r spop myset
] [$r spop myset
] [$r spop myset
]]] [$r scard myset
]
912 test
{SAVE
- make sure there are all the types as values
} {
913 # Wait for a background saving in progress to terminate
915 $r lpush mysavelist hello
916 $r lpush mysavelist world
918 $r set mynormalkey
{blablablba
}
919 $r zadd mytestzset
10 a
920 $r zadd mytestzset
20 b
921 $r zadd mytestzset
30 c
930 unset -nocomplain myset
932 for {set i
0} {$i < 100} {incr i
} {
933 set myset
([$r srandmember myset
]) 1
935 lsort [array names myset
]
938 test
{SORT ALPHA against integer encoded strings
} {
947 test
{Create a random
list and a random
set} {
949 array set seenrand
{}
950 for {set i
0} {$i < 10000} {incr i
} {
952 # Make sure all the weights are different because
953 # Redis does not use a stable sort but Tcl does.
955 set rint
[expr int
(rand
()*1000000)]
957 set rint
[expr rand
()]
959 if {![info exists seenrand
($rint)]} break
961 set seenrand
($rint) x
963 $r sadd tosort-set
$i
964 $r set weight_
$i $rint
965 $r hset wobj_
$i weight
$rint
966 lappend tosort
[list $i $rint]
968 set sorted
[lsort -index 1 -real $tosort]
970 for {set i
0} {$i < 10000} {incr i
} {
971 lappend res
[lindex $sorted $i 0]
976 test
{SORT with BY against the newly created
list} {
977 $r sort tosort
{BY weight_
*}
980 test
{SORT with BY
(hash field
) against the newly created
list} {
981 $r sort tosort
{BY wobj_
*->weight
}
984 test
{SORT with GET
(key
+hash
) with sanity check of each element
(list)} {
986 set l1
[$r sort tosort GET
# GET weight_*]
987 set l2
[$r sort tosort GET
# GET wobj_*->weight]
988 foreach {id1 w1
} $l1 {id2 w2
} $l2 {
989 set realweight
[$r get weight_
$id1]
991 set err
"ID mismatch $id1 != $id2"
994 if {$realweight != $w1 ||
$realweight != $w2} {
995 set err
"Weights mismatch! w1: $w1 w2: $w2 real: $realweight"
1002 test
{SORT with BY
, but against the newly created
set} {
1003 $r sort tosort-set
{BY weight_
*}
1006 test
{SORT with BY
(hash field
), but against the newly created
set} {
1007 $r sort tosort-set
{BY wobj_
*->weight
}
1010 test
{SORT with BY and STORE against the newly created
list} {
1011 $r sort tosort
{BY weight_
*} store sort-res
1012 $r lrange sort-res
0 -1
1015 test
{SORT with BY
(hash field
) and STORE against the newly created
list} {
1016 $r sort tosort
{BY wobj_
*->weight
} store sort-res
1017 $r lrange sort-res
0 -1
1020 test
{SORT direct
, numeric
, against the newly created
list} {
1022 } [lsort -integer $res]
1024 test
{SORT decreasing sort
} {
1025 $r sort tosort
{DESC
}
1026 } [lsort -decreasing -integer $res]
1028 test
{SORT speed
, sorting
10000 elements
list using BY
, 100 times
} {
1029 set start
[clock clicks
-milliseconds]
1030 for {set i
0} {$i < 100} {incr i
} {
1031 set sorted
[$r sort tosort
{BY weight_
* LIMIT
0 10}]
1033 set elapsed
[expr [clock clicks
-milliseconds]-$start]
1034 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
1039 test
{SORT speed
, as above but against hash field
} {
1040 set start
[clock clicks
-milliseconds]
1041 for {set i
0} {$i < 100} {incr i
} {
1042 set sorted
[$r sort tosort
{BY wobj_
*->weight LIMIT
0 10}]
1044 set elapsed
[expr [clock clicks
-milliseconds]-$start]
1045 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
1050 test
{SORT speed
, sorting
10000 elements
list directly
, 100 times
} {
1051 set start
[clock clicks
-milliseconds]
1052 for {set i
0} {$i < 100} {incr i
} {
1053 set sorted
[$r sort tosort
{LIMIT
0 10}]
1055 set elapsed
[expr [clock clicks
-milliseconds]-$start]
1056 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
1061 test
{SORT speed
, pseudo-sorting
10000 elements
list, BY
<const
>, 100 times
} {
1062 set start
[clock clicks
-milliseconds]
1063 for {set i
0} {$i < 100} {incr i
} {
1064 set sorted
[$r sort tosort
{BY nokey LIMIT
0 10}]
1066 set elapsed
[expr [clock clicks
-milliseconds]-$start]
1067 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
1072 test
{SORT regression
for issue
#19, sorting floats} {
1074 foreach x
{1.1 5.10 3.10 7.44 2.1 5.75 6.12 0.25 1.15} {
1078 } [lsort -real {1.1 5.10 3.10 7.44 2.1 5.75 6.12 0.25 1.15}]
1080 test
{SORT with GET
#} {
1085 $r mset weight_1
10 weight_2
5 weight_3
30
1086 $r sort mylist BY weight_
* GET
#
1089 test
{SORT with constant GET
} {
1090 $r sort mylist GET foo
1093 test
{LREM
, remove all the occurrences
} {
1097 $r rpush mylist foobar
1098 $r rpush mylist foobared
1101 $r rpush mylist test
1103 set res
[$r lrem mylist
0 bar
]
1104 list [$r lrange mylist
0 -1] $res
1105 } {{foo foobar foobared zap test foo
} 2}
1107 test
{LREM
, remove the first occurrence
} {
1108 set res
[$r lrem mylist
1 foo
]
1109 list [$r lrange mylist
0 -1] $res
1110 } {{foobar foobared zap test foo
} 1}
1112 test
{LREM
, remove non existing element
} {
1113 set res
[$r lrem mylist
1 nosuchelement
]
1114 list [$r lrange mylist
0 -1] $res
1115 } {{foobar foobared zap test foo
} 0}
1117 test
{LREM
, starting from tail with negative count
} {
1121 $r rpush mylist foobar
1122 $r rpush mylist foobared
1125 $r rpush mylist test
1128 set res
[$r lrem mylist
-1 bar
]
1129 list [$r lrange mylist
0 -1] $res
1130 } {{foo bar foobar foobared zap test foo foo
} 1}
1132 test
{LREM
, starting from tail with negative count
(2)} {
1133 set res
[$r lrem mylist
-2 foo
]
1134 list [$r lrange mylist
0 -1] $res
1135 } {{foo bar foobar foobared zap test
} 2}
1137 test
{LREM
, deleting objects that may be encoded as integers
} {
1138 $r lpush myotherlist
1
1139 $r lpush myotherlist
2
1140 $r lpush myotherlist
3
1141 $r lrem myotherlist
1 2
1152 test
{MGET against non existing key
} {
1153 $r mget foo baazz bar
1156 test
{MGET against non-string key
} {
1159 $r mget foo baazz bar myset
1168 for {set i
0} {$i < 100} {incr i
} {
1169 set rkey
[$r randomkey
]
1170 if {$rkey eq
{foo
}} {
1173 if {$rkey eq
{bar
}} {
1177 list $foo_seen $bar_seen
1180 test
{RANDOMKEY against empty DB
} {
1185 test
{RANDOMKEY regression
1} {
1192 test
{GETSET
(set new value
)} {
1193 list [$r getset foo xyz
] [$r get foo
]
1196 test
{GETSET
(replace old value
)} {
1198 list [$r getset foo xyz
] [$r get foo
]
1201 test
{SMOVE basics
} {
1208 $r smove myset1 myset2 a
1209 list [lsort [$r smembers myset2
]] [lsort [$r smembers myset1
]]
1212 test
{SMOVE non existing key
} {
1213 list [$r smove myset1 myset2 foo
] [lsort [$r smembers myset2
]] [lsort [$r smembers myset1
]]
1214 } {0 {a x y z
} {b c
}}
1216 test
{SMOVE non existing src
set} {
1217 list [$r smove noset myset2 foo
] [lsort [$r smembers myset2
]]
1220 test
{SMOVE non existing dst
set} {
1221 list [$r smove myset2 myset3 y
] [lsort [$r smembers myset2
]] [lsort [$r smembers myset3
]]
1224 test
{SMOVE wrong src key type
} {
1226 catch {$r smove x myset2 foo
} err
1230 test
{SMOVE wrong dst key type
} {
1232 catch {$r smove myset2 x foo
} err
1236 test
{MSET base case
} {
1237 $r mset x
10 y
"foo bar" z
"x x x x x x x\n\n\r\n"
1239 } [list 10 {foo bar
} "x x x x x x x\n\n\r\n"]
1241 test
{MSET wrong number of args
} {
1242 catch {$r mset x
10 y
"foo bar" z
} err
1246 test
{MSETNX with already existent key
} {
1247 list [$r msetnx x1 xxx y2 yyy x
20] [$r exists x1
] [$r exists y2
]
1250 test
{MSETNX with not existing keys
} {
1251 list [$r msetnx x1 xxx y2 yyy
] [$r get x1
] [$r get y2
]
1254 test
{MSETNX should remove all the volatile keys even on
failure} {
1258 list [$r msetnx x A y B z C
] [$r mget x y z
]
1261 test
{ZSET basic ZADD and score
update} {
1265 set aux1
[$r zrange ztmp
0 -1]
1267 set aux2
[$r zrange ztmp
0 -1]
1271 test
{ZCARD basics
} {
1275 test
{ZCARD non existing key
} {
1276 $r zcard ztmp-blabla
1279 test
{ZRANK basics
} {
1280 $r zadd zranktmp
10 x
1281 $r zadd zranktmp
20 y
1282 $r zadd zranktmp
30 z
1283 list [$r zrank zranktmp x
] [$r zrank zranktmp y
] [$r zrank zranktmp z
]
1286 test
{ZREVRANK basics
} {
1287 list [$r zrevrank zranktmp x
] [$r zrevrank zranktmp y
] [$r zrevrank zranktmp z
]
1290 test
{ZRANK
- after deletion
} {
1292 list [$r zrank zranktmp x
] [$r zrank zranktmp z
]
1298 for {set i
0} {$i < 1000} {incr i
} {
1299 set score
[expr rand
()]
1301 $r zadd zscoretest
$score $i
1303 for {set i
0} {$i < 1000} {incr i
} {
1304 if {[$r zscore zscoretest
$i] != [lindex $aux $i]} {
1305 set err
"Expected score was [lindex $aux $i] but got [$r zscore zscoretest $i] for element $i"
1312 test
{ZSCORE
after a DEBUG RELOAD
} {
1316 for {set i
0} {$i < 1000} {incr i
} {
1317 set score
[expr rand
()]
1319 $r zadd zscoretest
$score $i
1322 for {set i
0} {$i < 1000} {incr i
} {
1323 if {[$r zscore zscoretest
$i] != [lindex $aux $i]} {
1324 set err
"Expected score was [lindex $aux $i] but got [$r zscore zscoretest $i] for element $i"
1331 test
{ZRANGE and ZREVRANGE basics
} {
1332 list [$r zrange ztmp
0 -1] [$r zrevrange ztmp
0 -1] \
1333 [$r zrange ztmp
1 -1] [$r zrevrange ztmp
1 -1]
1334 } {{y x z
} {z x y
} {x z
} {x y
}}
1336 test
{ZRANGE WITHSCORES
} {
1337 $r zrange ztmp
0 -1 withscores
1340 test
{ZSETs stress tester
- sorting is working well?
} {
1342 for {set test
0} {$test < 2} {incr test
} {
1343 unset -nocomplain auxarray
1344 array set auxarray
{}
1347 for {set i
0} {$i < 1000} {incr i
} {
1349 set score
[expr rand
()]
1351 set score
[expr int
(rand
()*10)]
1353 set auxarray
($i) $score
1354 $r zadd myzset
$score $i
1356 if {[expr rand
()] < .2} {
1357 set j
[expr int
(rand
()*1000)]
1359 set score
[expr rand
()]
1361 set score
[expr int
(rand
()*10)]
1363 set auxarray
($j) $score
1364 $r zadd myzset
$score $j
1367 foreach {item score
} [array get auxarray
] {
1368 lappend auxlist
[list $score $item]
1370 set sorted
[lsort -command zlistAlikeSort
$auxlist]
1373 lappend auxlist
[lindex $x 1]
1375 set fromredis
[$r zrange myzset
0 -1]
1377 for {set i
0} {$i < [llength $fromredis]} {incr i
} {
1378 if {[lindex $fromredis $i] != [lindex $auxlist $i]} {
1386 test
{ZINCRBY
- can create a new sorted
set} {
1388 $r zincrby zset
1 foo
1389 list [$r zrange zset
0 -1] [$r zscore zset foo
]
1392 test
{ZINCRBY
- increment and decrement
} {
1393 $r zincrby zset
2 foo
1394 $r zincrby zset
1 bar
1395 set v1
[$r zrange zset
0 -1]
1396 $r zincrby zset
10 bar
1397 $r zincrby zset
-5 foo
1398 $r zincrby zset
-5 bar
1399 set v2
[$r zrange zset
0 -1]
1400 list $v1 $v2 [$r zscore zset foo
] [$r zscore zset bar
]
1401 } {{bar foo
} {foo bar
} -2 6}
1403 test
{ZRANGEBYSCORE and ZCOUNT basics
} {
1410 list [$r zrangebyscore zset
2 4] [$r zrangebyscore zset
(2 (4] \
1411 [$r zcount zset
2 4] [$r zcount zset
(2 (4]
1414 test
{ZRANGEBYSCORE withscores
} {
1421 $r zrangebyscore zset
2 4 withscores
1424 test
{ZRANGEBYSCORE fuzzy test
, 100 ranges in
1000 elements sorted
set} {
1427 for {set i
0} {$i < 1000} {incr i
} {
1428 $r zadd zset
[expr rand
()] $i
1430 for {set i
0} {$i < 100} {incr i
} {
1431 set min
[expr rand
()]
1432 set max
[expr rand
()]
1438 set low
[$r zrangebyscore zset
-inf $min]
1439 set ok
[$r zrangebyscore zset
$min $max]
1440 set high
[$r zrangebyscore zset
$max +inf
]
1441 set lowx
[$r zrangebyscore zset
-inf ($min]
1442 set okx
[$r zrangebyscore zset
($min ($max]
1443 set highx
[$r zrangebyscore zset
($max +inf
]
1445 if {[$r zcount zset
-inf $min] != [llength $low]} {
1446 append err
"Error, len does not match zcount\n"
1448 if {[$r zcount zset
$min $max] != [llength $ok]} {
1449 append err
"Error, len does not match zcount\n"
1451 if {[$r zcount zset
$max +inf
] != [llength $high]} {
1452 append err
"Error, len does not match zcount\n"
1454 if {[$r zcount zset
-inf ($min] != [llength $lowx]} {
1455 append err
"Error, len does not match zcount\n"
1457 if {[$r zcount zset
($min ($max] != [llength $okx]} {
1458 append err
"Error, len does not match zcount\n"
1460 if {[$r zcount zset
($max +inf
] != [llength $highx]} {
1461 append err
"Error, len does not match zcount\n"
1465 set score
[$r zscore zset
$x]
1466 if {$score > $min} {
1467 append err
"Error, score for $x is $score > $min\n"
1471 set score
[$r zscore zset
$x]
1472 if {$score >= $min} {
1473 append err
"Error, score for $x is $score >= $min\n"
1477 set score
[$r zscore zset
$x]
1478 if {$score < $min ||
$score > $max} {
1479 append err
"Error, score for $x is $score outside $min-$max range\n"
1483 set score
[$r zscore zset
$x]
1484 if {$score <= $min ||
$score >= $max} {
1485 append err
"Error, score for $x is $score outside $min-$max open range\n"
1489 set score
[$r zscore zset
$x]
1490 if {$score < $max} {
1491 append err
"Error, score for $x is $score < $max\n"
1495 set score
[$r zscore zset
$x]
1496 if {$score <= $max} {
1497 append err
"Error, score for $x is $score <= $max\n"
1504 test
{ZRANGEBYSCORE with LIMIT
} {
1512 [$r zrangebyscore zset
0 10 LIMIT
0 2] \
1513 [$r zrangebyscore zset
0 10 LIMIT
2 3] \
1514 [$r zrangebyscore zset
0 10 LIMIT
2 10] \
1515 [$r zrangebyscore zset
0 10 LIMIT
20 10]
1516 } {{a b
} {c d e
} {c d e
} {}}
1518 test
{ZRANGEBYSCORE with LIMIT and withscores
} {
1525 $r zrangebyscore zset
20 50 LIMIT
2 3 withscores
1528 test
{ZREMRANGEBYSCORE basics
} {
1535 list [$r zremrangebyscore zset
2 4] [$r zrange zset
0 -1]
1538 test
{ZREMRANGEBYSCORE from
-inf to
+inf
} {
1545 list [$r zremrangebyscore zset
-inf +inf
] [$r zrange zset
0 -1]
1548 test
{ZREMRANGEBYRANK basics
} {
1555 list [$r zremrangebyrank zset
1 3] [$r zrange zset
0 -1]
1558 test
{ZUNION against non-existing key doesn't
set destination
} {
1560 list [$r zunion dst_key
1 zseta
] [$r exists dst_key
]
1563 test
{ZUNION basics
} {
1564 $r del zseta zsetb zsetc
1571 list [$r zunion zsetc
2 zseta zsetb
] [$r zrange zsetc
0 -1 withscores
]
1572 } {4 {a
1 b
3 d
3 c
5}}
1574 test
{ZUNION with weights
} {
1575 list [$r zunion zsetc
2 zseta zsetb weights
2 3] [$r zrange zsetc
0 -1 withscores
]
1576 } {4 {a
2 b
7 d
9 c
12}}
1578 test
{ZUNION with AGGREGATE MIN
} {
1579 list [$r zunion zsetc
2 zseta zsetb aggregate min
] [$r zrange zsetc
0 -1 withscores
]
1580 } {4 {a
1 b
1 c
2 d
3}}
1582 test
{ZUNION with AGGREGATE MAX
} {
1583 list [$r zunion zsetc
2 zseta zsetb aggregate max
] [$r zrange zsetc
0 -1 withscores
]
1584 } {4 {a
1 b
2 c
3 d
3}}
1586 test
{ZINTER basics
} {
1587 list [$r zinter zsetc
2 zseta zsetb
] [$r zrange zsetc
0 -1 withscores
]
1590 test
{ZINTER with weights
} {
1591 list [$r zinter zsetc
2 zseta zsetb weights
2 3] [$r zrange zsetc
0 -1 withscores
]
1594 test
{ZINTER with AGGREGATE MIN
} {
1595 list [$r zinter zsetc
2 zseta zsetb aggregate min
] [$r zrange zsetc
0 -1 withscores
]
1598 test
{ZINTER with AGGREGATE MAX
} {
1599 list [$r zinter zsetc
2 zseta zsetb aggregate max
] [$r zrange zsetc
0 -1 withscores
]
1602 test
{SORT against sorted sets
} {
1609 $r sort zset alpha desc
1612 test
{Sorted sets
+inf and
-inf handling
} {
1617 $r zadd zset
1000000 d
1618 $r zadd zset
+inf max
1619 $r zadd zset
-inf min
1623 test
{HSET
/HLEN
- Small hash creation
} {
1624 array set smallhash
{}
1625 for {set i
0} {$i < 8} {incr i
} {
1626 set key
[randstring
0 8 alpha
]
1627 set val
[randstring
0 8 alpha
]
1628 if {[info exists smallhash
($key)]} {
1632 $r hset smallhash
$key $val
1633 set smallhash
($key) $val
1635 list [$r hlen smallhash
]
1638 test
{Is the small hash encoded with a zipmap?
} {
1639 $r debug object smallhash
1642 test
{HSET
/HLEN
- Big hash creation
} {
1643 array set bighash
{}
1644 for {set i
0} {$i < 1024} {incr i
} {
1645 set key
[randstring
0 8 alpha
]
1646 set val
[randstring
0 8 alpha
]
1647 if {[info exists bighash
($key)]} {
1651 $r hset bighash
$key $val
1652 set bighash
($key) $val
1654 list [$r hlen bighash
]
1657 test
{Is the big hash encoded with a zipmap?
} {
1658 $r debug object bighash
1661 test
{HGET against the small hash
} {
1663 foreach k
[array names smallhash
*] {
1664 if {$smallhash($k) ne
[$r hget smallhash
$k]} {
1665 set err
"$smallhash($k) != [$r hget smallhash $k]"
1672 test
{HGET against the big hash
} {
1674 foreach k
[array names bighash
*] {
1675 if {$bighash($k) ne
[$r hget bighash
$k]} {
1676 set err
"$bighash($k) != [$r hget bighash $k]"
1683 test
{HGET against non existing key
} {
1685 lappend rv
[$r hget smallhash __123123123__
]
1686 lappend rv
[$r hget bighash __123123123__
]
1690 test
{HSET in
update and insert mode
} {
1692 set k
[lindex [array names smallhash
*] 0]
1693 lappend rv
[$r hset smallhash
$k newval1
]
1694 set smallhash
($k) newval1
1695 lappend rv
[$r hget smallhash
$k]
1696 lappend rv
[$r hset smallhash __foobar123__ newval
]
1697 set k
[lindex [array names bighash
*] 0]
1698 lappend rv
[$r hset bighash
$k newval2
]
1699 set bighash
($k) newval2
1700 lappend rv
[$r hget bighash
$k]
1701 lappend rv
[$r hset bighash __foobar123__ newval
]
1702 lappend rv
[$r hdel smallhash __foobar123__
]
1703 lappend rv
[$r hdel bighash __foobar123__
]
1705 } {0 newval1
1 0 newval2
1 1 1}
1707 test
{HSETNX target key missing
- small hash
} {
1708 $r hsetnx smallhash __123123123__ foo
1709 $r hget smallhash __123123123__
1712 test
{HSETNX target key exists
- small hash
} {
1713 $r hsetnx smallhash __123123123__ bar
1714 set result
[$r hget smallhash __123123123__
]
1715 $r hdel smallhash __123123123__
1719 test
{HSETNX target key missing
- big hash
} {
1720 $r hsetnx bighash __123123123__ foo
1721 $r hget bighash __123123123__
1724 test
{HSETNX target key exists
- big hash
} {
1725 $r hsetnx bighash __123123123__ bar
1726 set result
[$r hget bighash __123123123__
]
1727 $r hdel bighash __123123123__
1731 test
{HMSET wrong number of args
} {
1732 catch {$r hmset smallhash key1 val1 key2
} err
1736 test
{HMSET
- small hash
} {
1738 foreach {k v
} [array get smallhash
] {
1739 set newval
[randstring
0 8 alpha
]
1740 set smallhash
($k) $newval
1741 lappend args
$k $newval
1743 $r hmset smallhash
{*}$args
1746 test
{HMSET
- big hash
} {
1748 foreach {k v
} [array get bighash
] {
1749 set newval
[randstring
0 8 alpha
]
1750 set bighash
($k) $newval
1751 lappend args
$k $newval
1753 $r hmset bighash
{*}$args
1756 test
{HMGET against non existing key and fields
} {
1758 lappend rv
[$r hmget doesntexist __123123123__ __456456456__
]
1759 lappend rv
[$r hmget smallhash __123123123__ __456456456__
]
1760 lappend rv
[$r hmget bighash __123123123__ __456456456__
]
1762 } {{{} {}} {{} {}} {{} {}}}
1764 test
{HMGET
- small hash
} {
1767 foreach {k v
} [array get smallhash
] {
1772 set result
[$r hmget smallhash
{*}$keys]
1773 if {$vals ne
$result} {
1774 set err
"$vals != $result"
1780 test
{HMGET
- big hash
} {
1783 foreach {k v
} [array get bighash
] {
1788 set result
[$r hmget bighash
{*}$keys]
1789 if {$vals ne
$result} {
1790 set err
"$vals != $result"
1796 test
{HKEYS
- small hash
} {
1797 lsort [$r hkeys smallhash
]
1798 } [lsort [array names smallhash
*]]
1800 test
{HKEYS
- big hash
} {
1801 lsort [$r hkeys bighash
]
1802 } [lsort [array names bighash
*]]
1804 test
{HVALS
- small hash
} {
1806 foreach {k v
} [array get smallhash
] {
1810 } [lsort [$r hvals smallhash
]]
1812 test
{HVALS
- big hash
} {
1814 foreach {k v
} [array get bighash
] {
1818 } [lsort [$r hvals bighash
]]
1820 test
{HGETALL
- small hash
} {
1821 lsort [$r hgetall smallhash
]
1822 } [lsort [array get smallhash
]]
1824 test
{HGETALL
- big hash
} {
1825 lsort [$r hgetall bighash
]
1826 } [lsort [array get bighash
]]
1828 test
{HDEL and
return value
} {
1830 lappend rv
[$r hdel smallhash nokey
]
1831 lappend rv
[$r hdel bighash nokey
]
1832 set k
[lindex [array names smallhash
*] 0]
1833 lappend rv
[$r hdel smallhash
$k]
1834 lappend rv
[$r hdel smallhash
$k]
1835 lappend rv
[$r hget smallhash
$k]
1837 set k
[lindex [array names bighash
*] 0]
1838 lappend rv
[$r hdel bighash
$k]
1839 lappend rv
[$r hdel bighash
$k]
1840 lappend rv
[$r hget bighash
$k]
1843 } {0 0 1 0 {} 1 0 {}}
1847 set k
[lindex [array names smallhash
*] 0]
1848 lappend rv
[$r hexists smallhash
$k]
1849 lappend rv
[$r hexists smallhash nokey
]
1850 set k
[lindex [array names bighash
*] 0]
1851 lappend rv
[$r hexists bighash
$k]
1852 lappend rv
[$r hexists bighash nokey
]
1855 test
{Is a zipmap encoded Hash promoted on big payload?
} {
1856 $r hset smallhash foo
[string repeat a
1024]
1857 $r debug object smallhash
1860 test
{HINCRBY against non existing database key
} {
1862 list [$r hincrby htest foo
2]
1865 test
{HINCRBY against non existing hash key
} {
1867 $r hdel smallhash tmp
1869 lappend rv
[$r hincrby smallhash tmp
2]
1870 lappend rv
[$r hget smallhash tmp
]
1871 lappend rv
[$r hincrby bighash tmp
2]
1872 lappend rv
[$r hget bighash tmp
]
1875 test
{HINCRBY against hash key created by hincrby itself
} {
1877 lappend rv
[$r hincrby smallhash tmp
3]
1878 lappend rv
[$r hget smallhash tmp
]
1879 lappend rv
[$r hincrby bighash tmp
3]
1880 lappend rv
[$r hget bighash tmp
]
1883 test
{HINCRBY against hash key originally
set with HSET
} {
1884 $r hset smallhash tmp
100
1885 $r hset bighash tmp
100
1886 list [$r hincrby smallhash tmp
2] [$r hincrby bighash tmp
2]
1889 test
{HINCRBY over
32bit value
} {
1890 $r hset smallhash tmp
17179869184
1891 $r hset bighash tmp
17179869184
1892 list [$r hincrby smallhash tmp
1] [$r hincrby bighash tmp
1]
1893 } {17179869185 17179869185}
1895 test
{HINCRBY over
32bit value with over
32bit increment
} {
1896 $r hset smallhash tmp
17179869184
1897 $r hset bighash tmp
17179869184
1898 list [$r hincrby smallhash tmp
17179869184] [$r hincrby bighash tmp
17179869184]
1899 } {34359738368 34359738368}
1901 test
{HINCRBY against key with spaces
(no integer encoded
)} {
1902 $r hset smallhash tmp
" 11 "
1903 $r hset bighash tmp
" 11 "
1904 list [$r hincrby smallhash tmp
1] [$r hincrby bighash tmp
1]
1908 # Randomized test, small and big
1909 # .rdb / AOF consistency test should include hashes
1911 test
{EXPIRE
- don't
set timeouts multiple times
} {
1913 set v1
[$r expire x
5]
1915 set v3
[$r expire x
10]
1917 list $v1 $v2 $v3 $v4
1920 test
{EXPIRE
- It should be still possible to
read 'x'
} {
1924 test
{EXPIRE
- After
6 seconds the key should no longer be here
} {
1926 list [$r get x
] [$r exists x
]
1929 test
{EXPIRE
- Delete on write policy
} {
1937 test
{EXPIREAT
- Check
for EXPIRE alike behavior
} {
1940 $r expireat x
[expr [clock seconds
]+15]
1944 test
{SETEX
- Set
+ Expire combo operation. Check
for TTL
} {
1949 test
{SETEX
- Check value
} {
1953 test
{SETEX
- Overwrite old key
} {
1958 test
{SETEX
- Wait
for the key to expire
} {
1963 test
{SETEX
- Wrong
time parameter
} {
1964 catch {$r setex z
-10 foo
} e
1966 } {*invalid expire
*}
1968 test
{ZSETs skiplist implementation backlink consistency test
} {
1971 for {set j
0} {$j < $elements} {incr j
} {
1972 $r zadd myzset
[expr rand
()] "Element-$j"
1973 $r zrem myzset
"Element-[expr int(rand()*$elements)]"
1975 set l1
[$r zrange myzset
0 -1]
1976 set l2
[$r zrevrange myzset
0 -1]
1977 for {set j
0} {$j < [llength $l1]} {incr j
} {
1978 if {[lindex $l1 $j] ne
[lindex $l2 end-
$j]} {
1985 test
{ZSETs ZRANK augmented skip
list stress testing
} {
1988 for {set k
0} {$k < 10000} {incr k
} {
1989 set i
[expr {$k%1000}]
1990 if {[expr rand
()] < .2} {
1993 set score
[expr rand
()]
1994 $r zadd myzset
$score $i
1996 set card
[$r zcard myzset
]
1998 set index
[randomInt
$card]
1999 set ele
[lindex [$r zrange myzset
$index $index] 0]
2000 set rank
[$r zrank myzset
$ele]
2001 if {$rank != $index} {
2002 set err
"$ele RANK is wrong! ($rank != $index)"
2010 foreach fuzztype
{binary alpha compr
} {
2011 test
"FUZZ stresser with data model $fuzztype" {
2013 for {set i
0} {$i < 10000} {incr i
} {
2014 set fuzz
[randstring
0 512 $fuzztype]
2016 set got
[$r get foo
]
2017 if {$got ne
$fuzz} {
2018 set err
[list $fuzz $got]
2037 test
{Handle an empty query well
} {
2039 puts -nonewline $fd "\r\n"
2044 test
{Negative multi bulk command does not create problems
} {
2046 puts -nonewline $fd "*-10\r\n"
2051 test
{Negative multi bulk payload
} {
2053 puts -nonewline $fd "SET x -10\r\n"
2058 test
{Too big bulk payload
} {
2060 puts -nonewline $fd "SET x 2000000000\r\n"
2063 } {*invalid bulk
*count
*}
2065 test
{Multi bulk request not followed by bulk args
} {
2067 puts -nonewline $fd "*1\r\nfoo\r\n"
2070 } {*protocol
error*}
2072 test
{Generic wrong number of args
} {
2073 catch {$r ping x y z
} err
2075 } {*wrong
*arguments
*ping
*}
2077 test
{SELECT an out of range DB
} {
2078 catch {$r select
1000000} err
2082 if {![catch {package require sha1
}]} {
2083 test
{Check consistency of different data types
after a reload
} {
2085 createComplexDataset
$r 10000
2086 set sha1
[datasetDigest
$r]
2088 set sha1_after
[datasetDigest
$r]
2089 expr {$sha1 eq
$sha1_after}
2092 test
{Same dataset digest
if saving
/reloading as AOF?
} {
2094 waitForBgrewriteaof
$r
2096 set sha1_after
[datasetDigest
$r]
2097 expr {$sha1 eq
$sha1_after}
2101 test
{EXPIRES
after a reload
(snapshot
+ append only
file)} {
2108 set e1
[expr {$ttl > 900 && $ttl <= 1000}]
2110 waitForBgrewriteaof
$r
2112 set e2
[expr {$ttl > 900 && $ttl <= 1000}]
2116 test
{PIPELINING stresser
(also a regression
for the old epoll bug
)} {
2117 set fd2
[socket $::host $::port]
2118 fconfigure $fd2 -encoding binary -translation binary
2119 puts -nonewline $fd2 "SELECT 9\r\n"
2123 for {set i
0} {$i < 100000} {incr i
} {
2125 set val
"0000${i}0000"
2126 append q
"SET key:$i [string length $val]\r\n$val\r\n"
2127 puts -nonewline $fd2 $q
2129 append q
"GET key:$i\r\n"
2130 puts -nonewline $fd2 $q
2134 for {set i
0} {$i < 100000} {incr i
} {
2137 set count
[string range
$count 1 end
]
2138 set val
[read $fd2 $count]
2145 test
{MUTLI
/ EXEC basics
} {
2151 set v1
[$r lrange mylist
0 -1]
2155 } {QUEUED QUEUED
{{a b c
} PONG
}}
2163 set v1
[$r del mylist
]
2165 set v3
[$r lrange mylist
0 -1]
2167 } {QUEUED OK
{a b c
}}
2169 test
{APPEND basics
} {
2170 list [$r append foo bar
] [$r get foo
] \
2171 [$r append foo
100] [$r get foo
]
2174 test
{APPEND basics
, integer encoded values
} {
2179 lappend res
[$r get foo
]
2182 lappend res
[$r get foo
]
2185 test
{APPEND fuzzing
} {
2187 foreach type
{binary alpha compr
} {
2190 for {set i
0} {$i < 1000} {incr i
} {
2191 set bin
[randstring
0 10 $type]
2195 if {$buf != [$r get x
]} {
2196 set err
"Expected '$buf' found '[$r get x]'"
2203 test
{SUBSTR basics
} {
2205 $r set foo
"Hello World"
2206 lappend res
[$r substr foo
0 3]
2207 lappend res
[$r substr foo
0 -1]
2208 lappend res
[$r substr foo
-4 -1]
2209 lappend res
[$r substr foo
5 3]
2210 lappend res
[$r substr foo
5 5000]
2211 lappend res
[$r substr foo
-5000 10000]
2213 } {Hell
{Hello World
} orld
{} { World
} {Hello World
}}
2215 test
{SUBSTR against integer encoded values
} {
2220 test
{SUBSTR fuzzing
} {
2222 for {set i
0} {$i < 1000} {incr i
} {
2223 set bin
[randstring
0 1024 binary]
2224 set _start
[set start
[randomInt
1500]]
2225 set _end
[set end
[randomInt
1500]]
2226 if {$_start < 0} {set _start
"end-[abs($_start)-1]"}
2227 if {$_end < 0} {set _end
"end-[abs($_end)-1]"}
2228 set s1
[string range
$bin $_start $_end]
2230 set s2
[$r substr bin
$start $end]
2232 set err
"String mismatch"
2239 # Leave the user with a clean DB before to exit
2244 lappend aux
[$r dbsize
]
2247 lappend aux
[$r dbsize
]
2250 test
{Perform a final SAVE to leave a clean DB on disk
} {
2255 if {[string match
{*Darwin
*} [exec uname
-a]]} {
2256 test
{Check
for memory leaks
} {
2257 exec leaks redis-server
2262 puts "\n[expr $::passed+$::failed] tests, $::passed passed, $::failed failed"
2263 if {$::failed > 0} {
2264 puts "\n*** WARNING!!! $::failed FAILED TESTS ***\n"
2269 set r
[redis
$::host $::port]
2273 set randkey
[expr int
(rand
()*10000)]
2274 set randval
[expr int
(rand
()*10000)]
2275 set randidx0
[expr int
(rand
()*10)]
2276 set randidx1
[expr int
(rand
()*10)]
2277 set cmd
[expr int
(rand
()*20)]
2279 if {$cmd == 0} {$r set $randkey $randval}
2280 if {$cmd == 1} {$r get
$randkey}
2281 if {$cmd == 2} {$r incr $randkey}
2282 if {$cmd == 3} {$r lpush
$randkey $randval}
2283 if {$cmd == 4} {$r rpop
$randkey}
2284 if {$cmd == 5} {$r del
$randkey}
2285 if {$cmd == 6} {$r llen
$randkey}
2286 if {$cmd == 7} {$r lrange $randkey $randidx0 $randidx1}
2287 if {$cmd == 8} {$r ltrim
$randkey $randidx0 $randidx1}
2288 if {$cmd == 9} {$r lindex $randkey $randidx0}
2289 if {$cmd == 10} {$r lset $randkey $randidx0 $randval}
2290 if {$cmd == 11} {$r sadd
$randkey $randval}
2291 if {$cmd == 12} {$r srem
$randkey $randval}
2292 if {$cmd == 13} {$r smove
$randkey $randval}
2293 if {$cmd == 14} {$r scard
$randkey}
2294 if {$cmd == 15} {$r expire
$randkey [expr $randval%60]}
2302 # Set a few configuration defaults
2303 set ::host 127.0.0.1
2312 for {set j
0} {$j < [llength $argv]} {incr j
} {
2313 set opt
[lindex $argv $j]
2314 set arg
[lindex $argv [expr $j+1]]
2315 set lastarg
[expr {$arg eq
{}}]
2316 if {$opt eq
{-h} && !$lastarg} {
2319 } elseif
{$opt eq
{-p} && !$lastarg} {
2322 } elseif
{$opt eq
{--stress}} {
2324 } elseif
{$opt eq
{--trace-leaks
}} {
2326 } elseif
{$opt eq
{--flush}} {
2328 } elseif
{$opt eq
{--first} && !$lastarg} {
2331 } elseif
{$opt eq
{--last} && !$lastarg} {
2335 puts "Wrong argument: $opt"
2340 # Before to run the test check if DB 9 and DB 10 are empty
2341 set r
[redis
$::host $::port]
2348 set db9size
[$r dbsize
]
2350 set db10size
[$r dbsize
]
2351 if {$db9size != 0 ||
$db10size != 0} {
2352 puts "Can't run the tests against DB 9 and 10: DBs are not empty."
2360 puts "Testing Redis, host $::host, port $::port"