Mercurial > hg > nginx-tests
annotate grpc.t @ 1542:451e787aad76
Tests: reworked libgd version detection.
The "libgd-config" binary is deprecated in recent versions and may not exist
or have unexpected output. More, it may not present within older versions,
as well, if installed separately, which previously broke test assumptions.
The fix is change the fallback to skip tests. In addition, recent Perl GD
module (2.57) started to export libgd version, which is now also consulted.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Mon, 13 Jan 2020 18:15:35 +0300 |
parents | 144c6ce732e4 |
children | fe938b5daf80 |
rev | line source |
---|---|
1303 | 1 #!/usr/bin/perl |
2 | |
3 # (C) Sergey Kandaurov | |
4 # (C) Nginx, Inc. | |
5 | |
6 # Tests for grpc backend. | |
7 | |
8 ############################################################################### | |
9 | |
10 use warnings; | |
11 use strict; | |
12 | |
13 use Test::More; | |
14 | |
15 BEGIN { use FindBin; chdir($FindBin::Bin); } | |
16 | |
17 use lib 'lib'; | |
18 use Test::Nginx; | |
19 use Test::Nginx::HTTP2; | |
20 | |
21 ############################################################################### | |
22 | |
23 select STDERR; $| = 1; | |
24 select STDOUT; $| = 1; | |
25 | |
1312
6f95c0ed2335
Tests: removed proxy prerequisite from grpc tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1303
diff
changeset
|
26 my $t = Test::Nginx->new()->has(qw/http rewrite http_v2 grpc/) |
1381
97c8280de681
Tests: removed TODO and try_run() checks for legacy versions.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1370
diff
changeset
|
27 ->has(qw/upstream_keepalive/)->plan(105); |
1303 | 28 |
29 $t->write_file_expand('nginx.conf', <<'EOF'); | |
30 | |
31 %%TEST_GLOBALS%% | |
32 | |
33 daemon off; | |
34 | |
35 events { | |
36 } | |
37 | |
38 http { | |
39 %%TEST_GLOBALS_HTTP%% | |
40 | |
41 upstream u { | |
42 server 127.0.0.1:8081; | |
43 keepalive 1; | |
44 } | |
45 | |
46 server { | |
47 listen 127.0.0.1:8080 http2; | |
48 server_name localhost; | |
49 | |
50 http2_max_field_size 128k; | |
51 http2_max_header_size 128k; | |
52 http2_body_preread_size 128k; | |
53 | |
54 location / { | |
55 grpc_pass grpc://127.0.0.1:8081; | |
56 | |
57 if ($arg_if) { | |
58 # nothing | |
59 } | |
60 | |
61 limit_except GET { | |
62 # nothing | |
63 } | |
64 } | |
65 | |
66 location /KeepAlive { | |
67 grpc_pass u; | |
68 } | |
69 | |
70 location /LongHeader { | |
71 grpc_pass 127.0.0.1:8081; | |
72 grpc_set_header X-LongHeader $arg_h; | |
73 } | |
74 | |
75 location /LongField { | |
76 grpc_pass 127.0.0.1:8081; | |
77 grpc_buffer_size 65k; | |
78 } | |
79 | |
80 location /SetHost { | |
81 grpc_pass 127.0.0.1:8081; | |
82 grpc_set_header Host custom; | |
83 } | |
84 | |
85 location /SetArgs { | |
86 grpc_pass 127.0.0.1:8081; | |
87 set $args $arg_c; | |
88 } | |
89 } | |
90 } | |
91 | |
92 EOF | |
93 | |
1381
97c8280de681
Tests: removed TODO and try_run() checks for legacy versions.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1370
diff
changeset
|
94 $t->run(); |
1303 | 95 |
96 ############################################################################### | |
97 | |
98 my $p = port(8081); | |
99 my $f = grpc(); | |
100 | |
101 my $frames = $f->{http_start}('/SayHello'); | |
102 my ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
103 is($frame->{flags}, 4, 'request - HEADERS flags'); | |
104 ok((my $sid = $frame->{sid}) % 2, 'request - HEADERS sid odd'); | |
105 is($frame->{headers}{':method'}, 'POST', 'request - method'); | |
106 is($frame->{headers}{':scheme'}, 'http', 'request - scheme'); | |
107 is($frame->{headers}{':path'}, '/SayHello', 'request - path'); | |
108 is($frame->{headers}{':authority'}, "127.0.0.1:$p", 'request - authority'); | |
109 is($frame->{headers}{'content-type'}, 'application/grpc', | |
110 'request - content type'); | |
111 is($frame->{headers}{te}, 'trailers', 'request - te'); | |
112 | |
113 $frames = $f->{data}('Hello'); | |
114 ($frame) = grep { $_->{type} eq "SETTINGS" } @$frames; | |
115 is($frame->{flags}, 1, 'request - SETTINGS ack'); | |
116 is($frame->{sid}, 0, 'request - SETTINGS sid'); | |
117 is($frame->{length}, 0, 'request - SETTINGS length'); | |
118 | |
119 ($frame) = grep { $_->{type} eq "DATA" } @$frames; | |
120 is($frame->{data}, 'Hello', 'request - DATA'); | |
121 is($frame->{length}, 5, 'request - DATA length'); | |
122 is($frame->{flags}, 1, 'request - DATA flags'); | |
123 is($frame->{sid}, $sid, 'request - DATA sid match'); | |
124 | |
125 $frames = $f->{http_end}(); | |
126 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
127 is($frame->{flags}, 4, 'response - HEADERS flags'); | |
128 is($frame->{sid}, 1, 'response - HEADERS sid'); | |
129 is($frame->{headers}{':status'}, '200', 'response - status'); | |
130 is($frame->{headers}{'content-type'}, 'application/grpc', | |
131 'response - content type'); | |
132 ok($frame->{headers}{server}, 'response - server'); | |
133 ok($frame->{headers}{date}, 'response - date'); | |
134 ok(my $c = $frame->{headers}{'x-connection'}, 'response - connection'); | |
135 | |
136 ($frame) = grep { $_->{type} eq "DATA" } @$frames; | |
137 is($frame->{data}, 'Hello world', 'response - DATA'); | |
138 is($frame->{length}, 11, 'response - DATA length'); | |
139 is($frame->{flags}, 0, 'response - DATA flags'); | |
140 is($frame->{sid}, 1, 'response - DATA sid'); | |
141 | |
142 (undef, $frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
143 is($frame->{flags}, 5, 'response - trailers flags'); | |
144 is($frame->{sid}, 1, 'response - trailers sid'); | |
145 is($frame->{headers}{'grpc-message'}, '', 'response - trailers message'); | |
146 is($frame->{headers}{'grpc-status'}, '0', 'response - trailers status'); | |
147 | |
148 # next request is on a new backend connection, no sid incremented | |
149 | |
150 $frames = $f->{http_start}('/SayHello'); | |
151 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
152 is($frame->{sid}, $sid, 'request 2 - HEADERS sid again'); | |
153 $f->{data}('Hello'); | |
154 $frames = $f->{http_end}(); | |
155 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
156 cmp_ok($frame->{headers}{'x-connection'}, '>', $c, 'response 2 - connection'); | |
157 | |
158 # upstream keepalive | |
159 | |
160 $frames = $f->{http_start}('/KeepAlive'); | |
161 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
162 is($frame->{sid}, $sid, 'keepalive - HEADERS sid'); | |
163 $f->{data}('Hello'); | |
164 $frames = $f->{http_end}(); | |
165 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
166 ok($c = $frame->{headers}{'x-connection'}, 'keepalive - connection'); | |
167 | |
168 $frames = $f->{http_start}('/KeepAlive', reuse => 1); | |
169 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
170 cmp_ok($frame->{sid}, '>', $sid, 'keepalive - HEADERS sid next'); | |
171 $f->{data}('Hello'); | |
172 $frames = $f->{http_end}(); | |
173 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
174 is($frame->{headers}{'x-connection'}, $c, 'keepalive - connection reuse'); | |
175 | |
1370
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
176 # upstream keepalive |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
177 # pending control frame ack after the response |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
178 |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
179 undef $f; |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
180 $f = grpc(); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
181 |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
182 $frames = $f->{http_start}('/KeepAlive'); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
183 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
184 is($frame->{sid}, $sid, 'keepalive 2 - HEADERS sid'); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
185 $f->{data}('Hello'); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
186 $f->{settings}(0, 1 => 4096); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
187 $frames = $f->{http_end}(); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
188 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
189 ok($c = $frame->{headers}{'x-connection'}, 'keepalive 2 - connection'); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
190 |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
191 $frames = $f->{http_start}('/KeepAlive', reuse => 1); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
192 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
193 ok($frame, 'upstream keepalive reused'); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
194 |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
195 cmp_ok($frame->{sid}, '>', $sid, 'keepalive 2 - HEADERS sid next'); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
196 $f->{data}('Hello'); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
197 $frames = $f->{http_end}(); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
198 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
199 is($frame->{headers}{'x-connection'}, $c, 'keepalive 2 - connection reuse'); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
200 |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
201 undef $f; |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
202 $f = grpc(); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
203 |
1303 | 204 # various header compression formats |
205 | |
206 $f->{http_start}('/SayHello'); | |
207 $f->{data}('Hello'); | |
208 $frames = $f->{http_end}(mode => 3); | |
209 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
210 is($frame->{headers}{':status'}, '200', 'without indexing'); | |
211 is($frame->{headers}{'content-type'}, 'application/grpc', | |
212 'without indexing 2'); | |
213 | |
214 $f->{http_start}('/SayHello'); | |
215 $f->{data}('Hello'); | |
216 $frames = $f->{http_end}(mode => 4); | |
217 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
218 is($frame->{headers}{':status'}, '200', 'without indexing new'); | |
219 is($frame->{headers}{'content-type'}, 'application/grpc', | |
220 'without indexing new 2'); | |
221 | |
222 $f->{http_start}('/SayHello'); | |
223 $f->{data}('Hello'); | |
224 $frames = $f->{http_end}(mode => 5); | |
225 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
226 is($frame->{headers}{':status'}, '200', 'never indexed'); | |
227 is($frame->{headers}{'content-type'}, 'application/grpc', | |
228 'never indexed 2'); | |
229 | |
230 $f->{http_start}('/SayHello'); | |
231 $f->{data}('Hello'); | |
232 $frames = $f->{http_end}(mode => 6); | |
233 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
234 is($frame->{headers}{':status'}, '200', 'never indexed new'); | |
235 is($frame->{headers}{'content-type'}, 'application/grpc', | |
236 'never indexed new 2'); | |
237 | |
238 # padding & priority | |
239 | |
240 $f->{http_start}('/SayHello'); | |
241 $f->{data}('Hello'); | |
242 $frames = $f->{http_end}(padding => 7); | |
243 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
244 is($frame->{headers}{':status'}, '200', 'padding'); | |
245 | |
246 $f->{http_start}('/SayHello'); | |
247 $f->{data}('Hello'); | |
248 $frames = $f->{http_end}(prio => 137, dep => 0x01020304); | |
249 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
250 is($frame->{headers}{':status'}, '200', 'priority'); | |
251 | |
252 $f->{http_start}('/SayHello'); | |
253 $f->{data}('Hello'); | |
254 $frames = $f->{http_end}(padding => 7, prio => 137, dep => 0x01020304); | |
255 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
256 is($frame->{headers}{':status'}, '200', 'padding priority'); | |
257 | |
258 SKIP: { | |
259 skip 'long test', 1 unless $ENV{TEST_NGINX_UNSAFE}; | |
260 | |
261 $f->{http_start}('/SaySplit'); | |
262 $f->{data}('Hello'); | |
263 $frames = $f->{http_end}(padding => 7, prio => 137, dep => 0x01020304, | |
264 split => [(map{1}(1..20)), 30], split_delay => 0.1); | |
265 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
266 is($frame->{headers}{':status'}, '200', 'padding priority split'); | |
267 | |
268 } | |
269 | |
270 # grpc error, no empty data frame expected | |
271 | |
272 $f->{http_start}('/SayHello'); | |
273 $f->{data}('Hello'); | |
274 $frames = $f->{http_err}(); | |
275 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
276 is($frame->{flags}, 5, 'grpc error - HEADERS flags'); | |
277 ($frame) = grep { $_->{type} eq "DATA" } @$frames; | |
278 ok(!$frame, 'grpc error - no DATA frame'); | |
279 | |
280 # continuation from backend, expect parts assembled | |
281 | |
282 $f->{http_start}('/SayHello'); | |
283 $f->{data}('Hello'); | |
284 $frames = $f->{continuation}(); | |
285 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
286 is($frame->{flags}, 4, 'continuation - HEADERS flags'); | |
287 is($frame->{headers}{':status'}, '200', 'continuation - status'); | |
288 is($frame->{headers}{'content-type'}, 'application/grpc', | |
289 'continuation - content type'); | |
290 | |
291 ($frame) = grep { $_->{type} eq "DATA" } @$frames; | |
292 is($frame->{data}, 'Hello world', 'continuation - DATA'); | |
293 is($frame->{length}, 11, 'continuation - DATA length'); | |
294 is($frame->{flags}, 0, 'continuation - DATA flags'); | |
295 | |
296 (undef, $frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
297 is($frame->{flags}, 5, 'continuation - trailers flags'); | |
298 is($frame->{headers}{'grpc-message'}, '', 'continuation - trailers message'); | |
299 is($frame->{headers}{'grpc-status'}, '0', 'continuation - trailers status'); | |
300 | |
301 # continuation from backend, header split | |
302 | |
303 $f->{http_start}('/SayHello'); | |
304 $f->{data}('Hello'); | |
305 $frames = $f->{http_end}(mode => 6, continuation => [map { 1 } (1 .. 42)]); | |
306 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
307 is($frame->{headers}{':status'}, '200', 'continuation - header split'); | |
308 | |
309 # continuation to backend | |
310 | |
311 $frames = $f->{http_start}('/LongHeader?h=' . ('Z' x 31337)); | |
312 @$frames = grep { $_->{type} =~ "HEADERS|CONTINUATION" } @$frames; | |
313 is(@$frames, 4, 'continuation - frames'); | |
314 | |
315 $frame = shift @$frames; | |
316 is($frame->{type}, 'HEADERS', 'continuation - HEADERS'); | |
317 is($frame->{length}, 16384, 'continuation - HEADERS length'); | |
318 is($frame->{flags}, 1, 'continuation - HEADERS flags'); | |
319 ok($frame->{sid}, 'continuation - HEADERS sid'); | |
320 | |
321 $frame = shift @$frames; | |
322 is($frame->{type}, 'CONTINUATION', 'continuation - CONTINUATION'); | |
323 is($frame->{length}, 16384, 'continuation - CONTINUATION length'); | |
324 is($frame->{flags}, 0, 'continuation - CONTINUATION flags'); | |
325 ok($frame->{sid}, 'continuation - CONTINUATION sid'); | |
326 | |
327 $frame = shift @$frames; | |
328 is($frame->{type}, 'CONTINUATION', 'continuation - CONTINUATION 2'); | |
329 is($frame->{length}, 16384, 'continuation - CONTINUATION 2 length'); | |
330 is($frame->{flags}, 0, 'continuation - CONTINUATION 2 flags'); | |
331 | |
332 $frame = shift @$frames; | |
333 is($frame->{type}, 'CONTINUATION', 'continuation - CONTINUATION n'); | |
334 cmp_ok($frame->{length}, '<', 16384, 'continuation - CONTINUATION n length'); | |
335 is($frame->{flags}, 4, 'continuation - CONTINUATION n flags'); | |
336 is($frame->{headers}{':path'}, '/LongHeader?h=' . 'Z' x 31337, | |
337 'continuation - path'); | |
338 is($frame->{headers}{'x-longheader'}, 'Z' x 31337, 'continuation - header'); | |
339 | |
340 $f->{http_end}(); | |
341 | |
342 # long header field | |
343 | |
344 $f->{http_start}('/LongField'); | |
345 $f->{data}('Hello'); | |
346 $frames = $f->{field_len}(2**7); | |
347 ($frame) = grep { $_->{flags} & 0x4 } @$frames; | |
348 is($frame->{headers}{'x' x 2**7}, 'y' x 2**7, 'long header field 1'); | |
349 | |
350 $f->{http_start}('/LongField'); | |
351 $f->{data}('Hello'); | |
352 $frames = $f->{field_len}(2**8); | |
353 ($frame) = grep { $_->{flags} & 0x4 } @$frames; | |
354 is($frame->{headers}{'x' x 2**8}, 'y' x 2**8, 'long header field 2'); | |
355 | |
356 $f->{http_start}('/LongField'); | |
357 $f->{data}('Hello'); | |
358 $frames = $f->{field_len}(2**15); | |
359 ($frame) = grep { $_->{flags} & 0x4 } @$frames; | |
360 is($frame->{headers}{'x' x 2**15}, 'y' x 2**15, 'long header field 3'); | |
361 | |
362 # flow control | |
363 | |
364 $f->{http_start}('/FlowControl'); | |
365 $frames = $f->{data_len}(('Hello' x 13000) . ('x' x 550), 65535); | |
366 my $sum = eval join '+', map { $_->{type} eq "DATA" && $_->{length} } @$frames; | |
367 is($sum, 65535, 'flow control - iws length'); | |
368 | |
369 $f->{update}(10); | |
370 $f->{update_sid}(10); | |
371 | |
372 $frames = $f->{data_len}(undef, 10); | |
373 ($frame) = grep { $_->{type} eq "DATA" } @$frames; | |
374 is($frame->{length}, 10, 'flow control - update length'); | |
375 is($frame->{flags}, 0, 'flow control - update flags'); | |
376 | |
377 $f->{update_sid}(10); | |
378 $f->{update}(10); | |
379 | |
380 $frames = $f->{data_len}(undef, 5); | |
381 ($frame) = grep { $_->{type} eq "DATA" } @$frames; | |
382 is($frame->{length}, 5, 'flow control - rest length'); | |
383 is($frame->{flags}, 1, 'flow control - rest flags'); | |
384 | |
385 $f->{http_end}(); | |
386 | |
1318
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
387 # preserve output |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
388 |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
389 $f->{http_start}('/Preserve'); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
390 $f->{data}('Hello'); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
391 $frames = $f->{http_pres}(); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
392 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
393 is($frame->{flags}, 4, 'preserve - HEADERS'); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
394 |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
395 my @data = grep { $_->{type} eq "DATA" } @$frames; |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
396 $sum = eval join '+', map { $_->{length} } @data; |
1319
3b30e97acdcb
Tests: made grpc preserve output test pass on win32 and Solaris.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1318
diff
changeset
|
397 is($sum, 20480, 'preserve - DATA'); |
1318
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
398 |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
399 (undef, $frame) = grep { $_->{type} eq "HEADERS" } @$frames; |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
400 is($frame->{flags}, 5, 'preserve - trailers'); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
401 |
1303 | 402 # DATA padding |
403 | |
404 $f->{http_start}('/SayPadding'); | |
405 $f->{data}('Hello'); | |
406 $frames = $f->{http_end}(body_padding => 42); | |
407 ($frame) = grep { $_->{type} eq "DATA" } @$frames; | |
1362
6874b32dc3d2
Tests: renamed some grpc.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1321
diff
changeset
|
408 is($frame->{data}, 'Hello world', 'DATA padding'); |
6874b32dc3d2
Tests: renamed some grpc.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1321
diff
changeset
|
409 is($frame->{length}, 11, 'DATA padding - length'); |
6874b32dc3d2
Tests: renamed some grpc.t tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1321
diff
changeset
|
410 is($frame->{flags}, 0, 'DATA padding - flags'); |
1303 | 411 |
412 # :authority inheritance | |
413 | |
414 $frames = $f->{http_start}('/SayHello?if=1'); | |
415 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
416 is($frame->{headers}{':authority'}, "127.0.0.1:$p", 'authority in if'); | |
417 $f->{data}('Hello'); | |
418 $f->{http_end}(); | |
419 | |
420 # misc tests | |
421 | |
422 $frames = $f->{http_start}('/SetHost'); | |
423 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
424 ok(!$frame->{headers}{':authority'}, 'set host - authority'); | |
425 is($frame->{headers}{'host'}, 'custom', 'set host - host'); | |
426 $f->{data}('Hello'); | |
427 $f->{http_end}(); | |
428 | |
429 $frames = $f->{http_start}('/SetArgs?f'); | |
430 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
431 is($frame->{headers}{':path'}, '/SetArgs', 'set args'); | |
432 $f->{data}('Hello'); | |
433 $f->{http_end}(); | |
434 | |
435 $frames = $f->{http_start}('/SetArgs?c=1'); | |
436 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
437 is($frame->{headers}{':path'}, '/SetArgs?1', 'set args len'); | |
438 $f->{data}('Hello'); | |
439 $f->{http_end}(); | |
440 | |
441 $frames = $f->{http_start}('/SetArgs esc'); | |
442 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
443 is($frame->{headers}{':path'}, '/SetArgs%20esc', 'uri escape'); | |
444 $f->{data}('Hello'); | |
445 $f->{http_end}(); | |
446 | |
447 $frames = $f->{http_start}('/'); | |
448 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
449 is($frame->{headers}{':path'}, '/', 'root index'); | |
450 $f->{data}('Hello'); | |
451 $f->{http_end}(); | |
452 | |
453 $frames = $f->{http_start}('/', method => 'GET'); | |
454 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
455 is($frame->{headers}{':method'}, 'GET', 'method get'); | |
456 $f->{data}('Hello'); | |
457 $f->{http_end}(); | |
458 | |
459 $frames = $f->{http_start}('/', method => 'HEAD'); | |
460 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
461 is($frame->{headers}{':method'}, 'HEAD', 'method head'); | |
462 $f->{data}('Hello'); | |
463 $f->{http_end}(); | |
464 | |
465 ############################################################################### | |
466 | |
467 sub grpc { | |
1318
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
468 my ($server, $client, $f, $s, $c, $sid, $csid, $uri); |
1303 | 469 my $n = 0; |
470 | |
471 $server = IO::Socket::INET->new( | |
472 Proto => 'tcp', | |
473 LocalHost => '127.0.0.1', | |
474 LocalPort => $p, | |
475 Listen => 5, | |
476 Reuse => 1 | |
477 ) | |
478 or die "Can't create listening socket: $!\n"; | |
479 | |
480 $f->{http_start} = sub { | |
481 ($uri, my %extra) = @_; | |
482 my $body_more = 1 if $uri !~ /LongHeader/; | |
483 my $meth = $extra{method} || 'POST'; | |
484 $s = Test::Nginx::HTTP2->new() if !defined $s; | |
1318
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
485 $csid = $s->new_stream({ body_more => $body_more, headers => [ |
1303 | 486 { name => ':method', value => $meth, mode => !!$meth }, |
487 { name => ':scheme', value => 'http', mode => 0 }, | |
488 { name => ':path', value => $uri, }, | |
489 { name => ':authority', value => 'localhost' }, | |
490 { name => 'content-type', value => 'application/grpc' }, | |
491 { name => 'te', value => 'trailers', mode => 2 }]}); | |
492 | |
493 if (!$extra{reuse}) { | |
1321
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
494 eval { |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
495 local $SIG{ALRM} = sub { die "timeout\n" }; |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
496 alarm(5); |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
497 |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
498 $client = $server->accept() or return; |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
499 |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
500 alarm(0); |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
501 }; |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
502 alarm(0); |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
503 if ($@) { |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
504 log_in("died: $@"); |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
505 return undef; |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
506 } |
351b95be742b
Tests: fixed grpc tests hang in accept() on internal nginx error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1319
diff
changeset
|
507 |
1303 | 508 log2c("(new connection $client)"); |
509 $n++; | |
510 | |
511 $client->sysread(my $buf, 24) == 24 or return; # preface | |
512 | |
513 $c = Test::Nginx::HTTP2->new(1, socket => $client, | |
514 pure => 1, preface => "") or return; | |
515 } | |
516 | |
517 my $frames = $c->read(all => [{ fin => 4 }]); | |
518 | |
519 if (!$extra{reuse}) { | |
520 $c->h2_settings(0); | |
521 $c->h2_settings(1); | |
522 } | |
523 | |
524 my ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
525 $sid = $frame->{sid}; | |
526 return $frames; | |
527 }; | |
528 $f->{data} = sub { | |
529 my ($body, %extra) = @_; | |
530 $s->h2_body($body, { %extra }); | |
531 return $c->read(all => [{ sid => $sid, | |
532 length => length($body) }]); | |
533 }; | |
534 $f->{data_len} = sub { | |
535 my ($body, $len) = @_; | |
536 $s->h2_body($body) if defined $body; | |
537 return $c->read(all => [{ sid => $sid, length => $len }]); | |
538 }; | |
539 $f->{update} = sub { | |
540 $c->h2_window(shift); | |
541 }; | |
542 $f->{update_sid} = sub { | |
543 $c->h2_window(shift, $sid); | |
544 }; | |
1370
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
545 $f->{settings} = sub { |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
546 $c->h2_settings(@_); |
23e407a72fe9
Tests: upstream keepalive with grpc pending frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1362
diff
changeset
|
547 }; |
1303 | 548 $f->{http_end} = sub { |
549 my (%extra) = @_; | |
550 $c->new_stream({ body_more => 1, %extra, headers => [ | |
551 { name => ':status', value => '200', | |
552 mode => $extra{mode} || 0 }, | |
553 { name => 'content-type', value => 'application/grpc', | |
554 mode => $extra{mode} || 1, huff => 1 }, | |
555 { name => 'x-connection', value => $n, | |
556 mode => 2, huff => 1 }, | |
557 ]}, $sid); | |
558 $c->h2_body('Hello world', { body_more => 1, | |
559 body_padding => $extra{body_padding} }); | |
560 $c->new_stream({ headers => [ | |
561 { name => 'grpc-status', value => '0', | |
562 mode => 2, huff => 1 }, | |
563 { name => 'grpc-message', value => '', | |
564 mode => 2, huff => 1 }, | |
565 ]}, $sid); | |
566 | |
567 return $s->read(all => [{ fin => 1 }]); | |
568 }; | |
1318
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
569 $f->{http_pres} = sub { |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
570 my (%extra) = @_; |
1319
3b30e97acdcb
Tests: made grpc preserve output test pass on win32 and Solaris.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1318
diff
changeset
|
571 $s->h2_settings(0, 0x4 => 8192); |
1318
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
572 $c->new_stream({ body_more => 1, %extra, headers => [ |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
573 { name => ':status', value => '200', |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
574 mode => $extra{mode} || 0 }, |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
575 { name => 'content-type', value => 'application/grpc', |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
576 mode => $extra{mode} || 1, huff => 1 }, |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
577 { name => 'x-connection', value => $n, |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
578 mode => 2, huff => 1 }, |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
579 ]}, $sid); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
580 for (1 .. 20) { |
1319
3b30e97acdcb
Tests: made grpc preserve output test pass on win32 and Solaris.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1318
diff
changeset
|
581 $c->h2_body(sprintf('Hello %02d', $_) x 128, { |
1318
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
582 body_more => 1, |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
583 body_padding => $extra{body_padding} }); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
584 $c->h2_ping("PING"); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
585 } |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
586 # reopen window |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
587 $s->h2_window(2**24); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
588 $s->h2_window(2**24, $csid); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
589 $c->new_stream({ headers => [ |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
590 { name => 'grpc-status', value => '0', |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
591 mode => 2, huff => 1 }, |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
592 { name => 'grpc-message', value => '', |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
593 mode => 2, huff => 1 }, |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
594 ]}, $sid); |
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
595 |
1319
3b30e97acdcb
Tests: made grpc preserve output test pass on win32 and Solaris.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1318
diff
changeset
|
596 return $s->read(all => [{ sid => $csid, fin => 1 }]); |
1318
6de2a27af2d3
Tests: grpc preserve output tests added (ticket #1519).
Sergey Kandaurov <pluknet@nginx.com>
parents:
1312
diff
changeset
|
597 }; |
1303 | 598 $f->{http_err} = sub { |
599 $c->new_stream({ headers => [ | |
600 { name => ':status', value => '200', mode => 0 }, | |
601 { name => 'content-type', value => 'application/grpc', | |
602 mode => 1, huff => 1 }, | |
603 { name => 'grpc-status', value => '12', | |
604 mode => 2, huff => 1 }, | |
605 { name => 'grpc-message', value => 'unknown service', | |
606 mode => 2, huff => 1 }, | |
607 ]}, $sid); | |
608 | |
609 return $s->read(all => [{ fin => 1 }]); | |
610 }; | |
611 $f->{continuation} = sub { | |
612 $c->new_stream({ continuation => 1, body_more => 1, headers => [ | |
613 { name => ':status', value => '200', mode => 0 }, | |
614 ]}, $sid); | |
615 $c->h2_continue($sid, { continuation => 1, headers => [ | |
616 { name => 'content-type', value => 'application/grpc', | |
617 mode => 1, huff => 1 }, | |
618 ]}); | |
619 $c->h2_continue($sid, { headers => [ | |
620 # an empty CONTINUATION frame is legitimate | |
621 ]}); | |
622 $c->h2_body('Hello world', { body_more => 1 }); | |
623 $c->new_stream({ continuation => 1, headers => [ | |
624 { name => 'grpc-status', value => '0', | |
625 mode => 2, huff => 1 }, | |
626 ]}, $sid); | |
627 $c->h2_continue($sid, { headers => [ | |
628 { name => 'grpc-message', value => '', | |
629 mode => 2, huff => 1 }, | |
630 ]}); | |
631 | |
632 return $s->read(all => [{ fin => 1 }]); | |
633 }; | |
634 $f->{field_len} = sub { | |
635 my ($len) = @_; | |
636 $c->new_stream({ continuation => [map {2**14} (0..$len/2**13)], | |
637 body_more => 1, headers => [ | |
638 { name => ':status', value => '200', mode => 0 }, | |
639 { name => 'content-type', value => 'application/grpc', | |
640 mode => 1, huff => 1 }, | |
641 { name => 'x' x $len, value => 'y' x $len, mode => 6 }, | |
642 ]}, $sid); | |
643 $c->h2_body('Hello world', { body_more => 1 }); | |
644 $c->new_stream({ headers => [ | |
645 { name => 'grpc-status', value => '0', | |
646 mode => 2, huff => 1 }, | |
647 { name => 'grpc-message', value => '', | |
648 mode => 2, huff => 1 }, | |
649 ]}, $sid); | |
650 | |
651 return $s->read(all => [{ fin => 1 }]); | |
652 }; | |
653 return $f; | |
654 } | |
655 | |
656 sub log2i { Test::Nginx::log_core('|| <<', @_); } | |
657 sub log2o { Test::Nginx::log_core('|| >>', @_); } | |
658 sub log2c { Test::Nginx::log_core('||', @_); } | |
659 | |
660 ############################################################################### |