eventmachine: wait for deferred actions to finish
[rainbows.git] / t / byte-range-common.sh
blob3418394d09ccd24b10d24ac1ce2a48e41760c4f2
1 t_begin "byte-range setup vars" && {
2 random_blob_size=$(count_bytes < random_blob)
3 rb_1=$(( $random_blob_size - 1 ))
4 range_head=-r-365
5 range_tail=-r155-
6 range_mid=-r200-300
7 range_n1=-r0-$rb_1
8 range_n2=-r0-$(($rb_1 - 1))
9 range_1b_head=-r0-0
10 range_1b_tail=-r$rb_1-$rb_1
11 range_1b_mid=-r200-200
12 range_all=-r0-$random_blob_size
13 url=http://$listen/random_blob
16 check_content_range () {
17 grep '^< HTTP/1\.1 206 Partial Content' $err
18 grep 'Range:' $err
19 # Content-Range: bytes #{offset}-#{offset+count-1}/#{clen}
20 d='\([0-9]\+\)'
21 start= end= size=
22 eval $(< $err sed -n -e \
23 "s/^< Content-Range: bytes $d-$d\/$d"'.*$/start=\1 end=\2 size=\3/p')
24 test -n "$start"
25 test -n "$end"
26 test -n "$size"
28 # ensure we didn't screw up the sed invocation
29 expect="< Content-Range: bytes $start-$end/$size"
30 test x"$(grep -F "$expect" $err)" = x"$(grep '^< Content-Range:' $err)"
32 test $start -le $end
33 test $end -lt $size
36 t_begin "read random blob sha1s" && {
37 file="file://$(pwd)/random_blob"
38 sha1_head=$(curl -sSff $range_head $file | rsha1)
39 sha1_tail=$(curl -sSff $range_tail $file | rsha1)
40 sha1_mid=$(curl -sSff $range_mid $file | rsha1)
41 sha1_n1=$(curl -sSff $range_n1 $file | rsha1)
42 sha1_n2=$(curl -sSff $range_n2 $file | rsha1)
43 sha1_1b_head=$(curl -sSff $range_1b_head $file | rsha1)
44 sha1_1b_tail=$(curl -sSff $range_1b_tail $file | rsha1)
45 sha1_1b_mid=$(curl -sSff $range_1b_mid $file | rsha1)
46 sha1_all=$(rsha1 < random_blob)
47 echo "$sha1_all=$sha1_n1"
50 t_begin "normal full request matches" && {
51 sha1="$(curl -v 2>$err -sSf $url | rsha1)"
52 test x"$sha1_all" = x"$sha1"
53 grep 'Content-Range:' $err && die "Content-Range unexpected"
54 grep 'HTTP/1.1 200 OK' $err || die "200 response expected"
57 t_begin "crazy offset goes over" && {
58 range_insane=-r$(($random_blob_size * 2))-$(($random_blob_size * 4))
59 curl -vsS 2>$err $range_insane $url >/dev/null
60 grep '^< HTTP/1\.[01] 416 ' $err || die "expected 416 error"
61 grep '^< Content-Range: bytes \*/'$random_blob_size $err || \
62 die "expected Content-Range: bytes */SIZE"
65 t_begin "keepalive/pipelining is supported on 416 responses" && {
66 rm -f $tmp
68 cat $fifo > $tmp &
69 printf 'GET /byte-range-common.sh HTTP/1.1\r\n'
70 printf 'Host: %s\r\n' $listen
71 printf 'Range: bytes=9999999999-9999999999\r\n\r\n'
72 printf 'GET /byte-range-common.sh HTTP/1.1\r\n'
73 printf 'Host: %s\r\n' $listen
74 printf 'Connection: close\r\n'
75 printf 'Range: bytes=0-0\r\n\r\n'
76 wait
77 ) | socat - TCP:$listen > $fifo
79 < $tmp awk '
80 /^HTTP\/1\.1 / && NR == 1 && $2 == 416 { first = $2 }
81 /^HTTP\/1\.1 / && NR != 1 && $2 == 206 { second = $2 }
82 END { exit((first == 416 && second == 206) ? 0 : 1) }
86 t_begin "full request matches with explicit ranges" && {
87 sha1="$(curl -v 2>$err $range_all -sSf $url | rsha1)"
88 check_content_range
89 test x"$sha1_all" = x"$sha1"
91 sha1="$(curl -v 2>$err $range_n1 -sSf $url | rsha1)"
92 check_content_range
93 test x"$sha1_all" = x"$sha1"
95 range_over=-r0-$(($random_blob_size * 2))
96 sha1="$(curl -v 2>$err $range_over -sSf $url | rsha1)"
97 check_content_range
98 test x"$sha1_all" = x"$sha1"
101 t_begin "no fence post errors" && {
102 sha1="$(curl -v 2>$err $range_n2 -sSf $url | rsha1)"
103 check_content_range
104 test x"$sha1_n2" = x"$sha1"
106 sha1="$(curl -v 2>$err $range_1b_head -sSf $url | rsha1)"
107 check_content_range
108 test x"$sha1_1b_head" = x"$sha1"
110 sha1="$(curl -v 2>$err $range_1b_tail -sSf $url | rsha1)"
111 check_content_range
112 test x"$sha1_1b_tail" = x"$sha1"
114 sha1="$(curl -v 2>$err $range_1b_mid -sSf $url | rsha1)"
115 check_content_range
116 test x"$sha1_1b_mid" = x"$sha1"
119 t_begin "head range matches" && {
120 sha1="$(curl -sSfv 2>$err $range_head $url | rsha1)"
121 check_content_range
122 test x"$sha1_head" = x"$sha1"
125 t_begin "tail range matches" && {
126 sha1="$(curl -sSfv 2>$err $range_tail $url | rsha1)"
127 check_content_range
128 test x"$sha1_tail" = x"$sha1"
131 t_begin "mid range matches" && {
132 sha1="$(curl -sSfv 2>$err $range_mid $url | rsha1)"
133 check_content_range
134 test x"$sha1_mid" = x"$sha1"
137 t_begin "shutdown server" && {
138 kill -QUIT $rainbows_pid
141 t_begin "check stderr" && check_stderr
143 t_done