rainbows 4.4.3 → 4.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/.document +1 -0
  2. data/.gitignore +1 -0
  3. data/Documentation/rainbows.1.txt +8 -4
  4. data/GIT-VERSION-GEN +34 -35
  5. data/GNUmakefile +4 -2
  6. data/HACKING +72 -0
  7. data/bin/rainbows +5 -0
  8. data/lib/rainbows/const.rb +3 -3
  9. data/lib/rainbows/coolio/client.rb +18 -6
  10. data/lib/rainbows/coolio/thread_client.rb +2 -0
  11. data/lib/rainbows/epoll/client.rb +35 -12
  12. data/lib/rainbows/ev_core.rb +5 -4
  13. data/lib/rainbows/event_machine/client.rb +9 -4
  14. data/lib/rainbows/process_client.rb +7 -3
  15. data/lib/rainbows/response.rb +54 -18
  16. data/lib/rainbows/revactor/client/methods.rb +1 -1
  17. data/lib/rainbows/stream_response_epoll.rb +34 -15
  18. data/lib/rainbows/stream_response_epoll/client.rb +11 -3
  19. data/lib/rainbows/writer_thread_pool/client.rb +2 -0
  20. data/lib/rainbows/xepoll/client.rb +0 -3
  21. data/lib/rainbows/xepoll_thread_pool/client.rb +1 -1
  22. data/lib/rainbows/xepoll_thread_spawn/client.rb +1 -1
  23. data/rainbows.gemspec +6 -3
  24. data/t/GNUmakefile +10 -3
  25. data/t/byte-range-common.sh +1 -1
  26. data/t/hijack.ru +56 -0
  27. data/t/t0000-simple-http.sh +9 -9
  28. data/t/t0001-unix-http.sh +8 -8
  29. data/t/t0003-reopen-logs.sh +8 -8
  30. data/t/t0004-heartbeat-timeout.sh +3 -3
  31. data/t/t0005-large-file-response.sh +1 -1
  32. data/t/t0010-keepalive-timeout-effective.sh +2 -2
  33. data/t/t0011-close-on-exec-set.sh +2 -2
  34. data/t/t0017-keepalive-timeout-zero.sh +2 -2
  35. data/t/t0024-pipelined-sendfile-response.sh +2 -2
  36. data/t/t0027-nil-copy_stream.sh +1 -1
  37. data/t/t0030-fast-pipe-response.sh +1 -1
  38. data/t/t0034-pipelined-pipe-response.sh +2 -2
  39. data/t/t0035-kgio-pipe-response.sh +1 -1
  40. data/t/t0040-keepalive_requests-setting.sh +4 -4
  41. data/t/t0043-quit-keepalive-disconnect.sh +3 -3
  42. data/t/t0044-autopush.sh +2 -2
  43. data/t/t0045-client_max_header_size.sh +2 -2
  44. data/t/t0100-rack-input-hammer-chunked.sh +4 -4
  45. data/t/t0100-rack-input-hammer-content-length.sh +4 -4
  46. data/t/t0106-rack-input-keepalive.sh +6 -6
  47. data/t/t0200-async-response.sh +5 -5
  48. data/t/t0202-async-response-one-oh.sh +5 -5
  49. data/t/t0300-async_sinatra.sh +5 -5
  50. data/t/t0400-em-async-app.sh +2 -2
  51. data/t/t0401-em-async-tailer.sh +2 -2
  52. data/t/t0402-async-keepalive.sh +23 -23
  53. data/t/t0500-cramp-streaming.sh +3 -3
  54. data/t/t0600-rack-fiber_pool.sh +1 -1
  55. data/t/t0700-app-deferred.sh +2 -2
  56. data/t/t0800-rack-hijack.sh +27 -0
  57. data/t/t9000-rack-app-pool.sh +3 -3
  58. data/t/t9001-sendfile-to-path.sh +1 -1
  59. data/t/t9100-thread-timeout.sh +1 -1
  60. data/t/t9101-thread-timeout-threshold.sh +1 -1
  61. data/t/test-lib.sh +15 -0
  62. data/t/test_isolate.rb +4 -3
  63. metadata +26 -6
  64. data/t/bin/utee +0 -12
