Tests: fixed HTTP/2 server push expectations, adjusted TODO.
diff --git a/h2_server_push.t b/h2_server_push.t
index 891f23d..4dd0b32 100644
--- a/h2_server_push.t
+++ b/h2_server_push.t
@@ -138,6 +138,10 @@
###############################################################################
+# 6.6. PUSH_PROMISE
+# PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that
+# is in either the "open" or "half-closed (remote)" state.
+
# preload & format
my $s = Test::Nginx::HTTP2->new();
@@ -161,33 +165,33 @@
$s = Test::Nginx::HTTP2->new();
$sid = $s->new_stream({ path => '/preload2' });
-$frames = $s->read(all => [{ sid => 8, fin => 1 }], wait => 0.5);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 4, 'preload 2');
$s = Test::Nginx::HTTP2->new();
$sid = $s->new_stream({ path => '/preload/many' });
-$frames = $s->read(all => [{ sid => 8, fin => 1 }], wait => 0.5);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 3, 'preload many');
# preload proxy
$s = Test::Nginx::HTTP2->new();
$sid = $s->new_stream({ path => '/preload/proxy' });
-$frames = $s->read(all => [{ sid => 8, fin => 1 }], wait => 0.5);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 2, 'preload proxy');
# both h2_push & preload
$s = Test::Nginx::HTTP2->new();
$sid = $s->new_stream({ path => '/both' });
-$frames = $s->read(all => [{ sid => 8, fin => 1 }], wait => 0.5);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 2, 'h2_push and preload');
# h2_push
$s = Test::Nginx::HTTP2->new();
$sid = $s->new_stream({ path => '/expl' });
-$frames = $s->read(all => [{ sid => 1, fin => 1 }, { sid => 2, fin => 1 }]);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
ok($frame, 'h2_push only');
@@ -196,7 +200,7 @@
$s = Test::Nginx::HTTP2->new();
$sid = $s->new_stream({ path => '/expl/off' });
-$frames = $s->read(all => [{ type => 'PUSH_PROMISE' }], wait => 0.2);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
ok(!$frame, 'h2_push off');
@@ -205,22 +209,22 @@
$s = Test::Nginx::HTTP2->new();
$sid = $s->new_stream({ path => '/arg?push=/push' });
-$frames = $s->read(all => [{ type => 'PUSH_PROMISE' }], wait => 0.2);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
ok($frame, 'h2_push variable');
$sid = $s->new_stream({ path => '/arg?push=' });
-$frames = $s->read(all => [{ type => 'PUSH_PROMISE' }], wait => 0.2);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
ok(!$frame, 'h2_push variable empty');
$sid = $s->new_stream({ path => '/arg?push=off' });
-$frames = $s->read(all => [{ type => 'PUSH_PROMISE' }], wait => 0.2);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
ok(!$frame, 'h2_push variable off');
$sid = $s->new_stream({ path => '/arg?push=foo' });
-$frames = $s->read(all => [{ type => 'PUSH_PROMISE' }], wait => 0.2);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
ok(!$frame, 'h2_push variable relative path');
@@ -229,14 +233,14 @@
$s = Test::Nginx::HTTP2->new();
$s->h2_settings(0, 0x2 => 0);
$sid = $s->new_stream({ path => '/expl' });
-$frames = $s->read(all => [{ type => 'PUSH_PROMISE' }], wait => 0.2);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
ok(!$frame, 'push setting disabled');
$s->h2_settings(0, 0x2 => 1);
$sid = $s->new_stream({ path => '/expl' });
-$frames = $s->read(all => [{ sid => $sid, fin => 1 }, { sid => 2, fin => 1 }]);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
ok($frame, 'push setting enabled');
@@ -252,27 +256,25 @@
$s = Test::Nginx::HTTP2->new();
$sid = $s->new_stream({ path => '/expl' });
-$frames = $s->read(all => [
- { sid => 1, fin => 1 },
- { sid => 2, fin => 1 },
- { sid => 4, fin => 1 }]);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 2, 'max pushes default');
$s = Test::Nginx::HTTP2->new();
$s->h2_settings(0, 0x3 => 1);
$sid = $s->new_stream({ path => '/expl' });
-$frames = $s->read(all => [{ sid => 1, fin => 1 }, { sid => 2, fin => 1 }]);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 1, 'max pushes limited');
$s = Test::Nginx::HTTP2->new();
$s->h2_settings(0, 0x3 => 0);
$sid = $s->new_stream({ path => '/expl' });
-$frames = $s->read(all => [{ type => 'PUSH_PROMISE' }], wait => 0.2);
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 0, 'max pushes disabled');
TODO: {
-local $TODO = 'not yet' if $t->read_file('nginx.conf') =~ /aio on/
- or $t->read_file('nginx.conf') =~ /aio threads/;
+todo_skip 'long tests with aio', 6 unless $ENV{TEST_NGINX_UNSAFE}
+ or $t->read_file('nginx.conf') !~ /aio (on|threads)/;
+local $TODO = 'not yet' if $t->read_file('nginx.conf') =~ /aio (on|threads)/;
# server push flow control & rst
@@ -304,7 +306,7 @@
$s->h2_window(2**16);
$frames = $s->read(all => [{ sid => 2, length => 1 }]);
-push @$frames, @{ $s->read(all => [{ sid => 4, fin => 1 }], wait => 0.5) };
+push @$frames, @{ $s->read(all => [{ sid => 4, fin => 1 }], wait => 0.2) };
($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == 2 } @$frames;
is($frame->{length}, 1, 'pushed response flow control');
@@ -316,8 +318,9 @@
ok(!$frame, 'rst pushed stream');
TODO: {
-local $TODO = 'not yet' if $t->read_file('nginx.conf') =~ /aio on/
- or $t->read_file('nginx.conf') =~ /aio threads/;
+todo_skip 'long tests with aio', 2 unless $ENV{TEST_NGINX_UNSAFE}
+ or $t->read_file('nginx.conf') !~ /aio (on|threads)/;
+local $TODO = 'not yet' if $t->read_file('nginx.conf') =~ /aio (on|threads)/;
# priority
@@ -359,9 +362,7 @@
{ name => ':scheme', value => 'http', mode => 0 },
{ name => ':path', value => '/', mode => 0 },
{ name => ':authority', value => 'max_pushes', mode => 1 }]});
-$frames = $s->read(all => [{ sid => $sid, fin => 1 },
- { sid => 2, fin => 1 }, { sid => 4, fin => 1 }]);
-push @$frames, @{ $s->read(all => [{ sid => 6, fin => 1 }], wait => 0.2) };
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 2, 'http2 max pushes lim');
$s = Test::Nginx::HTTP2->new(port(8082));
@@ -371,8 +372,7 @@
{ name => ':scheme', value => 'http', mode => 0 },
{ name => ':path', value => '/', mode => 0 },
{ name => ':authority', value => 'max_pushes', mode => 1 }]});
-$frames = $s->read(all => [{ sid => $sid, fin => 1 }, { sid => 2, fin => 1 }]);
-push @$frames, @{ $s->read(all => [{ sid => 4, fin => 1 }], wait => 0.2) };
+$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 1, 'http2 max pushes 2');
# missing request header ':authority'