]>
git.saurik.com Git - redis.git/blob - test/support/server.tcl
cd23f7c9cc280baff40457bdd2878f96dde2494a
1 proc error_and_quit
{config_file
error} {
2 puts "!!COULD NOT START REDIS-SERVER\n"
4 puts [exec cat
$config_file]
6 puts [string trim
$error]
10 proc start_server
{filename overrides
{code undefined
}} {
11 set data
[split [exec cat
"test/assets/$filename"] "\n"]
14 if {[string length
$line] > 0 && [string index
$line 0] ne
"#"} {
15 set elements
[split $line " "]
16 set directive
[lrange $elements 0 0]
17 set arguments
[lrange $elements 1 end
]
18 dict
set config
$directive $arguments
22 # use a different directory every time a server is started
23 dict
set config dir
[tmpdir server
]
25 # apply overrides from arguments
26 foreach override
$overrides {
27 set directive
[lrange $override 0 0]
28 set arguments
[lrange $override 1 end
]
29 dict
set config
$directive $arguments
32 # write new configuration to temporary file
33 set config_file
[tmpfile redis.conf
]
34 set fp
[open $config_file w
+]
35 foreach directive
[dict keys
$config] {
36 puts -nonewline $fp "$directive "
37 puts $fp [dict get
$config $directive]
41 set stdout
[format "%s/%s" [dict get
$config "dir"] "stdout"]
42 set stderr
[format "%s/%s" [dict get
$config "dir"] "stderr"]
43 exec .
/redis-server
$config_file > $stdout 2> $stderr &
46 # check that the server actually started
47 if {[file size
$stderr] > 0} {
48 error_and_quit
$config_file [exec cat
$stderr]
51 set line
[exec head
-n1 $stdout]
52 if {[string match
{*already in use
*} $line]} {
53 error_and_quit
$config_file $line
57 regexp {^
\[(\d
+)\]} [exec head
-n1 $stdout] _
pid
59 # create the client object
62 if {[dict exists
$config bind]} { set host
[dict get
$config bind] }
63 if {[dict exists
$config port
]} { set port
[dict get
$config port
] }
64 set client
[redis
$host $port]
66 # select the right db when we don't have to authenticate
67 if {![dict exists
$config requirepass
]} {
71 if {$code ne
"undefined"} {
72 # append the client to the client stack
73 lappend ::clients $client
75 # execute provided block
76 catch { uplevel 1 $code } err
78 # pop the client object
79 set ::clients [lrange $::clients 0 end-1
]
81 # kill server and wait for the process to be totally exited
84 if {[catch {exec ps
-p $pid | grep redis-server
} result
]} {
85 # non-zero exis status, process is gone
91 if {[string length
$err] > 0} {
92 puts "Error executing the suite, aborting..."
97 dict
set ret
"config" $config_file
98 dict
set ret
"pid" $pid
99 dict
set ret
"stdout" $stdout
100 dict
set ret
"stderr" $stderr
101 dict
set ret
"client" $client
106 proc kill_server config
{
107 set pid [dict get
$config pid]