]> git.saurik.com Git - redis.git/commitdiff
Redis test: scripting EVALSHA replication test more reliable.
authorantirez <antirez@gmail.com>
Thu, 26 Apr 2012 09:16:52 +0000 (11:16 +0200)
committerantirez <antirez@gmail.com>
Thu, 26 Apr 2012 09:16:52 +0000 (11:16 +0200)
A new primitive wait_for_condition was introduced in the scripting
engine that makes waiting for events simpler, so that it is simpler to
write tests that are more resistant to timing issues.

tests/support/test.tcl
tests/unit/scripting.tcl

index f66e54b87cfe96b6d584aebb837d1d01e1178096..91ab8117be1b33856942e7e3c02bd98bc687a257 100644 (file)
@@ -3,6 +3,10 @@ set ::num_passed 0
 set ::num_failed 0
 set ::tests_failed {}
 
+proc fail {msg} {
+    error "assertion:$msg"
+}
+
 proc assert {condition} {
     if {![uplevel 1 [list expr $condition]]} {
         error "assertion:Expected condition '$condition' to be true ([uplevel 1 [list subst -nocommands $condition]])"
@@ -44,6 +48,19 @@ proc assert_type {type key} {
     assert_equal $type [r type $key]
 }
 
+# Wait for the specified condition to be true, with the specified number of
+# max retries and delay between retries. Otherwise the 'elsescript' is
+# executed.
+proc wait_for_condition {maxtries delay e _else_ elsescript} {
+    while {[incr maxtries -1] >= 0} {
+        if {[uplevel 1 expr $e]} break
+        after $delay
+    }
+    if {$maxtries == -1} {
+        uplevel 1 $elsescript
+    }
+}
+
 # Test if TERM looks like to support colors
 proc color_term {} {
     expr {[info exists ::env(TERM)] && [string match *xterm* $::env(TERM)]}
index a60c65b437debfcaee9ca11b90a82ee060ddc070..daf0c0f26e78cff9359c8810abad9a291b3ccfc7 100644 (file)
@@ -327,10 +327,12 @@ start_server {tags {"scripting repl"}} {
             r evalsha ae3477e27be955de7e1bc9adfdca626b478d3cb2 0
         } {2}
 
-        if {$::valgrind} {after 2000} else {after 100}
-
         test {If EVALSHA was replicated as EVAL the slave should be ok} {
-            r -1 get x
-        } {2}
+            wait_for_condition 50 100 {
+                [r -1 get x] eq {2}
+            } else {
+                fail "Expected 2 in x, but value is '[r -1 get x]'"
+            }
+        }
     }
 }