Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
53cbf66c
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
53cbf66c
编写于
5月 19, 2010
作者:
P
Pieter Noordhuis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
initial tests for AOF (and small changes to server.tcl to support these)
上级
46b614ed
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
128 addition
and
26 deletion
+128
-26
tests/integration/aof.tcl
tests/integration/aof.tcl
+80
-0
tests/support/server.tcl
tests/support/server.tcl
+39
-26
tests/support/util.tcl
tests/support/util.tcl
+8
-0
tests/test_helper.tcl
tests/test_helper.tcl
+1
-0
未找到文件。
tests/integration/aof.tcl
0 → 100644
浏览文件 @
53cbf66c
set defaults
[
list
[
list appendonly yes
]
[
list appendfilename appendonly.aof
]]
set server_path
[
tmpdir server.aof
]
set aof_path
"
$server
_path/appendonly.aof"
proc append_to_aof
{
str
}
{
upvar fp fp
puts -nonewline $fp $str
}
proc create_aof
{
code
}
{
upvar fp fp aof_path aof_path
set fp
[
open $aof_path w+
]
uplevel 1 $code
close $fp
}
proc start_server_aof
{
overrides code
}
{
upvar defaults defaults srv srv server_path server_path
set _defaults $defaults
set srv
[
start_server default.conf
[
lappend _defaults $overrides
]]
uplevel 1 $code
kill_server $srv
}
## Test the server doesn't start when the AOF contains an unfinished MULTI
create_aof
{
append_to_aof
[
formatCommand set foo hello
]
append_to_aof
[
formatCommand multi
]
append_to_aof
[
formatCommand set bar world
]
}
start_server_aof
[
list dir $server_path
]
{
test
{
Unfinished MULTI: Server should not have been started
}
{
is_alive $srv
}
{
0
}
test
{
Unfinished MULTI: Server should have logged an error
}
{
exec cat
[
dict get $srv stdout
]
| tail -n1
}
{
*Unexpected end of file reading the append only file*
}
}
## Test that the server exits when the AOF contains a short read
create_aof
{
append_to_aof
[
formatCommand set foo hello
]
append_to_aof
[
string range
[
formatCommand set bar world
]
0 end-1
]
}
start_server_aof
[
list dir $server_path
]
{
test
{
Short read: Server should not have been started
}
{
is_alive $srv
}
{
0
}
test
{
Short read: Server should have logged an error
}
{
exec cat
[
dict get $srv stdout
]
| tail -n1
}
{
*Bad file format reading the append only file*
}
}
## Test that redis-check-aof indeed sees this AOF is not valid
test
{
Short read: Utility should confirm the AOF is not valid
}
{
catch
{
exec ./redis-check-aof $aof_path
}
str
set _ $str
}
{
*not valid*
}
test
{
Short read: Utility should be able to fix the AOF
}
{
exec echo y | ./redis-check-aof --fix $aof_path
}
{
*Successfully truncated AOF*
}
## Test that the server can be started using the truncated AOF
start_server_aof
[
list dir $server_path
]
{
test
{
Fixed AOF: Server should have been started
}
{
is_alive $srv
}
{
1
}
test
{
Fixed AOF: Keyspace should contain values that were parsable
}
{
set client
[
redis
[
dict get $srv host
]
[
dict get $srv port
]]
list
[
$client
get foo
]
[
$client
get bar
]
}
{
hello
{}}
}
tests/support/server.tcl
浏览文件 @
53cbf66c
...
...
@@ -8,6 +8,8 @@ proc error_and_quit {config_file error} {
}
proc kill_server config
{
# nevermind if its already dead
if
{
!
[
is_alive $config
]}
{
return
}
set pid
[
dict get $config pid
]
# check for leaks
...
...
@@ -20,16 +22,24 @@ proc kill_server config {
}
# kill server and wait for the process to be totally exited
exec kill $pid
while 1
{
# with a non-zero exit status, the process is gone
if
{[
catch
{
exec ps -p $pid | grep redis-server
}
result
]}
{
break
while
{[
is_alive $config
]}
{
if
{[
incr wait 10
]
% 1000 == 0
}
{
puts
"Waiting for process
$pid
to exit..."
}
exec kill $pid
after 10
}
}
proc is_alive config
{
set pid
[
dict get $config pid
]
if
{[
catch
{
exec ps -p $pid
}
err
]}
{
return 0
}
else
{
return 1
}
}
proc start_server
{
filename overrides
{
code undefined
}}
{
set data
[
split
[
exec cat
"tests/assets/
$filename
"
]
"
\n
"
]
set config
{}
...
...
@@ -74,33 +84,14 @@ proc start_server {filename overrides {code undefined}} {
error_and_quit $config_file
[
exec cat $stderr
]
}
set line
[
exec head -n1 $stdout
]
if
{[
string match
{
*already in use*
}
$line
]}
{
error_and_quit $config_file $line
}
while 1
{
# check that the server actually started and is ready for connections
if
{[
exec cat $stdout | grep
"ready to accept"
| wc -l
]
> 0
}
{
break
}
after 10
}
# find out the pid
regexp
{
^
\[
(
\d
+
)
\]
}
[
exec head -n1 $stdout
]
_ pid
#
create the
client object
#
setup properties to be able to initialize a
client object
set host $::host
set port $::port
if
{[
dict exists $config bind
]}
{
set host
[
dict get $config bind
]
}
if
{[
dict exists $config port
]}
{
set port
[
dict get $config port
]
}
set client
[
redis $host $port
]
# select the right db when we don't have to authenticate
if
{
!
[
dict exists $config requirepass
]}
{
$client select 9
}
# setup config dict
dict set srv
"config"
$config_file
...
...
@@ -109,9 +100,31 @@ proc start_server {filename overrides {code undefined}} {
dict set srv
"port"
$port
dict set srv
"stdout"
$stdout
dict set srv
"stderr"
$stderr
dict set srv
"client"
$client
# if a block of code is supplied, we wait for the server to become
# available, create a client object and kill the server afterwards
if
{
$code
ne
"undefined"
}
{
set line
[
exec head -n1 $stdout
]
if
{[
string match
{
*already in use*
}
$line
]}
{
error_and_quit $config_file $line
}
while 1
{
# check that the server actually started and is ready for connections
if
{[
exec cat $stdout | grep
"ready to accept"
| wc -l
]
> 0
}
{
break
}
after 10
}
set client
[
redis $host $port
]
dict set srv
"client"
$client
# select the right db when we don't have to authenticate
if
{
!
[
dict exists $config requirepass
]}
{
$client select 9
}
# append the server to the stack
lappend ::servers $srv
...
...
tests/support/util.tcl
浏览文件 @
53cbf66c
...
...
@@ -188,3 +188,11 @@ proc createComplexDataset {r ops} {
}
}
}
proc formatCommand
{
args
}
{
set cmd
"*
[
llength $args
]
\r\n
"
foreach a $args
{
append cmd
"
$
[
string length $a
]
\r\n
$a
\r\n
"
}
set _ $cmd
}
tests/test_helper.tcl
浏览文件 @
53cbf66c
...
...
@@ -61,6 +61,7 @@ proc main {} {
execute_tests
"unit/expire"
execute_tests
"unit/other"
execute_tests
"integration/replication"
execute_tests
"integration/aof"
puts
"
\n
[
expr $::passed+$::failed
]
tests,
$::passed
passed,
$::failed
failed"
if
{
$::failed
> 0
}
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录