# HG changeset patch # User Sergey Kandaurov # Date 1522937791 -10800 # Node ID 6de2a27af2d3c862f8621199de43c5e1c427c3c9 # Parent a05f377bf0cab506bb2d3997dcce475be8d60b0f Tests: grpc preserve output tests added (ticket #1519). diff --git a/grpc.t b/grpc.t --- a/grpc.t +++ b/grpc.t @@ -91,7 +91,7 @@ http { EOF -$t->try_run('no grpc')->plan(97); +$t->try_run('no grpc')->plan(100); ############################################################################### @@ -356,6 +356,21 @@ is($frame->{flags}, 1, 'flow control - r $f->{http_end}(); +# preserve output + +$f->{http_start}('/Preserve'); +$f->{data}('Hello'); +$frames = $f->{http_pres}(); +($frame) = grep { $_->{type} eq "HEADERS" } @$frames; +is($frame->{flags}, 4, 'preserve - HEADERS'); + +my @data = grep { $_->{type} eq "DATA" } @$frames; +$sum = eval join '+', map { $_->{length} } @data; +is($sum, 163840, 'preserve - DATA'); + +(undef, $frame) = grep { $_->{type} eq "HEADERS" } @$frames; +is($frame->{flags}, 5, 'preserve - trailers'); + # DATA padding $f->{http_start}('/SayPadding'); @@ -422,7 +437,7 @@ is($frame->{headers}{':method'}, 'HEAD', ############################################################################### sub grpc { - my ($server, $client, $f, $s, $c, $sid, $uri); + my ($server, $client, $f, $s, $c, $sid, $csid, $uri); my $n = 0; $server = IO::Socket::INET->new( @@ -439,7 +454,7 @@ sub grpc { my $body_more = 1 if $uri !~ /LongHeader/; my $meth = $extra{method} || 'POST'; $s = Test::Nginx::HTTP2->new() if !defined $s; - $s->new_stream({ body_more => $body_more, headers => [ + $csid = $s->new_stream({ body_more => $body_more, headers => [ { name => ':method', value => $meth, mode => !!$meth }, { name => ':scheme', value => 'http', mode => 0 }, { name => ':path', value => $uri, }, @@ -507,6 +522,34 @@ sub grpc { return $s->read(all => [{ fin => 1 }]); }; + $f->{http_pres} = sub { + my (%extra) = @_; + $c->new_stream({ body_more => 1, %extra, headers => [ + { name => ':status', value => '200', + mode => $extra{mode} || 0 }, + { name => 'content-type', value => 'application/grpc', + mode => $extra{mode} || 1, huff => 1 }, + { name => 'x-connection', value => $n, + mode => 2, huff => 1 }, + ]}, $sid); + for (1 .. 20) { + $c->h2_body(sprintf('Hello %02d', $_) x 1024, { + body_more => 1, + body_padding => $extra{body_padding} }); + $c->h2_ping("PING"); + } + # reopen window + $s->h2_window(2**24); + $s->h2_window(2**24, $csid); + $c->new_stream({ headers => [ + { name => 'grpc-status', value => '0', + mode => 2, huff => 1 }, + { name => 'grpc-message', value => '', + mode => 2, huff => 1 }, + ]}, $sid); + + return $s->read(all => [{ fin => 1 }]); + }; $f->{http_err} = sub { $c->new_stream({ headers => [ { name => ':status', value => '200', mode => 0 },