X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/e96e4fbf159269075633f30063d254515aeb3a5f..6cf5882c562b25c1e0e78c0cf5c47ab177040fa9:/test-redis.tcl?ds=sidebyside diff --git a/test-redis.tcl b/test-redis.tcl index 03436309..6eea1189 100644 --- a/test-redis.tcl +++ b/test-redis.tcl @@ -126,7 +126,19 @@ proc createComplexDataset {r ops} { for {set j 0} {$j < $ops} {incr j} { set k [randomKey] set v [randomValue] - set d [expr {rand()}] + randpath { + set d [expr {rand()}] + } { + set d [expr {rand()}] + } { + set d [expr {rand()}] + } { + set d [expr {rand()}] + } { + set d [expr {rand()}] + } { + randpath {set d +inf} {set d -inf} + } set t [$r type $k] if {$t eq {none}} { @@ -166,7 +178,7 @@ proc createComplexDataset {r ops} { } proc datasetDigest r { - set keys [lsort [split [$r keys *] " "]] + set keys [lsort [$r keys *]] set digest {} foreach k $keys { set t [$r type $k] @@ -192,7 +204,7 @@ proc datasetDigest r { set aux [::sha1::sha1 -hex [$r zrange $k 0 -1]] } } default { - error "Type not supported" + error "Type not supported: $t" } } if {$aux eq {}} continue @@ -268,20 +280,46 @@ proc main {server port} { $r get foo } [string repeat "abcd" 1000000] + test {Very big payload random access} { + set err {} + array set payload {} + for {set j 0} {$j < 100} {incr j} { + set size [expr 1+[randomInt 100000]] + set buf [string repeat "pl-$j" $size] + set payload($j) $buf + $r set bigpayload_$j $buf + } + for {set j 0} {$j < 1000} {incr j} { + set index [randomInt 100] + set buf [$r get bigpayload_$index] + if {$buf != $payload($index)} { + set err "Values differ: I set '$payload($index)' but I read back '$buf'" + break + } + } + unset payload + set _ $err + } {} + test {SET 10000 numeric keys and access all them in reverse order} { + set err {} for {set x 0} {$x < 10000} {incr x} { $r set $x $x } set sum 0 for {set x 9999} {$x >= 0} {incr x -1} { - incr sum [$r get $x] + set val [$r get $x] + if {$val ne $x} { + set err "Eleemnt at position $x is $val instead of $x" + break + } } - format $sum - } {49995000} + set _ $err + } {} - test {DBSIZE should be 10001 now} { + test {DBSIZE should be 10101 now} { $r dbsize - } {10001} + } {10101} test {INCR against non existing key} { set res {} @@ -308,6 +346,11 @@ proc main {server port} { $r incrby novar 17179869184 } {34359738368} + test {INCR against key with spaces (no integer encoded)} { + $r set novar " 11 " + $r incr novar + } {12} + test {DECRBY over 32bit value with over 32bit increment, negative res} { $r set novar 17179869184 $r decrby novar 17179869185 @@ -370,7 +413,8 @@ proc main {server port} { append res [$r lindex mylist 0] append res [$r lindex mylist 1] append res [$r lindex mylist 2] - } {3bac} + list $res [$r lindex mylist 100] + } {3bac {}} test {DEL a list} { $r del mylist @@ -423,11 +467,19 @@ proc main {server port} { format $err } {ERR*} + test {LLEN against non existing key} { + $r llen not-a-key + } {0} + test {LINDEX against non-list value error} { catch {$r lindex mylist 0} err format $err } {ERR*} + test {LINDEX against non existing key} { + $r lindex not-a-key 10 + } {} + test {LPUSH against non-list value error} { catch {$r lpush mylist 0} err format $err @@ -504,6 +556,12 @@ proc main {server port} { list [$r lrange mylist 0 -1] [$r type newlist] [string range $err 0 2] } {{a b c d} string ERR} + test {RPOPLPUSH against non existing src key} { + $r del mylist + $r del newlist + $r rpoplpush mylist newlist + } {} + test {RENAME basic usage} { $r set mykey hello $r rename mykey mykey1 @@ -667,7 +725,36 @@ proc main {server port} { $r lrange mylist 0 -1 } {99 98 97 96 95} + test {LTRIM stress testing} { + set mylist {} + set err {} + for {set i 0} {$i < 20} {incr i} { + lappend mylist $i + } + + for {set j 0} {$j < 100} {incr j} { + # Fill the list + $r del mylist + for {set i 0} {$i < 20} {incr i} { + $r rpush mylist $i + } + # Trim at random + set a [randomInt 20] + set b [randomInt 20] + $r ltrim mylist $a $b + if {[$r lrange mylist 0 -1] ne [lrange $mylist $a $b]} { + set err "[$r lrange mylist 0 -1] != [lrange $mylist $a $b]" + break + } + } + set _ $err + } {} + test {LSET} { + $r del mylist + foreach x {99 98 97 96 95} { + $r rpush mylist $x + } $r lset mylist 1 foo $r lset mylist -1 bar $r lrange mylist 0 -1 @@ -816,18 +903,23 @@ proc main {server port} { lsort [array names myset] } {a b c} - test {Create a random list} { + test {Create a random list and a random set} { set tosort {} array set seenrand {} for {set i 0} {$i < 10000} {incr i} { while 1 { # Make sure all the weights are different because # Redis does not use a stable sort but Tcl does. - set rint [expr int(rand()*1000000)] + randpath { + set rint [expr int(rand()*1000000)] + } { + set rint [expr rand()] + } if {![info exists seenrand($rint)]} break } set seenrand($rint) x $r lpush tosort $i + $r sadd tosort-set $i $r set weight_$i $rint lappend tosort [list $i $rint] } @@ -843,6 +935,15 @@ proc main {server port} { $r sort tosort {BY weight_*} } $res + test {the same SORT with BY, but against the newly created set} { + $r sort tosort-set {BY weight_*} + } $res + + test {SORT with BY and STORE against the newly created list} { + $r sort tosort {BY weight_*} store sort-res + $r lrange sort-res 0 -1 + } $res + test {SORT direct, numeric, against the newly created list} { $r sort tosort } [lsort -integer $res] @@ -901,6 +1002,10 @@ proc main {server port} { $r sort mylist BY weight_* GET # } {2 1 3} + test {SORT with constant GET} { + $r sort mylist GET foo + } {{} {} {}} + test {LREM, remove all the occurrences} { $r flushdb $r rpush mylist foo @@ -1123,9 +1228,14 @@ proc main {server port} { set _ $err } {} - test {ZRANGE and ZREVRANGE} { - list [$r zrange ztmp 0 -1] [$r zrevrange ztmp 0 -1] - } {{y x z} {z x y}} + test {ZRANGE and ZREVRANGE basics} { + list [$r zrange ztmp 0 -1] [$r zrevrange ztmp 0 -1] \ + [$r zrange ztmp 1 -1] [$r zrevrange ztmp 1 -1] + } {{y x z} {z x y} {x z} {x y}} + + test {ZRANGE WITHSCORES} { + $r zrange ztmp 0 -1 withscores + } {y 1 x 10 z 30} test {ZSETs stress tester - sorting is working well?} { set delta 0 @@ -1190,15 +1300,26 @@ proc main {server port} { list $v1 $v2 [$r zscore zset foo] [$r zscore zset bar] } {{bar foo} {foo bar} -2 6} - test {ZRANGEBYSCORE basics} { + test {ZRANGEBYSCORE and ZCOUNT basics} { $r del zset $r zadd zset 1 a $r zadd zset 2 b $r zadd zset 3 c $r zadd zset 4 d $r zadd zset 5 e - $r zrangebyscore zset 2 4 - } {b c d} + list [$r zrangebyscore zset 2 4] [$r zrangebyscore zset (2 (4] \ + [$r zcount zset 2 4] [$r zcount zset (2 (4] + } {{b c d} c 3 1} + + test {ZRANGEBYSCORE withscores} { + $r del zset + $r zadd zset 1 a + $r zadd zset 2 b + $r zadd zset 3 c + $r zadd zset 4 d + $r zadd zset 5 e + $r zrangebyscore zset 2 4 withscores + } {b 2 c 3 d 4} test {ZRANGEBYSCORE fuzzy test, 100 ranges in 1000 elements sorted set} { set err {} @@ -1217,24 +1338,65 @@ proc main {server port} { set low [$r zrangebyscore zset -inf $min] set ok [$r zrangebyscore zset $min $max] set high [$r zrangebyscore zset $max +inf] + set lowx [$r zrangebyscore zset -inf ($min] + set okx [$r zrangebyscore zset ($min ($max] + set highx [$r zrangebyscore zset ($max +inf] + + if {[$r zcount zset -inf $min] != [llength $low]} { + append err "Error, len does not match zcount\n" + } + if {[$r zcount zset $min $max] != [llength $ok]} { + append err "Error, len does not match zcount\n" + } + if {[$r zcount zset $max +inf] != [llength $high]} { + append err "Error, len does not match zcount\n" + } + if {[$r zcount zset -inf ($min] != [llength $lowx]} { + append err "Error, len does not match zcount\n" + } + if {[$r zcount zset ($min ($max] != [llength $okx]} { + append err "Error, len does not match zcount\n" + } + if {[$r zcount zset ($max +inf] != [llength $highx]} { + append err "Error, len does not match zcount\n" + } + foreach x $low { set score [$r zscore zset $x] if {$score > $min} { append err "Error, score for $x is $score > $min\n" } } + foreach x $lowx { + set score [$r zscore zset $x] + if {$score >= $min} { + append err "Error, score for $x is $score >= $min\n" + } + } foreach x $ok { set score [$r zscore zset $x] if {$score < $min || $score > $max} { append err "Error, score for $x is $score outside $min-$max range\n" } } + foreach x $okx { + set score [$r zscore zset $x] + if {$score <= $min || $score >= $max} { + append err "Error, score for $x is $score outside $min-$max open range\n" + } + } foreach x $high { set score [$r zscore zset $x] if {$score < $max} { append err "Error, score for $x is $score < $max\n" } } + foreach x $highx { + set score [$r zscore zset $x] + if {$score <= $max} { + append err "Error, score for $x is $score <= $max\n" + } + } } set _ $err } {} @@ -1253,6 +1415,16 @@ proc main {server port} { [$r zrangebyscore zset 0 10 LIMIT 20 10] } {{a b} {c d e} {c d e} {}} + test {ZRANGEBYSCORE with LIMIT and withscores} { + $r del zset + $r zadd zset 10 a + $r zadd zset 20 b + $r zadd zset 30 c + $r zadd zset 40 d + $r zadd zset 50 e + $r zrangebyscore zset 20 50 LIMIT 2 3 withscores + } {d 40 e 50} + test {ZREMRANGE basics} { $r del zset $r zadd zset 1 a @@ -1361,6 +1533,7 @@ proc main {server port} { } test {BGSAVE} { + waitForBgsave $r $r flushdb $r save $r set x 10 @@ -1449,6 +1622,82 @@ proc main {server port} { list $e1 $e2 } {1 1} + test {PIPELINING stresser (also a regression for the old epoll bug)} { + set fd2 [socket 127.0.0.1 6379] + fconfigure $fd2 -encoding binary -translation binary + puts -nonewline $fd2 "SELECT 9\r\n" + flush $fd2 + gets $fd2 + + for {set i 0} {$i < 100000} {incr i} { + set q {} + set val "0000${i}0000" + append q "SET key:$i [string length $val]\r\n$val\r\n" + puts -nonewline $fd2 $q + set q {} + append q "GET key:$i\r\n" + puts -nonewline $fd2 $q + } + flush $fd2 + + for {set i 0} {$i < 100000} {incr i} { + gets $fd2 line + gets $fd2 count + set count [string range $count 1 end] + set val [read $fd2 $count] + read $fd2 2 + } + close $fd2 + set _ 1 + } {1} + + test {MUTLI / EXEC basics} { + $r del mylist + $r rpush mylist a + $r rpush mylist b + $r rpush mylist c + $r multi + set v1 [$r lrange mylist 0 -1] + set v2 [$r ping] + set v3 [$r exec] + list $v1 $v2 $v3 + } {QUEUED QUEUED {{a b c} PONG}} + + test {DISCARD} { + $r del mylist + $r rpush mylist a + $r rpush mylist b + $r rpush mylist c + $r multi + set v1 [$r del mylist] + set v2 [$r discard] + set v3 [$r lrange mylist 0 -1] + list $v1 $v2 $v3 + } {QUEUED OK {a b c}} + + test {APPEND basics} { + list [$r append foo bar] [$r get foo] \ + [$r append foo 100] [$r get foo] + } {3 bar 6 bar100} + + test {APPEND fuzzing} { + set err {} + foreach type {binary alpha compr} { + set buf {} + $r del x + for {set i 0} {$i < 1000} {incr i} { + set bin [randstring 0 10 $type] + append buf $bin + $r append x $bin + } + if {$buf != [$r get x]} { + set err "Expected '$buf' found '[$r get x]'" + break + } + } + set _ $err + } {} + # Leave the user with a clean DB before to exit test {FLUSHDB} { set aux {}