]> git.saurik.com Git - redis.git/blobdiff - tests/support/util.tcl
Make sure that SELECT argument is an integer or return an error.
[redis.git] / tests / support / util.tcl
index 26cf1dc177f24b0b3ca057697bbde8f1c874f8b4..48d06b741575f31839371b8a7ae962d47f8d1c7f 100644 (file)
@@ -30,12 +30,16 @@ proc zlistAlikeSort {a b} {
 proc warnings_from_file {filename} {
     set lines [split [exec cat $filename] "\n"]
     set matched 0
 proc warnings_from_file {filename} {
     set lines [split [exec cat $filename] "\n"]
     set matched 0
+    set logall 0
     set result {}
     foreach line $lines {
     set result {}
     foreach line $lines {
+        if {[string match {*REDIS BUG REPORT START*} $line]} {
+            set logall 1
+        }
         if {[regexp {^\[\d+\]\s+\d+\s+\w+\s+\d{2}:\d{2}:\d{2} \#} $line]} {
             set matched 1
         }
         if {[regexp {^\[\d+\]\s+\d+\s+\w+\s+\d{2}:\d{2}:\d{2} \#} $line]} {
             set matched 1
         }
-        if {$matched} {
+        if {$logall || $matched} {
             lappend result $line
         }
     }
             lappend result $line
         }
     }
@@ -44,16 +48,18 @@ proc warnings_from_file {filename} {
 
 # Return value for INFO property
 proc status {r property} {
 
 # Return value for INFO property
 proc status {r property} {
-    if {[regexp "\r\n$property:(.*?)\r\n" [$r info] _ value]} {
+    if {[regexp "\r\n$property:(.*?)\r\n" [{*}$r info] _ value]} {
         set _ $value
     }
 }
 
 proc waitForBgsave r {
     while 1 {
         set _ $value
     }
 }
 
 proc waitForBgsave r {
     while 1 {
-        if {[status r bgsave_in_progress] eq 1} {
-            puts -nonewline "\nWaiting for background save to finish... "
-            flush stdout
+        if {[status r rdb_bgsave_in_progress] eq 1} {
+            if {$::verbose} {
+                puts -nonewline "\nWaiting for background save to finish... "
+                flush stdout
+            }
             after 1000
         } else {
             break
             after 1000
         } else {
             break
@@ -63,9 +69,11 @@ proc waitForBgsave r {
 
 proc waitForBgrewriteaof r {
     while 1 {
 
 proc waitForBgrewriteaof r {
     while 1 {
-        if {[status r bgrewriteaof_in_progress] eq 1} {
-            puts -nonewline "\nWaiting for background AOF rewrite to finish... "
-            flush stdout
+        if {[status r aof_rewrite_in_progress] eq 1} {
+            if {$::verbose} {
+                puts -nonewline "\nWaiting for background AOF rewrite to finish... "
+                flush stdout
+            }
             after 1000
         } else {
             break
             after 1000
         } else {
             break
@@ -75,7 +83,7 @@ proc waitForBgrewriteaof r {
 
 proc wait_for_sync r {
     while 1 {
 
 proc wait_for_sync r {
     while 1 {
-        if {[status r master_link_status] eq "down"} {
+        if {[status $r master_link_status] eq "down"} {
             after 10
         } else {
             break
             after 10
         } else {
             break
@@ -87,6 +95,14 @@ proc randomInt {max} {
     expr {int(rand()*$max)}
 }
 
     expr {int(rand()*$max)}
 }
 
+proc randomSignedInt {max} {
+    set i [randomInt $max]
+    if {rand() > 0.5} {
+        set i -$i
+    }
+    return $i
+}
+
 proc randpath args {
     set path [expr {int(rand()*[llength $args])}]
     uplevel 1 [lindex $args $path]
 proc randpath args {
     set path [expr {int(rand()*[llength $args])}]
     uplevel 1 [lindex $args $path]
@@ -95,13 +111,13 @@ proc randpath args {
 proc randomValue {} {
     randpath {
         # Small enough to likely collide
 proc randomValue {} {
     randpath {
         # Small enough to likely collide
-        randomInt 1000
+        randomSignedInt 1000
     } {
         # 32 bit compressible signed/unsigned
     } {
         # 32 bit compressible signed/unsigned
-        randpath {randomInt 2000000000} {randomInt 4000000000}
+        randpath {randomSignedInt 2000000000} {randomSignedInt 4000000000}
     } {
         # 64 bit
     } {
         # 64 bit
-        randpath {randomInt 1000000000000}
+        randpath {randomSignedInt 1000000000000}
     } {
         # Random string
         randpath {randstring 0 256 alpha} \
     } {
         # Random string
         randpath {randstring 0 256 alpha} \
@@ -129,23 +145,30 @@ proc randomKey {} {
 
 proc findKeyWithType {r type} {
     for {set j 0} {$j < 20} {incr j} {
 
 proc findKeyWithType {r type} {
     for {set j 0} {$j < 20} {incr j} {
-        set k [$r randomkey]
+        set k [{*}$r randomkey]
         if {$k eq {}} {
             return {}
         }
         if {$k eq {}} {
             return {}
         }
-        if {[$r type $k] eq $type} {
+        if {[{*}$r type $k] eq $type} {
             return $k
         }
     }
     return {}
 }
 
             return $k
         }
     }
     return {}
 }
 
-proc createComplexDataset {r ops} {
+proc createComplexDataset {r ops {opt {}}} {
     for {set j 0} {$j < $ops} {incr j} {
         set k [randomKey]
         set k2 [randomKey]
         set f [randomValue]
         set v [randomValue]
     for {set j 0} {$j < $ops} {incr j} {
         set k [randomKey]
         set k2 [randomKey]
         set f [randomValue]
         set v [randomValue]
+
+        if {[lsearch -exact $opt useexpire] != -1} {
+            if {rand() < 0.1} {
+                {*}$r expire [randomKey] [randomInt 2]
+            }
+        }
+
         randpath {
             set d [expr {rand()}]
         } {
         randpath {
             set d [expr {rand()}]
         } {
@@ -159,23 +182,23 @@ proc createComplexDataset {r ops} {
         } {
             randpath {set d +inf} {set d -inf}
         }
         } {
             randpath {set d +inf} {set d -inf}
         }
-        set t [$r type $k]
+        set t [{*}$r type $k]
 
         if {$t eq {none}} {
             randpath {
 
         if {$t eq {none}} {
             randpath {
-                $r set $k $v
+                {*}$r set $k $v
             } {
             } {
-                $r lpush $k $v
+                {*}$r lpush $k $v
             } {
             } {
-                $r sadd $k $v
+                {*}$r sadd $k $v
             } {
             } {
-                $r zadd $k $d $v
+                {*}$r zadd $k $d $v
             } {
             } {
-                $r hset $k $f $v
+                {*}$r hset $k $f $v
             } {
             } {
-                $r del $k
+                {*}$r del $k
             }
             }
-            set t [$r type $k]
+            set t [{*}$r type $k]
         }
 
         switch $t {
         }
 
         switch $t {
@@ -183,35 +206,45 @@ proc createComplexDataset {r ops} {
                 # Nothing to do
             }
             {list} {
                 # Nothing to do
             }
             {list} {
-                randpath {$r lpush $k $v} \
-                        {$r rpush $k $v} \
-                        {$r lrem $k 0 $v} \
-                        {$r rpop $k} \
-                        {$r lpop $k}
+                randpath {{*}$r lpush $k $v} \
+                        {{*}$r rpush $k $v} \
+                        {{*}$r lrem $k 0 $v} \
+                        {{*}$r rpop $k} \
+                        {{*}$r lpop $k}
             }
             {set} {
             }
             {set} {
-                randpath {$r sadd $k $v} \
-                        {$r srem $k $v} \
+                randpath {{*}$r sadd $k $v} \
+                        {{*}$r srem $k $v} \
                         {
                         {
-                            set otherset [findKeyWithType r set]
+                            set otherset [findKeyWithType {*}$r set]
                             if {$otherset ne {}} {
                             if {$otherset ne {}} {
-                                $r sunionstore $k2 $k $otherset
+                                randpath {
+                                    {*}$r sunionstore $k2 $k $otherset
+                                } {
+                                    {*}$r sinterstore $k2 $k $otherset
+                                } {
+                                    {*}$r sdiffstore $k2 $k $otherset
+                                }
                             }
                         }
             }
             {zset} {
                             }
                         }
             }
             {zset} {
-                randpath {$r zadd $k $d $v} \
-                        {$r zrem $k $v} \
+                randpath {{*}$r zadd $k $d $v} \
+                        {{*}$r zrem $k $v} \
                         {
                         {
-                            set otherzset [findKeyWithType r zset]
+                            set otherzset [findKeyWithType {*}$r zset]
                             if {$otherzset ne {}} {
                             if {$otherzset ne {}} {
-                                $r zunionstore $k2 2 $k $otherzset
+                                randpath {
+                                    {*}$r zunionstore $k2 2 $k $otherzset
+                                } {
+                                    {*}$r zinterstore $k2 2 $k $otherzset
+                                }
                             }
                         }
             }
             {hash} {
                             }
                         }
             }
             {hash} {
-                randpath {$r hset $k $f $v} \
-                        {$r hdel $k $f}
+                randpath {{*}$r hset $k $f $v} \
+                        {{*}$r hdel $k $f}
             }
         }
     }
             }
         }
     }
@@ -227,33 +260,33 @@ proc formatCommand {args} {
 
 proc csvdump r {
     set o {}
 
 proc csvdump r {
     set o {}
-    foreach k [lsort [$r keys *]] {
-        set type [$r type $k]
+    foreach k [lsort [{*}$r keys *]] {
+        set type [{*}$r type $k]
         append o [csvstring $k] , [csvstring $type] ,
         switch $type {
             string {
         append o [csvstring $k] , [csvstring $type] ,
         switch $type {
             string {
-                append o [csvstring [$r get $k]] "\n"
+                append o [csvstring [{*}$r get $k]] "\n"
             }
             list {
             }
             list {
-                foreach e [$r lrange $k 0 -1] {
+                foreach e [{*}$r lrange $k 0 -1] {
                     append o [csvstring $e] ,
                 }
                 append o "\n"
             }
             set {
                     append o [csvstring $e] ,
                 }
                 append o "\n"
             }
             set {
-                foreach e [lsort [$r smembers $k]] {
+                foreach e [lsort [{*}$r smembers $k]] {
                     append o [csvstring $e] ,
                 }
                 append o "\n"
             }
             zset {
                     append o [csvstring $e] ,
                 }
                 append o "\n"
             }
             zset {
-                foreach e [$r zrange $k 0 -1 withscores] {
+                foreach e [{*}$r zrange $k 0 -1 withscores] {
                     append o [csvstring $e] ,
                 }
                 append o "\n"
             }
             hash {
                     append o [csvstring $e] ,
                 }
                 append o "\n"
             }
             hash {
-                set fields [$r hgetall $k]
+                set fields [{*}$r hgetall $k]
                 set newfields {}
                 foreach {k v} $fields {
                     lappend newfields [list $k $v]
                 set newfields {}
                 foreach {k v} $fields {
                     lappend newfields [list $k $v]
@@ -273,3 +306,7 @@ proc csvdump r {
 proc csvstring s {
     return "\"$s\""
 }
 proc csvstring s {
     return "\"$s\""
 }
+
+proc roundFloat f {
+    format "%.10g" $f
+}