comparison h2.t @ 655:75ecd26b8831

Tests: HTTP/2 tests cleanup.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 20 Aug 2015 19:22:13 +0300
parents a64fe1054fb4
children b0342dbd9390
comparison
equal deleted inserted replaced
654:a64fe1054fb4 655:75ecd26b8831
30 eval { IO::Socket::SSL::SSL_VERIFY_NONE(); }; 30 eval { IO::Socket::SSL::SSL_VERIFY_NONE(); };
31 plan(skip_all => 'IO::Socket::SSL too old') if $@; 31 plan(skip_all => 'IO::Socket::SSL too old') if $@;
32 32
33 my $t = Test::Nginx->new()->has(qw/http http_ssl http_v2 proxy cache/) 33 my $t = Test::Nginx->new()->has(qw/http http_ssl http_v2 proxy cache/)
34 ->has(qw/limit_conn rewrite realip shmem/) 34 ->has(qw/limit_conn rewrite realip shmem/)
35 ->has_daemon('openssl')->plan(150); 35 ->has_daemon('openssl')->plan(152);
36 36
37 $t->write_file_expand('nginx.conf', <<'EOF'); 37 $t->write_file_expand('nginx.conf', <<'EOF');
38 38
39 %%TEST_GLOBALS%% 39 %%TEST_GLOBALS%%
40 40
219 is($frame->{length}, 4, 'WINDOW_UPDATE fixed length'); 219 is($frame->{length}, 4, 'WINDOW_UPDATE fixed length');
220 220
221 ($frame) = grep { $_->{type} eq 'SETTINGS' } @$frames; 221 ($frame) = grep { $_->{type} eq 'SETTINGS' } @$frames;
222 ok($frame, 'SETTINGS frame'); 222 ok($frame, 'SETTINGS frame');
223 is($frame->{flags}, 0, 'SETTINGS flags'); 223 is($frame->{flags}, 0, 'SETTINGS flags');
224 is($frame->{sid}, 0, 'SETTINGS stream');
224 225
225 h2_settings($sess, 1); 226 h2_settings($sess, 1);
226 h2_settings($sess, 0); 227 h2_settings($sess, 0);
227 228
228 $frames = h2_read($sess, all => [{ type => 'SETTINGS' }]); 229 $frames = h2_read($sess, all => [{ type => 'SETTINGS' }]);
238 239
239 ($frame) = grep { $_->{type} eq "PING" } @$frames; 240 ($frame) = grep { $_->{type} eq "PING" } @$frames;
240 ok($frame, 'PING frame'); 241 ok($frame, 'PING frame');
241 is($frame->{value}, 'SEE-THIS', 'PING payload'); 242 is($frame->{value}, 'SEE-THIS', 'PING payload');
242 is($frame->{flags}, 1, 'PING flags ack'); 243 is($frame->{flags}, 1, 'PING flags ack');
244 is($frame->{sid}, 0, 'PING stream');
243 245
244 # GET 246 # GET
245 247
246 my $sid = new_stream($sess); 248 my $sid = new_stream($sess);
247 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 249 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
1581 1583
1582 my $length = unpack_length($buf); 1584 my $length = unpack_length($buf);
1583 my $type = unpack('x3C', $buf); 1585 my $type = unpack('x3C', $buf);
1584 my $flags = unpack('x4C', $buf); 1586 my $flags = unpack('x4C', $buf);
1585 1587
1586 $buf = raw_read($s, $buf, $length + 9); 1588 my $stream = unpack "x5 B32", $buf;
1589 substr($stream, 0, 1) = 0;
1590 $stream = unpack("N", pack("B32", $stream));
1591
1592 $buf = raw_read($s, $buf, $length);
1587 last unless length $buf; 1593 last unless length $buf;
1594
1595 $buf = substr($buf, 9);
1588 1596
1589 my $frame = $cframe{$type}{value}($sess, $buf, $length); 1597 my $frame = $cframe{$type}{value}($sess, $buf, $length);
1590 $frame->{length} = $length; 1598 $frame->{length} = $length;
1591 $frame->{type} = $cframe{$type}{name}; 1599 $frame->{type} = $cframe{$type}{name};
1592 $frame->{flags} = $flags; 1600 $frame->{flags} = $flags;
1601 $frame->{sid} = $stream;
1593 push @got, $frame; 1602 push @got, $frame;
1594 1603
1595 $buf = substr($buf, $length + 9); 1604 $buf = substr($buf, $length);
1596 1605
1597 last unless test_fin($got[-1], $extra{all}); 1606 last unless test_fin($got[-1], $extra{all});
1598 }; 1607 };
1599 return \@got; 1608 return \@got;
1600 } 1609 }
1629 @{$all} = @test; 1638 @{$all} = @test;
1630 } 1639 }
1631 1640
1632 sub headers { 1641 sub headers {
1633 my ($ctx, $buf, $len) = @_; 1642 my ($ctx, $buf, $len) = @_;
1634 my %payload; 1643 return { headers => hunpack($ctx, $buf, $len) };
1635 my $skip = 9;
1636
1637 my $stream = unpack "x5 B32", $buf;
1638 substr($stream, 0, 1) = 0;
1639 $stream = unpack("N", pack("B32", $stream));
1640 $payload{sid} = $stream;
1641
1642 my $headers = substr($buf, $skip);
1643 $payload{headers} = hunpack($ctx, $headers, $len);
1644
1645
1646 return \%payload;
1647 } 1644 }
1648 1645
1649 sub data { 1646 sub data {
1650 my ($ctx, $buf, $len) = @_; 1647 my ($ctx, $buf, $len) = @_;
1651 my %frame; 1648 return { data => substr($buf, 0, $len) };
1652
1653 my $stream = unpack "x5 B32", $buf;
1654 substr($stream, 0, 1) = 0;
1655 $stream = unpack("N", pack("B32", $stream));
1656 $frame{sid} = $stream;
1657
1658 $frame{data} = substr($buf, 9, $len);
1659 return \%frame;
1660 } 1649 }
1661 1650
1662 sub settings { 1651 sub settings {
1663 my ($ctx, $buf, $len) = @_; 1652 my ($ctx, $buf, $len) = @_;
1664 my %payload; 1653 my %payload;
1665 my $skip = 9; 1654 my $skip = 0;
1666
1667 my $stream = unpack "x5 B32", $buf;
1668 substr($stream, 0, 1) = 0;
1669 $stream = unpack("N", pack("B32", $stream));
1670 $payload{sid} = $stream;
1671
1672 fail("stream identifier field is anything other than 0x0")
1673 if $stream;
1674 1655
1675 for (1 .. $len / 6) { 1656 for (1 .. $len / 6) {
1676 my $id = hex unpack "\@$skip n", $buf; $skip += 2; 1657 my $id = hex unpack "\@$skip n", $buf; $skip += 2;
1677 $payload{$id} = unpack "\@$skip N", $buf; $skip += 4; 1658 $payload{$id} = unpack "\@$skip N", $buf; $skip += 4;
1678 } 1659 }
1679 return \%payload; 1660 return \%payload;
1680 } 1661 }
1681 1662
1682 sub ping { 1663 sub ping {
1683 my ($ctx, $buf, $len) = @_; 1664 my ($ctx, $buf, $len) = @_;
1684 my %payload; 1665 return { value => unpack "a8", $buf };
1685 my $skip = 9;
1686
1687 $payload{value} = unpack "\@$skip a8", $buf;
1688 return \%payload;
1689 } 1666 }
1690 1667
1691 sub rst_stream { 1668 sub rst_stream {
1692 my ($ctx, $buf, $len) = @_; 1669 my ($ctx, $buf, $len) = @_;
1693 my %payload; 1670 return { code => unpack "N", $buf };
1694 my $skip = 9;
1695
1696 my $stream = unpack "x5 B32", $buf;
1697 substr($stream, 0, 1) = 0;
1698 $stream = unpack("N", pack("B32", $stream));
1699 $payload{sid} = $stream;
1700
1701 $payload{code} = unpack "\@$skip N", $buf;
1702 return \%payload;
1703 } 1671 }
1704 1672
1705 sub goaway { 1673 sub goaway {
1706 my ($ctx, $buf, $len) = @_; 1674 my ($ctx, $buf, $len) = @_;
1707 my %payload; 1675 my %payload;
1708 my $skip = 9; 1676
1709 1677 my $stream = unpack "B32", $buf;
1710 my $stream = unpack "x5 B32", $buf;
1711 substr($stream, 0, 1) = 0;
1712 $stream = unpack("N", pack("B32", $stream));
1713 $payload{sid} = $stream;
1714
1715 fail("stream identifier field is anything other than 0x0")
1716 if $stream;
1717
1718 $stream = unpack "\@$skip B32", $buf;
1719 substr($stream, 0, 1) = 0; 1678 substr($stream, 0, 1) = 0;
1720 $stream = unpack("N", pack("B32", $stream)); 1679 $stream = unpack("N", pack("B32", $stream));
1721 $payload{last_sid} = $stream; 1680 $payload{last_sid} = $stream;
1722 $skip += 4; 1681
1723 1682 $len -= 4;
1724 $len = $len - $skip; 1683 $payload{debug} = unpack "x4 H$len", $buf;
1725 $payload{debug} = unpack "\@$skip H$len", $buf;
1726 return \%payload; 1684 return \%payload;
1727 } 1685 }
1728 1686
1729 sub window_update { 1687 sub window_update {
1730 my ($ctx, $buf, $len) = @_; 1688 my ($ctx, $buf, $len) = @_;
1731 my %payload; 1689 my $value = unpack "B32", $buf;
1732 my $skip = 5;
1733
1734 my $stream = unpack "\@$skip B32", $buf; $skip += 4;
1735 substr($stream, 0, 1) = 0;
1736 $stream = unpack("N", pack("B32", $stream));
1737 $payload{sid} = $stream;
1738
1739 my $value = unpack "\@$skip B32", $buf;
1740 substr($value, 0, 1) = 0; 1690 substr($value, 0, 1) = 0;
1741 $payload{wdelta} = unpack("N", pack("B32", $value)); 1691 return { wdelta => unpack("N", pack("B32", $value)) };
1742 return \%payload;
1743 } 1692 }
1744 1693
1745 sub pack_length { 1694 sub pack_length {
1746 pack 'c3', unpack 'xc3', pack 'N', $_[0]; 1695 pack 'c3', unpack 'xc3', pack 'N', $_[0];
1747 } 1696 }