diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/helpers/fake_redis_node.tcl | 58 | ||||
-rw-r--r-- | tests/integration/redis-cli.tcl | 31 |
2 files changed, 84 insertions, 5 deletions
diff --git a/tests/helpers/fake_redis_node.tcl b/tests/helpers/fake_redis_node.tcl new file mode 100644 index 000000000..a12d87fed --- /dev/null +++ b/tests/helpers/fake_redis_node.tcl @@ -0,0 +1,58 @@ +# A fake Redis node for replaying predefined/expected traffic with a client. +# +# Usage: tclsh fake_redis_node.tcl PORT COMMAND REPLY [ COMMAND REPLY [ ... ] ] +# +# Commands are given as space-separated strings, e.g. "GET foo", and replies as +# RESP-encoded replies minus the trailing \r\n, e.g. "+OK". + +set port [lindex $argv 0]; +set expected_traffic [lrange $argv 1 end]; + +# Reads and parses a command from a socket and returns it as a space-separated +# string, e.g. "set foo bar". +proc read_command {sock} { + set char [read $sock 1] + switch $char { + * { + set numargs [gets $sock] + set result {} + for {set i 0} {$i<$numargs} {incr i} { + read $sock 1; # dollar sign + set len [gets $sock] + set str [read $sock $len] + gets $sock; # trailing \r\n + lappend result $str + } + return $result + } + {} { + # EOF + return {} + } + default { + # Non-RESP command + set rest [gets $sock] + return "$char$rest" + } + } +} + +proc accept {sock host port} { + global expected_traffic + foreach {expect_cmd reply} $expected_traffic { + if {[eof $sock]} {break} + set cmd [read_command $sock] + if {[string equal -nocase $cmd $expect_cmd]} { + puts $sock $reply + flush $sock + } else { + puts $sock "-ERR unexpected command $cmd" + break + } + } + close $sock +} + +socket -server accept $port +after 5000 set done timeout +vwait done diff --git a/tests/integration/redis-cli.tcl b/tests/integration/redis-cli.tcl index db525e405..8ffa154a7 100644 --- a/tests/integration/redis-cli.tcl +++ b/tests/integration/redis-cli.tcl @@ -85,8 +85,8 @@ start_server {tags {"cli"}} { set _ $tmp } - proc _run_cli {opts args} { - set cmd [rediscli [srv host] [srv port] [list -n $::dbnum {*}$args]] + proc _run_cli {host port db opts args} { + set cmd [rediscli $host $port [list -n $db {*}$args]] foreach {key value} $opts { if {$key eq "pipe"} { set cmd "sh -c \"$value | $cmd\"" @@ -105,15 +105,19 @@ start_server {tags {"cli"}} { } proc run_cli {args} { - _run_cli {} {*}$args + _run_cli [srv host] [srv port] $::dbnum {} {*}$args } proc run_cli_with_input_pipe {cmd args} { - _run_cli [list pipe $cmd] -x {*}$args + _run_cli [srv host] [srv port] $::dbnum [list pipe $cmd] -x {*}$args } proc run_cli_with_input_file {path args} { - _run_cli [list path $path] -x {*}$args + _run_cli [srv host] [srv port] $::dbnum [list path $path] -x {*}$args + } + + proc run_cli_host_port_db {host port db args} { + _run_cli $host $port $db {} {*}$args } proc test_nontty_cli {name code} { @@ -230,6 +234,23 @@ start_server {tags {"cli"}} { assert_equal "foo\nbar" [run_cli lrange list 0 -1] } + test_nontty_cli "ASK redirect test" { + # Set up two fake Redis nodes. + set tclsh [info nameofexecutable] + set script "tests/helpers/fake_redis_node.tcl" + set port1 [find_available_port $::baseport $::portcount] + set port2 [find_available_port $::baseport $::portcount] + set p1 [exec $tclsh $script $port1 \ + "SET foo bar" "-ASK 12182 127.0.0.1:$port2" &] + set p2 [exec $tclsh $script $port2 \ + "ASKING" "+OK" \ + "SET foo bar" "+OK" &] + # Sleep to make sure both fake nodes have started listening + after 100 + # Run the cli + assert_equal "OK" [run_cli_host_port_db "127.0.0.1" $port1 0 -c SET foo bar] + } + test_nontty_cli "Quoted input arguments" { r set "\x00\x00" "value" assert_equal "value" [run_cli --quoted-input get {"\x00\x00"}] |