123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
- start_server {tags {"string"}} {
- test {SET and GET an item} {
- r set x foobar
- r get x
- } {foobar}
- test {SET and GET an empty item} {
- r set x {}
- r get x
- } {}
- test {Very big payload in GET/SET} {
- set buf [string repeat "abcd" 1000000]
- r set foo $buf
- r get foo
- } [string repeat "abcd" 1000000]
- tags {"slow"} {
- 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} {
- r flushdb
- 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} {
- set val [r get $x]
- if {$val ne $x} {
- set err "Element at position $x is $val instead of $x"
- break
- }
- }
- set _ $err
- } {}
- test {DBSIZE should be 10000 now} {
- r dbsize
- } {10000}
- }
- test "SETNX target key missing" {
- r del novar
- assert_equal 1 [r setnx novar foobared]
- assert_equal "foobared" [r get novar]
- }
- test "SETNX target key exists" {
- r set novar foobared
- assert_equal 0 [r setnx novar blabla]
- assert_equal "foobared" [r get novar]
- }
- test "SETNX against not-expired volatile key" {
- r set x 10
- r expire x 10000
- assert_equal 0 [r setnx x 20]
- assert_equal 10 [r get x]
- }
- test "SETNX against expired volatile key" {
- # Make it very unlikely for the key this test uses to be expired by the
- # active expiry cycle. This is tightly coupled to the implementation of
- # active expiry and dbAdd() but currently the only way to test that
- # SETNX expires a key when it should have been.
- for {set x 0} {$x < 9999} {incr x} {
- r setex key-$x 3600 value
- }
- # This will be one of 10000 expiring keys. A cycle is executed every
- # 100ms, sampling 10 keys for being expired or not. This key will be
- # expired for at most 1s when we wait 2s, resulting in a total sample
- # of 100 keys. The probability of the success of this test being a
- # false positive is therefore approx. 1%.
- r set x 10
- r expire x 1
- # Wait for the key to expire
- after 2000
- assert_equal 1 [r setnx x 20]
- assert_equal 20 [r get x]
- }
- test {MGET} {
- r flushdb
- r set foo BAR
- r set bar FOO
- r mget foo bar
- } {BAR FOO}
- test {MGET against non existing key} {
- r mget foo baazz bar
- } {BAR {} FOO}
- test {MGET against non-string key} {
- r sadd myset ciao
- r sadd myset bau
- r mget foo baazz bar myset
- } {BAR {} FOO {}}
- test {GETSET (set new value)} {
- r del foo
- list [r getset foo xyz] [r get foo]
- } {{} xyz}
- test {GETSET (replace old value)} {
- r set foo bar
- list [r getset foo xyz] [r get foo]
- } {bar xyz}
- test {MSET base case} {
- r mset x 10 y "foo bar" z "x x x x x x x\n\n\r\n"
- r mget x y z
- } [list 10 {foo bar} "x x x x x x x\n\n\r\n"]
- test {MSET wrong number of args} {
- catch {r mset x 10 y "foo bar" z} err
- format $err
- } {*wrong number*}
- test {MSETNX with already existent key} {
- list [r msetnx x1 xxx y2 yyy x 20] [r exists x1] [r exists y2]
- } {0 0 0}
- test {MSETNX with not existing keys} {
- list [r msetnx x1 xxx y2 yyy] [r get x1] [r get y2]
- } {1 xxx yyy}
- test "STRLEN against non-existing key" {
- assert_equal 0 [r strlen notakey]
- }
- test "STRLEN against integer-encoded value" {
- r set myinteger -555
- assert_equal 4 [r strlen myinteger]
- }
- test "STRLEN against plain string" {
- r set mystring "foozzz0123456789 baz"
- assert_equal 20 [r strlen mystring]
- }
- test "SETBIT against non-existing key" {
- r del mykey
- assert_equal 0 [r setbit mykey 1 1]
- assert_equal [binary format B* 01000000] [r get mykey]
- }
- test "SETBIT against string-encoded key" {
- # Ascii "@" is integer 64 = 01 00 00 00
- r set mykey "@"
- assert_equal 0 [r setbit mykey 2 1]
- assert_equal [binary format B* 01100000] [r get mykey]
- assert_equal 1 [r setbit mykey 1 0]
- assert_equal [binary format B* 00100000] [r get mykey]
- }
- test "SETBIT against integer-encoded key" {
- # Ascii "1" is integer 49 = 00 11 00 01
- r set mykey 1
- assert_encoding int mykey
- assert_equal 0 [r setbit mykey 6 1]
- assert_equal [binary format B* 00110011] [r get mykey]
- assert_equal 1 [r setbit mykey 2 0]
- assert_equal [binary format B* 00010011] [r get mykey]
- }
- test "SETBIT against key with wrong type" {
- r del mykey
- r lpush mykey "foo"
- assert_error "WRONGTYPE*" {r setbit mykey 0 1}
- }
- test "SETBIT with out of range bit offset" {
- r del mykey
- assert_error "*out of range*" {r setbit mykey [expr 4*1024*1024*1024] 1}
- assert_error "*out of range*" {r setbit mykey -1 1}
- }
- test "SETBIT with non-bit argument" {
- r del mykey
- assert_error "*out of range*" {r setbit mykey 0 -1}
- assert_error "*out of range*" {r setbit mykey 0 2}
- assert_error "*out of range*" {r setbit mykey 0 10}
- assert_error "*out of range*" {r setbit mykey 0 20}
- }
- test "SETBIT fuzzing" {
- set str ""
- set len [expr 256*8]
- r del mykey
- for {set i 0} {$i < 2000} {incr i} {
- set bitnum [randomInt $len]
- set bitval [randomInt 2]
- set fmt [format "%%-%ds%%d%%-s" $bitnum]
- set head [string range $str 0 $bitnum-1]
- set tail [string range $str $bitnum+1 end]
- set str [string map {" " 0} [format $fmt $head $bitval $tail]]
- r setbit mykey $bitnum $bitval
- assert_equal [binary format B* $str] [r get mykey]
- }
- }
- test "GETBIT against non-existing key" {
- r del mykey
- assert_equal 0 [r getbit mykey 0]
- }
- test "GETBIT against string-encoded key" {
- # Single byte with 2nd and 3rd bit set
- r set mykey "`"
- # In-range
- assert_equal 0 [r getbit mykey 0]
- assert_equal 1 [r getbit mykey 1]
- assert_equal 1 [r getbit mykey 2]
- assert_equal 0 [r getbit mykey 3]
- # Out-range
- assert_equal 0 [r getbit mykey 8]
- assert_equal 0 [r getbit mykey 100]
- assert_equal 0 [r getbit mykey 10000]
- }
- test "GETBIT against integer-encoded key" {
- r set mykey 1
- assert_encoding int mykey
- # Ascii "1" is integer 49 = 00 11 00 01
- assert_equal 0 [r getbit mykey 0]
- assert_equal 0 [r getbit mykey 1]
- assert_equal 1 [r getbit mykey 2]
- assert_equal 1 [r getbit mykey 3]
- # Out-range
- assert_equal 0 [r getbit mykey 8]
- assert_equal 0 [r getbit mykey 100]
- assert_equal 0 [r getbit mykey 10000]
- }
- test "SETRANGE against non-existing key" {
- r del mykey
- assert_equal 3 [r setrange mykey 0 foo]
- assert_equal "foo" [r get mykey]
- r del mykey
- assert_equal 0 [r setrange mykey 0 ""]
- assert_equal 0 [r exists mykey]
- r del mykey
- assert_equal 4 [r setrange mykey 1 foo]
- assert_equal "\000foo" [r get mykey]
- }
- test "SETRANGE against string-encoded key" {
- r set mykey "foo"
- assert_equal 3 [r setrange mykey 0 b]
- assert_equal "boo" [r get mykey]
- r set mykey "foo"
- assert_equal 3 [r setrange mykey 0 ""]
- assert_equal "foo" [r get mykey]
- r set mykey "foo"
- assert_equal 3 [r setrange mykey 1 b]
- assert_equal "fbo" [r get mykey]
- r set mykey "foo"
- assert_equal 7 [r setrange mykey 4 bar]
- assert_equal "foo\000bar" [r get mykey]
- }
- test "SETRANGE against integer-encoded key" {
- r set mykey 1234
- assert_encoding int mykey
- assert_equal 4 [r setrange mykey 0 2]
- assert_encoding raw mykey
- assert_equal 2234 [r get mykey]
- # Shouldn't change encoding when nothing is set
- r set mykey 1234
- assert_encoding int mykey
- assert_equal 4 [r setrange mykey 0 ""]
- assert_encoding int mykey
- assert_equal 1234 [r get mykey]
- r set mykey 1234
- assert_encoding int mykey
- assert_equal 4 [r setrange mykey 1 3]
- assert_encoding raw mykey
- assert_equal 1334 [r get mykey]
- r set mykey 1234
- assert_encoding int mykey
- assert_equal 6 [r setrange mykey 5 2]
- assert_encoding raw mykey
- assert_equal "1234\0002" [r get mykey]
- }
- test "SETRANGE against key with wrong type" {
- r del mykey
- r lpush mykey "foo"
- assert_error "WRONGTYPE*" {r setrange mykey 0 bar}
- }
- test "SETRANGE with out of range offset" {
- r del mykey
- assert_error "*maximum allowed size*" {r setrange mykey [expr 512*1024*1024-4] world}
- r set mykey "hello"
- assert_error "*out of range*" {r setrange mykey -1 world}
- assert_error "*maximum allowed size*" {r setrange mykey [expr 512*1024*1024-4] world}
- }
- test "GETRANGE against non-existing key" {
- r del mykey
- assert_equal "" [r getrange mykey 0 -1]
- }
- test "GETRANGE against string value" {
- r set mykey "Hello World"
- assert_equal "Hell" [r getrange mykey 0 3]
- assert_equal "Hello World" [r getrange mykey 0 -1]
- assert_equal "orld" [r getrange mykey -4 -1]
- assert_equal "" [r getrange mykey 5 3]
- assert_equal " World" [r getrange mykey 5 5000]
- assert_equal "Hello World" [r getrange mykey -5000 10000]
- }
- test "GETRANGE against integer-encoded value" {
- r set mykey 1234
- assert_equal "123" [r getrange mykey 0 2]
- assert_equal "1234" [r getrange mykey 0 -1]
- assert_equal "234" [r getrange mykey -3 -1]
- assert_equal "" [r getrange mykey 5 3]
- assert_equal "4" [r getrange mykey 3 5000]
- assert_equal "1234" [r getrange mykey -5000 10000]
- }
- test "GETRANGE fuzzing" {
- for {set i 0} {$i < 1000} {incr i} {
- r set bin [set bin [randstring 0 1024 binary]]
- set _start [set start [randomInt 1500]]
- set _end [set end [randomInt 1500]]
- if {$_start < 0} {set _start "end-[abs($_start)-1]"}
- if {$_end < 0} {set _end "end-[abs($_end)-1]"}
- assert_equal [string range $bin $_start $_end] [r getrange bin $start $end]
- }
- }
- test {Extended SET can detect syntax errors} {
- set e {}
- catch {r set foo bar non-existing-option} e
- set e
- } {*syntax*}
- test {Extended SET NX option} {
- r del foo
- set v1 [r set foo 1 nx]
- set v2 [r set foo 2 nx]
- list $v1 $v2 [r get foo]
- } {OK {} 1}
- test {Extended SET XX option} {
- r del foo
- set v1 [r set foo 1 xx]
- r set foo bar
- set v2 [r set foo 2 xx]
- list $v1 $v2 [r get foo]
- } {{} OK 2}
- test {Extended SET EX option} {
- r del foo
- r set foo bar ex 10
- set ttl [r ttl foo]
- assert {$ttl <= 10 && $ttl > 5}
- }
- test {Extended SET PX option} {
- r del foo
- r set foo bar px 10000
- set ttl [r ttl foo]
- assert {$ttl <= 10 && $ttl > 5}
- }
- test {Extended SET using multiple options at once} {
- r set foo val
- assert {[r set foo bar xx px 10000] eq {OK}}
- set ttl [r ttl foo]
- assert {$ttl <= 10 && $ttl > 5}
- }
- test {GETRANGE with huge ranges, Github issue #1844} {
- r set foo bar
- r getrange foo 0 4294967297
- } {bar}
- }
|