Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Side by Side Diff: net/spdy/spdy_framer_test.cc

Issue 349293010: Deprecate HTTP/2 PAD_HIGH field and enforce max padding size to 256 octets. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nullptr => NULL. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_protocol.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 #include <iostream> 6 #include <iostream>
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 1558 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 { 1569 {
1570 const char kDescription[] = "'hello' data frame with more padding, no FIN"; 1570 const char kDescription[] = "'hello' data frame with more padding, no FIN";
1571 const unsigned char kV3FrameData[] = { // Also applies for V2. 1571 const unsigned char kV3FrameData[] = { // Also applies for V2.
1572 0x00, 0x00, 0x00, 0x01, 1572 0x00, 0x00, 0x00, 0x01,
1573 0x00, 0x00, 0x00, 0x05, 1573 0x00, 0x00, 0x00, 0x05,
1574 'h', 'e', 'l', 'l', 1574 'h', 'e', 'l', 'l',
1575 'o' 1575 'o'
1576 }; 1576 };
1577 1577
1578 const unsigned char kV4FrameData[] = { 1578 const unsigned char kV4FrameData[] = {
1579 0x01, 0x0b, 0x00, 0x18, // Length = 267. PAD_HIGH and PAD_LOW set. 1579 0x00, 0xfd, 0x00, 0x08, // Length = 253. PADDED set.
1580 0x00, 0x00, 0x00, 0x01, 1580 0x00, 0x00, 0x00, 0x01,
1581 0x01, 0x04, // Pad Low and Pad High fields. 1581 0xf7, // Pad length field.
1582 'h', 'e', 'l', 'l', // Data 1582 'h', 'e', 'l', 'l', // Data
1583 'o', 1583 'o',
1584 // Padding of 260 zeros (so both PAD_HIGH and PAD_LOW fields are used). 1584 // Padding of 247 zeros.
1585 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1585 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1586 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1586 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1587 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1587 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1588 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1589 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1588 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1590 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1589 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1591 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1590 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1592 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1591 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1593 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1592 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1594 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1593 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1595 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1594 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1596 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1595 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1597 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1596 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1598 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1597 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1599 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1598 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1600 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1599 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1601 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1600 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1602 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1601 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1603 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1602 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1604 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 1603 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
1605 }; 1604 };
1606 const char bytes[] = "hello"; 1605 const char bytes[] = "hello";
1607 1606
1608 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); 1607 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes)));
1609 // 260 zeros and the pad low/high fields make the overall padding to be 262 1608 // 247 zeros and the pad length field make the overall padding to be 248
1610 // bytes. 1609 // bytes.
1611 data_ir.set_padding_len(262); 1610 data_ir.set_padding_len(248);
1612 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1611 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1613 if (IsSpdy4()) { 1612 if (IsSpdy4()) {
1614 CompareFrame( 1613 CompareFrame(
1615 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1614 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1616 } else { 1615 } else {
1617 CompareFrame( 1616 CompareFrame(
1618 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1617 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1619 } 1618 }
1620 1619
1621 frame.reset(framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir)); 1620 frame.reset(framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir));
1622 CompareCharArraysWithHexError( 1621 CompareCharArraysWithHexError(
1623 kDescription, 1622 kDescription,
1624 reinterpret_cast<const unsigned char*>(frame->data()), 1623 reinterpret_cast<const unsigned char*>(frame->data()),
1625 framer.GetDataFrameMinimumSize(), 1624 framer.GetDataFrameMinimumSize(),
1626 IsSpdy4() ? kV4FrameData : kV3FrameData, 1625 IsSpdy4() ? kV4FrameData : kV3FrameData,
1627 framer.GetDataFrameMinimumSize()); 1626 framer.GetDataFrameMinimumSize());
1628 } 1627 }
1629 1628
1630 { 1629 {
1631 const char kDescription[] = "'hello' data frame with few padding, no FIN"; 1630 const char kDescription[] = "'hello' data frame with few padding, no FIN";
1632 const unsigned char kV3FrameData[] = { // Also applies for V2. 1631 const unsigned char kV3FrameData[] = { // Also applies for V2.
1633 0x00, 0x00, 0x00, 0x01, 1632 0x00, 0x00, 0x00, 0x01,
1634 0x00, 0x00, 0x00, 0x05, 1633 0x00, 0x00, 0x00, 0x05,
1635 'h', 'e', 'l', 'l', 1634 'h', 'e', 'l', 'l',
1636 'o' 1635 'o'
1637 }; 1636 };
1638 1637
1639 const unsigned char kV4FrameData[] = { 1638 const unsigned char kV4FrameData[] = {
1640 0x00, 0x0d, 0x00, 0x08, // Length = 13. PAD_LOW set. 1639 0x00, 0x0d, 0x00, 0x08, // Length = 13. PADDED set.
1641 0x00, 0x00, 0x00, 0x01, 1640 0x00, 0x00, 0x00, 0x01,
1642 0x07, // Pad Low field. 1641 0x07, // Pad length field.
1643 'h', 'e', 'l', 'l', // Data 1642 'h', 'e', 'l', 'l', // Data
1644 'o', 1643 'o',
1645 '0', '0', '0', '0', // Padding 1644 '0', '0', '0', '0', // Padding
1646 '0', '0', '0' 1645 '0', '0', '0'
1647 }; 1646 };
1648 const char bytes[] = "hello"; 1647 const char bytes[] = "hello";
1649 1648
1650 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); 1649 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes)));
1651 // 7 zeros and the pad low field make the overall padding to be 8 bytes. 1650 // 7 zeros and the pad length field make the overall padding to be 8 bytes.
1652 data_ir.set_padding_len(8); 1651 data_ir.set_padding_len(8);
1653 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1652 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1654 if (IsSpdy4()) { 1653 if (IsSpdy4()) {
1655 CompareFrame( 1654 CompareFrame(
1656 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1655 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1657 } else { 1656 } else {
1658 CompareFrame( 1657 CompareFrame(
1659 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1658 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1660 } 1659 }
1661 } 1660 }
1662 1661
1663 { 1662 {
1664 const char kDescription[] = 1663 const char kDescription[] =
1665 "'hello' data frame with 1 byte padding, no FIN"; 1664 "'hello' data frame with 1 byte padding, no FIN";
1666 const unsigned char kV3FrameData[] = { // Also applies for V2. 1665 const unsigned char kV3FrameData[] = { // Also applies for V2.
1667 0x00, 0x00, 0x00, 0x01, 1666 0x00, 0x00, 0x00, 0x01,
1668 0x00, 0x00, 0x00, 0x05, 1667 0x00, 0x00, 0x00, 0x05,
1669 'h', 'e', 'l', 'l', 1668 'h', 'e', 'l', 'l',
1670 'o' 1669 'o'
1671 }; 1670 };
1672 1671
1673 const unsigned char kV4FrameData[] = { 1672 const unsigned char kV4FrameData[] = {
1674 0x00, 0x06, 0x00, 0x08, // Length = 6. PAD_LOW set. 1673 0x00, 0x06, 0x00, 0x08, // Length = 6. PADDED set.
1675 0x00, 0x00, 0x00, 0x01, 1674 0x00, 0x00, 0x00, 0x01,
1676 0x00, // Pad Low field. 1675 0x00, // Pad length field.
1677 'h', 'e', 'l', 'l', // Data 1676 'h', 'e', 'l', 'l', // Data
1678 'o', 1677 'o',
1679 }; 1678 };
1680 const char bytes[] = "hello"; 1679 const char bytes[] = "hello";
1681 1680
1682 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); 1681 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes)));
1683 // The pad low field itself is used for the 1-byte padding and no padding 1682 // The pad length field itself is used for the 1-byte padding and no padding
1684 // payload is needed. 1683 // payload is needed.
1685 data_ir.set_padding_len(1); 1684 data_ir.set_padding_len(1);
1686 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1685 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1687 if (IsSpdy4()) { 1686 if (IsSpdy4()) {
1688 CompareFrame( 1687 CompareFrame(
1689 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1688 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1690 } else { 1689 } else {
1691 CompareFrame( 1690 CompareFrame(
1692 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1691 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1693 } 1692 }
(...skipping 1875 matching lines...) Expand 10 before | Expand all | Expand 10 after
3569 3568
3570 TestSpdyVisitor visitor(spdy_version_); 3569 TestSpdyVisitor visitor(spdy_version_);
3571 visitor.use_compression_ = false; 3570 visitor.use_compression_ = false;
3572 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); 3571 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData));
3573 3572
3574 EXPECT_EQ(0, visitor.error_count_); 3573 EXPECT_EQ(0, visitor.error_count_);
3575 EXPECT_EQ(0, visitor.setting_count_); 3574 EXPECT_EQ(0, visitor.setting_count_);
3576 EXPECT_EQ(1, visitor.settings_ack_received_); 3575 EXPECT_EQ(1, visitor.settings_ack_received_);
3577 } 3576 }
3578 3577
3579
3580 TEST_P(SpdyFramerTest, ProcessDataFrameWithPadding) { 3578 TEST_P(SpdyFramerTest, ProcessDataFrameWithPadding) {
3581 if (spdy_version_ <= SPDY3) { 3579 if (spdy_version_ <= SPDY3) {
3582 return; 3580 return;
3583 } 3581 }
3584 3582
3585 const int kPaddingLen = 512; // So we get two bytes for padding length field. 3583 const int kPaddingLen = 119;
3586 const char data_payload[] = "hello"; 3584 const char data_payload[] = "hello";
3587 3585
3588 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3586 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3589 SpdyFramer framer(spdy_version_); 3587 SpdyFramer framer(spdy_version_);
3590 framer.set_visitor(&visitor); 3588 framer.set_visitor(&visitor);
3591 3589
3592 SpdyDataIR data_ir(1, StringPiece(data_payload, strlen(data_payload))); 3590 SpdyDataIR data_ir(1, StringPiece(data_payload, strlen(data_payload)));
3593 data_ir.set_padding_len(kPaddingLen); 3591 data_ir.set_padding_len(kPaddingLen);
3594 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 3592 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
3595 ASSERT_TRUE(frame.get() != NULL); 3593 ASSERT_TRUE(frame.get() != NULL);
3596 3594
3597 int bytes_consumed = 0; 3595 int bytes_consumed = 0;
3598 3596
3599 // Send the frame header. 3597 // Send the frame header.
3600 EXPECT_CALL(visitor, OnDataFrameHeader(1, 3598 EXPECT_CALL(visitor, OnDataFrameHeader(1,
3601 kPaddingLen + strlen(data_payload), 3599 kPaddingLen + strlen(data_payload),
3602 false)); 3600 false));
3603 CHECK_EQ(8u, framer.ProcessInput(frame->data(), 8)); 3601 CHECK_EQ(8u, framer.ProcessInput(frame->data(), 8));
3604 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH); 3602 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH);
3605 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3603 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3606 bytes_consumed += 8; 3604 bytes_consumed += 8;
3607 3605
3608 // Send the first byte of the padding length field. 3606 // Send the padding length field.
3609 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1));
3610 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH);
3611 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3612 bytes_consumed += 1;
3613
3614 // Send the second byte of the padding length field.
3615 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); 3607 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1));
3616 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); 3608 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME);
3617 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3609 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3618 bytes_consumed += 1; 3610 bytes_consumed += 1;
3619 3611
3620 // Send the first two bytes of the data payload. 3612 // Send the first two bytes of the data payload, i.e., "he".
3621 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false)); 3613 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false));
3622 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2)); 3614 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2));
3623 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); 3615 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME);
3624 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3616 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3625 bytes_consumed += 2; 3617 bytes_consumed += 2;
3626 3618
3627 // Send the rest three bytes of the data payload. 3619 // Send the rest three bytes of the data payload, i.e., "llo".
3628 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3, false)); 3620 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3, false));
3629 CHECK_EQ(3u, framer.ProcessInput(frame->data() + bytes_consumed, 3)); 3621 CHECK_EQ(3u, framer.ProcessInput(frame->data() + bytes_consumed, 3));
3630 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); 3622 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING);
3631 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3623 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3632 bytes_consumed += 3; 3624 bytes_consumed += 3;
3633 3625
3634 // Send the first 100 bytes of the padding payload. 3626 // Send the first 100 bytes of the padding payload.
3635 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 100, false)); 3627 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 100, false));
3636 CHECK_EQ(100u, framer.ProcessInput(frame->data() + bytes_consumed, 100)); 3628 CHECK_EQ(100u, framer.ProcessInput(frame->data() + bytes_consumed, 100));
3637 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); 3629 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING);
3638 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3630 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3639 bytes_consumed += 100; 3631 bytes_consumed += 100;
3640 3632
3641 // Send rest of the padding payload. 3633 // Send rest of the padding payload.
3642 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 410, false)); 3634 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 18, false));
3643 CHECK_EQ(410u, framer.ProcessInput(frame->data() + bytes_consumed, 410)); 3635 CHECK_EQ(18u, framer.ProcessInput(frame->data() + bytes_consumed, 18));
3644 CHECK_EQ(framer.state(), SpdyFramer::SPDY_RESET); 3636 CHECK_EQ(framer.state(), SpdyFramer::SPDY_RESET);
3645 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3637 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3646 } 3638 }
3647 3639
3648 TEST_P(SpdyFramerTest, ReadWindowUpdate) { 3640 TEST_P(SpdyFramerTest, ReadWindowUpdate) {
3649 SpdyFramer framer(spdy_version_); 3641 SpdyFramer framer(spdy_version_);
3650 scoped_ptr<SpdyFrame> control_frame( 3642 scoped_ptr<SpdyFrame> control_frame(
3651 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); 3643 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2)));
3652 TestSpdyVisitor visitor(spdy_version_); 3644 TestSpdyVisitor visitor(spdy_version_);
3653 visitor.SimulateInFramer( 3645 visitor.SimulateInFramer(
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
3772 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); 3764 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_);
3773 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 3765 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_));
3774 } 3766 }
3775 3767
3776 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { 3768 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) {
3777 if (spdy_version_ <= SPDY3) { 3769 if (spdy_version_ <= SPDY3) {
3778 return; 3770 return;
3779 } 3771 }
3780 3772
3781 const unsigned char kInput[] = { 3773 const unsigned char kInput[] = {
3782 0x00, 0x14, 0x01, 0x08, // HEADERS: PAD_LOW 3774 0x00, 0x14, 0x01, 0x08, // HEADERS: PADDED
3783 0x00, 0x00, 0x00, 0x01, // Stream 1 3775 0x00, 0x00, 0x00, 0x01, // Stream 1
3784 0x03, // Padding of 3. 3776 0x03, // Padding of 3.
3785 0x00, 0x06, 0x63, 0x6f, 3777 0x00, 0x06, 0x63, 0x6f,
3786 0x6f, 0x6b, 0x69, 0x65, 3778 0x6f, 0x6b, 0x69, 0x65,
3787 0x07, 0x66, 0x6f, 0x6f, 3779 0x07, 0x66, 0x6f, 0x6f,
3788 0x3d, 0x62, 0x61, 0x72, 3780 0x3d, 0x62, 0x61, 0x72,
3789 0x00, 0x00, 0x00, 3781 0x00, 0x00, 0x00,
3790 3782
3791 0x00, 0x14, 0x09, 0x00, // CONTINUATION 3783 0x00, 0x14, 0x09, 0x00, // CONTINUATION
3792 0x00, 0x00, 0x00, 0x01, // Stream 1 3784 0x00, 0x00, 0x00, 0x01, // Stream 1
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
3864 Pair("cookie", "foo=bar; baz=bing; "), 3856 Pair("cookie", "foo=bar; baz=bing; "),
3865 Pair("name", "value"))); 3857 Pair("name", "value")));
3866 } 3858 }
3867 3859
3868 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { 3860 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) {
3869 if (spdy_version_ <= SPDY3) { 3861 if (spdy_version_ <= SPDY3) {
3870 return; 3862 return;
3871 } 3863 }
3872 3864
3873 const unsigned char kInput[] = { 3865 const unsigned char kInput[] = {
3874 0x00, 0x18, 0x05, 0x18, // PUSH_PROMISE: PAD_LOW & PAD_HIGH 3866 0x00, 0x17, 0x05, 0x08, // PUSH_PROMISE: PADDED
3875 0x00, 0x00, 0x00, 0x01, // Stream 1 3867 0x00, 0x00, 0x00, 0x01, // Stream 1
3876 0x00, 0x00, 0x00, 0x2A, // Promised stream 42 3868 0x00, 0x00, 0x00, 0x2A, // Promised stream 42
3877 0x00, 0x02, // Padding of 2. 3869 0x02, // Padding of 2.
3878 0x00, 0x06, 0x63, 0x6f, 3870 0x00, 0x06, 0x63, 0x6f,
3879 0x6f, 0x6b, 0x69, 0x65, 3871 0x6f, 0x6b, 0x69, 0x65,
3880 0x07, 0x66, 0x6f, 0x6f, 3872 0x07, 0x66, 0x6f, 0x6f,
3881 0x3d, 0x62, 0x61, 0x72, 3873 0x3d, 0x62, 0x61, 0x72,
3882 0x00, 0x00, 3874 0x00, 0x00,
3883 3875
3884 0x00, 0x14, 0x09, 0x00, // CONTINUATION 3876 0x00, 0x14, 0x09, 0x00, // CONTINUATION
3885 0x00, 0x00, 0x00, 0x01, // Stream 1 3877 0x00, 0x00, 0x00, 0x01, // Stream 1
3886 0x00, 0x06, 0x63, 0x6f, 3878 0x00, 0x06, 0x63, 0x6f,
3887 0x6f, 0x6b, 0x69, 0x65, 3879 0x6f, 0x6b, 0x69, 0x65,
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
4374 } 4366 }
4375 } 4367 }
4376 } 4368 }
4377 4369
4378 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { 4370 TEST_P(SpdyFramerTest, DataFrameFlagsV4) {
4379 if (spdy_version_ <= SPDY3) { 4371 if (spdy_version_ <= SPDY3) {
4380 return; 4372 return;
4381 } 4373 }
4382 4374
4383 uint8 valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | 4375 uint8 valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT |
4384 DATA_FLAG_PAD_LOW | DATA_FLAG_PAD_HIGH; 4376 DATA_FLAG_PADDED;
4385 4377
4386 for (int flags = 0; flags < 256; ++flags) { 4378 for (int flags = 0; flags < 256; ++flags) {
4387 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4379 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4388 4380
4389 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4381 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4390 SpdyFramer framer(spdy_version_); 4382 SpdyFramer framer(spdy_version_);
4391 framer.set_visitor(&visitor); 4383 framer.set_visitor(&visitor);
4392 4384
4393 SpdyDataIR data_ir(1, StringPiece("hello", 5)); 4385 SpdyDataIR data_ir(1, StringPiece("hello", 5));
4394 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 4386 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
4395 SetFrameFlags(frame.get(), flags, spdy_version_); 4387 SetFrameFlags(frame.get(), flags, spdy_version_);
4396 4388
4397 if (flags & ~valid_data_flags) { 4389 if (flags & ~valid_data_flags) {
4398 EXPECT_CALL(visitor, OnError(_)); 4390 EXPECT_CALL(visitor, OnError(_));
4399 } else { 4391 } else {
4400 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); 4392 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
4401 if ((flags & DATA_FLAG_PAD_LOW) || (flags & DATA_FLAG_PAD_HIGH)) { 4393 if (flags & DATA_FLAG_PADDED) {
4402 // Expect Error since we don't set pad_high and pad_low in payload. 4394 // Expect Error since we don't set padded in payload.
4403 EXPECT_CALL(visitor, OnError(_)); 4395 EXPECT_CALL(visitor, OnError(_));
4404 } else { 4396 } else {
4405 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); 4397 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false));
4406 if (flags & DATA_FLAG_FIN) { 4398 if (flags & DATA_FLAG_FIN) {
4407 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); 4399 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true));
4408 } 4400 }
4409 } 4401 }
4410 } 4402 }
4411 4403
4412 framer.ProcessInput(frame->data(), frame->size()); 4404 framer.ProcessInput(frame->data(), frame->size());
4413 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PAD_LOW) || 4405 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) {
4414 (flags & DATA_FLAG_PAD_HIGH)) {
4415 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4406 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4416 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, 4407 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS,
4417 framer.error_code()) 4408 framer.error_code())
4418 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4409 << SpdyFramer::ErrorCodeToString(framer.error_code());
4419 } else { 4410 } else {
4420 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 4411 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
4421 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4412 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4422 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4413 << SpdyFramer::ErrorCodeToString(framer.error_code());
4423 } 4414 }
4424 } 4415 }
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
4679 if (IsSpdy4() && (flags & HEADERS_FLAG_PRIORITY)) { 4670 if (IsSpdy4() && (flags & HEADERS_FLAG_PRIORITY)) {
4680 headers_ir.set_priority(3); 4671 headers_ir.set_priority(3);
4681 headers_ir.set_has_priority(true); 4672 headers_ir.set_has_priority(true);
4682 } 4673 }
4683 headers_ir.SetHeader("foo", "bar"); 4674 headers_ir.SetHeader("foo", "bar");
4684 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 4675 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir));
4685 int set_flags = flags; 4676 int set_flags = flags;
4686 if (IsSpdy4()) { 4677 if (IsSpdy4()) {
4687 // TODO(jgraettinger): Add padding to SpdyHeadersIR, 4678 // TODO(jgraettinger): Add padding to SpdyHeadersIR,
4688 // and implement framing. 4679 // and implement framing.
4689 set_flags &= ~HEADERS_FLAG_PAD_LOW; 4680 set_flags &= ~HEADERS_FLAG_PADDED;
4690 set_flags &= ~HEADERS_FLAG_PAD_HIGH;
4691 } 4681 }
4692 SetFrameFlags(frame.get(), set_flags, spdy_version_); 4682 SetFrameFlags(frame.get(), set_flags, spdy_version_);
4693 4683
4694 if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) { 4684 if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) {
4695 EXPECT_CALL(visitor, OnError(_)); 4685 EXPECT_CALL(visitor, OnError(_));
4696 } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | 4686 } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN |
4697 HEADERS_FLAG_END_HEADERS | 4687 HEADERS_FLAG_END_HEADERS |
4698 HEADERS_FLAG_END_SEGMENT | 4688 HEADERS_FLAG_END_SEGMENT |
4699 HEADERS_FLAG_PAD_LOW | 4689 HEADERS_FLAG_PADDED |
4700 HEADERS_FLAG_PAD_HIGH |
4701 HEADERS_FLAG_PRIORITY)) { 4690 HEADERS_FLAG_PRIORITY)) {
4702 EXPECT_CALL(visitor, OnError(_)); 4691 EXPECT_CALL(visitor, OnError(_));
4703 } else { 4692 } else {
4704 if (spdy_version_ > SPDY3 && flags & HEADERS_FLAG_PRIORITY) { 4693 if (spdy_version_ > SPDY3 && flags & HEADERS_FLAG_PRIORITY) {
4705 EXPECT_CALL(visitor, OnSynStream(57, // stream id 4694 EXPECT_CALL(visitor, OnSynStream(57, // stream id
4706 0, // associated stream id 4695 0, // associated stream id
4707 3, // priority 4696 3, // priority
4708 flags & CONTROL_FLAG_FIN, 4697 flags & CONTROL_FLAG_FIN,
4709 false)); // unidirectional 4698 false)); // unidirectional
4710 } else { 4699 } else {
(...skipping 15 matching lines...) Expand all
4726 4715
4727 framer.ProcessInput(frame->data(), frame->size()); 4716 framer.ProcessInput(frame->data(), frame->size());
4728 if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) { 4717 if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) {
4729 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4718 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4730 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4719 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4731 framer.error_code()) 4720 framer.error_code())
4732 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4721 << SpdyFramer::ErrorCodeToString(framer.error_code());
4733 } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | 4722 } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN |
4734 HEADERS_FLAG_END_HEADERS | 4723 HEADERS_FLAG_END_HEADERS |
4735 HEADERS_FLAG_END_SEGMENT | 4724 HEADERS_FLAG_END_SEGMENT |
4736 HEADERS_FLAG_PAD_LOW | 4725 HEADERS_FLAG_PADDED |
4737 HEADERS_FLAG_PAD_HIGH |
4738 HEADERS_FLAG_PRIORITY)) { 4726 HEADERS_FLAG_PRIORITY)) {
4739 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4727 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4740 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4728 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4741 framer.error_code()) 4729 framer.error_code())
4742 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4730 << SpdyFramer::ErrorCodeToString(framer.error_code());
4743 } else if (IsSpdy4() && ~(flags & HEADERS_FLAG_END_HEADERS)) { 4731 } else if (IsSpdy4() && ~(flags & HEADERS_FLAG_END_HEADERS)) {
4744 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 4732 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
4745 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4733 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4746 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4734 << SpdyFramer::ErrorCodeToString(framer.error_code());
4747 } else { 4735 } else {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
4834 framer.set_debug_visitor(&debug_visitor); 4822 framer.set_debug_visitor(&debug_visitor);
4835 4823
4836 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, PUSH_PROMISE, _, _)); 4824 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, PUSH_PROMISE, _, _));
4837 4825
4838 SpdyPushPromiseIR push_promise(42, 57); 4826 SpdyPushPromiseIR push_promise(42, 57);
4839 push_promise.SetHeader("foo", "bar"); 4827 push_promise.SetHeader("foo", "bar");
4840 scoped_ptr<SpdySerializedFrame> frame( 4828 scoped_ptr<SpdySerializedFrame> frame(
4841 framer.SerializePushPromise(push_promise)); 4829 framer.SerializePushPromise(push_promise));
4842 // TODO(jgraettinger): Add padding to SpdyPushPromiseIR, 4830 // TODO(jgraettinger): Add padding to SpdyPushPromiseIR,
4843 // and implement framing. 4831 // and implement framing.
4844 int set_flags = flags & ~HEADERS_FLAG_PAD_LOW & ~HEADERS_FLAG_PAD_HIGH; 4832 int set_flags = flags & ~HEADERS_FLAG_PADDED;
4845 SetFrameFlags(frame.get(), set_flags, spdy_version_); 4833 SetFrameFlags(frame.get(), set_flags, spdy_version_);
4846 4834
4847 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | 4835 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) {
4848 HEADERS_FLAG_PAD_LOW |
4849 HEADERS_FLAG_PAD_HIGH)) {
4850 EXPECT_CALL(visitor, OnError(_)); 4836 EXPECT_CALL(visitor, OnError(_));
4851 } else { 4837 } else {
4852 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, PUSH_PROMISE, _)); 4838 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, PUSH_PROMISE, _));
4853 EXPECT_CALL(visitor, OnPushPromise(42, 57, 4839 EXPECT_CALL(visitor, OnPushPromise(42, 57,
4854 flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE)); 4840 flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE));
4855 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) 4841 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _))
4856 .WillRepeatedly(testing::Return(true)); 4842 .WillRepeatedly(testing::Return(true));
4857 } 4843 }
4858 4844
4859 framer.ProcessInput(frame->data(), frame->size()); 4845 framer.ProcessInput(frame->data(), frame->size());
4860 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | 4846 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) {
4861 HEADERS_FLAG_PAD_LOW |
4862 HEADERS_FLAG_PAD_HIGH)) {
4863 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4847 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4864 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4848 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4865 framer.error_code()) 4849 framer.error_code())
4866 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4850 << SpdyFramer::ErrorCodeToString(framer.error_code());
4867 } else { 4851 } else {
4868 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 4852 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
4869 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4853 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4870 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4854 << SpdyFramer::ErrorCodeToString(framer.error_code());
4871 } 4855 }
4872 } 4856 }
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after
5379 EXPECT_EQ(4u, framer.MapWeightToPriority(109)); 5363 EXPECT_EQ(4u, framer.MapWeightToPriority(109));
5380 EXPECT_EQ(4u, framer.MapWeightToPriority(74)); 5364 EXPECT_EQ(4u, framer.MapWeightToPriority(74));
5381 EXPECT_EQ(5u, framer.MapWeightToPriority(73)); 5365 EXPECT_EQ(5u, framer.MapWeightToPriority(73));
5382 EXPECT_EQ(5u, framer.MapWeightToPriority(37)); 5366 EXPECT_EQ(5u, framer.MapWeightToPriority(37));
5383 EXPECT_EQ(6u, framer.MapWeightToPriority(36)); 5367 EXPECT_EQ(6u, framer.MapWeightToPriority(36));
5384 EXPECT_EQ(6u, framer.MapWeightToPriority(1)); 5368 EXPECT_EQ(6u, framer.MapWeightToPriority(1));
5385 EXPECT_EQ(7u, framer.MapWeightToPriority(0)); 5369 EXPECT_EQ(7u, framer.MapWeightToPriority(0));
5386 } 5370 }
5387 5371
5388 } // namespace net 5372 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698