Mercurial > hg > nginx-tests
comparison stream_limit_rate.t @ 816:77359b849cd5
Tests: stream package.
author | Andrey Zelenkov <zelenkov@nginx.com> |
---|---|
date | Mon, 20 Jul 2015 15:06:09 +0300 |
parents | a53c310c695d |
children | 5048b8f0fedd |
comparison
equal
deleted
inserted
replaced
815:9f5f604a840e | 816:77359b849cd5 |
---|---|
16 | 16 |
17 BEGIN { use FindBin; chdir($FindBin::Bin); } | 17 BEGIN { use FindBin; chdir($FindBin::Bin); } |
18 | 18 |
19 use lib 'lib'; | 19 use lib 'lib'; |
20 use Test::Nginx; | 20 use Test::Nginx; |
21 use Test::Nginx::Stream qw/ stream /; | |
21 | 22 |
22 ############################################################################### | 23 ############################################################################### |
23 | 24 |
24 select STDERR; $| = 1; | 25 select STDERR; $| = 1; |
25 select STDOUT; $| = 1; | 26 select STDOUT; $| = 1; |
93 | 94 |
94 ############################################################################### | 95 ############################################################################### |
95 | 96 |
96 my $str = '1234567890' x 100; | 97 my $str = '1234567890' x 100; |
97 | 98 |
98 my %r = stream_get($str, peer => '127.0.0.1:8081'); | 99 my %r = response($str, peer => '127.0.0.1:8081'); |
99 is($r{'data'}, $str, 'exact limit'); | 100 is($r{'data'}, $str, 'exact limit'); |
100 | 101 |
101 %r = stream_get($str, peer => '127.0.0.1:8082'); | 102 %r = response($str, peer => '127.0.0.1:8082'); |
102 is($r{'data'}, $str, 'unlimited'); | 103 is($r{'data'}, $str, 'unlimited'); |
103 | 104 |
104 SKIP: { | 105 SKIP: { |
105 skip 'unsafe on VM', 2 unless $ENV{TEST_NGINX_UNSAFE}; | 106 skip 'unsafe on VM', 2 unless $ENV{TEST_NGINX_UNSAFE}; |
106 | 107 |
107 # if interaction between backend and client is slow then proxy can add extra | 108 # if interaction between backend and client is slow then proxy can add extra |
108 # bytes to upload/download data | 109 # bytes to upload/download data |
109 | 110 |
110 %r = stream_get($str, peer => '127.0.0.1:8083', readonce => 1); | 111 %r = response($str, peer => '127.0.0.1:8083', readonce => 1); |
111 is($r{'data'}, '1', 'download - one byte'); | 112 is($r{'data'}, '1', 'download - one byte'); |
112 | 113 |
113 %r = stream_get($str, peer => '127.0.0.1:8084'); | 114 %r = response($str, peer => '127.0.0.1:8084'); |
114 is($r{'data'}, '1', 'upload - one byte'); | 115 is($r{'data'}, '1', 'upload - one byte'); |
115 | 116 |
116 } | 117 } |
117 | 118 |
118 # Five chunks are split with four 1s delays: | 119 # Five chunks are split with four 1s delays: |
119 # the first four chunks are quarters of test string | 120 # the first four chunks are quarters of test string |
120 # and the fifth one is some extra data from backend. | 121 # and the fifth one is some extra data from backend. |
121 | 122 |
122 %r = stream_get($str, peer => '127.0.0.1:8085'); | 123 %r = response($str, peer => '127.0.0.1:8085'); |
123 my $diff = time() - $r{'time'}; | 124 my $diff = time() - $r{'time'}; |
124 cmp_ok($diff, '>=', 4, 'download - time'); | 125 cmp_ok($diff, '>=', 4, 'download - time'); |
125 is($r{'data'}, $str, 'download - data'); | 126 is($r{'data'}, $str, 'download - data'); |
126 | 127 |
127 my $time = time(); | 128 my $time = time(); |
128 %r = stream_get($str . 'close', peer => '127.0.0.1:8086'); | 129 %r = response($str . 'close', peer => '127.0.0.1:8086'); |
129 $diff = time() - $time; | 130 $diff = time() - $time; |
130 cmp_ok($diff, '>=', 4, 'upload - time'); | 131 cmp_ok($diff, '>=', 4, 'upload - time'); |
131 is($r{'data'}, $str . 'close', 'upload - data'); | 132 is($r{'data'}, $str . 'close', 'upload - data'); |
132 | 133 |
133 ############################################################################### | 134 ############################################################################### |
134 | 135 |
135 sub stream_get { | 136 sub response { |
136 my ($data, %extra) = @_; | 137 my ($data, %extra) = @_; |
137 | 138 |
138 my $s = stream_connect($extra{'peer'}); | 139 my $s = stream($extra{peer}); |
139 stream_write($s, $data); | 140 $s->write($data); |
140 | 141 |
141 $data = ''; | 142 $data = ''; |
142 while (my $buf = stream_read($s)) { | 143 while (1) { |
144 my $buf = $s->read(); | |
145 last unless length($buf); | |
146 | |
143 $data .= $buf; | 147 $data .= $buf; |
148 | |
144 last if $extra{'readonce'}; | 149 last if $extra{'readonce'}; |
145 } | 150 } |
146 $data =~ /([\S]*)\s?(\d+)?/; | 151 $data =~ /([\S]*)\s?(\d+)?/; |
147 | 152 |
148 return ('data' => $1, 'time' => $2); | 153 return ('data' => $1, 'time' => $2) |
149 } | |
150 | |
151 sub stream_connect { | |
152 my $peer = shift; | |
153 my $s = IO::Socket::INET->new( | |
154 Proto => 'tcp', | |
155 PeerAddr => $peer | |
156 ) | |
157 or die "Can't connect to nginx: $!\n"; | |
158 | |
159 return $s; | |
160 } | |
161 | |
162 sub stream_write { | |
163 my ($s, $message) = @_; | |
164 | |
165 local $SIG{PIPE} = 'IGNORE'; | |
166 | |
167 $s->blocking(0); | |
168 while (IO::Select->new($s)->can_write(1.5)) { | |
169 my $n = $s->syswrite($message); | |
170 last unless $n; | |
171 $message = substr($message, $n); | |
172 last unless length $message; | |
173 } | |
174 | |
175 if (length $message) { | |
176 $s->close(); | |
177 } | |
178 } | |
179 | |
180 sub stream_read { | |
181 my ($s) = @_; | |
182 my ($buf); | |
183 | |
184 $s->blocking(0); | |
185 if (IO::Select->new($s)->can_read(5)) { | |
186 $s->sysread($buf, 1024); | |
187 }; | |
188 | |
189 log_in($buf); | |
190 return $buf; | |
191 } | 154 } |
192 | 155 |
193 ############################################################################### | 156 ############################################################################### |
194 | 157 |
195 sub stream_daemon { | 158 sub stream_daemon { |