1 set defaults
{ appendonly
{yes
} appendfilename
{appendonly.aof
} }
2 set server_path
[tmpdir server.aof
]
3 set aof_path
"$server_path/appendonly.aof"
5 proc append_to_aof
{str
} {
7 puts -nonewline $fp $str
10 proc create_aof
{code
} {
11 upvar fp fp aof_path aof_path
12 set fp
[open $aof_path w
+]
17 proc start_server_aof
{overrides code
} {
18 upvar defaults defaults srv srv server_path server_path
19 set config
[concat $defaults $overrides]
20 set srv
[start_server
[list overrides
$config]]
26 ## Test the server doesn't start when the AOF contains an unfinished MULTI
28 append_to_aof
[formatCommand
set foo hello
]
29 append_to_aof
[formatCommand multi
]
30 append_to_aof
[formatCommand
set bar world
]
33 start_server_aof
[list dir
$server_path] {
34 test
"Unfinished MULTI: Server should have logged an error" {
35 set pattern
"*Unexpected end of file reading the append only file*"
38 set result
[exec tail
-n1 < [dict get
$srv stdout
]]
39 if {[string match
$pattern $result]} {
46 error "assertion:expected error not found on config file"
51 ## Test that the server exits when the AOF contains a short read
53 append_to_aof
[formatCommand
set foo hello
]
54 append_to_aof
[string range
[formatCommand
set bar world
] 0 end-1
]
57 start_server_aof
[list dir
$server_path] {
58 test
"Short read: Server should have logged an error" {
59 set pattern
"*Bad file format reading the append only file*"
62 set result
[exec tail
-n1 < [dict get
$srv stdout
]]
63 if {[string match
$pattern $result]} {
70 error "assertion:expected error not found on config file"
75 ## Test that redis-check-aof indeed sees this AOF is not valid
76 test
"Short read: Utility should confirm the AOF is not valid" {
78 exec src
/redis-check-aof
$aof_path
80 assert_match
"*not valid*" $result
83 test
"Short read: Utility should be able to fix the AOF" {
84 set result
[exec src
/redis-check-aof
--fix $aof_path << "y\n"]
85 assert_match
"*Successfully truncated AOF*" $result
88 ## Test that the server can be started using the truncated AOF
89 start_server_aof
[list dir
$server_path] {
90 test
"Fixed AOF: Server should have been started" {
91 assert_equal
1 [is_alive
$srv]
94 test
"Fixed AOF: Keyspace should contain values that were parsable" {
95 set client
[redis
[dict get
$srv host
] [dict get
$srv port
]]
96 assert_equal
"hello" [$client get foo
]
97 assert_equal
"" [$client get bar
]
101 ## Test that SPOP (that modifies the client its argc/argv) is correctly free'd
103 append_to_aof
[formatCommand sadd
set foo
]
104 append_to_aof
[formatCommand sadd
set bar
]
105 append_to_aof
[formatCommand spop
set]
108 start_server_aof
[list dir
$server_path] {
109 test
"AOF+SPOP: Server should have been started" {
110 assert_equal
1 [is_alive
$srv]
113 test
"AOF+SPOP: Set should have 1 member" {
114 set client
[redis
[dict get
$srv host
] [dict get
$srv port
]]
115 assert_equal
1 [$client scard
set]
119 ## Test that EXPIREAT is loaded correctly
121 append_to_aof
[formatCommand rpush
list foo
]
122 append_to_aof
[formatCommand expireat
list 1000]
123 append_to_aof
[formatCommand rpush
list bar
]
126 start_server_aof
[list dir
$server_path] {
127 test
"AOF+EXPIRE: Server should have been started" {
128 assert_equal
1 [is_alive
$srv]
131 test
"AOF+EXPIRE: List should be empty" {
132 set client
[redis
[dict get
$srv host
] [dict get
$srv port
]]
133 assert_equal
0 [$client llen
list]
137 start_server
{overrides
{appendonly
{yes
} appendfilename
{appendonly.aof
}}} {
138 test
{Redis should not try to convert DEL into EXPIREAT
for EXPIRE
-1} {