]> git.saurik.com Git - redis.git/blob - test/support/server.tcl
cd23f7c9cc280baff40457bdd2878f96dde2494a
[redis.git] / test / support / server.tcl
1 proc error_and_quit {config_file error} {
2 puts "!!COULD NOT START REDIS-SERVER\n"
3 puts "CONFIGURATION:"
4 puts [exec cat $config_file]
5 puts "\nERROR:"
6 puts [string trim $error]
7 exit 1
8 }
9
10 proc start_server {filename overrides {code undefined}} {
11 set data [split [exec cat "test/assets/$filename"] "\n"]
12 set config {}
13 foreach line $data {
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
19 }
20 }
21
22 # use a different directory every time a server is started
23 dict set config dir [tmpdir server]
24
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
30 }
31
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]
38 }
39 close $fp
40
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 &
44 after 10
45
46 # check that the server actually started
47 if {[file size $stderr] > 0} {
48 error_and_quit $config_file [exec cat $stderr]
49 }
50
51 set line [exec head -n1 $stdout]
52 if {[string match {*already in use*} $line]} {
53 error_and_quit $config_file $line
54 }
55
56 # find out the pid
57 regexp {^\[(\d+)\]} [exec head -n1 $stdout] _ pid
58
59 # create the client object
60 set host $::host
61 set port $::port
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]
65
66 # select the right db when we don't have to authenticate
67 if {![dict exists $config requirepass]} {
68 $client select 9
69 }
70
71 if {$code ne "undefined"} {
72 # append the client to the client stack
73 lappend ::clients $client
74
75 # execute provided block
76 catch { uplevel 1 $code } err
77
78 # pop the client object
79 set ::clients [lrange $::clients 0 end-1]
80
81 # kill server and wait for the process to be totally exited
82 exec kill $pid
83 while 1 {
84 if {[catch {exec ps -p $pid | grep redis-server} result]} {
85 # non-zero exis status, process is gone
86 break;
87 }
88 after 10
89 }
90
91 if {[string length $err] > 0} {
92 puts "Error executing the suite, aborting..."
93 puts $err
94 exit 1
95 }
96 } else {
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
102 set _ $ret
103 }
104 }
105
106 proc kill_server config {
107 set pid [dict get $config pid]
108 exec kill $pid
109 }