Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
5eedc9c6
Commit
5eedc9c6
authored
Jun 15, 2010
by
Pieter Noordhuis
Browse files
tests for BLPOP/BRPOP via an option in the tcl client that defers reading the reply
parent
d5096a28
Changes
4
Hide whitespace changes
Inline
Side-by-side
tests/support/redis.tcl
View file @
5eedc9c6
...
@@ -32,6 +32,7 @@ namespace eval redis {}
...
@@ -32,6 +32,7 @@ namespace eval redis {}
set ::redis::id 0
set ::redis::id 0
array set ::redis::fd
{}
array set ::redis::fd
{}
array set ::redis::blocking
{}
array set ::redis::blocking
{}
array set ::redis::deferred
{}
array set ::redis::callback
{}
array set ::redis::callback
{}
array set ::redis::state
{}
;
# State in non-blocking reply reading
array set ::redis::state
{}
;
# State in non-blocking reply reading
array set ::redis::statestack
{}
;
# Stack of states, for nested mbulks
array set ::redis::statestack
{}
;
# Stack of states, for nested mbulks
...
@@ -55,12 +56,13 @@ foreach redis_multibulk_cmd {
...
@@ -55,12 +56,13 @@ foreach redis_multibulk_cmd {
unset redis_bulk_cmd
unset redis_bulk_cmd
unset redis_multibulk_cmd
unset redis_multibulk_cmd
proc redis
{{
server 127.0.0.1
}
{
port 6379
}}
{
proc redis
{{
server 127.0.0.1
}
{
port 6379
}
{
defer 0
}
}
{
set fd
[
socket $server $port
]
set fd
[
socket $server $port
]
fconfigure $fd -translation binary
fconfigure $fd -translation binary
set id
[
incr ::redis::id
]
set id
[
incr ::redis::id
]
set ::redis::fd
(
$id
)
$fd
set ::redis::fd
(
$id
)
$fd
set ::redis::blocking
(
$id
)
1
set ::redis::blocking
(
$id
)
1
set ::redis::deferred
(
$id
)
$defer
::redis::redis_reset_state $id
::redis::redis_reset_state $id
interp alias
{}
::redis::redisHandle$id
{}
::redis::__dispatch__ $id
interp alias
{}
::redis::redisHandle$id
{}
::redis::__dispatch__ $id
}
}
...
@@ -68,6 +70,7 @@ proc redis {{server 127.0.0.1} {port 6379}} {
...
@@ -68,6 +70,7 @@ proc redis {{server 127.0.0.1} {port 6379}} {
proc ::redis::__dispatch__
{
id method args
}
{
proc ::redis::__dispatch__
{
id method args
}
{
set fd $::redis::fd
(
$id
)
set fd $::redis::fd
(
$id
)
set blocking $::redis::blocking
(
$id
)
set blocking $::redis::blocking
(
$id
)
set deferred $::redis::deferred
(
$id
)
if
{
$blocking
== 0
}
{
if
{
$blocking
== 0
}
{
if
{[
llength $args
]
== 0
}
{
if
{[
llength $args
]
== 0
}
{
error
"Please provide a callback in non-blocking mode"
error
"Please provide a callback in non-blocking mode"
...
@@ -95,14 +98,16 @@ proc ::redis::__dispatch__ {id method args} {
...
@@ -95,14 +98,16 @@ proc ::redis::__dispatch__ {id method args} {
append cmd
[
join $args
]
append cmd
[
join $args
]
::redis::redis_writenl $fd $cmd
::redis::redis_writenl $fd $cmd
}
}
if
{
$blocking
}
{
if
{
!$deferred
}
{
::redis::redis_read_reply $fd
if
{
$blocking
}
{
}
else
{
::redis::redis_read_reply $fd
# Every well formed reply read will pop an element from this
}
else
{
# list and use it as a callback. So pipelining is supported
# Every well formed reply read will pop an element from this
# in non blocking mode.
# list and use it as a callback. So pipelining is supported
lappend ::redis::callback
(
$id
)
$callback
# in non blocking mode.
fileevent $fd readable
[
list ::redis::redis_readable $fd $id
]
lappend ::redis::callback
(
$id
)
$callback
fileevent $fd readable
[
list ::redis::redis_readable $fd $id
]
}
}
}
}
else
{
}
else
{
uplevel 1
[
list ::redis::__method__$method $id $fd
]
$args
uplevel 1
[
list ::redis::__method__$method $id $fd
]
$args
...
@@ -114,6 +119,10 @@ proc ::redis::__method__blocking {id fd val} {
...
@@ -114,6 +119,10 @@ proc ::redis::__method__blocking {id fd val} {
fconfigure $fd -blocking $val
fconfigure $fd -blocking $val
}
}
proc ::redis::__method__read
{
id fd
}
{
::redis::redis_read_reply $fd
}
proc ::redis::__method__close
{
id fd
}
{
proc ::redis::__method__close
{
id fd
}
{
catch
{
close $fd
}
catch
{
close $fd
}
catch
{
unset ::redis::fd
(
$id
)}
catch
{
unset ::redis::fd
(
$id
)}
...
...
tests/support/test.tcl
View file @
5eedc9c6
...
@@ -17,7 +17,7 @@ proc assert_equal {expected value} {
...
@@ -17,7 +17,7 @@ proc assert_equal {expected value} {
}
}
proc assert_error
{
pattern code
}
{
proc assert_error
{
pattern code
}
{
if
{[
catch $code error
]}
{
if
{[
catch
{
uplevel 1
$code
}
error
]}
{
assert_match $pattern $error
assert_match $pattern $error
}
else
{
}
else
{
puts
"!! ERROR
\n
Expected an error but nothing was catched"
puts
"!! ERROR
\n
Expected an error but nothing was catched"
...
...
tests/test_helper.tcl
View file @
5eedc9c6
...
@@ -42,6 +42,22 @@ proc r {args} {
...
@@ -42,6 +42,22 @@ proc r {args} {
[
srv $level
"client"
]
{*}
$args
[
srv $level
"client"
]
{*}
$args
}
}
proc redis_deferring_client
{
args
}
{
set level 0
if
{[
llength $args
]
> 0 &&
[
string is integer
[
lindex $args 0
]]}
{
set level
[
lindex $args 0
]
set args
[
lrange $args 1 end
]
}
# create client that defers reading reply
set client
[
redis
[
srv $level
"host"
]
[
srv $level
"port"
]
1
]
# select the right db and read the response
(
OK
)
$client select 9
$client read
return $client
}
# Provide easy access to INFO properties. Same semantic as
"proc r"
.
# Provide easy access to INFO properties. Same semantic as
"proc r"
.
proc s
{
args
}
{
proc s
{
args
}
{
set level 0
set level 0
...
...
tests/unit/type/list.tcl
View file @
5eedc9c6
...
@@ -78,6 +78,99 @@ start_server {
...
@@ -78,6 +78,99 @@ start_server {
assert_encoding linkedlist $key
assert_encoding linkedlist $key
}
}
foreach type
{
ziplist linkedlist
}
{
test
"BLPOP, BRPOP: single existing list -
$type
"
{
set rd
[
redis_deferring_client
]
create_$type blist
{
a b c d
}
$rd blpop blist 1
assert_equal
{
blist a
}
[
$rd
read
]
$rd brpop blist 1
assert_equal
{
blist d
}
[
$rd
read
]
$rd blpop blist 1
assert_equal
{
blist b
}
[
$rd
read
]
$rd brpop blist 1
assert_equal
{
blist c
}
[
$rd
read
]
}
test
"BLPOP, BRPOP: multiple existing lists -
$type
"
{
set rd
[
redis_deferring_client
]
create_$type blist1
{
a b c
}
create_$type blist2
{
d e f
}
$rd blpop blist1 blist2 1
assert_equal
{
blist1 a
}
[
$rd
read
]
$rd brpop blist1 blist2 1
assert_equal
{
blist1 c
}
[
$rd
read
]
assert_equal 1
[
r llen blist1
]
assert_equal 3
[
r llen blist2
]
$rd blpop blist2 blist1 1
assert_equal
{
blist2 d
}
[
$rd
read
]
$rd brpop blist2 blist1 1
assert_equal
{
blist2 f
}
[
$rd
read
]
assert_equal 1
[
r llen blist1
]
assert_equal 1
[
r llen blist2
]
}
test
"BLPOP, BRPOP: second list has an entry -
$type
"
{
set rd
[
redis_deferring_client
]
r del blist1
create_$type blist2
{
d e f
}
$rd blpop blist1 blist2 1
assert_equal
{
blist2 d
}
[
$rd
read
]
$rd brpop blist1 blist2 1
assert_equal
{
blist2 f
}
[
$rd
read
]
assert_equal 0
[
r llen blist1
]
assert_equal 1
[
r llen blist2
]
}
}
foreach
{
pop
}
{
BLPOP BRPOP
}
{
test
"
$pop:
with single empty list argument"
{
set rd
[
redis_deferring_client
]
r del blist1
$rd $pop blist1 1
r rpush blist1 foo
assert_equal
{
blist1 foo
}
[
$rd
read
]
assert_equal 0
[
r exists blist1
]
}
test
"
$pop:
second argument is not a list"
{
set rd
[
redis_deferring_client
]
r del blist1 blist2
r set blist2 nolist
$rd $pop blist1 blist2 1
assert_error
"ERR*wrong kind*"
{
$rd
read
}
}
test
"
$pop:
timeout"
{
set rd
[
redis_deferring_client
]
r del blist1 blist2
$rd $pop blist1 blist2 1
assert_equal
{}
[
$rd
read
]
}
test
"
$pop:
arguments are empty"
{
set rd
[
redis_deferring_client
]
r del blist1 blist2
$rd $pop blist1 blist2 1
r rpush blist1 foo
assert_equal
{
blist1 foo
}
[
$rd
read
]
assert_equal 0
[
r exists blist1
]
assert_equal 0
[
r exists blist2
]
$rd $pop blist1 blist2 1
r rpush blist2 foo
assert_equal
{
blist2 foo
}
[
$rd
read
]
assert_equal 0
[
r exists blist1
]
assert_equal 0
[
r exists blist2
]
}
}
test
{
LPUSHX, RPUSHX - generic
}
{
test
{
LPUSHX, RPUSHX - generic
}
{
r del xlist
r del xlist
assert_equal 0
[
r lpushx xlist a
]
assert_equal 0
[
r lpushx xlist a
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment