| 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 1657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3474 SpdyFramer::SpdyFramerErrorToString( | 3474 SpdyFramer::SpdyFramerErrorToString( |
| 3475 SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS)); | 3475 SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS)); |
| 3476 EXPECT_STREQ("SPDY_INVALID_CONTROL_FRAME_FLAGS", | 3476 EXPECT_STREQ("SPDY_INVALID_CONTROL_FRAME_FLAGS", |
| 3477 SpdyFramer::SpdyFramerErrorToString( | 3477 SpdyFramer::SpdyFramerErrorToString( |
| 3478 SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS)); | 3478 SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS)); |
| 3479 EXPECT_STREQ("UNKNOWN_ERROR", | 3479 EXPECT_STREQ("UNKNOWN_ERROR", |
| 3480 SpdyFramer::SpdyFramerErrorToString(SpdyFramer::LAST_ERROR)); | 3480 SpdyFramer::SpdyFramerErrorToString(SpdyFramer::LAST_ERROR)); |
| 3481 } | 3481 } |
| 3482 | 3482 |
| 3483 TEST_P(SpdyFramerTest, StatusCodeToStringTest) { | 3483 TEST_P(SpdyFramerTest, StatusCodeToStringTest) { |
| 3484 EXPECT_STREQ("NO_ERROR", SpdyFramer::StatusCodeToString(RST_STREAM_NO_ERROR)); | 3484 EXPECT_STREQ("NO_ERROR", SpdyFramer::StatusCodeToString(ERROR_CODE_NO_ERROR)); |
| 3485 EXPECT_STREQ("PROTOCOL_ERROR", | 3485 EXPECT_STREQ("PROTOCOL_ERROR", |
| 3486 SpdyFramer::StatusCodeToString(RST_STREAM_PROTOCOL_ERROR)); | 3486 SpdyFramer::StatusCodeToString(ERROR_CODE_PROTOCOL_ERROR)); |
| 3487 EXPECT_STREQ("INTERNAL_ERROR", | 3487 EXPECT_STREQ("INTERNAL_ERROR", |
| 3488 SpdyFramer::StatusCodeToString(RST_STREAM_INTERNAL_ERROR)); | 3488 SpdyFramer::StatusCodeToString(ERROR_CODE_INTERNAL_ERROR)); |
| 3489 EXPECT_STREQ("FLOW_CONTROL_ERROR", | 3489 EXPECT_STREQ("FLOW_CONTROL_ERROR", |
| 3490 SpdyFramer::StatusCodeToString(RST_STREAM_FLOW_CONTROL_ERROR)); | 3490 SpdyFramer::StatusCodeToString(ERROR_CODE_FLOW_CONTROL_ERROR)); |
| 3491 EXPECT_STREQ("SETTINGS_TIMEOUT", | 3491 EXPECT_STREQ("SETTINGS_TIMEOUT", |
| 3492 SpdyFramer::StatusCodeToString(RST_STREAM_SETTINGS_TIMEOUT)); | 3492 SpdyFramer::StatusCodeToString(ERROR_CODE_SETTINGS_TIMEOUT)); |
| 3493 EXPECT_STREQ("STREAM_CLOSED", | 3493 EXPECT_STREQ("STREAM_CLOSED", |
| 3494 SpdyFramer::StatusCodeToString(RST_STREAM_STREAM_CLOSED)); | 3494 SpdyFramer::StatusCodeToString(ERROR_CODE_STREAM_CLOSED)); |
| 3495 EXPECT_STREQ("FRAME_SIZE_ERROR", | 3495 EXPECT_STREQ("FRAME_SIZE_ERROR", |
| 3496 SpdyFramer::StatusCodeToString(RST_STREAM_FRAME_SIZE_ERROR)); | 3496 SpdyFramer::StatusCodeToString(ERROR_CODE_FRAME_SIZE_ERROR)); |
| 3497 EXPECT_STREQ("REFUSED_STREAM", | 3497 EXPECT_STREQ("REFUSED_STREAM", |
| 3498 SpdyFramer::StatusCodeToString(RST_STREAM_REFUSED_STREAM)); | 3498 SpdyFramer::StatusCodeToString(ERROR_CODE_REFUSED_STREAM)); |
| 3499 EXPECT_STREQ("CANCEL", SpdyFramer::StatusCodeToString(RST_STREAM_CANCEL)); | 3499 EXPECT_STREQ("CANCEL", SpdyFramer::StatusCodeToString(ERROR_CODE_CANCEL)); |
| 3500 EXPECT_STREQ("COMPRESSION_ERROR", | 3500 EXPECT_STREQ("COMPRESSION_ERROR", |
| 3501 SpdyFramer::StatusCodeToString(RST_STREAM_COMPRESSION_ERROR)); | 3501 SpdyFramer::StatusCodeToString(ERROR_CODE_COMPRESSION_ERROR)); |
| 3502 EXPECT_STREQ("CONNECT_ERROR", | 3502 EXPECT_STREQ("CONNECT_ERROR", |
| 3503 SpdyFramer::StatusCodeToString(RST_STREAM_CONNECT_ERROR)); | 3503 SpdyFramer::StatusCodeToString(ERROR_CODE_CONNECT_ERROR)); |
| 3504 EXPECT_STREQ("ENHANCE_YOUR_CALM", | 3504 EXPECT_STREQ("ENHANCE_YOUR_CALM", |
| 3505 SpdyFramer::StatusCodeToString(RST_STREAM_ENHANCE_YOUR_CALM)); | 3505 SpdyFramer::StatusCodeToString(ERROR_CODE_ENHANCE_YOUR_CALM)); |
| 3506 EXPECT_STREQ("INADEQUATE_SECURITY", | 3506 EXPECT_STREQ("INADEQUATE_SECURITY", |
| 3507 SpdyFramer::StatusCodeToString(RST_STREAM_INADEQUATE_SECURITY)); | 3507 SpdyFramer::StatusCodeToString(ERROR_CODE_INADEQUATE_SECURITY)); |
| 3508 EXPECT_STREQ("HTTP_1_1_REQUIRED", | 3508 EXPECT_STREQ("HTTP_1_1_REQUIRED", |
| 3509 SpdyFramer::StatusCodeToString(RST_STREAM_HTTP_1_1_REQUIRED)); | 3509 SpdyFramer::StatusCodeToString(ERROR_CODE_HTTP_1_1_REQUIRED)); |
| 3510 } | 3510 } |
| 3511 | 3511 |
| 3512 TEST_P(SpdyFramerTest, FrameTypeToStringTest) { | 3512 TEST_P(SpdyFramerTest, FrameTypeToStringTest) { |
| 3513 EXPECT_STREQ("DATA", SpdyFramer::FrameTypeToString(DATA)); | 3513 EXPECT_STREQ("DATA", SpdyFramer::FrameTypeToString(DATA)); |
| 3514 EXPECT_STREQ("RST_STREAM", SpdyFramer::FrameTypeToString(RST_STREAM)); | 3514 EXPECT_STREQ("RST_STREAM", SpdyFramer::FrameTypeToString(RST_STREAM)); |
| 3515 EXPECT_STREQ("SETTINGS", SpdyFramer::FrameTypeToString(SETTINGS)); | 3515 EXPECT_STREQ("SETTINGS", SpdyFramer::FrameTypeToString(SETTINGS)); |
| 3516 EXPECT_STREQ("PING", SpdyFramer::FrameTypeToString(PING)); | 3516 EXPECT_STREQ("PING", SpdyFramer::FrameTypeToString(PING)); |
| 3517 EXPECT_STREQ("GOAWAY", SpdyFramer::FrameTypeToString(GOAWAY)); | 3517 EXPECT_STREQ("GOAWAY", SpdyFramer::FrameTypeToString(GOAWAY)); |
| 3518 EXPECT_STREQ("HEADERS", SpdyFramer::FrameTypeToString(HEADERS)); | 3518 EXPECT_STREQ("HEADERS", SpdyFramer::FrameTypeToString(HEADERS)); |
| 3519 EXPECT_STREQ("WINDOW_UPDATE", SpdyFramer::FrameTypeToString(WINDOW_UPDATE)); | 3519 EXPECT_STREQ("WINDOW_UPDATE", SpdyFramer::FrameTypeToString(WINDOW_UPDATE)); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3576 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { | 3576 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { |
| 3577 uint8_t flags = 0; | 3577 uint8_t flags = 0; |
| 3578 do { | 3578 do { |
| 3579 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex | 3579 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex |
| 3580 << static_cast<int>(flags)); | 3580 << static_cast<int>(flags)); |
| 3581 | 3581 |
| 3582 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3582 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3583 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3583 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3584 framer.set_visitor(&visitor); | 3584 framer.set_visitor(&visitor); |
| 3585 | 3585 |
| 3586 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL); | 3586 SpdyRstStreamIR rst_stream(13, ERROR_CODE_CANCEL); |
| 3587 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 3587 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 3588 SetFrameFlags(&frame, flags); | 3588 SetFrameFlags(&frame, flags); |
| 3589 | 3589 |
| 3590 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL)); | 3590 EXPECT_CALL(visitor, OnRstStream(13, ERROR_CODE_CANCEL)); |
| 3591 | 3591 |
| 3592 framer.ProcessInput(frame.data(), frame.size()); | 3592 framer.ProcessInput(frame.data(), frame.size()); |
| 3593 | 3593 |
| 3594 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3594 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3595 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3595 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3596 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3596 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3597 } while (++flags != 0); | 3597 } while (++flags != 0); |
| 3598 } | 3598 } |
| 3599 | 3599 |
| 3600 TEST_P(SpdyFramerTest, SettingsFrameFlags) { | 3600 TEST_P(SpdyFramerTest, SettingsFrameFlags) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3638 TEST_P(SpdyFramerTest, GoawayFrameFlags) { | 3638 TEST_P(SpdyFramerTest, GoawayFrameFlags) { |
| 3639 uint8_t flags = 0; | 3639 uint8_t flags = 0; |
| 3640 do { | 3640 do { |
| 3641 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex | 3641 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex |
| 3642 << static_cast<int>(flags)); | 3642 << static_cast<int>(flags)); |
| 3643 | 3643 |
| 3644 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3644 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3645 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3645 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3646 framer.set_visitor(&visitor); | 3646 framer.set_visitor(&visitor); |
| 3647 | 3647 |
| 3648 SpdyGoAwayIR goaway_ir(97, GOAWAY_NO_ERROR, "test"); | 3648 SpdyGoAwayIR goaway_ir(97, ERROR_CODE_NO_ERROR, "test"); |
| 3649 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); | 3649 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
| 3650 SetFrameFlags(&frame, flags); | 3650 SetFrameFlags(&frame, flags); |
| 3651 | 3651 |
| 3652 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_NO_ERROR)); | 3652 EXPECT_CALL(visitor, OnGoAway(97, ERROR_CODE_NO_ERROR)); |
| 3653 | 3653 |
| 3654 framer.ProcessInput(frame.data(), frame.size()); | 3654 framer.ProcessInput(frame.data(), frame.size()); |
| 3655 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3655 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3656 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3656 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3657 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3657 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3658 } while (++flags != 0); | 3658 } while (++flags != 0); |
| 3659 } | 3659 } |
| 3660 | 3660 |
| 3661 TEST_P(SpdyFramerTest, HeadersFrameFlags) { | 3661 TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
| 3662 uint8_t flags = 0; | 3662 uint8_t flags = 0; |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3864 0x03, // Type: RST_STREAM | 3864 0x03, // Type: RST_STREAM |
| 3865 0x00, // Flags: none | 3865 0x00, // Flags: none |
| 3866 0x00, 0x00, 0x00, 0x01, // Stream: 1 | 3866 0x00, 0x00, 0x00, 0x01, // Stream: 1 |
| 3867 0x00, 0x00, 0x00, 0xff, // Error: 255 | 3867 0x00, 0x00, 0x00, 0xff, // Error: 255 |
| 3868 }; | 3868 }; |
| 3869 | 3869 |
| 3870 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3870 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3871 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3871 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3872 framer.set_visitor(&visitor); | 3872 framer.set_visitor(&visitor); |
| 3873 | 3873 |
| 3874 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_NO_ERROR)); | 3874 EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_NO_ERROR)); |
| 3875 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid), | 3875 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid), |
| 3876 arraysize(kH2RstStreamInvalid)); | 3876 arraysize(kH2RstStreamInvalid)); |
| 3877 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3877 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3878 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3878 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3879 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3879 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3880 | 3880 |
| 3881 framer.Reset(); | 3881 framer.Reset(); |
| 3882 | 3882 |
| 3883 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INTERNAL_ERROR)); | 3883 EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_INTERNAL_ERROR)); |
| 3884 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes), | 3884 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes), |
| 3885 arraysize(kH2RstStreamNumStatusCodes)); | 3885 arraysize(kH2RstStreamNumStatusCodes)); |
| 3886 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3886 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3887 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3887 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3888 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3888 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3889 } | 3889 } |
| 3890 | 3890 |
| 3891 // Test handling of GOAWAY frames with out-of-bounds status code. | 3891 // Test handling of GOAWAY frames with out-of-bounds status code. |
| 3892 TEST_P(SpdyFramerTest, GoAwayStatusBounds) { | 3892 TEST_P(SpdyFramerTest, GoAwayStatusBounds) { |
| 3893 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3893 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3894 const unsigned char kH2FrameData[] = { | 3894 const unsigned char kH2FrameData[] = { |
| 3895 0x00, 0x00, 0x0a, // Length: 10 | 3895 0x00, 0x00, 0x0a, // Length: 10 |
| 3896 0x07, // Type: GOAWAY | 3896 0x07, // Type: GOAWAY |
| 3897 0x00, // Flags: none | 3897 0x00, // Flags: none |
| 3898 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 3898 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 3899 0x00, 0x00, 0x00, 0x01, // Last: 1 | 3899 0x00, 0x00, 0x00, 0x01, // Last: 1 |
| 3900 0xff, 0xff, 0xff, 0xff, // Error: 0xffffffff | 3900 0xff, 0xff, 0xff, 0xff, // Error: 0xffffffff |
| 3901 0x47, 0x41, // Description | 3901 0x47, 0x41, // Description |
| 3902 }; | 3902 }; |
| 3903 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3903 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3904 framer.set_visitor(&visitor); | 3904 framer.set_visitor(&visitor); |
| 3905 | 3905 |
| 3906 EXPECT_CALL(visitor, OnGoAway(1, GOAWAY_INTERNAL_ERROR)); | 3906 EXPECT_CALL(visitor, OnGoAway(1, ERROR_CODE_INTERNAL_ERROR)); |
| 3907 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), | 3907 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), |
| 3908 arraysize(kH2FrameData)); | 3908 arraysize(kH2FrameData)); |
| 3909 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3909 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3910 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3910 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3911 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3911 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3912 } | 3912 } |
| 3913 | 3913 |
| 3914 // Tests handling of a GOAWAY frame with out-of-bounds stream ID. | 3914 // Tests handling of a GOAWAY frame with out-of-bounds stream ID. |
| 3915 TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { | 3915 TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { |
| 3916 const unsigned char kH2FrameData[] = { | 3916 const unsigned char kH2FrameData[] = { |
| 3917 0x00, 0x00, 0x08, // Length: 8 | 3917 0x00, 0x00, 0x08, // Length: 8 |
| 3918 0x07, // Type: GOAWAY | 3918 0x07, // Type: GOAWAY |
| 3919 0x00, // Flags: none | 3919 0x00, // Flags: none |
| 3920 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 3920 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 3921 0xff, 0xff, 0xff, 0xff, // Last: 0x7fffffff (R-bit set) | 3921 0xff, 0xff, 0xff, 0xff, // Last: 0x7fffffff (R-bit set) |
| 3922 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR | 3922 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR |
| 3923 }; | 3923 }; |
| 3924 | 3924 |
| 3925 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3925 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3926 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3926 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3927 framer.set_visitor(&visitor); | 3927 framer.set_visitor(&visitor); |
| 3928 | 3928 |
| 3929 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_NO_ERROR)); | 3929 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, ERROR_CODE_NO_ERROR)); |
| 3930 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), | 3930 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), |
| 3931 arraysize(kH2FrameData)); | 3931 arraysize(kH2FrameData)); |
| 3932 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3932 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3933 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3933 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3934 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3934 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3935 } | 3935 } |
| 3936 | 3936 |
| 3937 TEST_P(SpdyFramerTest, OnBlocked) { | 3937 TEST_P(SpdyFramerTest, OnBlocked) { |
| 3938 const SpdyStreamId kStreamId = 0; | 3938 const SpdyStreamId kStreamId = 0; |
| 3939 | 3939 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4330 | 4330 |
| 4331 EXPECT_EQ(1, visitor->data_frame_count_); | 4331 EXPECT_EQ(1, visitor->data_frame_count_); |
| 4332 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); | 4332 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); |
| 4333 EXPECT_EQ(0, visitor->headers_frame_count_); | 4333 EXPECT_EQ(0, visitor->headers_frame_count_); |
| 4334 } | 4334 } |
| 4335 } | 4335 } |
| 4336 | 4336 |
| 4337 } // namespace test | 4337 } // namespace test |
| 4338 | 4338 |
| 4339 } // namespace net | 4339 } // namespace net |
| OLD | NEW |