From: antirez Date: Thu, 26 Apr 2012 09:16:52 +0000 (+0200) Subject: Redis test: scripting EVALSHA replication test more reliable. X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/5080e625d31e5132f952c5132e69aa65c6c2b383?hp=d9237055baddbc41d6832ef5e6a516feb738eb95 Redis test: scripting EVALSHA replication test more reliable. 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. --- diff --git a/tests/support/test.tcl b/tests/support/test.tcl index f66e54b8..91ab8117 100644 --- a/tests/support/test.tcl +++ b/tests/support/test.tcl @@ -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)]} diff --git a/tests/unit/scripting.tcl b/tests/unit/scripting.tcl index a60c65b4..daf0c0f2 100644 --- a/tests/unit/scripting.tcl +++ b/tests/unit/scripting.tcl @@ -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]'" + } + } } }