| OLD | NEW |
| 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 "net/spdy/spdy_framer.h" | 5 #include "net/spdy/spdy_framer.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 LOG(FATAL); | 142 LOG(FATAL); |
| 143 } | 143 } |
| 144 | 144 |
| 145 void OnStreamEnd(SpdyStreamId stream_id) override { LOG(FATAL); } | 145 void OnStreamEnd(SpdyStreamId stream_id) override { LOG(FATAL); } |
| 146 | 146 |
| 147 void OnStreamPadding(SpdyStreamId stream_id, size_t len) override { | 147 void OnStreamPadding(SpdyStreamId stream_id, size_t len) override { |
| 148 LOG(FATAL); | 148 LOG(FATAL); |
| 149 } | 149 } |
| 150 | 150 |
| 151 void OnRstStream(SpdyStreamId stream_id, | 151 void OnRstStream(SpdyStreamId stream_id, |
| 152 SpdyRstStreamStatus status) override { | 152 SpdyErrorCode error_code) override { |
| 153 LOG(FATAL); | 153 LOG(FATAL); |
| 154 } | 154 } |
| 155 void OnSetting(SpdySettingsIds id, uint32_t value) override { LOG(FATAL); } | 155 void OnSetting(SpdySettingsIds id, uint32_t value) override { LOG(FATAL); } |
| 156 void OnPing(SpdyPingId unique_id, bool is_ack) override { LOG(FATAL); } | 156 void OnPing(SpdyPingId unique_id, bool is_ack) override { LOG(FATAL); } |
| 157 void OnSettingsEnd() override { LOG(FATAL); } | 157 void OnSettingsEnd() override { LOG(FATAL); } |
| 158 void OnGoAway(SpdyStreamId last_accepted_stream_id, | 158 void OnGoAway(SpdyStreamId last_accepted_stream_id, |
| 159 SpdyGoAwayStatus status) override { | 159 SpdyErrorCode error_code) override { |
| 160 LOG(FATAL); | 160 LOG(FATAL); |
| 161 } | 161 } |
| 162 | 162 |
| 163 void OnWindowUpdate(SpdyStreamId stream_id, | 163 void OnWindowUpdate(SpdyStreamId stream_id, |
| 164 int delta_window_size) override { | 164 int delta_window_size) override { |
| 165 LOG(FATAL); | 165 LOG(FATAL); |
| 166 } | 166 } |
| 167 | 167 |
| 168 void OnPriority(SpdyStreamId stream_id, | 168 void OnPriority(SpdyStreamId stream_id, |
| 169 SpdyStreamId parent_stream_id, | 169 SpdyStreamId parent_stream_id, |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 | 351 |
| 352 void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { | 352 void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { |
| 353 CHECK(headers_handler_ != nullptr); | 353 CHECK(headers_handler_ != nullptr); |
| 354 headers_ = headers_handler_->decoded_block().Clone(); | 354 headers_ = headers_handler_->decoded_block().Clone(); |
| 355 header_bytes_received_ = headers_handler_->header_bytes_parsed(); | 355 header_bytes_received_ = headers_handler_->header_bytes_parsed(); |
| 356 if (end_headers) { | 356 if (end_headers) { |
| 357 headers_handler_.reset(); | 357 headers_handler_.reset(); |
| 358 } | 358 } |
| 359 } | 359 } |
| 360 | 360 |
| 361 void OnRstStream(SpdyStreamId stream_id, | 361 void OnRstStream(SpdyStreamId stream_id, SpdyErrorCode error_code) override { |
| 362 SpdyRstStreamStatus status) override { | 362 VLOG(1) << "OnRstStream(" << stream_id << ", " << error_code << ")"; |
| 363 VLOG(1) << "OnRstStream(" << stream_id << ", " << status << ")"; | |
| 364 ++fin_frame_count_; | 363 ++fin_frame_count_; |
| 365 } | 364 } |
| 366 | 365 |
| 367 void OnSetting(SpdySettingsIds id, uint32_t value) override { | 366 void OnSetting(SpdySettingsIds id, uint32_t value) override { |
| 368 VLOG(1) << "OnSetting(" << id << ", " << std::hex << ", " << value << ")"; | 367 VLOG(1) << "OnSetting(" << id << ", " << std::hex << ", " << value << ")"; |
| 369 ++setting_count_; | 368 ++setting_count_; |
| 370 } | 369 } |
| 371 | 370 |
| 372 void OnSettingsAck() override { | 371 void OnSettingsAck() override { |
| 373 VLOG(1) << "OnSettingsAck"; | 372 VLOG(1) << "OnSettingsAck"; |
| 374 ++settings_ack_received_; | 373 ++settings_ack_received_; |
| 375 } | 374 } |
| 376 | 375 |
| 377 void OnSettingsEnd() override { | 376 void OnSettingsEnd() override { |
| 378 VLOG(1) << "OnSettingsEnd"; | 377 VLOG(1) << "OnSettingsEnd"; |
| 379 ++settings_ack_sent_; | 378 ++settings_ack_sent_; |
| 380 } | 379 } |
| 381 | 380 |
| 382 void OnPing(SpdyPingId unique_id, bool is_ack) override { | 381 void OnPing(SpdyPingId unique_id, bool is_ack) override { |
| 383 LOG(DFATAL) << "OnPing(" << unique_id << ", " << (is_ack ? 1 : 0) << ")"; | 382 LOG(DFATAL) << "OnPing(" << unique_id << ", " << (is_ack ? 1 : 0) << ")"; |
| 384 } | 383 } |
| 385 | 384 |
| 386 void OnGoAway(SpdyStreamId last_accepted_stream_id, | 385 void OnGoAway(SpdyStreamId last_accepted_stream_id, |
| 387 SpdyGoAwayStatus status) override { | 386 SpdyErrorCode error_code) override { |
| 388 VLOG(1) << "OnGoAway(" << last_accepted_stream_id << ", " << status << ")"; | 387 VLOG(1) << "OnGoAway(" << last_accepted_stream_id << ", " << error_code |
| 388 << ")"; |
| 389 ++goaway_count_; | 389 ++goaway_count_; |
| 390 } | 390 } |
| 391 | 391 |
| 392 void OnHeaders(SpdyStreamId stream_id, | 392 void OnHeaders(SpdyStreamId stream_id, |
| 393 bool has_priority, | 393 bool has_priority, |
| 394 int weight, | 394 int weight, |
| 395 SpdyStreamId parent_stream_id, | 395 SpdyStreamId parent_stream_id, |
| 396 bool exclusive, | 396 bool exclusive, |
| 397 bool fin, | 397 bool fin, |
| 398 bool end) override { | 398 bool end) override { |
| (...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1000 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1000 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1001 } | 1001 } |
| 1002 | 1002 |
| 1003 // Test that if we receive a RST_STREAM with stream ID zero, we signal an error | 1003 // Test that if we receive a RST_STREAM with stream ID zero, we signal an error |
| 1004 // (but don't crash). | 1004 // (but don't crash). |
| 1005 TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) { | 1005 TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) { |
| 1006 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 1006 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 1007 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1007 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1008 framer.set_visitor(&visitor); | 1008 framer.set_visitor(&visitor); |
| 1009 | 1009 |
| 1010 SpdyRstStreamIR rst_stream_ir(0, RST_STREAM_PROTOCOL_ERROR); | 1010 SpdyRstStreamIR rst_stream_ir(0, ERROR_CODE_PROTOCOL_ERROR); |
| 1011 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream_ir)); | 1011 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream_ir)); |
| 1012 | 1012 |
| 1013 // We shouldn't have to read the whole frame before we signal an error. | 1013 // We shouldn't have to read the whole frame before we signal an error. |
| 1014 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 1014 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 1015 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); | 1015 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
| 1016 EXPECT_TRUE(framer.HasError()); | 1016 EXPECT_TRUE(framer.HasError()); |
| 1017 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) | 1017 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) |
| 1018 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1018 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1019 } | 1019 } |
| 1020 | 1020 |
| (...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1625 | 1625 |
| 1626 { | 1626 { |
| 1627 const char kDescription[] = "RST_STREAM frame"; | 1627 const char kDescription[] = "RST_STREAM frame"; |
| 1628 const unsigned char kH2FrameData[] = { | 1628 const unsigned char kH2FrameData[] = { |
| 1629 0x00, 0x00, 0x04, // Length: 4 | 1629 0x00, 0x00, 0x04, // Length: 4 |
| 1630 0x03, // Type: RST_STREAM | 1630 0x03, // Type: RST_STREAM |
| 1631 0x00, // Flags: none | 1631 0x00, // Flags: none |
| 1632 0x00, 0x00, 0x00, 0x01, // Stream: 1 | 1632 0x00, 0x00, 0x00, 0x01, // Stream: 1 |
| 1633 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR | 1633 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR |
| 1634 }; | 1634 }; |
| 1635 SpdyRstStreamIR rst_stream(1, RST_STREAM_PROTOCOL_ERROR); | 1635 SpdyRstStreamIR rst_stream(1, ERROR_CODE_PROTOCOL_ERROR); |
| 1636 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 1636 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 1637 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1637 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1638 } | 1638 } |
| 1639 | 1639 |
| 1640 { | 1640 { |
| 1641 const char kDescription[] = "RST_STREAM frame with max stream ID"; | 1641 const char kDescription[] = "RST_STREAM frame with max stream ID"; |
| 1642 const unsigned char kH2FrameData[] = { | 1642 const unsigned char kH2FrameData[] = { |
| 1643 0x00, 0x00, 0x04, // Length: 4 | 1643 0x00, 0x00, 0x04, // Length: 4 |
| 1644 0x03, // Type: RST_STREAM | 1644 0x03, // Type: RST_STREAM |
| 1645 0x00, // Flags: none | 1645 0x00, // Flags: none |
| 1646 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff | 1646 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff |
| 1647 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR | 1647 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR |
| 1648 }; | 1648 }; |
| 1649 SpdyRstStreamIR rst_stream(0x7FFFFFFF, RST_STREAM_PROTOCOL_ERROR); | 1649 SpdyRstStreamIR rst_stream(0x7FFFFFFF, ERROR_CODE_PROTOCOL_ERROR); |
| 1650 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 1650 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 1651 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1651 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1652 } | 1652 } |
| 1653 | 1653 |
| 1654 { | 1654 { |
| 1655 const char kDescription[] = "RST_STREAM frame with max status code"; | 1655 const char kDescription[] = "RST_STREAM frame with max status code"; |
| 1656 const unsigned char kH2FrameData[] = { | 1656 const unsigned char kH2FrameData[] = { |
| 1657 0x00, 0x00, 0x04, // Length: 4 | 1657 0x00, 0x00, 0x04, // Length: 4 |
| 1658 0x03, // Type: RST_STREAM | 1658 0x03, // Type: RST_STREAM |
| 1659 0x00, // Flags: none | 1659 0x00, // Flags: none |
| 1660 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff | 1660 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff |
| 1661 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR | 1661 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR |
| 1662 }; | 1662 }; |
| 1663 SpdyRstStreamIR rst_stream(0x7FFFFFFF, RST_STREAM_INTERNAL_ERROR); | 1663 SpdyRstStreamIR rst_stream(0x7FFFFFFF, ERROR_CODE_INTERNAL_ERROR); |
| 1664 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 1664 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 1665 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1665 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1666 } | 1666 } |
| 1667 } | 1667 } |
| 1668 | 1668 |
| 1669 TEST_P(SpdyFramerTest, CreateSettings) { | 1669 TEST_P(SpdyFramerTest, CreateSettings) { |
| 1670 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1670 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1671 | 1671 |
| 1672 { | 1672 { |
| 1673 const char kDescription[] = "Network byte order SETTINGS frame"; | 1673 const char kDescription[] = "Network byte order SETTINGS frame"; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1780 const char kDescription[] = "GOAWAY frame"; | 1780 const char kDescription[] = "GOAWAY frame"; |
| 1781 const unsigned char kH2FrameData[] = { | 1781 const unsigned char kH2FrameData[] = { |
| 1782 0x00, 0x00, 0x0a, // Length: 10 | 1782 0x00, 0x00, 0x0a, // Length: 10 |
| 1783 0x07, // Type: GOAWAY | 1783 0x07, // Type: GOAWAY |
| 1784 0x00, // Flags: none | 1784 0x00, // Flags: none |
| 1785 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 1785 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 1786 0x00, 0x00, 0x00, 0x00, // Last: 0 | 1786 0x00, 0x00, 0x00, 0x00, // Last: 0 |
| 1787 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR | 1787 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR |
| 1788 0x47, 0x41, // Description | 1788 0x47, 0x41, // Description |
| 1789 }; | 1789 }; |
| 1790 SpdyGoAwayIR goaway_ir(0, GOAWAY_NO_ERROR, "GA"); | 1790 SpdyGoAwayIR goaway_ir(0, ERROR_CODE_NO_ERROR, "GA"); |
| 1791 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); | 1791 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
| 1792 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1792 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1793 } | 1793 } |
| 1794 | 1794 |
| 1795 { | 1795 { |
| 1796 const char kDescription[] = "GOAWAY frame with max stream ID, status"; | 1796 const char kDescription[] = "GOAWAY frame with max stream ID, status"; |
| 1797 const unsigned char kH2FrameData[] = { | 1797 const unsigned char kH2FrameData[] = { |
| 1798 0x00, 0x00, 0x0a, // Length: 10 | 1798 0x00, 0x00, 0x0a, // Length: 10 |
| 1799 0x07, // Type: GOAWAY | 1799 0x07, // Type: GOAWAY |
| 1800 0x00, // Flags: none | 1800 0x00, // Flags: none |
| 1801 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 1801 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 1802 0x7f, 0xff, 0xff, 0xff, // Last: 0x7fffffff | 1802 0x7f, 0xff, 0xff, 0xff, // Last: 0x7fffffff |
| 1803 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR | 1803 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR |
| 1804 0x47, 0x41, // Description | 1804 0x47, 0x41, // Description |
| 1805 }; | 1805 }; |
| 1806 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); | 1806 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, ERROR_CODE_INTERNAL_ERROR, "GA"); |
| 1807 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); | 1807 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
| 1808 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1808 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1809 } | 1809 } |
| 1810 } | 1810 } |
| 1811 | 1811 |
| 1812 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { | 1812 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
| 1813 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 1813 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 1814 | 1814 |
| 1815 { | 1815 { |
| 1816 const char kDescription[] = "HEADERS frame, no FIN"; | 1816 const char kDescription[] = "HEADERS frame, no FIN"; |
| (...skipping 1734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3551 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { | 3551 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { |
| 3552 uint8_t flags = 0; | 3552 uint8_t flags = 0; |
| 3553 do { | 3553 do { |
| 3554 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex | 3554 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex |
| 3555 << static_cast<int>(flags)); | 3555 << static_cast<int>(flags)); |
| 3556 | 3556 |
| 3557 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3557 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3558 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3558 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3559 framer.set_visitor(&visitor); | 3559 framer.set_visitor(&visitor); |
| 3560 | 3560 |
| 3561 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL); | 3561 SpdyRstStreamIR rst_stream(13, ERROR_CODE_CANCEL); |
| 3562 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 3562 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 3563 SetFrameFlags(&frame, flags); | 3563 SetFrameFlags(&frame, flags); |
| 3564 | 3564 |
| 3565 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL)); | 3565 EXPECT_CALL(visitor, OnRstStream(13, ERROR_CODE_CANCEL)); |
| 3566 | 3566 |
| 3567 framer.ProcessInput(frame.data(), frame.size()); | 3567 framer.ProcessInput(frame.data(), frame.size()); |
| 3568 | 3568 |
| 3569 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3569 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3570 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3570 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3571 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3571 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3572 } while (++flags != 0); | 3572 } while (++flags != 0); |
| 3573 } | 3573 } |
| 3574 | 3574 |
| 3575 TEST_P(SpdyFramerTest, SettingsFrameFlags) { | 3575 TEST_P(SpdyFramerTest, SettingsFrameFlags) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3613 TEST_P(SpdyFramerTest, GoawayFrameFlags) { | 3613 TEST_P(SpdyFramerTest, GoawayFrameFlags) { |
| 3614 uint8_t flags = 0; | 3614 uint8_t flags = 0; |
| 3615 do { | 3615 do { |
| 3616 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex | 3616 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex |
| 3617 << static_cast<int>(flags)); | 3617 << static_cast<int>(flags)); |
| 3618 | 3618 |
| 3619 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3619 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3620 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3620 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3621 framer.set_visitor(&visitor); | 3621 framer.set_visitor(&visitor); |
| 3622 | 3622 |
| 3623 SpdyGoAwayIR goaway_ir(97, GOAWAY_NO_ERROR, "test"); | 3623 SpdyGoAwayIR goaway_ir(97, ERROR_CODE_NO_ERROR, "test"); |
| 3624 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); | 3624 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
| 3625 SetFrameFlags(&frame, flags); | 3625 SetFrameFlags(&frame, flags); |
| 3626 | 3626 |
| 3627 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_NO_ERROR)); | 3627 EXPECT_CALL(visitor, OnGoAway(97, ERROR_CODE_NO_ERROR)); |
| 3628 | 3628 |
| 3629 framer.ProcessInput(frame.data(), frame.size()); | 3629 framer.ProcessInput(frame.data(), frame.size()); |
| 3630 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3630 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3631 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3631 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3632 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3632 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3633 } while (++flags != 0); | 3633 } while (++flags != 0); |
| 3634 } | 3634 } |
| 3635 | 3635 |
| 3636 TEST_P(SpdyFramerTest, HeadersFrameFlags) { | 3636 TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
| 3637 uint8_t flags = 0; | 3637 uint8_t flags = 0; |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3839 0x03, // Type: RST_STREAM | 3839 0x03, // Type: RST_STREAM |
| 3840 0x00, // Flags: none | 3840 0x00, // Flags: none |
| 3841 0x00, 0x00, 0x00, 0x01, // Stream: 1 | 3841 0x00, 0x00, 0x00, 0x01, // Stream: 1 |
| 3842 0x00, 0x00, 0x00, 0xff, // Error: 255 | 3842 0x00, 0x00, 0x00, 0xff, // Error: 255 |
| 3843 }; | 3843 }; |
| 3844 | 3844 |
| 3845 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3845 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3846 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3846 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3847 framer.set_visitor(&visitor); | 3847 framer.set_visitor(&visitor); |
| 3848 | 3848 |
| 3849 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_NO_ERROR)); | 3849 EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_NO_ERROR)); |
| 3850 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid), | 3850 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid), |
| 3851 arraysize(kH2RstStreamInvalid)); | 3851 arraysize(kH2RstStreamInvalid)); |
| 3852 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3852 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3853 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3853 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3854 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3854 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3855 | 3855 |
| 3856 framer.Reset(); | 3856 framer.Reset(); |
| 3857 | 3857 |
| 3858 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INTERNAL_ERROR)); | 3858 EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_INTERNAL_ERROR)); |
| 3859 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes), | 3859 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes), |
| 3860 arraysize(kH2RstStreamNumStatusCodes)); | 3860 arraysize(kH2RstStreamNumStatusCodes)); |
| 3861 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3861 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3862 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3862 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3863 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3863 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3864 } | 3864 } |
| 3865 | 3865 |
| 3866 // Test handling of GOAWAY frames with out-of-bounds status code. | 3866 // Test handling of GOAWAY frames with out-of-bounds status code. |
| 3867 TEST_P(SpdyFramerTest, GoAwayStatusBounds) { | 3867 TEST_P(SpdyFramerTest, GoAwayStatusBounds) { |
| 3868 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3868 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3869 const unsigned char kH2FrameData[] = { | 3869 const unsigned char kH2FrameData[] = { |
| 3870 0x00, 0x00, 0x0a, // Length: 10 | 3870 0x00, 0x00, 0x0a, // Length: 10 |
| 3871 0x07, // Type: GOAWAY | 3871 0x07, // Type: GOAWAY |
| 3872 0x00, // Flags: none | 3872 0x00, // Flags: none |
| 3873 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 3873 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 3874 0x00, 0x00, 0x00, 0x01, // Last: 1 | 3874 0x00, 0x00, 0x00, 0x01, // Last: 1 |
| 3875 0xff, 0xff, 0xff, 0xff, // Error: 0xffffffff | 3875 0xff, 0xff, 0xff, 0xff, // Error: 0xffffffff |
| 3876 0x47, 0x41, // Description | 3876 0x47, 0x41, // Description |
| 3877 }; | 3877 }; |
| 3878 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3878 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3879 framer.set_visitor(&visitor); | 3879 framer.set_visitor(&visitor); |
| 3880 | 3880 |
| 3881 EXPECT_CALL(visitor, OnGoAway(1, GOAWAY_INTERNAL_ERROR)); | 3881 EXPECT_CALL(visitor, OnGoAway(1, ERROR_CODE_INTERNAL_ERROR)); |
| 3882 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), | 3882 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), |
| 3883 arraysize(kH2FrameData)); | 3883 arraysize(kH2FrameData)); |
| 3884 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3884 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3885 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3885 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3886 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3886 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3887 } | 3887 } |
| 3888 | 3888 |
| 3889 // Tests handling of a GOAWAY frame with out-of-bounds stream ID. | 3889 // Tests handling of a GOAWAY frame with out-of-bounds stream ID. |
| 3890 TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { | 3890 TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { |
| 3891 const unsigned char kH2FrameData[] = { | 3891 const unsigned char kH2FrameData[] = { |
| 3892 0x00, 0x00, 0x08, // Length: 8 | 3892 0x00, 0x00, 0x08, // Length: 8 |
| 3893 0x07, // Type: GOAWAY | 3893 0x07, // Type: GOAWAY |
| 3894 0x00, // Flags: none | 3894 0x00, // Flags: none |
| 3895 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 3895 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 3896 0xff, 0xff, 0xff, 0xff, // Last: 0x7fffffff (R-bit set) | 3896 0xff, 0xff, 0xff, 0xff, // Last: 0x7fffffff (R-bit set) |
| 3897 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR | 3897 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR |
| 3898 }; | 3898 }; |
| 3899 | 3899 |
| 3900 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3900 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3901 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3901 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3902 framer.set_visitor(&visitor); | 3902 framer.set_visitor(&visitor); |
| 3903 | 3903 |
| 3904 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_NO_ERROR)); | 3904 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, ERROR_CODE_NO_ERROR)); |
| 3905 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), | 3905 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), |
| 3906 arraysize(kH2FrameData)); | 3906 arraysize(kH2FrameData)); |
| 3907 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3907 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3908 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3908 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3909 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3909 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3910 } | 3910 } |
| 3911 | 3911 |
| 3912 TEST_P(SpdyFramerTest, OnBlocked) { | 3912 TEST_P(SpdyFramerTest, OnBlocked) { |
| 3913 const SpdyStreamId kStreamId = 0; | 3913 const SpdyStreamId kStreamId = 0; |
| 3914 | 3914 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4305 | 4305 |
| 4306 EXPECT_EQ(1, visitor->data_frame_count_); | 4306 EXPECT_EQ(1, visitor->data_frame_count_); |
| 4307 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); | 4307 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); |
| 4308 EXPECT_EQ(0, visitor->headers_frame_count_); | 4308 EXPECT_EQ(0, visitor->headers_frame_count_); |
| 4309 } | 4309 } |
| 4310 } | 4310 } |
| 4311 | 4311 |
| 4312 } // namespace test | 4312 } // namespace test |
| 4313 | 4313 |
| 4314 } // namespace net | 4314 } // namespace net |
| OLD | NEW |