start_server {tags {"auth"}} {test {AUTH fails if there is no password configured server side} {catch {r auth foo} errset _ $err} {ERR*no password*} }start_server {tags {"auth"} overrides {requirepass foobar}} {test {AUTH fails when a wrong password is given} {catch {r auth wrong!} errset _ $err} {ERR*invalid password}test {Arbitrary command gives an error when AUTH is required} {catch {r set foo bar} errset _ $err} {NOAUTH*}test {AUTH succeeds when the right password is given} {r auth foobar} {OK}test {Once AUTH succeeded we can actually send commands to the server} {r set foo 100r incr foo} {101} }
start_server {tags {"repl"}} {r set mykey foostart_server {} {test {Second server should have role master at first} {s role} {master}test {SLAVEOF should start with link status "down"} {r slaveof [srv -1 host] [srv -1 port]s master_link_status} {down}} }
test {AUTH fails when a wrong password is given} {catch {r auth wrong!} errset _ $err} {ERR*invalid password}test {Arbitrary command gives an error when AUTH is required} {catch {r set foo bar} errset _ $err} {NOAUTH*}
6. 同步等待函数
wait_for_condition {maxtries delay e else elsescript}函数可以同步等待指定条件被满足。例:
test "Fixed AOF: Keyspace should contain values that were parseable" {set client [redis [dict get $srv host] [dict get $srv port]]wait_for_condition 50 100 {[catch {$client ping} e] == 0} else {fail "Loading DB is taking too much time."}assert_equal "hello" [$client get foo]assert_equal "" [$client get bar]}
7. 随机生成数据
start_write_load {host port seconds}函数可以不停的往实例中写入数据。
8. 一个稍复杂的例子
下面是一个主从同步的例子,作为这一节的结束和测试。
foreach dl {no yes} {start_server {tags {"repl"}} {set master [srv 0 client]$master config set repl-diskless-sync $dlset master_host [srv 0 host]set master_port [srv 0 port]set slaves {}set load_handle0 [start_write_load $master_host $master_port 3]set load_handle1 [start_write_load $master_host $master_port 5]set load_handle2 [start_write_load $master_host $master_port 20]set load_handle3 [start_write_load $master_host $master_port 8]set load_handle4 [start_write_load $master_host $master_port 4]start_server {} {lappend slaves [srv 0 client]start_server {} {lappend slaves [srv 0 client]start_server {} {lappend slaves [srv 0 client]test "Connect multiple slaves at the same time (issue #141), diskless=$dl" {# Send SALVEOF commands to slaves[lindex $slaves 0] slaveof $master_host $master_port[lindex $slaves 1] slaveof $master_host $master_port[lindex $slaves 2] slaveof $master_host $master_port# Wait for all the three slaves to reach the "online"# state from the POV of the master.set retry 500while {$retry} {set info [r -3 info]if {[string match {*slave0:*state=online*slave1:*state=online*slave2:*state=online*} $info]} {break} else {incr retry -1after 100}}if {$retry == 0} {error "assertion:Slaves not correctly synchronized"}# Wait that slaves acknowledge they are online so# we are sure that DBSIZE and DEBUG DIGEST will not# fail because of timing issues.wait_for_condition 500 100 {[lindex [[lindex $slaves 0] role] 3] eq {connected} &&[lindex [[lindex $slaves 1] role] 3] eq {connected} &&[lindex [[lindex $slaves 2] role] 3] eq {connected}} else {fail "Slaves still not connected after some time"}# Stop the write loadstop_write_load $load_handle0stop_write_load $load_handle1stop_write_load $load_handle2stop_write_load $load_handle3stop_write_load $load_handle4# Make sure that slaves and master have same# number of keyswait_for_condition 500 100 {[$master dbsize] == [[lindex $slaves 0] dbsize] &&[$master dbsize] == [[lindex $slaves 1] dbsize] &&[$master dbsize] == [[lindex $slaves 2] dbsize]} else {fail "Different number of keys between masted and slave after too long time."}# Check digestsset digest [$master debug digest]set digest0 [[lindex $slaves 0] debug digest]set digest1 [[lindex $slaves 1] debug digest]set digest2 [[lindex $slaves 2] debug digest]assert {$digest ne 0000000000000000000000000000000000000000}assert {$digest eq $digest0}assert {$digest eq $digest1}assert {$digest eq $digest2}}}}}} }