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 {