@@ -0,0 +1,56 @@
1
+ use Rack::Lint
2
+ use Rack::ContentLength
3
+ use Rack::ContentType, "text/plain"
4
+ class DieIfUsed
5
+ def each
6
+ abort "body.each called after response hijack\n"
7
+ end
8
+
9
+ def close
10
+ abort "body.close called after response hijack\n"
11
+ end
12
+ end
13
+ def lazy_close(io)
14
+ thr = Thread.new do
15
+ # wait and see if Rainbows! accidentally closes us
16
+ sleep((ENV["DELAY"] || 10).to_i)
17
+ begin
18
+ io.close
19
+ rescue => e
20
+ warn "E: #{e.message} (#{e.class})"
21
+ exit!(3)
22
+ end
23
+ end
24
+ at_exit { thr.join }
25
+ end
26
+
27
+ run lambda { |env|
28
+ case env["PATH_INFO"]
29
+ when "/hijack_req"
30
+ if env["rack.hijack?"]
31
+ io = env["rack.hijack"].call
32
+ if io.respond_to?(:read_nonblock) &&
33
+ env["rack.hijack_io"].respond_to?(:read_nonblock)
34
+
35
+ # exercise both, since we Rack::Lint may use different objects
36
+ env["rack.hijack_io"].write("HTTP/1.0 200 OK\r\n\r\n")
37
+ io.write("request.hijacked")
38
+ lazy_close(io)
39
+ return [ 500, {}, DieIfUsed.new ]
40
+ end
41
+ end
42
+ [ 500, {}, [ "hijack BAD\n" ] ]
43
+ when "/hijack_res"
44
+ r = "response.hijacked"
45
+ [ 200,
46
+ {
47
+ "Content-Length" => r.bytesize.to_s,
48
+ "rack.hijack" => proc do |io|
49
+ io.write(r)
50
+ lazy_close(io)
51
+ end
52
+ },
53
+ DieIfUsed.new
54
+ ]
55
+ end
56
+ }
@@ -60,19 +60,19 @@ t_begin "pipelining partial requests" && {
60
60
  dbgcat tmp
61
61
 
62
62
  t_begin "two HTTP/1.1 responses" && {
63
- test 2 -eq $(grep '^HTTP/1.1' $tmp | wc -l)
63
+ test 2 -eq $(grep '^HTTP/1.1' $tmp | count_lines)
64
64
  }
65
65
 
66
66
  t_begin "two HTTP/1.1 200 OK responses" && {
67
- test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | wc -l)
67
+ test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | count_lines)
68
68
  }
69
69
 
70
70
  t_begin 'one "Connection: keep-alive" response' && {
71
- test 1 -eq $(grep '^Connection: keep-alive' $tmp | wc -l)
71
+ test 1 -eq $(grep '^Connection: keep-alive' $tmp | count_lines)
72
72
  }
73
73
 
74
74
  t_begin 'one "Connection: close" response' && {
75
- test 1 -eq $(grep '^Connection: close' $tmp | wc -l)
75
+ test 1 -eq $(grep '^Connection: close' $tmp | count_lines)
76
76
  }
77
77
 
78
78
  t_begin 'check subshell success' && {
@@ -98,19 +98,19 @@ dbgcat tmp
98
98
  dbgcat r_err
99
99
 
100
100
  t_begin "got 2 HTTP/1.1 responses from pipelining" && {
101
- test 2 -eq $(grep '^HTTP/1.1' $tmp | wc -l)
101
+ test 2 -eq $(grep '^HTTP/1.1' $tmp | count_lines)
102
102
  }
103
103
 
104
104
  t_begin "got 2 HTTP/1.1 200 OK responses" && {
105
- test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | wc -l)
105
+ test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | count_lines)
106
106
  }
107
107
 
108
108
  t_begin "one keepalive connection" && {
109
- test 1 -eq $(grep '^Connection: keep-alive' $tmp | wc -l)
109
+ test 1 -eq $(grep '^Connection: keep-alive' $tmp | count_lines)
110
110
  }
111
111
 
112
112
  t_begin "second request closes connection" && {
113
- test 1 -eq $(grep '^Connection: close' $tmp | wc -l)
113
+ test 1 -eq $(grep '^Connection: close' $tmp | count_lines)
114
114
  }
115
115
 
