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 not have been started" {
35 assert_equal
0 [is_alive
$srv]
38 test
"Unfinished MULTI: Server should have logged an error" {
39 set result
[exec cat
[dict get
$srv stdout
] | tail
-n1]
40 assert_match
"*Unexpected end of file reading the append only file*" $result
44 ## Test that the server exits when the AOF contains a short read
46 append_to_aof
[formatCommand
set foo hello
]
47 append_to_aof
[string range
[formatCommand
set bar world
] 0 end-1
]
50 start_server_aof
[list dir
$server_path] {
51 test
"Short read: Server should not have been started" {
52 assert_equal
0 [is_alive
$srv]
55 test
"Short read: Server should have logged an error" {
56 set result
[exec cat
[dict get
$srv stdout
] | tail
-n1]
57 assert_match
"*Bad file format reading the append only file*" $result
61 ## Test that redis-check-aof indeed sees this AOF is not valid
62 test
"Short read: Utility should confirm the AOF is not valid" {
64 exec src
/redis-check-aof
$aof_path
66 assert_match
"*not valid*" $result
69 test
"Short read: Utility should be able to fix the AOF" {
70 set result
[exec echo y | src
/redis-check-aof
--fix $aof_path]
71 assert_match
"*Successfully truncated AOF*" $result
74 ## Test that the server can be started using the truncated AOF
75 start_server_aof
[list dir
$server_path] {
76 test
"Fixed AOF: Server should have been started" {
77 assert_equal
1 [is_alive
$srv]
80 test
"Fixed AOF: Keyspace should contain values that were parsable" {
81 set client
[redis
[dict get
$srv host
] [dict get
$srv port
]]
82 assert_equal
"hello" [$client get foo
]
83 assert_equal
"" [$client get bar
]
87 ## Test that SPOP (that modifies the client its argc/argv) is correctly free'd
89 append_to_aof
[formatCommand sadd
set foo
]
90 append_to_aof
[formatCommand sadd
set bar
]
91 append_to_aof
[formatCommand spop
set]
94 start_server_aof
[list dir
$server_path] {
95 test
"AOF+SPOP: Server should have been started" {
96 assert_equal
1 [is_alive
$srv]
99 test
"AOF+SPOP: Set should have 1 member" {
100 set client
[redis
[dict get
$srv host
] [dict get
$srv port
]]
101 assert_equal
1 [$client scard
set]
105 ## Test that EXPIREAT is loaded correctly
107 append_to_aof
[formatCommand rpush
list foo
]
108 append_to_aof
[formatCommand expireat
list 1000]
109 append_to_aof
[formatCommand rpush
list bar
]
112 start_server_aof
[list dir
$server_path] {
113 test
"AOF+EXPIRE: Server should have been started" {
114 assert_equal
1 [is_alive
$srv]
117 test
"AOF+EXPIRE: List should be empty" {
118 set client
[redis
[dict get
$srv host
] [dict get
$srv port
]]
119 assert_equal
0 [$client llen
list]
123 start_server
{overrides
{appendonly
{yes
} appendfilename
{appendonly.aof
}}} {
124 test
{Redis should not try to convert DEL into EXPIREAT
for EXPIRE
-1} {