]> git.saurik.com Git - redis.git/blobdiff - tests/unit/basic.tcl
Added a 'runtest' script that is responsible to check if Tcl is available and run...
[redis.git] / tests / unit / basic.tcl
index 9015079648e92453b704799c59065d891732e186..a7267fd8f43c577c266c5f9a78b2b83b1473cb91 100644 (file)
@@ -138,21 +138,48 @@ start_server {tags {"basic"}} {
         r decrby novar 17179869185
     } {-1}
 
-    test {SETNX target key missing} {
-        r setnx novar2 foobared
-        r get novar2
-    } {foobared}
+    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 setnx novar2 blabla
-        r get novar2
-    } {foobared}
+    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 volatile key} {
+    test "SETNX against not-expired volatile key" {
         r set x 10
         r expire x 10000
-        list [r setnx x 20] [r get x]
-    } {0 10}
+        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 {EXISTS} {
         set res {}
@@ -361,18 +388,18 @@ start_server {tags {"basic"}} {
         list [r msetnx x1 xxx y2 yyy] [r get x1] [r get y2]
     } {1 xxx yyy}
 
-    test {STRLEN against non existing key} {
-        r strlen notakey
-    } {0}
+    test "STRLEN against non-existing key" {
+        assert_equal 0 [r strlen notakey]
+    }
 
-    test {STRLEN against integer} {
+    test "STRLEN against integer-encoded value" {
         r set myinteger -555
-        r strlen myinteger
-    } {4}
+        assert_equal 4 [r strlen myinteger]
+    }
 
-    test {STRLEN against plain string} {
+    test "STRLEN against plain string" {
         r set mystring "foozzz0123456789 baz"
-        r strlen mystring
+        assert_equal 20 [r strlen mystring]
     }
 
     test "SETBIT against non-existing key" {
@@ -422,6 +449,24 @@ start_server {tags {"basic"}} {
         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]
@@ -471,14 +516,6 @@ start_server {tags {"basic"}} {
         r del mykey
         assert_equal 4 [r setrange mykey 1 foo]
         assert_equal "\000foo" [r get mykey]
-
-        r del mykey
-        assert_equal 3 [r setrange mykey -1 foo]
-        assert_equal "foo" [r get mykey]
-
-        r del mykey
-        assert_equal 3 [r setrange mykey -100 foo]
-        assert_equal "foo" [r get mykey]
     }
 
     test "SETRANGE against string-encoded key" {
@@ -494,18 +531,6 @@ start_server {tags {"basic"}} {
         assert_equal 3 [r setrange mykey 1 b]
         assert_equal "fbo" [r get mykey]
 
-        r set mykey "foo"
-        assert_equal 6 [r setrange mykey -1 bar]
-        assert_equal "foobar" [r get mykey]
-
-        r set mykey "foo"
-        assert_equal 5 [r setrange mykey -2 bar]
-        assert_equal "fobar" [r get mykey]
-
-        r set mykey "foo"
-        assert_equal 3 [r setrange mykey -20 bar]
-        assert_equal "bar" [r get mykey]
-
         r set mykey "foo"
         assert_equal 7 [r setrange mykey 4 bar]
         assert_equal "foo\000bar" [r get mykey]
@@ -531,18 +556,6 @@ start_server {tags {"basic"}} {
         assert_encoding raw mykey
         assert_equal 1334 [r get mykey]
 
-        r set mykey 1234
-        assert_encoding int mykey
-        assert_equal 5 [r setrange mykey -1 5]
-        assert_encoding raw mykey
-        assert_equal 12345 [r get mykey]
-
-        r set mykey 1234
-        assert_encoding int mykey
-        assert_equal 4 [r setrange mykey -2 5]
-        assert_encoding raw mykey
-        assert_equal 1235 [r get mykey]
-
         r set mykey 1234
         assert_encoding int mykey
         assert_equal 6 [r setrange mykey 5 2]
@@ -559,7 +572,9 @@ start_server {tags {"basic"}} {
     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}
     }