116
116
  t_begin "subshell exited correctly" && {
@@ -134,7 +134,7 @@ dbgcat tmp
134
134
  dbgcat r_err
135
135
 
136
136
  t_begin "env.inspect should've put everything on one line" && {
137
- test 1 -eq $(wc -l < $tmp)
137
+ test 1 -eq $(count_lines < $tmp)
138
138
  }
139
139
 
140
140
  t_begin "no headers in output" && {
@@ -51,19 +51,19 @@ t_begin "pipelining partial requests" && {
51
51
  dbgcat tmp
52
52
 
53
53
  t_begin "two HTTP/1.1 responses" && {
54
- test 2 -eq $(grep '^HTTP/1.1' $tmp | wc -l)
54
+ test 2 -eq $(grep '^HTTP/1.1' $tmp | count_lines)
55
55
  }
56
56
 
57
57
  t_begin "two HTTP/1.1 200 OK responses" && {
58
- test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | wc -l)
58
+ test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | count_lines)
59
59
  }
60
60
 
61
61
  t_begin 'one "Connection: keep-alive" response' && {
62
- test 1 -eq $(grep '^Connection: keep-alive' $tmp | wc -l)
62
+ test 1 -eq $(grep '^Connection: keep-alive' $tmp | count_lines)
63
63
  }
64
64
 
65
65
  t_begin 'one "Connection: close" response' && {
66
- test 1 -eq $(grep '^Connection: close' $tmp | wc -l)
66
+ test 1 -eq $(grep '^Connection: close' $tmp | count_lines)
67
67
  }
68
68
 
69
69
  t_begin 'check subshell success' && {
@@ -89,19 +89,19 @@ dbgcat tmp
89
89
  dbgcat r_err
90
90
 
91
91
  t_begin "two HTTP/1.1 responses" && {
92
- test 2 -eq $(grep '^HTTP/1.1' $tmp | wc -l)
92
+ test 2 -eq $(grep '^HTTP/1.1' $tmp | count_lines)
93
93
  }
94
94
 
95
95
  t_begin "two HTTP/1.1 200 OK responses" && {
96
- test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | wc -l)
96
+ test 2 -eq $(grep '^HTTP/1.1 200 OK' $tmp | count_lines)
97
97
  }
98
98
 
99
99
  t_begin 'one "Connection: keep-alive" response' && {
100
- test 1 -eq $(grep '^Connection: keep-alive' $tmp | wc -l)
100
+ test 1 -eq $(grep '^Connection: keep-alive' $tmp | count_lines)
101
101
  }
102
102
 
103
103
  t_begin 'one "Connection: close" response' && {
104
- test 1 -eq $(grep '^Connection: close' $tmp | wc -l)
104
+ test 1 -eq $(grep '^Connection: close' $tmp | count_lines)
105
105
  }
106
106
 
107
107
  t_begin 'check subshell success' && {
@@ -17,7 +17,7 @@ t_begin "ensure server is responsive" && {
17
17
  }
18
18
 
19
19
  t_begin "start $nr_client concurrent requests" && {
20
- start=$(date +%s)
20
+ start=$(unix_time)
21
21
  for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
22
22
  do
23
23
  ( curl -sSf http://$listen/2 >> $curl_out 2>> $curl_err ) &
@@ -59,7 +59,7 @@ dbgcat r_err
59
59
 
60
60
  t_begin "wait curl requests to finish" && {
61
61
  wait
62
- t_info elapsed=$(( $(date +%s) - $start ))
62
+ t_info elapsed=$(( $(unix_time) - $start ))
63
63
  }
64
64
 
65
65
  t_begin "ensure no errors from curl" && {
@@ -67,11 +67,11 @@ t_begin "ensure no errors from curl" && {
67
67
  }
68
68
 
69
69
  t_begin "curl got $nr_client responses" && {
70
- test "$(wc -l < $curl_out)" -eq $nr_client
70
+ test "$(count_lines < $curl_out)" -eq $nr_client
71
71
  }
72
72
 
73
73
  t_begin "all responses were identical" && {
74
- nr=$(sort < $curl_out | uniq | wc -l)
74
+ nr=$(sort < $curl_out | uniq | count_lines)
75
75
  test "$nr" -eq 1
76
76
  }
77
77
 
@@ -86,11 +86,11 @@ t_begin "rotated stderr is clean" && {
86
86
  }
87
87
 
88
88
  t_begin "server is now writing logs to new stderr" && {
89
- before_rot=$(wc -c < $r_rot)
90
- before_err=$(wc -c < $r_err)
89
+ before_rot=$(count_bytes < $r_rot)
90
+ before_err=$(count_bytes < $r_err)
91
91
  curl -sSfv http://$listen/
92
- after_rot=$(wc -c < $r_rot)
93
- after_err=$(wc -c < $r_err)
92
+ after_rot=$(count_bytes < $r_rot)
93
+ after_err=$(count_bytes < $r_err)
94
94
  test $after_rot -eq $before_rot
95
95
  test $after_err -gt $before_err
96
96
  }
@@ -23,9 +23,9 @@ t_begin "sleep for a bit, ensure worker PID does not change" && {
23
23
 
24
24
  t_begin "block the worker process to force it to die" && {
25
25
  rm $ok
26
- t0=$(date +%s)
26
+ t0=$(unix_time)
27
27
  err="$(curl -sSf http://$listen/block-forever 2>&1 || > $ok)"
28
- t1=$(date +%s)
28
+ t1=$(unix_time)
29
29
  elapsed=$(($t1 - $t0))
30
30
  t_info "elapsed=$elapsed err=$err"
31
31
  test x"$err" != x"Should never get here"
@@ -34,7 +34,7 @@ t_begin "block the worker process to force it to die" && {
34
34
 
35
35
  t_begin "ensure worker was killed" && {
36
36
  test -e $ok
37
- test 1 -eq $(grep timeout $r_err | grep killing | wc -l)
37
+ test 1 -eq $(grep timeout $r_err | grep killing | count_lines)
38
38
  }
39
39
 
40
40
  t_begin "ensure timeout took at least 3 seconds" && {
@@ -21,7 +21,7 @@ t_begin "setup and startup" && {
21
21
 
22
22
  t_begin "read random blob sha1 and size" && {
23
23
  random_blob_sha1=$(rsha1 < random_blob)
24
- random_blob_size=$(wc -c < random_blob)
24
+ random_blob_size=$(count_bytes < random_blob)
25
25
  }
26
26
 
27
27
  t_begin "read current RSS" && {
@@ -16,12 +16,12 @@ t_begin 'check server up' && {
16
16
 
17
17
  t_begin "send keepalive response that does not expect close" && {
18
18
  req='GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'
19
- t0=$(date +%s)
19
+ t0=$(unix_time)
20
20
  (
21
21
  cat $fifo > $tmp &
22
22
  printf "$req"
23
23
  wait
24
- date +%s > $ok
24
+ unix_time > $ok
25
25
  ) | socat - TCP:$listen > $fifo
26
26
  now="$(cat $ok)"
27
27
  elapsed=$(( $now - $t0 ))
@@ -13,12 +13,12 @@ t_begin "setup and start" && {
13
13
 
14
14
  t_begin "send keepalive req expect it to timeout in ~1s" && {
15
15
  req='GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'
16
- t0=$(date +%s)
16
+ t0=$(unix_time)
17
17
  (
18
18
  cat $fifo > $tmp &
19
19
  printf "$req"
20
20
  wait
21
- date +%s > $ok
21
+ unix_time > $ok
22
22
  ) | socat - TCP:$listen > $fifo
23
23
  now="$(cat $ok)"
24
24
  elapsed=$(( $now - $t0 ))
@@ -16,12 +16,12 @@ t_begin 'check server responds with Connection: close' && {
16
16
 
17
17
  t_begin "send keepalive response that does not expect close" && {
18
18
  req='GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'
19
- t0=$(date +%s)
19
+ t0=$(unix_time)
20
20
  (
21
21
  cat $fifo > $tmp &
22
22
  printf "$req"
23
23
  wait
24
- date +%s > $ok
24
+ unix_time > $ok
25
25
  ) | socat - TCP:$listen > $fifo
26
26
  now="$(cat $ok)"
27
27
  elapsed=$(( $now - $t0 ))
@@ -63,7 +63,7 @@ t_begin "staggered pipeline of 3 HTTP requests" && {
63
63
  wait
64
64
  echo ok >> $ok
65
65
  ) | socat - TCP:$listen > $dd_fifo
66
- test 2 -eq $(grep '^ok$' $ok |wc -l)
66
+ test 2 -eq $(grep '^ok$' $ok |count_lines)
67
67
  }
68
68
 
69
69
  t_begin "pipeline 3 HTTP requests" && {
@@ -78,7 +78,7 @@ t_begin "pipeline 3 HTTP requests" && {
78
78
  wait
79
79
  echo ok >> $ok
80
80
  ) | socat - TCP:$listen > $fifo
81
- test 2 -eq $(grep '^ok$' $ok |wc -l)
81
+ test 2 -eq $(grep '^ok$' $ok |count_lines)
82
82
  }
83
83
 
84
84
  t_begin "shutdown server" && {
@@ -19,7 +19,7 @@ EOF
19
19
 
20
20
  t_begin "read random blob sha1 and size" && {
21
21
  random_blob_sha1=$(rsha1 < random_blob)
22
- random_blob_size=$(wc -c < random_blob)
22
+ random_blob_size=$(count_bytes < random_blob)
23
23
  }
24
24
 
25
25
  t_begin "send a series HTTP/1.1 requests sequentially" && {
@@ -35,7 +35,7 @@ t_begin "send three keep-alive requests" && {
35
35
  }
36
36
 
37
37
  t_begin "ensure responses were all keep-alive" && {
38
- test 3 -eq $(grep '< Connection: keep-alive' < $err | wc -l)
38
+ test 3 -eq $(grep '< Connection: keep-alive' < $err | count_lines)
39
39
  }
40
40
 
41
41
  t_begin "HTTP/1.0 test" && {
@@ -62,7 +62,7 @@ t_begin "staggered pipeline of 3 HTTP requests" && {
62
62
  wait
63
63
  echo ok >> $ok
64
64
  ) | socat - TCP:$listen > $dd_fifo
65
- test 2 -eq $(grep '^ok$' $ok |wc -l)
65
+ test 2 -eq $(grep '^ok$' $ok |count_lines)
66
66
  }
67
67
 
68
68
  t_begin "pipeline 3 HTTP requests" && {
@@ -77,7 +77,7 @@ t_begin "pipeline 3 HTTP requests" && {
77
77
  wait
78
78
  echo ok >> $ok
79
79
  ) | socat - TCP:$listen > $fifo
80
- test 2 -eq $(grep '^ok$' $ok |wc -l)
80
+ test 2 -eq $(grep '^ok$' $ok |count_lines)
81
81
  }
82
82
 
83
83
  t_begin "shutdown server" && {
@@ -35,7 +35,7 @@ t_begin "send three keep-alive requests" && {
35
35
  }
36
36
 
37
37
  t_begin "ensure responses were all keep-alive" && {
38
- test 3 -eq $(grep '< Connection: keep-alive' < $err | wc -l)
38
+ test 3 -eq $(grep '< Connection: keep-alive' < $err | count_lines)
39
39
  }
40
40
 
41
41
  t_begin "HTTP/1.0 test" && {
@@ -13,8 +13,8 @@ t_begin "setup and start" && {
13
13
 
14
14
  t_begin "curl requests hit default keepalive_requests limit" && {
15
15
  curl -sSfv http://$listen/[0-101] > $curl_out 2> $curl_err
16
- test 1 -eq $(grep 'Connection: close' $curl_err |wc -l)
17
- test 101 -eq $(grep 'Connection: keep-alive' $curl_err |wc -l)
16
+ test 1 -eq $(grep 'Connection: close' $curl_err |count_lines)
17
+ test 101 -eq $(grep 'Connection: keep-alive' $curl_err |count_lines)
18
18
  }
19
19
 
20
20
  t_begin "reload with smaller keepalive_requests limit" && {
@@ -32,8 +32,8 @@ EOF
32
32
  t_begin "curl requests hit smaller keepalive_requests limit" && {
33
33
  rm -f $curl_out $curl_err
34
34
  curl -sSfv http://$listen/[1-13] > $curl_out 2> $curl_err
35
- test 2 -eq $(grep 'Connection: close' $curl_err |wc -l)
36
- test 11 -eq $(grep 'Connection: keep-alive' $curl_err |wc -l)
35
+ test 2 -eq $(grep 'Connection: close' $curl_err |count_lines)
36
+ test 11 -eq $(grep 'Connection: keep-alive' $curl_err |count_lines)
37
37
  }
38
38
 
39
39
  t_begin "killing succeeds" && {
@@ -33,13 +33,13 @@ t_begin "wait for response" && {
33
33
  }
34
34
 
35
35
  t_begin "stop Rainbows! gracefully" && {
36
- t0=$(date +%s)
36
+ t0=$(unix_time)
37
37
  kill -QUIT $rainbows_pid
38
38
  }
39
39
 
40
40
  t_begin "keepalive client disconnected quickly" && {
41
41
  wait
42
- diff=$(( $(date +%s) - $t0 ))
42
+ diff=$(( $(unix_time) - $t0 ))
43
43
  test $diff -le 2 || die "client diff=$diff > 2"
44
44
  }
45
45
 
@@ -48,7 +48,7 @@ t_begin "wait for termination" && {
48
48
  do
49
49
  sleep 1
50
50
  done
51
- diff=$(( $(date +%s) - $t0 ))
51
+ diff=$(( $(unix_time) - $t0 ))
52
52
  test $diff -le 4 || die "server diff=$diff > 4"
53
53
  }
54
54
 
@@ -37,7 +37,7 @@ start_strace () {
37
37
 
38
38
  check_TCP_CORK () {
39
39
  nr=0
40
- while test 2 -gt $(grep TCP_CORK $strace_out | wc -l)
40
+ while test 2 -gt $(grep TCP_CORK $strace_out | count_lines)
41
41
  do
42
42
  nr=$(( $nr + 1 ))
43
43
  if test $nr -gt 30
@@ -48,7 +48,7 @@ check_TCP_CORK () {
48
48
  sleep 1
49
49
  done
50
50
 
51
- test 2 -eq $(grep TCP_CORK $strace_out | wc -l)
51
+ test 2 -eq $(grep TCP_CORK $strace_out | count_lines)
52
52
  fgrep 'SOL_TCP, TCP_CORK, [0],' $strace_out
53
53
  fgrep 'SOL_TCP, TCP_CORK, [1],' $strace_out
54
54
  }
@@ -54,7 +54,7 @@ t_begin "smallest HTTP/0.9 request works right" && {
54
54
  ) | socat - TCP:$listen > $fifo
55
55
  wait
56
56
  test xok = x"$(cat $ok)"
57
- test 1 -eq $(wc -l < $tmp)
57
+ test 1 -eq $(count_lines < $tmp)
58
58
  grep HTTP_VERSION $tmp && die "unexpected HTTP_VERSION in HTTP/0.9 request"
59
59
  }
60
60
 
@@ -75,7 +75,7 @@ EOF
75
75
 
76
76
  t_begin "HTTP/1.1 request succeeds" && {
77
77
  curl -sSf http://$listen/ > $tmp
78
- test 1 -eq $(wc -l < $tmp)
78
+ test 1 -eq $(count_lines < $tmp)
79
79
  dbgcat tmp
80
80
  }
81
81
 
@@ -17,7 +17,7 @@ t_begin "setup and startup" && {
17
17
  }
18
18
 
19
19
  t_begin "send $nr_client concurrent requests" && {
20
- start=$(date +%s)
20
+ start=$(unix_time)
21
21
  for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
22
22
  do
23
23
  (
@@ -26,17 +26,17 @@ t_begin "send $nr_client concurrent requests" && {
26
26
  ) &
27
27
  done
28
28
  wait
29
- t_info elapsed=$(( $(date +%s) - $start ))
29
+ t_info elapsed=$(( $(unix_time) - $start ))
30
30
  }
31
31
 
32
32
  t_begin "kill server" && kill $rainbows_pid
33
33
 
34
34
  t_begin "got $nr_client responses" && {
35
- test $nr_client -eq $(wc -l < $curl_out)
35
+ test $nr_client -eq $(count_lines < $curl_out)
36
36
  }
37
37
 
38
38
  t_begin "all responses identical" && {
39
- test 1 -eq $(sort < $curl_out | uniq | wc -l)
39
+ test 1 -eq $(sort < $curl_out | uniq | count_lines)
40
40
  }
41
41
 
42
42
  t_begin "sha1 matches on-disk sha1" && {