| 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> |
| 11 #include <cstdint> | 11 #include <cstdint> |
| 12 #include <limits> | 12 #include <limits> |
| 13 #include <memory> | 13 #include <memory> |
| 14 #include <string> | 14 #include <string> |
| 15 #include <tuple> | 15 #include <tuple> |
| 16 #include <vector> | 16 #include <vector> |
| 17 | 17 |
| 18 #include "base/compiler_specific.h" | 18 #include "base/compiler_specific.h" |
| 19 #include "base/logging.h" | 19 #include "base/logging.h" |
| 20 #include "base/macros.h" | 20 #include "base/macros.h" |
| 21 #include "base/memory/ptr_util.h" | 21 #include "base/memory/ptr_util.h" |
| 22 #include "base/strings/string_number_conversions.h" | 22 #include "base/strings/string_number_conversions.h" |
| 23 #include "net/quic/core/quic_flags.h" | 23 #include "net/quic/core/quic_flags.h" |
| 24 #include "net/spdy/array_output_buffer.h" |
| 24 #include "net/spdy/hpack/hpack_constants.h" | 25 #include "net/spdy/hpack/hpack_constants.h" |
| 25 #include "net/spdy/mock_spdy_framer_visitor.h" | 26 #include "net/spdy/mock_spdy_framer_visitor.h" |
| 26 #include "net/spdy/spdy_flags.h" | 27 #include "net/spdy/spdy_flags.h" |
| 27 #include "net/spdy/spdy_frame_builder.h" | 28 #include "net/spdy/spdy_frame_builder.h" |
| 28 #include "net/spdy/spdy_frame_reader.h" | 29 #include "net/spdy/spdy_frame_reader.h" |
| 29 #include "net/spdy/spdy_protocol.h" | 30 #include "net/spdy/spdy_protocol.h" |
| 30 #include "net/spdy/spdy_test_utils.h" | 31 #include "net/spdy/spdy_test_utils.h" |
| 31 #include "testing/gmock/include/gmock/gmock.h" | 32 #include "testing/gmock/include/gmock/gmock.h" |
| 32 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
| 33 #include "testing/platform_test.h" | 34 #include "testing/platform_test.h" |
| 34 | 35 |
| 35 using base::StringPiece; | 36 using base::StringPiece; |
| 36 using std::string; | 37 using std::string; |
| 37 using testing::_; | 38 using testing::_; |
| 38 | 39 |
| 39 namespace net { | 40 namespace net { |
| 40 | 41 |
| 41 namespace test { | 42 namespace test { |
| 42 | 43 |
| 44 namespace { |
| 45 |
| 46 const int64_t kSize = 64 * 1024; |
| 47 char output_buffer[kSize] = ""; |
| 48 } |
| 49 |
| 43 class MockDebugVisitor : public SpdyFramerDebugVisitorInterface { | 50 class MockDebugVisitor : public SpdyFramerDebugVisitorInterface { |
| 44 public: | 51 public: |
| 45 MOCK_METHOD4(OnSendCompressedFrame, | 52 MOCK_METHOD4(OnSendCompressedFrame, |
| 46 void(SpdyStreamId stream_id, | 53 void(SpdyStreamId stream_id, |
| 47 SpdyFrameType type, | 54 SpdyFrameType type, |
| 48 size_t payload_len, | 55 size_t payload_len, |
| 49 size_t frame_len)); | 56 size_t frame_len)); |
| 50 | 57 |
| 51 MOCK_METHOD3(OnReceiveCompressedFrame, | 58 MOCK_METHOD3(OnReceiveCompressedFrame, |
| 52 void(SpdyStreamId stream_id, | 59 void(SpdyStreamId stream_id, |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 std::vector<SpdySerializedFrame> frame_list; | 261 std::vector<SpdySerializedFrame> frame_list; |
| 255 SpdyFramer::SpdyHeaderFrameIterator it(framer, CloneSpdyHeadersIR(headers)); | 262 SpdyFramer::SpdyHeaderFrameIterator it(framer, CloneSpdyHeadersIR(headers)); |
| 256 while (it.HasNextFrame()) { | 263 while (it.HasNextFrame()) { |
| 257 frame_list.push_back(it.NextFrame()); | 264 frame_list.push_back(it.NextFrame()); |
| 258 } | 265 } |
| 259 framer->debug_visitor_ = saved_debug_visitor; | 266 framer->debug_visitor_ = saved_debug_visitor; |
| 260 | 267 |
| 261 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); | 268 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); |
| 262 return serialized_headers_old_version; | 269 return serialized_headers_old_version; |
| 263 } | 270 } |
| 271 |
| 272 static SpdySerializedFrame SerializeHeaders(SpdyFramer* framer, |
| 273 const SpdyHeadersIR& headers, |
| 274 ArrayOutputBuffer* output) { |
| 275 if (output == nullptr) { |
| 276 return SerializeHeaders(framer, headers); |
| 277 } |
| 278 output->Reset(); |
| 279 EXPECT_TRUE(framer->SerializeHeaders(headers, output)); |
| 280 SpdySerializedFrame serialized_headers_old_version(output->Begin(), |
| 281 output->Size(), false); |
| 282 framer->hpack_encoder_.reset(nullptr); |
| 283 auto* saved_debug_visitor = framer->debug_visitor_; |
| 284 framer->debug_visitor_ = nullptr; |
| 285 |
| 286 std::vector<SpdySerializedFrame> frame_list; |
| 287 SpdyFramer::SpdyHeaderFrameIterator it(framer, CloneSpdyHeadersIR(headers)); |
| 288 while (it.HasNextFrame()) { |
| 289 frame_list.push_back(it.NextFrame()); |
| 290 } |
| 291 framer->debug_visitor_ = saved_debug_visitor; |
| 292 |
| 293 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); |
| 294 return serialized_headers_old_version; |
| 295 } |
| 264 }; | 296 }; |
| 265 | 297 |
| 266 class TestSpdyVisitor : public SpdyFramerVisitorInterface, | 298 class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
| 267 public SpdyFramerDebugVisitorInterface { | 299 public SpdyFramerDebugVisitorInterface { |
| 268 public: | 300 public: |
| 269 // This is larger than our max frame size because header blocks that | 301 // This is larger than our max frame size because header blocks that |
| 270 // are too long can spill over into CONTINUATION frames. | 302 // are too long can spill over into CONTINUATION frames. |
| 271 static const size_t kDefaultHeaderBufferSize = 16 * 1024 * 1024; | 303 static const size_t kDefaultHeaderBufferSize = 16 * 1024 * 1024; |
| 272 | 304 |
| 273 explicit TestSpdyVisitor(SpdyFramer::CompressionOption option) | 305 explicit TestSpdyVisitor(SpdyFramer::CompressionOption option) |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 DCHECK_EQ(HEADERS, type); | 662 DCHECK_EQ(HEADERS, type); |
| 631 uint8_t flags; | 663 uint8_t flags; |
| 632 reader.ReadUInt8(&flags); | 664 reader.ReadUInt8(&flags); |
| 633 | 665 |
| 634 return StringPiece(frame.data() + framer.GetHeadersMinimumSize(), | 666 return StringPiece(frame.data() + framer.GetHeadersMinimumSize(), |
| 635 frame.size() - framer.GetHeadersMinimumSize()); | 667 frame.size() - framer.GetHeadersMinimumSize()); |
| 636 } | 668 } |
| 637 | 669 |
| 638 enum DecoderChoice { DECODER_SELF, DECODER_NESTED, DECODER_HTTP2 }; | 670 enum DecoderChoice { DECODER_SELF, DECODER_NESTED, DECODER_HTTP2 }; |
| 639 enum HpackChoice { HPACK_DECODER_1, HPACK_DECODER_3 }; | 671 enum HpackChoice { HPACK_DECODER_1, HPACK_DECODER_3 }; |
| 672 enum Output { USE, NOT_USE }; |
| 640 | 673 |
| 641 class SpdyFramerTest | 674 class SpdyFramerTest : public ::testing::TestWithParam< |
| 642 : public ::testing::TestWithParam<std::tuple<DecoderChoice, HpackChoice>> { | 675 std::tuple<DecoderChoice, HpackChoice, Output>> { |
| 676 public: |
| 677 SpdyFramerTest() : output_(output_buffer, kSize) {} |
| 678 |
| 643 protected: | 679 protected: |
| 644 void SetUp() override { | 680 void SetUp() override { |
| 645 auto param = GetParam(); | 681 auto param = GetParam(); |
| 646 switch (std::get<0>(param)) { | 682 switch (std::get<0>(param)) { |
| 647 case DECODER_SELF: | 683 case DECODER_SELF: |
| 648 FLAGS_use_nested_spdy_framer_decoder = false; | 684 FLAGS_use_nested_spdy_framer_decoder = false; |
| 649 FLAGS_chromium_http2_flag_spdy_use_http2_frame_decoder_adapter = false; | 685 FLAGS_chromium_http2_flag_spdy_use_http2_frame_decoder_adapter = false; |
| 650 break; | 686 break; |
| 651 case DECODER_NESTED: | 687 case DECODER_NESTED: |
| 652 FLAGS_use_nested_spdy_framer_decoder = true; | 688 FLAGS_use_nested_spdy_framer_decoder = true; |
| 653 FLAGS_chromium_http2_flag_spdy_use_http2_frame_decoder_adapter = false; | 689 FLAGS_chromium_http2_flag_spdy_use_http2_frame_decoder_adapter = false; |
| 654 break; | 690 break; |
| 655 case DECODER_HTTP2: | 691 case DECODER_HTTP2: |
| 656 FLAGS_use_nested_spdy_framer_decoder = false; | 692 FLAGS_use_nested_spdy_framer_decoder = false; |
| 657 FLAGS_chromium_http2_flag_spdy_use_http2_frame_decoder_adapter = true; | 693 FLAGS_chromium_http2_flag_spdy_use_http2_frame_decoder_adapter = true; |
| 658 break; | 694 break; |
| 659 } | 695 } |
| 660 switch (std::get<1>(param)) { | 696 switch (std::get<1>(param)) { |
| 661 case HPACK_DECODER_1: | 697 case HPACK_DECODER_1: |
| 662 FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3 = false; | 698 FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3 = false; |
| 663 break; | 699 break; |
| 664 case HPACK_DECODER_3: | 700 case HPACK_DECODER_3: |
| 665 FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3 = true; | 701 FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3 = true; |
| 666 break; | 702 break; |
| 667 } | 703 } |
| 704 switch (std::get<2>(param)) { |
| 705 case USE: |
| 706 use_output_ = true; |
| 707 break; |
| 708 case NOT_USE: |
| 709 // TODO(yasong): remove this case after |
| 710 // FLAGS_chromium_http2_flag_remove_rewritelength deprecates. |
| 711 use_output_ = false; |
| 712 break; |
| 713 } |
| 668 } | 714 } |
| 669 | 715 |
| 670 void CompareFrame(const string& description, | 716 void CompareFrame(const string& description, |
| 671 const SpdySerializedFrame& actual_frame, | 717 const SpdySerializedFrame& actual_frame, |
| 672 const unsigned char* expected, | 718 const unsigned char* expected, |
| 673 const int expected_len) { | 719 const int expected_len) { |
| 674 const unsigned char* actual = | 720 const unsigned char* actual = |
| 675 reinterpret_cast<const unsigned char*>(actual_frame.data()); | 721 reinterpret_cast<const unsigned char*>(actual_frame.data()); |
| 676 CompareCharArraysWithHexError(description, actual, actual_frame.size(), | 722 CompareCharArraysWithHexError(description, actual, actual_frame.size(), |
| 677 expected, expected_len); | 723 expected, expected_len); |
| 678 } | 724 } |
| 679 | 725 |
| 680 void CompareFrames(const string& description, | 726 void CompareFrames(const string& description, |
| 681 const SpdySerializedFrame& expected_frame, | 727 const SpdySerializedFrame& expected_frame, |
| 682 const SpdySerializedFrame& actual_frame) { | 728 const SpdySerializedFrame& actual_frame) { |
| 683 CompareCharArraysWithHexError( | 729 CompareCharArraysWithHexError( |
| 684 description, | 730 description, |
| 685 reinterpret_cast<const unsigned char*>(expected_frame.data()), | 731 reinterpret_cast<const unsigned char*>(expected_frame.data()), |
| 686 expected_frame.size(), | 732 expected_frame.size(), |
| 687 reinterpret_cast<const unsigned char*>(actual_frame.data()), | 733 reinterpret_cast<const unsigned char*>(actual_frame.data()), |
| 688 actual_frame.size()); | 734 actual_frame.size()); |
| 689 } | 735 } |
| 736 |
| 737 bool use_output_ = false; |
| 738 ArrayOutputBuffer output_; |
| 690 }; | 739 }; |
| 691 | 740 |
| 692 INSTANTIATE_TEST_CASE_P(SpdyFramerTests, | 741 INSTANTIATE_TEST_CASE_P(SpdyFramerTests, |
| 693 SpdyFramerTest, | 742 SpdyFramerTest, |
| 694 ::testing::Combine(::testing::Values(DECODER_SELF, | 743 ::testing::Combine(::testing::Values(DECODER_SELF, |
| 695 DECODER_NESTED, | 744 DECODER_NESTED, |
| 696 DECODER_HTTP2), | 745 DECODER_HTTP2), |
| 697 ::testing::Values(HPACK_DECODER_1, | 746 ::testing::Values(HPACK_DECODER_1, |
| 698 HPACK_DECODER_3))); | 747 HPACK_DECODER_3), |
| 748 ::testing::Values(USE, NOT_USE))); |
| 699 | 749 |
| 700 // Test that we can encode and decode a SpdyHeaderBlock in serialized form. | 750 // Test that we can encode and decode a SpdyHeaderBlock in serialized form. |
| 701 TEST_P(SpdyFramerTest, HeaderBlockInBuffer) { | 751 TEST_P(SpdyFramerTest, HeaderBlockInBuffer) { |
| 702 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 752 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 703 | 753 |
| 704 // Encode the header block into a Headers frame. | 754 // Encode the header block into a Headers frame. |
| 705 SpdyHeadersIR headers(1); | 755 SpdyHeadersIR headers(1); |
| 706 headers.SetHeader("alpha", "beta"); | 756 headers.SetHeader("alpha", "beta"); |
| 707 headers.SetHeader("gamma", "charlie"); | 757 headers.SetHeader("gamma", "charlie"); |
| 708 headers.SetHeader("cookie", "key1=value1; key2=value2"); | 758 headers.SetHeader("cookie", "key1=value1; key2=value2"); |
| 709 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 759 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 760 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 710 | 761 |
| 711 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 762 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 712 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), | 763 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
| 713 frame.size()); | 764 frame.size()); |
| 714 | 765 |
| 715 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 766 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 716 EXPECT_EQ(headers.header_block(), visitor.headers_); | 767 EXPECT_EQ(headers.header_block(), visitor.headers_); |
| 717 } | 768 } |
| 718 | 769 |
| 719 // Test that if there's not a full frame, we fail to parse it. | 770 // Test that if there's not a full frame, we fail to parse it. |
| 720 TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) { | 771 TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) { |
| 721 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 772 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 722 | 773 |
| 723 // Encode the header block into a Headers frame. | 774 // Encode the header block into a Headers frame. |
| 724 SpdyHeadersIR headers(1); | 775 SpdyHeadersIR headers(1); |
| 725 headers.SetHeader("alpha", "beta"); | 776 headers.SetHeader("alpha", "beta"); |
| 726 headers.SetHeader("gamma", "charlie"); | 777 headers.SetHeader("gamma", "charlie"); |
| 727 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 778 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 779 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 728 | 780 |
| 729 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 781 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 730 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), | 782 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
| 731 frame.size() - 2); | 783 frame.size() - 2); |
| 732 | 784 |
| 733 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 785 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 734 EXPECT_EQ(0u, visitor.headers_.size()); | 786 EXPECT_EQ(0u, visitor.headers_.size()); |
| 735 } | 787 } |
| 736 | 788 |
| 737 // Test that we treat incoming upper-case or mixed-case header values as | 789 // Test that we treat incoming upper-case or mixed-case header values as |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 826 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 775 | 827 |
| 776 const SpdyStreamId parent_stream_id_test_array[] = {0, 3}; | 828 const SpdyStreamId parent_stream_id_test_array[] = {0, 3}; |
| 777 for (SpdyStreamId parent_stream_id : parent_stream_id_test_array) { | 829 for (SpdyStreamId parent_stream_id : parent_stream_id_test_array) { |
| 778 const bool exclusive_test_array[] = {true, false}; | 830 const bool exclusive_test_array[] = {true, false}; |
| 779 for (bool exclusive : exclusive_test_array) { | 831 for (bool exclusive : exclusive_test_array) { |
| 780 SpdyHeadersIR headers(1); | 832 SpdyHeadersIR headers(1); |
| 781 headers.set_has_priority(true); | 833 headers.set_has_priority(true); |
| 782 headers.set_parent_stream_id(parent_stream_id); | 834 headers.set_parent_stream_id(parent_stream_id); |
| 783 headers.set_exclusive(exclusive); | 835 headers.set_exclusive(exclusive); |
| 784 SpdySerializedFrame frame( | 836 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 785 SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 837 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 786 | 838 |
| 787 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 839 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 788 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), | 840 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
| 789 frame.size()); | 841 frame.size()); |
| 790 | 842 |
| 791 EXPECT_TRUE(visitor.header_has_priority_); | 843 EXPECT_TRUE(visitor.header_has_priority_); |
| 792 EXPECT_EQ(parent_stream_id, visitor.header_parent_stream_id_); | 844 EXPECT_EQ(parent_stream_id, visitor.header_parent_stream_id_); |
| 793 EXPECT_EQ(exclusive, visitor.header_exclusive_); | 845 EXPECT_EQ(exclusive, visitor.header_exclusive_); |
| 794 } | 846 } |
| 795 } | 847 } |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 996 | 1048 |
| 997 // Test that if we receive a HEADERS with stream ID zero, we signal an error | 1049 // Test that if we receive a HEADERS with stream ID zero, we signal an error |
| 998 // (but don't crash). | 1050 // (but don't crash). |
| 999 TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) { | 1051 TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) { |
| 1000 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 1052 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 1001 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1053 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1002 framer.set_visitor(&visitor); | 1054 framer.set_visitor(&visitor); |
| 1003 | 1055 |
| 1004 SpdyHeadersIR headers(0); | 1056 SpdyHeadersIR headers(0); |
| 1005 headers.SetHeader("alpha", "beta"); | 1057 headers.SetHeader("alpha", "beta"); |
| 1006 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 1058 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 1059 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 1007 | 1060 |
| 1008 // We shouldn't have to read the whole frame before we signal an error. | 1061 // We shouldn't have to read the whole frame before we signal an error. |
| 1009 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 1062 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 1010 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); | 1063 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
| 1011 EXPECT_TRUE(framer.HasError()); | 1064 EXPECT_TRUE(framer.HasError()); |
| 1012 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) | 1065 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) |
| 1013 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1066 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1014 } | 1067 } |
| 1015 | 1068 |
| 1016 // Test that if we receive a PRIORITY with stream ID zero, we signal an error | 1069 // Test that if we receive a PRIORITY with stream ID zero, we signal an error |
| 1017 // (but don't crash). | 1070 // (but don't crash). |
| 1018 TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) { | 1071 TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) { |
| 1019 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 1072 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 1020 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1073 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1021 framer.set_visitor(&visitor); | 1074 framer.set_visitor(&visitor); |
| 1022 | 1075 |
| 1023 SpdyPriorityIR priority_ir(0, 1, 16, true); | 1076 SpdyPriorityIR priority_ir(0, 1, 16, true); |
| 1024 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); | 1077 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); |
| 1078 if (use_output_) { |
| 1079 ASSERT_TRUE(framer.SerializeFrame(priority_ir, &output_)); |
| 1080 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1081 } |
| 1025 | 1082 |
| 1026 // We shouldn't have to read the whole frame before we signal an error. | 1083 // We shouldn't have to read the whole frame before we signal an error. |
| 1027 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 1084 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 1028 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); | 1085 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
| 1029 EXPECT_TRUE(framer.HasError()); | 1086 EXPECT_TRUE(framer.HasError()); |
| 1030 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) | 1087 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) |
| 1031 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1088 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1032 } | 1089 } |
| 1033 | 1090 |
| 1034 // Test that if we receive a RST_STREAM with stream ID zero, we signal an error | 1091 // Test that if we receive a RST_STREAM with stream ID zero, we signal an error |
| 1035 // (but don't crash). | 1092 // (but don't crash). |
| 1036 TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) { | 1093 TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) { |
| 1037 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 1094 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 1038 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1095 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1039 framer.set_visitor(&visitor); | 1096 framer.set_visitor(&visitor); |
| 1040 | 1097 |
| 1041 SpdyRstStreamIR rst_stream_ir(0, ERROR_CODE_PROTOCOL_ERROR); | 1098 SpdyRstStreamIR rst_stream_ir(0, ERROR_CODE_PROTOCOL_ERROR); |
| 1042 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream_ir)); | 1099 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream_ir)); |
| 1100 if (use_output_) { |
| 1101 ASSERT_TRUE(framer.SerializeRstStream(rst_stream_ir, &output_)); |
| 1102 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1103 } |
| 1043 | 1104 |
| 1044 // We shouldn't have to read the whole frame before we signal an error. | 1105 // We shouldn't have to read the whole frame before we signal an error. |
| 1045 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 1106 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 1046 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); | 1107 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
| 1047 EXPECT_TRUE(framer.HasError()); | 1108 EXPECT_TRUE(framer.HasError()); |
| 1048 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) | 1109 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) |
| 1049 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1110 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1050 } | 1111 } |
| 1051 | 1112 |
| 1052 // Test that if we receive a SETTINGS with stream ID other than zero, | 1113 // Test that if we receive a SETTINGS with stream ID other than zero, |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1110 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 1171 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 1111 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1172 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1112 framer.set_visitor(&visitor); | 1173 framer.set_visitor(&visitor); |
| 1113 | 1174 |
| 1114 SpdyContinuationIR continuation(0); | 1175 SpdyContinuationIR continuation(0); |
| 1115 auto some_nonsense_encoding = | 1176 auto some_nonsense_encoding = |
| 1116 base::MakeUnique<string>("some nonsense encoding"); | 1177 base::MakeUnique<string>("some nonsense encoding"); |
| 1117 continuation.take_encoding(std::move(some_nonsense_encoding)); | 1178 continuation.take_encoding(std::move(some_nonsense_encoding)); |
| 1118 continuation.set_end_headers(true); | 1179 continuation.set_end_headers(true); |
| 1119 SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); | 1180 SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); |
| 1181 if (use_output_) { |
| 1182 ASSERT_TRUE(framer.SerializeContinuation(continuation, &output_)); |
| 1183 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1184 } |
| 1120 | 1185 |
| 1121 // We shouldn't have to read the whole frame before we signal an error. | 1186 // We shouldn't have to read the whole frame before we signal an error. |
| 1122 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 1187 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 1123 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); | 1188 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
| 1124 EXPECT_TRUE(framer.HasError()); | 1189 EXPECT_TRUE(framer.HasError()); |
| 1125 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) | 1190 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) |
| 1126 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1191 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1127 } | 1192 } |
| 1128 | 1193 |
| 1129 // Test that if we receive a PUSH_PROMISE with stream ID zero, we signal an | 1194 // Test that if we receive a PUSH_PROMISE with stream ID zero, we signal an |
| 1130 // SPDY_INVALID_STREAM_ID. | 1195 // SPDY_INVALID_STREAM_ID. |
| 1131 TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) { | 1196 TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) { |
| 1132 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 1197 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 1133 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1198 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1134 framer.set_visitor(&visitor); | 1199 framer.set_visitor(&visitor); |
| 1135 | 1200 |
| 1136 SpdyPushPromiseIR push_promise(0, 4); | 1201 SpdyPushPromiseIR push_promise(0, 4); |
| 1137 push_promise.SetHeader("alpha", "beta"); | 1202 push_promise.SetHeader("alpha", "beta"); |
| 1138 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); | 1203 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
| 1204 if (use_output_) { |
| 1205 ASSERT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
| 1206 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1207 } |
| 1139 | 1208 |
| 1140 // We shouldn't have to read the whole frame before we signal an error. | 1209 // We shouldn't have to read the whole frame before we signal an error. |
| 1141 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 1210 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 1142 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); | 1211 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
| 1143 EXPECT_TRUE(framer.HasError()); | 1212 EXPECT_TRUE(framer.HasError()); |
| 1144 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) | 1213 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) |
| 1145 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1214 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1146 } | 1215 } |
| 1147 | 1216 |
| 1148 // Test that if we receive a PUSH_PROMISE with promised stream ID zero, we | 1217 // Test that if we receive a PUSH_PROMISE with promised stream ID zero, we |
| 1149 // signal SPDY_INVALID_STREAM_ID. | 1218 // signal SPDY_INVALID_STREAM_ID. |
| 1150 TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) { | 1219 TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) { |
| 1151 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 1220 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 1152 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1221 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1153 framer.set_visitor(&visitor); | 1222 framer.set_visitor(&visitor); |
| 1154 | 1223 |
| 1155 SpdyPushPromiseIR push_promise(3, 0); | 1224 SpdyPushPromiseIR push_promise(3, 0); |
| 1156 push_promise.SetHeader("alpha", "beta"); | 1225 push_promise.SetHeader("alpha", "beta"); |
| 1157 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); | 1226 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
| 1227 if (use_output_) { |
| 1228 ASSERT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
| 1229 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1230 } |
| 1158 | 1231 |
| 1159 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 1232 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 1160 framer.ProcessInput(frame.data(), frame.size()); | 1233 framer.ProcessInput(frame.data(), frame.size()); |
| 1161 EXPECT_TRUE(framer.HasError()); | 1234 EXPECT_TRUE(framer.HasError()); |
| 1162 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.spdy_framer_error()) | 1235 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.spdy_framer_error()) |
| 1163 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1236 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1164 } | 1237 } |
| 1165 | 1238 |
| 1166 TEST_P(SpdyFramerTest, DuplicateHeader) { | 1239 TEST_P(SpdyFramerTest, DuplicateHeader) { |
| 1167 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 1240 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1394 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1467 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1395 | 1468 |
| 1396 const char kHeader1[] = "header1"; | 1469 const char kHeader1[] = "header1"; |
| 1397 const char kHeader2[] = "header2"; | 1470 const char kHeader2[] = "header2"; |
| 1398 const char kValue1[] = "value1"; | 1471 const char kValue1[] = "value1"; |
| 1399 const char kValue2[] = "value2"; | 1472 const char kValue2[] = "value2"; |
| 1400 | 1473 |
| 1401 SpdyHeadersIR headers(1); | 1474 SpdyHeadersIR headers(1); |
| 1402 headers.SetHeader(kHeader1, kValue1); | 1475 headers.SetHeader(kHeader1, kValue1); |
| 1403 headers.SetHeader(kHeader2, kValue2); | 1476 headers.SetHeader(kHeader2, kValue2); |
| 1404 SpdySerializedFrame headers_frame( | 1477 SpdySerializedFrame headers_frame(SpdyFramerPeer::SerializeHeaders( |
| 1405 SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 1478 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 1406 | 1479 |
| 1407 const char bytes[] = "this is a test test test test test!"; | 1480 const char bytes[] = "this is a test test test test test!"; |
| 1408 SpdyDataIR data_ir(1, StringPiece(bytes, arraysize(bytes))); | 1481 SpdyDataIR data_ir(1, StringPiece(bytes, arraysize(bytes))); |
| 1409 data_ir.set_fin(true); | 1482 data_ir.set_fin(true); |
| 1410 SpdySerializedFrame send_frame(framer.SerializeData(data_ir)); | 1483 SpdySerializedFrame send_frame(framer.SerializeData(data_ir)); |
| 1411 | 1484 |
| 1412 // Run the inputs through the framer. | 1485 // Run the inputs through the framer. |
| 1413 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); | 1486 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
| 1414 const unsigned char* data; | 1487 const unsigned char* data; |
| 1415 data = reinterpret_cast<const unsigned char*>(headers_frame.data()); | 1488 data = reinterpret_cast<const unsigned char*>(headers_frame.data()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1427 EXPECT_EQ(1, visitor.headers_frame_count_); | 1500 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 1428 EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_)); | 1501 EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_)); |
| 1429 EXPECT_EQ(0, visitor.fin_frame_count_); | 1502 EXPECT_EQ(0, visitor.fin_frame_count_); |
| 1430 EXPECT_EQ(0, visitor.fin_flag_count_); | 1503 EXPECT_EQ(0, visitor.fin_flag_count_); |
| 1431 EXPECT_EQ(1, visitor.end_of_stream_count_); | 1504 EXPECT_EQ(1, visitor.end_of_stream_count_); |
| 1432 EXPECT_EQ(1, visitor.data_frame_count_); | 1505 EXPECT_EQ(1, visitor.data_frame_count_); |
| 1433 } | 1506 } |
| 1434 | 1507 |
| 1435 TEST_P(SpdyFramerTest, WindowUpdateFrame) { | 1508 TEST_P(SpdyFramerTest, WindowUpdateFrame) { |
| 1436 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1509 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1437 SpdySerializedFrame frame( | 1510 SpdyWindowUpdateIR window_update(1, 0x12345678); |
| 1438 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x12345678))); | 1511 SpdySerializedFrame frame(framer.SerializeWindowUpdate(window_update)); |
| 1512 if (use_output_) { |
| 1513 ASSERT_TRUE(framer.SerializeWindowUpdate(window_update, &output_)); |
| 1514 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1515 } |
| 1439 | 1516 |
| 1440 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; | 1517 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; |
| 1441 const unsigned char kH2FrameData[] = { | 1518 const unsigned char kH2FrameData[] = { |
| 1442 0x00, 0x00, 0x04, // Length: 4 | 1519 0x00, 0x00, 0x04, // Length: 4 |
| 1443 0x08, // Type: WINDOW_UPDATE | 1520 0x08, // Type: WINDOW_UPDATE |
| 1444 0x00, // Flags: none | 1521 0x00, // Flags: none |
| 1445 0x00, 0x00, 0x00, 0x01, // Stream: 1 | 1522 0x00, 0x00, 0x00, 0x01, // Stream: 1 |
| 1446 0x12, 0x34, 0x56, 0x78, // Increment: 305419896 | 1523 0x12, 0x34, 0x56, 0x78, // Increment: 305419896 |
| 1447 }; | 1524 }; |
| 1448 | 1525 |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1658 const char kDescription[] = "RST_STREAM frame"; | 1735 const char kDescription[] = "RST_STREAM frame"; |
| 1659 const unsigned char kH2FrameData[] = { | 1736 const unsigned char kH2FrameData[] = { |
| 1660 0x00, 0x00, 0x04, // Length: 4 | 1737 0x00, 0x00, 0x04, // Length: 4 |
| 1661 0x03, // Type: RST_STREAM | 1738 0x03, // Type: RST_STREAM |
| 1662 0x00, // Flags: none | 1739 0x00, // Flags: none |
| 1663 0x00, 0x00, 0x00, 0x01, // Stream: 1 | 1740 0x00, 0x00, 0x00, 0x01, // Stream: 1 |
| 1664 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR | 1741 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR |
| 1665 }; | 1742 }; |
| 1666 SpdyRstStreamIR rst_stream(1, ERROR_CODE_PROTOCOL_ERROR); | 1743 SpdyRstStreamIR rst_stream(1, ERROR_CODE_PROTOCOL_ERROR); |
| 1667 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 1744 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 1745 if (use_output_) { |
| 1746 ASSERT_TRUE(framer.SerializeRstStream(rst_stream, &output_)); |
| 1747 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1748 } |
| 1668 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1749 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1669 } | 1750 } |
| 1670 | 1751 |
| 1671 { | 1752 { |
| 1672 const char kDescription[] = "RST_STREAM frame with max stream ID"; | 1753 const char kDescription[] = "RST_STREAM frame with max stream ID"; |
| 1673 const unsigned char kH2FrameData[] = { | 1754 const unsigned char kH2FrameData[] = { |
| 1674 0x00, 0x00, 0x04, // Length: 4 | 1755 0x00, 0x00, 0x04, // Length: 4 |
| 1675 0x03, // Type: RST_STREAM | 1756 0x03, // Type: RST_STREAM |
| 1676 0x00, // Flags: none | 1757 0x00, // Flags: none |
| 1677 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff | 1758 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff |
| 1678 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR | 1759 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR |
| 1679 }; | 1760 }; |
| 1680 SpdyRstStreamIR rst_stream(0x7FFFFFFF, ERROR_CODE_PROTOCOL_ERROR); | 1761 SpdyRstStreamIR rst_stream(0x7FFFFFFF, ERROR_CODE_PROTOCOL_ERROR); |
| 1681 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 1762 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 1763 if (use_output_) { |
| 1764 output_.Reset(); |
| 1765 ASSERT_TRUE(framer.SerializeRstStream(rst_stream, &output_)); |
| 1766 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1767 } |
| 1682 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1768 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1683 } | 1769 } |
| 1684 | 1770 |
| 1685 { | 1771 { |
| 1686 const char kDescription[] = "RST_STREAM frame with max status code"; | 1772 const char kDescription[] = "RST_STREAM frame with max status code"; |
| 1687 const unsigned char kH2FrameData[] = { | 1773 const unsigned char kH2FrameData[] = { |
| 1688 0x00, 0x00, 0x04, // Length: 4 | 1774 0x00, 0x00, 0x04, // Length: 4 |
| 1689 0x03, // Type: RST_STREAM | 1775 0x03, // Type: RST_STREAM |
| 1690 0x00, // Flags: none | 1776 0x00, // Flags: none |
| 1691 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff | 1777 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff |
| 1692 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR | 1778 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR |
| 1693 }; | 1779 }; |
| 1694 SpdyRstStreamIR rst_stream(0x7FFFFFFF, ERROR_CODE_INTERNAL_ERROR); | 1780 SpdyRstStreamIR rst_stream(0x7FFFFFFF, ERROR_CODE_INTERNAL_ERROR); |
| 1695 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 1781 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 1782 if (use_output_) { |
| 1783 output_.Reset(); |
| 1784 ASSERT_TRUE(framer.SerializeRstStream(rst_stream, &output_)); |
| 1785 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1786 } |
| 1696 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1787 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1697 } | 1788 } |
| 1698 } | 1789 } |
| 1699 | 1790 |
| 1700 TEST_P(SpdyFramerTest, CreateSettings) { | 1791 TEST_P(SpdyFramerTest, CreateSettings) { |
| 1701 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1792 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1702 | 1793 |
| 1703 { | 1794 { |
| 1704 const char kDescription[] = "Network byte order SETTINGS frame"; | 1795 const char kDescription[] = "Network byte order SETTINGS frame"; |
| 1705 | 1796 |
| 1706 const unsigned char kH2FrameData[] = { | 1797 const unsigned char kH2FrameData[] = { |
| 1707 0x00, 0x00, 0x06, // Length: 6 | 1798 0x00, 0x00, 0x06, // Length: 6 |
| 1708 0x04, // Type: SETTINGS | 1799 0x04, // Type: SETTINGS |
| 1709 0x00, // Flags: none | 1800 0x00, // Flags: none |
| 1710 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 1801 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 1711 0x00, 0x04, // Param: INITIAL_WINDOW_SIZE | 1802 0x00, 0x04, // Param: INITIAL_WINDOW_SIZE |
| 1712 0x0a, 0x0b, 0x0c, 0x0d, // Value: 168496141 | 1803 0x0a, 0x0b, 0x0c, 0x0d, // Value: 168496141 |
| 1713 }; | 1804 }; |
| 1714 | 1805 |
| 1715 uint32_t kValue = 0x0a0b0c0d; | 1806 uint32_t kValue = 0x0a0b0c0d; |
| 1716 SpdySettingsIR settings_ir; | 1807 SpdySettingsIR settings_ir; |
| 1717 | 1808 |
| 1718 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; | 1809 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; |
| 1719 settings_ir.AddSetting(kId, kValue); | 1810 settings_ir.AddSetting(kId, kValue); |
| 1720 | 1811 |
| 1721 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); | 1812 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); |
| 1813 if (use_output_) { |
| 1814 ASSERT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
| 1815 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1816 } |
| 1722 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1817 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1723 } | 1818 } |
| 1724 | 1819 |
| 1725 { | 1820 { |
| 1726 const char kDescription[] = "Basic SETTINGS frame"; | 1821 const char kDescription[] = "Basic SETTINGS frame"; |
| 1727 // These end up seemingly out of order because of the way that our internal | 1822 // These end up seemingly out of order because of the way that our internal |
| 1728 // ordering for settings_ir works. HTTP2 has no requirement on ordering on | 1823 // ordering for settings_ir works. HTTP2 has no requirement on ordering on |
| 1729 // the wire. | 1824 // the wire. |
| 1730 const unsigned char kH2FrameData[] = { | 1825 const unsigned char kH2FrameData[] = { |
| 1731 0x00, 0x00, 0x18, // Length: 24 | 1826 0x00, 0x00, 0x18, // Length: 24 |
| 1732 0x04, // Type: SETTINGS | 1827 0x04, // Type: SETTINGS |
| 1733 0x00, // Flags: none | 1828 0x00, // Flags: none |
| 1734 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 1829 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 1735 0x00, 0x01, // Param: HEADER_TABLE_SIZE | 1830 0x00, 0x01, // Param: HEADER_TABLE_SIZE |
| 1736 0x00, 0x00, 0x00, 0x05, // Value: 5 | 1831 0x00, 0x00, 0x00, 0x05, // Value: 5 |
| 1737 0x00, 0x02, // Param: ENABLE_PUSH | 1832 0x00, 0x02, // Param: ENABLE_PUSH |
| 1738 0x00, 0x00, 0x00, 0x06, // Value: 6 | 1833 0x00, 0x00, 0x00, 0x06, // Value: 6 |
| 1739 0x00, 0x03, // Param: MAX_CONCURRENT_STREAMS | 1834 0x00, 0x03, // Param: MAX_CONCURRENT_STREAMS |
| 1740 0x00, 0x00, 0x00, 0x07, // Value: 7 | 1835 0x00, 0x00, 0x00, 0x07, // Value: 7 |
| 1741 0x00, 0x04, // Param: INITIAL_WINDOW_SIZE | 1836 0x00, 0x04, // Param: INITIAL_WINDOW_SIZE |
| 1742 0x00, 0x00, 0x00, 0x08, // Value: 8 | 1837 0x00, 0x00, 0x00, 0x08, // Value: 8 |
| 1743 }; | 1838 }; |
| 1744 | 1839 |
| 1745 SpdySettingsIR settings_ir; | 1840 SpdySettingsIR settings_ir; |
| 1746 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 5); | 1841 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 5); |
| 1747 settings_ir.AddSetting(SETTINGS_ENABLE_PUSH, 6); | 1842 settings_ir.AddSetting(SETTINGS_ENABLE_PUSH, 6); |
| 1748 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 7); | 1843 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 7); |
| 1749 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 8); | 1844 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 8); |
| 1750 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); | 1845 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); |
| 1846 if (use_output_) { |
| 1847 output_.Reset(); |
| 1848 ASSERT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
| 1849 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1850 } |
| 1751 | 1851 |
| 1752 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1852 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1753 } | 1853 } |
| 1754 | 1854 |
| 1755 { | 1855 { |
| 1756 const char kDescription[] = "Empty SETTINGS frame"; | 1856 const char kDescription[] = "Empty SETTINGS frame"; |
| 1757 | 1857 |
| 1758 const unsigned char kH2FrameData[] = { | 1858 const unsigned char kH2FrameData[] = { |
| 1759 0x00, 0x00, 0x00, // Length: 0 | 1859 0x00, 0x00, 0x00, // Length: 0 |
| 1760 0x04, // Type: SETTINGS | 1860 0x04, // Type: SETTINGS |
| 1761 0x00, // Flags: none | 1861 0x00, // Flags: none |
| 1762 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 1862 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 1763 }; | 1863 }; |
| 1764 SpdySettingsIR settings_ir; | 1864 SpdySettingsIR settings_ir; |
| 1765 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); | 1865 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); |
| 1866 if (use_output_) { |
| 1867 output_.Reset(); |
| 1868 ASSERT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
| 1869 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1870 } |
| 1871 |
| 1766 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1872 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1767 } | 1873 } |
| 1768 } | 1874 } |
| 1769 | 1875 |
| 1770 TEST_P(SpdyFramerTest, CreatePingFrame) { | 1876 TEST_P(SpdyFramerTest, CreatePingFrame) { |
| 1771 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1877 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1772 | 1878 |
| 1773 { | 1879 { |
| 1774 const char kDescription[] = "PING frame"; | 1880 const char kDescription[] = "PING frame"; |
| 1775 const unsigned char kH2FrameData[] = { | 1881 const unsigned char kH2FrameData[] = { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1787 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 1893 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 1788 0x12, 0x34, 0x56, 0x78, // Opaque | 1894 0x12, 0x34, 0x56, 0x78, // Opaque |
| 1789 0x9a, 0xbc, 0xde, 0xff, // Data | 1895 0x9a, 0xbc, 0xde, 0xff, // Data |
| 1790 }; | 1896 }; |
| 1791 SpdySerializedFrame frame; | 1897 SpdySerializedFrame frame; |
| 1792 const SpdyPingId kPingId = 0x123456789abcdeffULL; | 1898 const SpdyPingId kPingId = 0x123456789abcdeffULL; |
| 1793 SpdyPingIR ping_ir(kPingId); | 1899 SpdyPingIR ping_ir(kPingId); |
| 1794 // Tests SpdyPingIR when the ping is not an ack. | 1900 // Tests SpdyPingIR when the ping is not an ack. |
| 1795 ASSERT_FALSE(ping_ir.is_ack()); | 1901 ASSERT_FALSE(ping_ir.is_ack()); |
| 1796 frame = framer.SerializePing(ping_ir); | 1902 frame = framer.SerializePing(ping_ir); |
| 1903 if (use_output_) { |
| 1904 ASSERT_TRUE(framer.SerializePing(ping_ir, &output_)); |
| 1905 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1906 } |
| 1797 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1907 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1798 | 1908 |
| 1799 // Tests SpdyPingIR when the ping is an ack. | 1909 // Tests SpdyPingIR when the ping is an ack. |
| 1800 ping_ir.set_is_ack(true); | 1910 ping_ir.set_is_ack(true); |
| 1801 frame = framer.SerializePing(ping_ir); | 1911 frame = framer.SerializePing(ping_ir); |
| 1912 if (use_output_) { |
| 1913 output_.Reset(); |
| 1914 ASSERT_TRUE(framer.SerializePing(ping_ir, &output_)); |
| 1915 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1916 } |
| 1802 CompareFrame(kDescription, frame, kH2FrameDataWithAck, | 1917 CompareFrame(kDescription, frame, kH2FrameDataWithAck, |
| 1803 arraysize(kH2FrameDataWithAck)); | 1918 arraysize(kH2FrameDataWithAck)); |
| 1804 } | 1919 } |
| 1805 } | 1920 } |
| 1806 | 1921 |
| 1807 TEST_P(SpdyFramerTest, CreateGoAway) { | 1922 TEST_P(SpdyFramerTest, CreateGoAway) { |
| 1808 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1923 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1809 | 1924 |
| 1810 { | 1925 { |
| 1811 const char kDescription[] = "GOAWAY frame"; | 1926 const char kDescription[] = "GOAWAY frame"; |
| 1812 const unsigned char kH2FrameData[] = { | 1927 const unsigned char kH2FrameData[] = { |
| 1813 0x00, 0x00, 0x0a, // Length: 10 | 1928 0x00, 0x00, 0x0a, // Length: 10 |
| 1814 0x07, // Type: GOAWAY | 1929 0x07, // Type: GOAWAY |
| 1815 0x00, // Flags: none | 1930 0x00, // Flags: none |
| 1816 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 1931 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 1817 0x00, 0x00, 0x00, 0x00, // Last: 0 | 1932 0x00, 0x00, 0x00, 0x00, // Last: 0 |
| 1818 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR | 1933 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR |
| 1819 0x47, 0x41, // Description | 1934 0x47, 0x41, // Description |
| 1820 }; | 1935 }; |
| 1821 SpdyGoAwayIR goaway_ir(0, ERROR_CODE_NO_ERROR, "GA"); | 1936 SpdyGoAwayIR goaway_ir(0, ERROR_CODE_NO_ERROR, "GA"); |
| 1822 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); | 1937 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
| 1938 if (use_output_) { |
| 1939 ASSERT_TRUE(framer.SerializeGoAway(goaway_ir, &output_)); |
| 1940 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1941 } |
| 1823 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1942 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1824 } | 1943 } |
| 1825 | 1944 |
| 1826 { | 1945 { |
| 1827 const char kDescription[] = "GOAWAY frame with max stream ID, status"; | 1946 const char kDescription[] = "GOAWAY frame with max stream ID, status"; |
| 1828 const unsigned char kH2FrameData[] = { | 1947 const unsigned char kH2FrameData[] = { |
| 1829 0x00, 0x00, 0x0a, // Length: 10 | 1948 0x00, 0x00, 0x0a, // Length: 10 |
| 1830 0x07, // Type: GOAWAY | 1949 0x07, // Type: GOAWAY |
| 1831 0x00, // Flags: none | 1950 0x00, // Flags: none |
| 1832 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 1951 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 1833 0x7f, 0xff, 0xff, 0xff, // Last: 0x7fffffff | 1952 0x7f, 0xff, 0xff, 0xff, // Last: 0x7fffffff |
| 1834 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR | 1953 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR |
| 1835 0x47, 0x41, // Description | 1954 0x47, 0x41, // Description |
| 1836 }; | 1955 }; |
| 1837 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, ERROR_CODE_INTERNAL_ERROR, "GA"); | 1956 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, ERROR_CODE_INTERNAL_ERROR, "GA"); |
| 1838 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); | 1957 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
| 1958 if (use_output_) { |
| 1959 output_.Reset(); |
| 1960 ASSERT_TRUE(framer.SerializeGoAway(goaway_ir, &output_)); |
| 1961 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1962 } |
| 1839 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1963 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1840 } | 1964 } |
| 1841 } | 1965 } |
| 1842 | 1966 |
| 1843 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { | 1967 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
| 1844 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 1968 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 1845 | 1969 |
| 1846 { | 1970 { |
| 1847 const char kDescription[] = "HEADERS frame, no FIN"; | 1971 const char kDescription[] = "HEADERS frame, no FIN"; |
| 1848 // frame-format off | 1972 // frame-format off |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1862 0x03, // Name Len: 3 | 1986 0x03, // Name Len: 3 |
| 1863 0x66, 0x6f, 0x6f, // foo | 1987 0x66, 0x6f, 0x6f, // foo |
| 1864 0x03, // Value Len: 3 | 1988 0x03, // Value Len: 3 |
| 1865 0x62, 0x61, 0x72, // bar | 1989 0x62, 0x61, 0x72, // bar |
| 1866 }; | 1990 }; |
| 1867 // frame-format on | 1991 // frame-format on |
| 1868 | 1992 |
| 1869 SpdyHeadersIR headers(1); | 1993 SpdyHeadersIR headers(1); |
| 1870 headers.SetHeader("bar", "foo"); | 1994 headers.SetHeader("bar", "foo"); |
| 1871 headers.SetHeader("foo", "bar"); | 1995 headers.SetHeader("foo", "bar"); |
| 1872 SpdySerializedFrame frame( | 1996 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 1873 SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 1997 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 1874 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 1998 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1875 } | 1999 } |
| 1876 | 2000 |
| 1877 { | 2001 { |
| 1878 const char kDescription[] = | 2002 const char kDescription[] = |
| 1879 "HEADERS frame with a 0-length header name, FIN, max stream ID"; | 2003 "HEADERS frame with a 0-length header name, FIN, max stream ID"; |
| 1880 // frame-format off | 2004 // frame-format off |
| 1881 const unsigned char kH2FrameData[] = { | 2005 const unsigned char kH2FrameData[] = { |
| 1882 0x00, 0x00, 0x0f, // Length: 15 | 2006 0x00, 0x00, 0x0f, // Length: 15 |
| 1883 0x01, // Type: HEADERS | 2007 0x01, // Type: HEADERS |
| 1884 0x05, // Flags: END_STREAM|END_HEADERS | 2008 0x05, // Flags: END_STREAM|END_HEADERS |
| 1885 0x7f, 0xff, 0xff, 0xff, // Stream: 2147483647 | 2009 0x7f, 0xff, 0xff, 0xff, // Stream: 2147483647 |
| 1886 | 2010 |
| 1887 0x00, // Unindexed Entry | 2011 0x00, // Unindexed Entry |
| 1888 0x00, // Name Len: 0 | 2012 0x00, // Name Len: 0 |
| 1889 0x03, // Value Len: 3 | 2013 0x03, // Value Len: 3 |
| 1890 0x66, 0x6f, 0x6f, // foo | 2014 0x66, 0x6f, 0x6f, // foo |
| 1891 | 2015 |
| 1892 0x00, // Unindexed Entry | 2016 0x00, // Unindexed Entry |
| 1893 0x03, // Name Len: 3 | 2017 0x03, // Name Len: 3 |
| 1894 0x66, 0x6f, 0x6f, // foo | 2018 0x66, 0x6f, 0x6f, // foo |
| 1895 0x03, // Value Len: 3 | 2019 0x03, // Value Len: 3 |
| 1896 0x62, 0x61, 0x72, // bar | 2020 0x62, 0x61, 0x72, // bar |
| 1897 }; | 2021 }; |
| 1898 // frame-format on | 2022 // frame-format on |
| 1899 SpdyHeadersIR headers(0x7fffffff); | 2023 SpdyHeadersIR headers(0x7fffffff); |
| 1900 headers.set_fin(true); | 2024 headers.set_fin(true); |
| 1901 headers.SetHeader("", "foo"); | 2025 headers.SetHeader("", "foo"); |
| 1902 headers.SetHeader("foo", "bar"); | 2026 headers.SetHeader("foo", "bar"); |
| 1903 SpdySerializedFrame frame( | 2027 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 1904 SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 2028 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 1905 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 2029 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1906 } | 2030 } |
| 1907 | 2031 |
| 1908 { | 2032 { |
| 1909 const char kDescription[] = | 2033 const char kDescription[] = |
| 1910 "HEADERS frame with a 0-length header val, FIN, max stream ID"; | 2034 "HEADERS frame with a 0-length header val, FIN, max stream ID"; |
| 1911 // frame-format off | 2035 // frame-format off |
| 1912 const unsigned char kH2FrameData[] = { | 2036 const unsigned char kH2FrameData[] = { |
| 1913 0x00, 0x00, 0x0f, // Length: 15 | 2037 0x00, 0x00, 0x0f, // Length: 15 |
| 1914 0x01, // Type: HEADERS | 2038 0x01, // Type: HEADERS |
| 1915 0x05, // Flags: END_STREAM|END_HEADERS | 2039 0x05, // Flags: END_STREAM|END_HEADERS |
| 1916 0x7f, 0xff, 0xff, 0xff, // Stream: 2147483647 | 2040 0x7f, 0xff, 0xff, 0xff, // Stream: 2147483647 |
| 1917 | 2041 |
| 1918 0x00, // Unindexed Entry | 2042 0x00, // Unindexed Entry |
| 1919 0x03, // Name Len: 3 | 2043 0x03, // Name Len: 3 |
| 1920 0x62, 0x61, 0x72, // bar | 2044 0x62, 0x61, 0x72, // bar |
| 1921 0x03, // Value Len: 3 | 2045 0x03, // Value Len: 3 |
| 1922 0x66, 0x6f, 0x6f, // foo | 2046 0x66, 0x6f, 0x6f, // foo |
| 1923 | 2047 |
| 1924 0x00, // Unindexed Entry | 2048 0x00, // Unindexed Entry |
| 1925 0x03, // Name Len: 3 | 2049 0x03, // Name Len: 3 |
| 1926 0x66, 0x6f, 0x6f, // foo | 2050 0x66, 0x6f, 0x6f, // foo |
| 1927 0x00, // Value Len: 0 | 2051 0x00, // Value Len: 0 |
| 1928 }; | 2052 }; |
| 1929 // frame-format on | 2053 // frame-format on |
| 1930 SpdyHeadersIR headers_ir(0x7fffffff); | 2054 SpdyHeadersIR headers_ir(0x7fffffff); |
| 1931 headers_ir.set_fin(true); | 2055 headers_ir.set_fin(true); |
| 1932 headers_ir.SetHeader("bar", "foo"); | 2056 headers_ir.SetHeader("bar", "foo"); |
| 1933 headers_ir.SetHeader("foo", ""); | 2057 headers_ir.SetHeader("foo", ""); |
| 1934 SpdySerializedFrame frame( | 2058 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 1935 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 2059 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 1936 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 2060 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1937 } | 2061 } |
| 1938 | 2062 |
| 1939 { | 2063 { |
| 1940 const char kDescription[] = | 2064 const char kDescription[] = |
| 1941 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri"; | 2065 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri"; |
| 1942 | 2066 |
| 1943 // frame-format off | 2067 // frame-format off |
| 1944 const unsigned char kH2FrameData[] = { | 2068 const unsigned char kH2FrameData[] = { |
| 1945 0x00, 0x00, 0x14, // Length: 20 | 2069 0x00, 0x00, 0x14, // Length: 20 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1960 0x66, 0x6f, 0x6f, // foo | 2084 0x66, 0x6f, 0x6f, // foo |
| 1961 0x00, // Value Len: 0 | 2085 0x00, // Value Len: 0 |
| 1962 }; | 2086 }; |
| 1963 // frame-format on | 2087 // frame-format on |
| 1964 SpdyHeadersIR headers_ir(0x7fffffff); | 2088 SpdyHeadersIR headers_ir(0x7fffffff); |
| 1965 headers_ir.set_fin(true); | 2089 headers_ir.set_fin(true); |
| 1966 headers_ir.set_has_priority(true); | 2090 headers_ir.set_has_priority(true); |
| 1967 headers_ir.set_weight(220); | 2091 headers_ir.set_weight(220); |
| 1968 headers_ir.SetHeader("bar", "foo"); | 2092 headers_ir.SetHeader("bar", "foo"); |
| 1969 headers_ir.SetHeader("foo", ""); | 2093 headers_ir.SetHeader("foo", ""); |
| 1970 SpdySerializedFrame frame( | 2094 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 1971 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 2095 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 1972 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 2096 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 1973 } | 2097 } |
| 1974 | 2098 |
| 1975 { | 2099 { |
| 1976 const char kDescription[] = | 2100 const char kDescription[] = |
| 1977 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri, " | 2101 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri, " |
| 1978 "exclusive=true, parent_stream=0"; | 2102 "exclusive=true, parent_stream=0"; |
| 1979 | 2103 |
| 1980 // frame-format off | 2104 // frame-format off |
| 1981 const unsigned char kV4FrameData[] = { | 2105 const unsigned char kV4FrameData[] = { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1999 }; | 2123 }; |
| 2000 // frame-format on | 2124 // frame-format on |
| 2001 SpdyHeadersIR headers_ir(0x7fffffff); | 2125 SpdyHeadersIR headers_ir(0x7fffffff); |
| 2002 headers_ir.set_fin(true); | 2126 headers_ir.set_fin(true); |
| 2003 headers_ir.set_has_priority(true); | 2127 headers_ir.set_has_priority(true); |
| 2004 headers_ir.set_weight(220); | 2128 headers_ir.set_weight(220); |
| 2005 headers_ir.set_exclusive(true); | 2129 headers_ir.set_exclusive(true); |
| 2006 headers_ir.set_parent_stream_id(0); | 2130 headers_ir.set_parent_stream_id(0); |
| 2007 headers_ir.SetHeader("bar", "foo"); | 2131 headers_ir.SetHeader("bar", "foo"); |
| 2008 headers_ir.SetHeader("foo", ""); | 2132 headers_ir.SetHeader("foo", ""); |
| 2009 SpdySerializedFrame frame( | 2133 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 2010 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 2134 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 2011 CompareFrame(kDescription, frame, kV4FrameData, arraysize(kV4FrameData)); | 2135 CompareFrame(kDescription, frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2012 } | 2136 } |
| 2013 | 2137 |
| 2014 { | 2138 { |
| 2015 const char kDescription[] = | 2139 const char kDescription[] = |
| 2016 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri, " | 2140 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri, " |
| 2017 "exclusive=false, parent_stream=max stream ID"; | 2141 "exclusive=false, parent_stream=max stream ID"; |
| 2018 | 2142 |
| 2019 // frame-format off | 2143 // frame-format off |
| 2020 const unsigned char kV4FrameData[] = { | 2144 const unsigned char kV4FrameData[] = { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2038 }; | 2162 }; |
| 2039 // frame-format on | 2163 // frame-format on |
| 2040 SpdyHeadersIR headers_ir(0x7fffffff); | 2164 SpdyHeadersIR headers_ir(0x7fffffff); |
| 2041 headers_ir.set_fin(true); | 2165 headers_ir.set_fin(true); |
| 2042 headers_ir.set_has_priority(true); | 2166 headers_ir.set_has_priority(true); |
| 2043 headers_ir.set_weight(220); | 2167 headers_ir.set_weight(220); |
| 2044 headers_ir.set_exclusive(false); | 2168 headers_ir.set_exclusive(false); |
| 2045 headers_ir.set_parent_stream_id(0x7fffffff); | 2169 headers_ir.set_parent_stream_id(0x7fffffff); |
| 2046 headers_ir.SetHeader("bar", "foo"); | 2170 headers_ir.SetHeader("bar", "foo"); |
| 2047 headers_ir.SetHeader("foo", ""); | 2171 headers_ir.SetHeader("foo", ""); |
| 2048 SpdySerializedFrame frame( | 2172 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 2049 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 2173 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 2050 CompareFrame(kDescription, frame, kV4FrameData, arraysize(kV4FrameData)); | 2174 CompareFrame(kDescription, frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2051 } | 2175 } |
| 2052 | 2176 |
| 2053 { | 2177 { |
| 2054 const char kDescription[] = | 2178 const char kDescription[] = |
| 2055 "HEADERS frame with a 0-length header name, FIN, max stream ID, padded"; | 2179 "HEADERS frame with a 0-length header name, FIN, max stream ID, padded"; |
| 2056 | 2180 |
| 2057 // frame-format off | 2181 // frame-format off |
| 2058 const unsigned char kH2FrameData[] = { | 2182 const unsigned char kH2FrameData[] = { |
| 2059 0x00, 0x00, 0x15, // Length: 21 | 2183 0x00, 0x00, 0x15, // Length: 21 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2075 | 2199 |
| 2076 0x00, 0x00, 0x00, 0x00, // Padding | 2200 0x00, 0x00, 0x00, 0x00, // Padding |
| 2077 0x00, // Padding | 2201 0x00, // Padding |
| 2078 }; | 2202 }; |
| 2079 // frame-format on | 2203 // frame-format on |
| 2080 SpdyHeadersIR headers_ir(0x7fffffff); | 2204 SpdyHeadersIR headers_ir(0x7fffffff); |
| 2081 headers_ir.set_fin(true); | 2205 headers_ir.set_fin(true); |
| 2082 headers_ir.SetHeader("", "foo"); | 2206 headers_ir.SetHeader("", "foo"); |
| 2083 headers_ir.SetHeader("foo", "bar"); | 2207 headers_ir.SetHeader("foo", "bar"); |
| 2084 headers_ir.set_padding_len(6); | 2208 headers_ir.set_padding_len(6); |
| 2085 SpdySerializedFrame frame( | 2209 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 2086 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 2210 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 2087 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 2211 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 2088 } | 2212 } |
| 2089 } | 2213 } |
| 2090 | 2214 |
| 2091 // TODO(phajdan.jr): Clean up after we no longer need | 2215 // TODO(phajdan.jr): Clean up after we no longer need |
| 2092 // to workaround http://crbug.com/139744. | 2216 // to workaround http://crbug.com/139744. |
| 2093 #if !defined(USE_SYSTEM_ZLIB) | 2217 #if !defined(USE_SYSTEM_ZLIB) |
| 2094 TEST_P(SpdyFramerTest, CreateHeadersCompressed) { | 2218 TEST_P(SpdyFramerTest, CreateHeadersCompressed) { |
| 2095 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2219 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2096 | 2220 |
| 2097 { | 2221 { |
| 2098 SpdyHeadersIR headers_ir(1); | 2222 SpdyHeadersIR headers_ir(1); |
| 2099 headers_ir.SetHeader("bar", "foo"); | 2223 headers_ir.SetHeader("bar", "foo"); |
| 2100 headers_ir.SetHeader("foo", "bar"); | 2224 headers_ir.SetHeader("foo", "bar"); |
| 2101 SpdySerializedFrame frame( | 2225 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 2102 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 2226 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 2103 // Deflate compression doesn't apply to HPACK. | 2227 // Deflate compression doesn't apply to HPACK. |
| 2104 } | 2228 } |
| 2105 } | 2229 } |
| 2106 #endif // !defined(USE_SYSTEM_ZLIB) | 2230 #endif // !defined(USE_SYSTEM_ZLIB) |
| 2107 | 2231 |
| 2108 TEST_P(SpdyFramerTest, CreateWindowUpdate) { | 2232 TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
| 2109 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2233 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2110 | 2234 |
| 2111 { | 2235 { |
| 2112 const char kDescription[] = "WINDOW_UPDATE frame"; | 2236 const char kDescription[] = "WINDOW_UPDATE frame"; |
| 2113 const unsigned char kH2FrameData[] = { | 2237 const unsigned char kH2FrameData[] = { |
| 2114 0x00, 0x00, 0x04, // Length: 4 | 2238 0x00, 0x00, 0x04, // Length: 4 |
| 2115 0x08, // Type: WINDOW_UPDATE | 2239 0x08, // Type: WINDOW_UPDATE |
| 2116 0x00, // Flags: none | 2240 0x00, // Flags: none |
| 2117 0x00, 0x00, 0x00, 0x01, // Stream: 1 | 2241 0x00, 0x00, 0x00, 0x01, // Stream: 1 |
| 2118 0x00, 0x00, 0x00, 0x01, // Increment: 1 | 2242 0x00, 0x00, 0x00, 0x01, // Increment: 1 |
| 2119 }; | 2243 }; |
| 2120 SpdySerializedFrame frame( | 2244 SpdySerializedFrame frame( |
| 2121 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1))); | 2245 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1))); |
| 2246 if (use_output_) { |
| 2247 output_.Reset(); |
| 2248 ASSERT_TRUE( |
| 2249 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1), &output_)); |
| 2250 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2251 } |
| 2122 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 2252 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 2123 } | 2253 } |
| 2124 | 2254 |
| 2125 { | 2255 { |
| 2126 const char kDescription[] = "WINDOW_UPDATE frame with max stream ID"; | 2256 const char kDescription[] = "WINDOW_UPDATE frame with max stream ID"; |
| 2127 const unsigned char kH2FrameData[] = { | 2257 const unsigned char kH2FrameData[] = { |
| 2128 0x00, 0x00, 0x04, // Length: 4 | 2258 0x00, 0x00, 0x04, // Length: 4 |
| 2129 0x08, // Type: WINDOW_UPDATE | 2259 0x08, // Type: WINDOW_UPDATE |
| 2130 0x00, // Flags: none | 2260 0x00, // Flags: none |
| 2131 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff | 2261 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff |
| 2132 0x00, 0x00, 0x00, 0x01, // Increment: 1 | 2262 0x00, 0x00, 0x00, 0x01, // Increment: 1 |
| 2133 }; | 2263 }; |
| 2134 SpdySerializedFrame frame( | 2264 SpdySerializedFrame frame( |
| 2135 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(0x7FFFFFFF, 1))); | 2265 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(0x7FFFFFFF, 1))); |
| 2266 if (use_output_) { |
| 2267 output_.Reset(); |
| 2268 ASSERT_TRUE(framer.SerializeWindowUpdate( |
| 2269 SpdyWindowUpdateIR(0x7FFFFFFF, 1), &output_)); |
| 2270 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2271 } |
| 2136 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 2272 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 2137 } | 2273 } |
| 2138 | 2274 |
| 2139 { | 2275 { |
| 2140 const char kDescription[] = "WINDOW_UPDATE frame with max window delta"; | 2276 const char kDescription[] = "WINDOW_UPDATE frame with max window delta"; |
| 2141 const unsigned char kH2FrameData[] = { | 2277 const unsigned char kH2FrameData[] = { |
| 2142 0x00, 0x00, 0x04, // Length: 4 | 2278 0x00, 0x00, 0x04, // Length: 4 |
| 2143 0x08, // Type: WINDOW_UPDATE | 2279 0x08, // Type: WINDOW_UPDATE |
| 2144 0x00, // Flags: none | 2280 0x00, // Flags: none |
| 2145 0x00, 0x00, 0x00, 0x01, // Stream: 1 | 2281 0x00, 0x00, 0x00, 0x01, // Stream: 1 |
| 2146 0x7f, 0xff, 0xff, 0xff, // Increment: 0x7fffffff | 2282 0x7f, 0xff, 0xff, 0xff, // Increment: 0x7fffffff |
| 2147 }; | 2283 }; |
| 2148 SpdySerializedFrame frame( | 2284 SpdySerializedFrame frame( |
| 2149 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x7FFFFFFF))); | 2285 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x7FFFFFFF))); |
| 2286 if (use_output_) { |
| 2287 output_.Reset(); |
| 2288 ASSERT_TRUE(framer.SerializeWindowUpdate( |
| 2289 SpdyWindowUpdateIR(1, 0x7FFFFFFF), &output_)); |
| 2290 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2291 } |
| 2150 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); | 2292 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
| 2151 } | 2293 } |
| 2152 } | 2294 } |
| 2153 | 2295 |
| 2154 TEST_P(SpdyFramerTest, SerializeBlocked) { | 2296 TEST_P(SpdyFramerTest, SerializeBlocked) { |
| 2155 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2297 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2156 | 2298 |
| 2157 const char kDescription[] = "BLOCKED frame"; | 2299 const char kDescription[] = "BLOCKED frame"; |
| 2158 const unsigned char kType = static_cast<unsigned char>(BLOCKED); | 2300 const unsigned char kType = static_cast<unsigned char>(BLOCKED); |
| 2159 const unsigned char kFrameData[] = { | 2301 const unsigned char kFrameData[] = { |
| 2160 0x00, 0x00, 0x00, // Length: 0 | 2302 0x00, 0x00, 0x00, // Length: 0 |
| 2161 kType, // Type: BLOCKED | 2303 kType, // Type: BLOCKED |
| 2162 0x00, // Flags: none | 2304 0x00, // Flags: none |
| 2163 0x00, 0x00, 0x00, 0x00, // Stream: 0 | 2305 0x00, 0x00, 0x00, 0x00, // Stream: 0 |
| 2164 }; | 2306 }; |
| 2165 SpdyBlockedIR blocked_ir(0); | 2307 SpdyBlockedIR blocked_ir(0); |
| 2166 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir)); | 2308 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir)); |
| 2309 if (use_output_) { |
| 2310 ASSERT_TRUE(framer.SerializeFrame(blocked_ir, &output_)); |
| 2311 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2312 } |
| 2167 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2313 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2168 } | 2314 } |
| 2169 | 2315 |
| 2170 TEST_P(SpdyFramerTest, CreateBlocked) { | 2316 TEST_P(SpdyFramerTest, CreateBlocked) { |
| 2171 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2317 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2172 | 2318 |
| 2173 const char kDescription[] = "BLOCKED frame"; | 2319 const char kDescription[] = "BLOCKED frame"; |
| 2174 const SpdyStreamId kStreamId = 3; | 2320 const SpdyStreamId kStreamId = 3; |
| 2175 | 2321 |
| 2176 SpdySerializedFrame frame_serialized( | 2322 SpdySerializedFrame frame_serialized( |
| 2177 framer.SerializeBlocked(SpdyBlockedIR(kStreamId))); | 2323 framer.SerializeBlocked(SpdyBlockedIR(kStreamId))); |
| 2324 if (use_output_) { |
| 2325 ASSERT_TRUE(framer.SerializeBlocked(SpdyBlockedIR(kStreamId), &output_)); |
| 2326 frame_serialized = |
| 2327 SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2328 } |
| 2178 SpdyBlockedIR blocked_ir(kStreamId); | 2329 SpdyBlockedIR blocked_ir(kStreamId); |
| 2179 SpdySerializedFrame frame_created(framer.SerializeFrame(blocked_ir)); | 2330 SpdySerializedFrame frame_created(framer.SerializeFrame(blocked_ir)); |
| 2180 | 2331 |
| 2181 CompareFrames(kDescription, frame_serialized, frame_created); | 2332 CompareFrames(kDescription, frame_serialized, frame_created); |
| 2182 } | 2333 } |
| 2183 | 2334 |
| 2184 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { | 2335 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { |
| 2185 { | 2336 { |
| 2186 // Test framing PUSH_PROMISE without padding. | 2337 // Test framing PUSH_PROMISE without padding. |
| 2187 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 2338 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2206 0x66, 0x6f, 0x6f, // foo | 2357 0x66, 0x6f, 0x6f, // foo |
| 2207 0x03, // Value Len: 3 | 2358 0x03, // Value Len: 3 |
| 2208 0x62, 0x61, 0x72, // bar | 2359 0x62, 0x61, 0x72, // bar |
| 2209 }; | 2360 }; |
| 2210 // frame-format on | 2361 // frame-format on |
| 2211 | 2362 |
| 2212 SpdyPushPromiseIR push_promise(41, 58); | 2363 SpdyPushPromiseIR push_promise(41, 58); |
| 2213 push_promise.SetHeader("bar", "foo"); | 2364 push_promise.SetHeader("bar", "foo"); |
| 2214 push_promise.SetHeader("foo", "bar"); | 2365 push_promise.SetHeader("foo", "bar"); |
| 2215 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); | 2366 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
| 2367 if (use_output_) { |
| 2368 ASSERT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
| 2369 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2370 } |
| 2216 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2371 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2217 } | 2372 } |
| 2218 | 2373 |
| 2219 { | 2374 { |
| 2220 // Test framing PUSH_PROMISE with one byte of padding. | 2375 // Test framing PUSH_PROMISE with one byte of padding. |
| 2221 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 2376 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 2222 const char kDescription[] = "PUSH_PROMISE frame with one byte of padding"; | 2377 const char kDescription[] = "PUSH_PROMISE frame with one byte of padding"; |
| 2223 | 2378 |
| 2224 // frame-format off | 2379 // frame-format off |
| 2225 const unsigned char kFrameData[] = { | 2380 const unsigned char kFrameData[] = { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2242 0x03, // Value Len: 3 | 2397 0x03, // Value Len: 3 |
| 2243 0x62, 0x61, 0x72, // bar | 2398 0x62, 0x61, 0x72, // bar |
| 2244 }; | 2399 }; |
| 2245 // frame-format on | 2400 // frame-format on |
| 2246 | 2401 |
| 2247 SpdyPushPromiseIR push_promise(41, 58); | 2402 SpdyPushPromiseIR push_promise(41, 58); |
| 2248 push_promise.set_padding_len(1); | 2403 push_promise.set_padding_len(1); |
| 2249 push_promise.SetHeader("bar", "foo"); | 2404 push_promise.SetHeader("bar", "foo"); |
| 2250 push_promise.SetHeader("foo", "bar"); | 2405 push_promise.SetHeader("foo", "bar"); |
| 2251 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); | 2406 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
| 2407 if (use_output_) { |
| 2408 output_.Reset(); |
| 2409 ASSERT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
| 2410 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2411 } |
| 2252 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2412 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2253 } | 2413 } |
| 2254 | 2414 |
| 2255 { | 2415 { |
| 2256 // Test framing PUSH_PROMISE with 177 bytes of padding. | 2416 // Test framing PUSH_PROMISE with 177 bytes of padding. |
| 2257 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 2417 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 2258 const char kDescription[] = "PUSH_PROMISE frame with 177 bytes of padding"; | 2418 const char kDescription[] = "PUSH_PROMISE frame with 177 bytes of padding"; |
| 2259 | 2419 |
| 2260 // frame-format off | 2420 // frame-format off |
| 2261 // clang-format off | 2421 // clang-format off |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 2458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 2299 }; | 2459 }; |
| 2300 // clang-format on | 2460 // clang-format on |
| 2301 // frame-format on | 2461 // frame-format on |
| 2302 | 2462 |
| 2303 SpdyPushPromiseIR push_promise(42, 57); | 2463 SpdyPushPromiseIR push_promise(42, 57); |
| 2304 push_promise.set_padding_len(177); | 2464 push_promise.set_padding_len(177); |
| 2305 push_promise.SetHeader("bar", "foo"); | 2465 push_promise.SetHeader("bar", "foo"); |
| 2306 push_promise.SetHeader("foo", "bar"); | 2466 push_promise.SetHeader("foo", "bar"); |
| 2307 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); | 2467 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
| 2468 if (use_output_) { |
| 2469 output_.Reset(); |
| 2470 ASSERT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
| 2471 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2472 } |
| 2308 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2473 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2309 } | 2474 } |
| 2310 } | 2475 } |
| 2311 | 2476 |
| 2312 // Regression test for https://crbug.com/464748. | 2477 // Regression test for https://crbug.com/464748. |
| 2313 TEST_P(SpdyFramerTest, GetNumberRequiredContinuationFrames) { | 2478 TEST_P(SpdyFramerTest, GetNumberRequiredContinuationFrames) { |
| 2314 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2479 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2315 EXPECT_EQ(1u, SpdyFramerPeer::GetNumberRequiredContinuationFrames( | 2480 EXPECT_EQ(1u, SpdyFramerPeer::GetNumberRequiredContinuationFrames( |
| 2316 &framer, 16383 + 16374)); | 2481 &framer, 16383 + 16374)); |
| 2317 EXPECT_EQ(2u, SpdyFramerPeer::GetNumberRequiredContinuationFrames( | 2482 EXPECT_EQ(2u, SpdyFramerPeer::GetNumberRequiredContinuationFrames( |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2353 auto buffer = base::MakeUnique<string>(); | 2518 auto buffer = base::MakeUnique<string>(); |
| 2354 HpackEncoder encoder(ObtainHpackHuffmanTable()); | 2519 HpackEncoder encoder(ObtainHpackHuffmanTable()); |
| 2355 encoder.DisableCompression(); | 2520 encoder.DisableCompression(); |
| 2356 encoder.EncodeHeaderSet(header_block, buffer.get()); | 2521 encoder.EncodeHeaderSet(header_block, buffer.get()); |
| 2357 | 2522 |
| 2358 SpdyContinuationIR continuation(42); | 2523 SpdyContinuationIR continuation(42); |
| 2359 continuation.take_encoding(std::move(buffer)); | 2524 continuation.take_encoding(std::move(buffer)); |
| 2360 continuation.set_end_headers(true); | 2525 continuation.set_end_headers(true); |
| 2361 | 2526 |
| 2362 SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); | 2527 SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); |
| 2528 if (use_output_) { |
| 2529 ASSERT_TRUE(framer.SerializeContinuation(continuation, &output_)); |
| 2530 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2531 } |
| 2363 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2532 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2364 } | 2533 } |
| 2365 | 2534 |
| 2366 // Test that if we send an unexpected CONTINUATION | 2535 // Test that if we send an unexpected CONTINUATION |
| 2367 // we signal an error (but don't crash). | 2536 // we signal an error (but don't crash). |
| 2368 TEST_P(SpdyFramerTest, SendUnexpectedContinuation) { | 2537 TEST_P(SpdyFramerTest, SendUnexpectedContinuation) { |
| 2369 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 2538 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 2370 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2539 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2371 framer.set_visitor(&visitor); | 2540 framer.set_visitor(&visitor); |
| 2372 | 2541 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2457 0x78, 0x78, 0x78, 0x78, // xxxx | 2626 0x78, 0x78, 0x78, 0x78, // xxxx |
| 2458 0x78, // x | 2627 0x78, // x |
| 2459 }; | 2628 }; |
| 2460 // frame-format on | 2629 // frame-format on |
| 2461 | 2630 |
| 2462 SpdyPushPromiseIR push_promise(42, 57); | 2631 SpdyPushPromiseIR push_promise(42, 57); |
| 2463 push_promise.set_padding_len(1); | 2632 push_promise.set_padding_len(1); |
| 2464 string big_value(TestSpdyVisitor::sent_control_frame_max_size(), 'x'); | 2633 string big_value(TestSpdyVisitor::sent_control_frame_max_size(), 'x'); |
| 2465 push_promise.SetHeader("xxx", big_value); | 2634 push_promise.SetHeader("xxx", big_value); |
| 2466 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); | 2635 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
| 2636 if (use_output_) { |
| 2637 ASSERT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
| 2638 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2639 } |
| 2467 | 2640 |
| 2468 // The entire frame should look like below: | 2641 // The entire frame should look like below: |
| 2469 // Name Length in Byte | 2642 // Name Length in Byte |
| 2470 // ------------------------------------------- Begin of PUSH_PROMISE frame | 2643 // ------------------------------------------- Begin of PUSH_PROMISE frame |
| 2471 // PUSH_PROMISE header 9 | 2644 // PUSH_PROMISE header 9 |
| 2472 // Pad length field 1 | 2645 // Pad length field 1 |
| 2473 // Promised stream 4 | 2646 // Promised stream 4 |
| 2474 // Length field of key 2 | 2647 // Length field of key 2 |
| 2475 // Content of key 3 | 2648 // Content of key 3 |
| 2476 // Length field of value 3 | 2649 // Length field of value 3 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2515 's', 't', ':', '1', '2', '3', '"', ';', ' ', 'm', 'a', '=', | 2688 's', 't', ':', '1', '2', '3', '"', ';', ' ', 'm', 'a', '=', |
| 2516 '4', '2', ';', ' ', 'v', '=', '"', '2', '4', '"'}; | 2689 '4', '2', ';', ' ', 'v', '=', '"', '2', '4', '"'}; |
| 2517 SpdyAltSvcIR altsvc_ir(3); | 2690 SpdyAltSvcIR altsvc_ir(3); |
| 2518 altsvc_ir.set_origin("origin"); | 2691 altsvc_ir.set_origin("origin"); |
| 2519 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( | 2692 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 2520 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); | 2693 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); |
| 2521 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( | 2694 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 2522 "p\"=i:d", "h_\\o\"st", 123, 42, | 2695 "p\"=i:d", "h_\\o\"st", 123, 42, |
| 2523 SpdyAltSvcWireFormat::VersionVector{24})); | 2696 SpdyAltSvcWireFormat::VersionVector{24})); |
| 2524 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); | 2697 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
| 2698 if (use_output_) { |
| 2699 ASSERT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); |
| 2700 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2701 } |
| 2525 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2702 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2526 } | 2703 } |
| 2527 | 2704 |
| 2528 TEST_P(SpdyFramerTest, CreatePriority) { | 2705 TEST_P(SpdyFramerTest, CreatePriority) { |
| 2529 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2706 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2530 | 2707 |
| 2531 const char kDescription[] = "PRIORITY frame"; | 2708 const char kDescription[] = "PRIORITY frame"; |
| 2532 const unsigned char kFrameData[] = { | 2709 const unsigned char kFrameData[] = { |
| 2533 0x00, 0x00, 0x05, // Length: 5 | 2710 0x00, 0x00, 0x05, // Length: 5 |
| 2534 0x02, // Type: PRIORITY | 2711 0x02, // Type: PRIORITY |
| 2535 0x00, // Flags: none | 2712 0x00, // Flags: none |
| 2536 0x00, 0x00, 0x00, 0x02, // Stream: 2 | 2713 0x00, 0x00, 0x00, 0x02, // Stream: 2 |
| 2537 0x80, 0x00, 0x00, 0x01, // Parent: 1 (Exclusive) | 2714 0x80, 0x00, 0x00, 0x01, // Parent: 1 (Exclusive) |
| 2538 0x10, // Weight: 17 | 2715 0x10, // Weight: 17 |
| 2539 }; | 2716 }; |
| 2540 SpdyPriorityIR priority_ir(2, 1, 17, true); | 2717 SpdyPriorityIR priority_ir(2, 1, 17, true); |
| 2541 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); | 2718 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); |
| 2719 if (use_output_) { |
| 2720 ASSERT_TRUE(framer.SerializeFrame(priority_ir, &output_)); |
| 2721 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2722 } |
| 2542 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2723 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2543 SpdyPriorityIR priority2(2); | 2724 SpdyPriorityIR priority2(2); |
| 2544 priority2.set_parent_stream_id(1); | 2725 priority2.set_parent_stream_id(1); |
| 2545 priority2.set_weight(17); | 2726 priority2.set_weight(17); |
| 2546 priority2.set_exclusive(true); | 2727 priority2.set_exclusive(true); |
| 2547 frame = framer.SerializeFrame(priority2); | 2728 if (use_output_) { |
| 2729 output_.Reset(); |
| 2730 ASSERT_TRUE(framer.SerializeFrame(priority2, &output_)); |
| 2731 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2732 } else { |
| 2733 frame = framer.SerializeFrame(priority2); |
| 2734 } |
| 2548 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2735 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2549 } | 2736 } |
| 2550 | 2737 |
| 2551 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { | 2738 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { |
| 2552 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2739 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2553 SpdyHeadersIR headers_ir(1); | 2740 SpdyHeadersIR headers_ir(1); |
| 2554 headers_ir.SetHeader("alpha", "beta"); | 2741 headers_ir.SetHeader("alpha", "beta"); |
| 2555 headers_ir.SetHeader("gamma", "delta"); | 2742 headers_ir.SetHeader("gamma", "delta"); |
| 2556 SpdySerializedFrame control_frame( | 2743 SpdySerializedFrame control_frame(SpdyFramerPeer::SerializeHeaders( |
| 2557 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 2744 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 2558 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); | 2745 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
| 2559 visitor.SimulateInFramer( | 2746 visitor.SimulateInFramer( |
| 2560 reinterpret_cast<unsigned char*>(control_frame.data()), | 2747 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 2561 control_frame.size()); | 2748 control_frame.size()); |
| 2562 EXPECT_EQ(1, visitor.headers_frame_count_); | 2749 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 2563 EXPECT_EQ(0, visitor.control_frame_header_data_count_); | 2750 EXPECT_EQ(0, visitor.control_frame_header_data_count_); |
| 2564 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 2751 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 2565 EXPECT_EQ(0, visitor.end_of_stream_count_); | 2752 EXPECT_EQ(0, visitor.end_of_stream_count_); |
| 2566 EXPECT_EQ(headers_ir.header_block(), visitor.headers_); | 2753 EXPECT_EQ(headers_ir.header_block(), visitor.headers_); |
| 2567 } | 2754 } |
| 2568 | 2755 |
| 2569 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { | 2756 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { |
| 2570 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2757 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2571 SpdyHeadersIR headers_ir(1); | 2758 SpdyHeadersIR headers_ir(1); |
| 2572 headers_ir.set_fin(true); | 2759 headers_ir.set_fin(true); |
| 2573 headers_ir.SetHeader("alpha", "beta"); | 2760 headers_ir.SetHeader("alpha", "beta"); |
| 2574 headers_ir.SetHeader("gamma", "delta"); | 2761 headers_ir.SetHeader("gamma", "delta"); |
| 2575 SpdySerializedFrame control_frame( | 2762 SpdySerializedFrame control_frame(SpdyFramerPeer::SerializeHeaders( |
| 2576 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 2763 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 2577 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); | 2764 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
| 2578 visitor.SimulateInFramer( | 2765 visitor.SimulateInFramer( |
| 2579 reinterpret_cast<unsigned char*>(control_frame.data()), | 2766 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 2580 control_frame.size()); | 2767 control_frame.size()); |
| 2581 EXPECT_EQ(1, visitor.headers_frame_count_); | 2768 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 2582 EXPECT_EQ(0, visitor.control_frame_header_data_count_); | 2769 EXPECT_EQ(0, visitor.control_frame_header_data_count_); |
| 2583 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 2770 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 2584 EXPECT_EQ(1, visitor.end_of_stream_count_); | 2771 EXPECT_EQ(1, visitor.end_of_stream_count_); |
| 2585 EXPECT_EQ(headers_ir.header_block(), visitor.headers_); | 2772 EXPECT_EQ(headers_ir.header_block(), visitor.headers_); |
| 2586 } | 2773 } |
| 2587 | 2774 |
| 2588 TEST_P(SpdyFramerTest, TooLargeHeadersFrameUsesContinuation) { | 2775 TEST_P(SpdyFramerTest, TooLargeHeadersFrameUsesContinuation) { |
| 2589 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 2776 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 2590 SpdyHeadersIR headers(1); | 2777 SpdyHeadersIR headers(1); |
| 2591 headers.set_padding_len(256); | 2778 headers.set_padding_len(256); |
| 2592 | 2779 |
| 2593 // Exact payload length will change with HPACK, but this should be long | 2780 // Exact payload length will change with HPACK, but this should be long |
| 2594 // enough to cause an overflow. | 2781 // enough to cause an overflow. |
| 2595 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); | 2782 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); |
| 2596 string big_value(kBigValueSize, 'x'); | 2783 string big_value(kBigValueSize, 'x'); |
| 2597 headers.SetHeader("aa", big_value); | 2784 headers.SetHeader("aa", big_value); |
| 2598 SpdySerializedFrame control_frame( | 2785 SpdySerializedFrame control_frame(SpdyFramerPeer::SerializeHeaders( |
| 2599 SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 2786 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 2600 EXPECT_GT(control_frame.size(), | 2787 EXPECT_GT(control_frame.size(), |
| 2601 TestSpdyVisitor::sent_control_frame_max_size()); | 2788 TestSpdyVisitor::sent_control_frame_max_size()); |
| 2602 | 2789 |
| 2603 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 2790 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 2604 visitor.SimulateInFramer( | 2791 visitor.SimulateInFramer( |
| 2605 reinterpret_cast<unsigned char*>(control_frame.data()), | 2792 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 2606 control_frame.size()); | 2793 control_frame.size()); |
| 2607 EXPECT_TRUE(visitor.header_buffer_valid_); | 2794 EXPECT_TRUE(visitor.header_buffer_valid_); |
| 2608 EXPECT_EQ(0, visitor.error_count_); | 2795 EXPECT_EQ(0, visitor.error_count_); |
| 2609 EXPECT_EQ(1, visitor.headers_frame_count_); | 2796 EXPECT_EQ(1, visitor.headers_frame_count_); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2676 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 2863 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 2677 SpdyPushPromiseIR push_promise(1, 2); | 2864 SpdyPushPromiseIR push_promise(1, 2); |
| 2678 push_promise.set_padding_len(256); | 2865 push_promise.set_padding_len(256); |
| 2679 | 2866 |
| 2680 // Exact payload length will change with HPACK, but this should be long | 2867 // Exact payload length will change with HPACK, but this should be long |
| 2681 // enough to cause an overflow. | 2868 // enough to cause an overflow. |
| 2682 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); | 2869 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); |
| 2683 string big_value(kBigValueSize, 'x'); | 2870 string big_value(kBigValueSize, 'x'); |
| 2684 push_promise.SetHeader("aa", big_value); | 2871 push_promise.SetHeader("aa", big_value); |
| 2685 SpdySerializedFrame control_frame(framer.SerializePushPromise(push_promise)); | 2872 SpdySerializedFrame control_frame(framer.SerializePushPromise(push_promise)); |
| 2873 if (use_output_) { |
| 2874 ASSERT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
| 2875 control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2876 } |
| 2686 EXPECT_GT(control_frame.size(), | 2877 EXPECT_GT(control_frame.size(), |
| 2687 TestSpdyVisitor::sent_control_frame_max_size()); | 2878 TestSpdyVisitor::sent_control_frame_max_size()); |
| 2688 | 2879 |
| 2689 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 2880 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 2690 visitor.SimulateInFramer( | 2881 visitor.SimulateInFramer( |
| 2691 reinterpret_cast<unsigned char*>(control_frame.data()), | 2882 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 2692 control_frame.size()); | 2883 control_frame.size()); |
| 2693 EXPECT_TRUE(visitor.header_buffer_valid_); | 2884 EXPECT_TRUE(visitor.header_buffer_valid_); |
| 2694 EXPECT_EQ(0, visitor.error_count_); | 2885 EXPECT_EQ(0, visitor.error_count_); |
| 2695 EXPECT_EQ(1, visitor.push_promise_frame_count_); | 2886 EXPECT_EQ(1, visitor.push_promise_frame_count_); |
| 2696 EXPECT_EQ(1, visitor.continuation_count_); | 2887 EXPECT_EQ(1, visitor.continuation_count_); |
| 2697 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 2888 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 2698 } | 2889 } |
| 2699 | 2890 |
| 2700 // Check that the framer stops delivering header data chunks once the visitor | 2891 // Check that the framer stops delivering header data chunks once the visitor |
| 2701 // declares it doesn't want any more. This is important to guard against | 2892 // declares it doesn't want any more. This is important to guard against |
| 2702 // "zip bomb" types of attacks. | 2893 // "zip bomb" types of attacks. |
| 2703 TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) { | 2894 TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) { |
| 2704 const size_t kHeaderBufferChunks = 4; | 2895 const size_t kHeaderBufferChunks = 4; |
| 2705 const size_t kHeaderBufferSize = | 2896 const size_t kHeaderBufferSize = |
| 2706 TestSpdyVisitor::header_data_chunk_max_size() * kHeaderBufferChunks; | 2897 TestSpdyVisitor::header_data_chunk_max_size() * kHeaderBufferChunks; |
| 2707 const size_t kBigValueSize = kHeaderBufferSize * 2; | 2898 const size_t kBigValueSize = kHeaderBufferSize * 2; |
| 2708 string big_value(kBigValueSize, 'x'); | 2899 string big_value(kBigValueSize, 'x'); |
| 2709 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2900 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2710 SpdyHeadersIR headers(1); | 2901 SpdyHeadersIR headers(1); |
| 2711 headers.set_fin(true); | 2902 headers.set_fin(true); |
| 2712 headers.SetHeader("aa", big_value); | 2903 headers.SetHeader("aa", big_value); |
| 2713 SpdySerializedFrame control_frame( | 2904 SpdySerializedFrame control_frame(SpdyFramerPeer::SerializeHeaders( |
| 2714 SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 2905 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 2715 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); | 2906 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
| 2716 visitor.set_header_buffer_size(kHeaderBufferSize); | 2907 visitor.set_header_buffer_size(kHeaderBufferSize); |
| 2717 visitor.SimulateInFramer( | 2908 visitor.SimulateInFramer( |
| 2718 reinterpret_cast<unsigned char*>(control_frame.data()), | 2909 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 2719 control_frame.size()); | 2910 control_frame.size()); |
| 2720 // It's up to the visitor to ignore extraneous header data; the framer | 2911 // It's up to the visitor to ignore extraneous header data; the framer |
| 2721 // won't throw an error. | 2912 // won't throw an error. |
| 2722 EXPECT_GT(visitor.header_bytes_received_, visitor.header_buffer_size_); | 2913 EXPECT_GT(visitor.header_bytes_received_, visitor.header_buffer_size_); |
| 2723 EXPECT_EQ(1, visitor.end_of_stream_count_); | 2914 EXPECT_EQ(1, visitor.end_of_stream_count_); |
| 2724 } | 2915 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2758 visitor.framer_.spdy_framer_error()) | 2949 visitor.framer_.spdy_framer_error()) |
| 2759 << SpdyFramer::SpdyFramerErrorToString( | 2950 << SpdyFramer::SpdyFramerErrorToString( |
| 2760 visitor.framer_.spdy_framer_error()); | 2951 visitor.framer_.spdy_framer_error()); |
| 2761 EXPECT_EQ(0, visitor.goaway_count_); // Frame not parsed. | 2952 EXPECT_EQ(0, visitor.goaway_count_); // Frame not parsed. |
| 2762 } | 2953 } |
| 2763 | 2954 |
| 2764 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) { | 2955 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) { |
| 2765 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2956 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2766 SpdySettingsIR settings_ir; | 2957 SpdySettingsIR settings_ir; |
| 2767 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); | 2958 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
| 2959 if (use_output_) { |
| 2960 ASSERT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
| 2961 control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2962 } |
| 2768 SetFrameLength(&control_frame, 0); | 2963 SetFrameLength(&control_frame, 0); |
| 2769 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 2964 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 2770 visitor.SimulateInFramer( | 2965 visitor.SimulateInFramer( |
| 2771 reinterpret_cast<unsigned char*>(control_frame.data()), | 2966 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 2772 framer.GetFrameHeaderSize()); | 2967 framer.GetFrameHeaderSize()); |
| 2773 // Zero-len settings frames are permitted as of HTTP/2. | 2968 // Zero-len settings frames are permitted as of HTTP/2. |
| 2774 EXPECT_EQ(0, visitor.error_count_); | 2969 EXPECT_EQ(0, visitor.error_count_); |
| 2775 } | 2970 } |
| 2776 | 2971 |
| 2777 // Tests handling of SETTINGS frames with invalid length. | 2972 // Tests handling of SETTINGS frames with invalid length. |
| 2778 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { | 2973 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { |
| 2779 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2974 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2780 SpdySettingsIR settings_ir; | 2975 SpdySettingsIR settings_ir; |
| 2781 | 2976 |
| 2782 // Add settings to more than fill the frame so that we don't get a buffer | 2977 // Add settings to more than fill the frame so that we don't get a buffer |
| 2783 // overflow when calling SimulateInFramer() below. These settings must be | 2978 // overflow when calling SimulateInFramer() below. These settings must be |
| 2784 // distinct parameters because SpdySettingsIR has a map for settings, and will | 2979 // distinct parameters because SpdySettingsIR has a map for settings, and will |
| 2785 // collapse multiple copies of the same parameter. | 2980 // collapse multiple copies of the same parameter. |
| 2786 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0x00000002); | 2981 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0x00000002); |
| 2787 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 0x00000002); | 2982 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 0x00000002); |
| 2788 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); | 2983 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
| 2984 if (use_output_) { |
| 2985 ASSERT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
| 2986 control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2987 } |
| 2789 const size_t kNewLength = 8; | 2988 const size_t kNewLength = 8; |
| 2790 SetFrameLength(&control_frame, kNewLength); | 2989 SetFrameLength(&control_frame, kNewLength); |
| 2791 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 2990 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 2792 visitor.SimulateInFramer( | 2991 visitor.SimulateInFramer( |
| 2793 reinterpret_cast<unsigned char*>(control_frame.data()), | 2992 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 2794 framer.GetFrameHeaderSize() + kNewLength); | 2993 framer.GetFrameHeaderSize() + kNewLength); |
| 2795 // Should generate an error, since its not possible to have a | 2994 // Should generate an error, since its not possible to have a |
| 2796 // settings frame of length kNewLength. | 2995 // settings frame of length kNewLength. |
| 2797 EXPECT_EQ(1, visitor.error_count_); | 2996 EXPECT_EQ(1, visitor.error_count_); |
| 2798 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE, | 2997 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE, |
| 2799 visitor.framer_.spdy_framer_error()) | 2998 visitor.framer_.spdy_framer_error()) |
| 2800 << SpdyFramer::SpdyFramerErrorToString( | 2999 << SpdyFramer::SpdyFramerErrorToString( |
| 2801 visitor.framer_.spdy_framer_error()); | 3000 visitor.framer_.spdy_framer_error()); |
| 2802 } | 3001 } |
| 2803 | 3002 |
| 2804 // Tests handling of SETTINGS frames larger than the frame buffer size. | 3003 // Tests handling of SETTINGS frames larger than the frame buffer size. |
| 2805 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { | 3004 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { |
| 2806 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3005 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2807 SpdySettingsIR settings_ir; | 3006 SpdySettingsIR settings_ir; |
| 2808 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 5); | 3007 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 5); |
| 2809 settings_ir.AddSetting(SETTINGS_ENABLE_PUSH, 6); | 3008 settings_ir.AddSetting(SETTINGS_ENABLE_PUSH, 6); |
| 2810 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 7); | 3009 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 7); |
| 2811 | 3010 |
| 2812 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); | 3011 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
| 3012 if (use_output_) { |
| 3013 ASSERT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
| 3014 control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 3015 } |
| 3016 |
| 2813 EXPECT_LT(SpdyFramerPeer::ControlFrameBufferSize(), control_frame.size()); | 3017 EXPECT_LT(SpdyFramerPeer::ControlFrameBufferSize(), control_frame.size()); |
| 2814 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 3018 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 2815 | 3019 |
| 2816 // Read all at once. | 3020 // Read all at once. |
| 2817 visitor.SimulateInFramer( | 3021 visitor.SimulateInFramer( |
| 2818 reinterpret_cast<unsigned char*>(control_frame.data()), | 3022 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 2819 control_frame.size()); | 3023 control_frame.size()); |
| 2820 EXPECT_EQ(0, visitor.error_count_); | 3024 EXPECT_EQ(0, visitor.error_count_); |
| 2821 EXPECT_EQ(3, visitor.setting_count_); | 3025 EXPECT_EQ(3, visitor.setting_count_); |
| 2822 EXPECT_EQ(1, visitor.settings_ack_sent_); | 3026 EXPECT_EQ(1, visitor.settings_ack_sent_); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3014 EXPECT_CALL(visitor, OnStreamPadding(1, 18)); | 3218 EXPECT_CALL(visitor, OnStreamPadding(1, 18)); |
| 3015 CHECK_EQ(18u, framer.ProcessInput(frame.data() + bytes_consumed, 18)); | 3219 CHECK_EQ(18u, framer.ProcessInput(frame.data() + bytes_consumed, 18)); |
| 3016 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READY_FOR_FRAME); | 3220 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READY_FOR_FRAME); |
| 3017 CHECK_EQ(framer.spdy_framer_error(), SpdyFramer::SPDY_NO_ERROR); | 3221 CHECK_EQ(framer.spdy_framer_error(), SpdyFramer::SPDY_NO_ERROR); |
| 3018 } | 3222 } |
| 3019 | 3223 |
| 3020 TEST_P(SpdyFramerTest, ReadWindowUpdate) { | 3224 TEST_P(SpdyFramerTest, ReadWindowUpdate) { |
| 3021 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3225 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3022 SpdySerializedFrame control_frame( | 3226 SpdySerializedFrame control_frame( |
| 3023 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); | 3227 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); |
| 3228 if (use_output_) { |
| 3229 ASSERT_TRUE( |
| 3230 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2), &output_)); |
| 3231 control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 3232 } |
| 3024 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 3233 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 3025 visitor.SimulateInFramer( | 3234 visitor.SimulateInFramer( |
| 3026 reinterpret_cast<unsigned char*>(control_frame.data()), | 3235 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 3027 control_frame.size()); | 3236 control_frame.size()); |
| 3028 EXPECT_EQ(1u, visitor.last_window_update_stream_); | 3237 EXPECT_EQ(1u, visitor.last_window_update_stream_); |
| 3029 EXPECT_EQ(2, visitor.last_window_update_delta_); | 3238 EXPECT_EQ(2, visitor.last_window_update_delta_); |
| 3030 } | 3239 } |
| 3031 | 3240 |
| 3032 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { | 3241 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { |
| 3033 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3242 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3034 SpdyPushPromiseIR push_promise(42, 57); | 3243 SpdyPushPromiseIR push_promise(42, 57); |
| 3035 push_promise.SetHeader("foo", "bar"); | 3244 push_promise.SetHeader("foo", "bar"); |
| 3036 push_promise.SetHeader("bar", "foofoo"); | 3245 push_promise.SetHeader("bar", "foofoo"); |
| 3037 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); | 3246 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
| 3247 if (use_output_) { |
| 3248 // Use a new framer to clean up the hpack dynamic table. |
| 3249 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3250 ASSERT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
| 3251 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 3252 } |
| 3038 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); | 3253 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
| 3039 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), | 3254 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
| 3040 frame.size()); | 3255 frame.size()); |
| 3041 EXPECT_EQ(42u, visitor.last_push_promise_stream_); | 3256 EXPECT_EQ(42u, visitor.last_push_promise_stream_); |
| 3042 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); | 3257 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); |
| 3043 EXPECT_EQ(push_promise.header_block(), visitor.headers_); | 3258 EXPECT_EQ(push_promise.header_block(), visitor.headers_); |
| 3044 } | 3259 } |
| 3045 | 3260 |
| 3046 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { | 3261 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
| 3047 // frame-format off | 3262 // frame-format off |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3453 // Simulate the case where the stream id validation checks out. | 3668 // Simulate the case where the stream id validation checks out. |
| 3454 visitor.on_unknown_frame_result_ = true; | 3669 visitor.on_unknown_frame_result_ = true; |
| 3455 visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame)); | 3670 visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame)); |
| 3456 EXPECT_EQ(0, visitor.error_count_); | 3671 EXPECT_EQ(0, visitor.error_count_); |
| 3457 | 3672 |
| 3458 // Follow it up with a valid control frame to make sure we handle | 3673 // Follow it up with a valid control frame to make sure we handle |
| 3459 // subsequent frames correctly. | 3674 // subsequent frames correctly. |
| 3460 SpdySettingsIR settings_ir; | 3675 SpdySettingsIR settings_ir; |
| 3461 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 10); | 3676 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 10); |
| 3462 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); | 3677 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
| 3678 if (use_output_) { |
| 3679 ASSERT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
| 3680 control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 3681 } |
| 3463 visitor.SimulateInFramer( | 3682 visitor.SimulateInFramer( |
| 3464 reinterpret_cast<unsigned char*>(control_frame.data()), | 3683 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 3465 control_frame.size()); | 3684 control_frame.size()); |
| 3466 EXPECT_EQ(0, visitor.error_count_); | 3685 EXPECT_EQ(0, visitor.error_count_); |
| 3467 EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_)); | 3686 EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_)); |
| 3468 EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_)); | 3687 EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_)); |
| 3469 } | 3688 } |
| 3470 | 3689 |
| 3471 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) { | 3690 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) { |
| 3472 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3691 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3662 do { | 3881 do { |
| 3663 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex | 3882 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex |
| 3664 << static_cast<int>(flags)); | 3883 << static_cast<int>(flags)); |
| 3665 | 3884 |
| 3666 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3885 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3667 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3886 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3668 framer.set_visitor(&visitor); | 3887 framer.set_visitor(&visitor); |
| 3669 | 3888 |
| 3670 SpdyRstStreamIR rst_stream(13, ERROR_CODE_CANCEL); | 3889 SpdyRstStreamIR rst_stream(13, ERROR_CODE_CANCEL); |
| 3671 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); | 3890 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
| 3891 if (use_output_) { |
| 3892 output_.Reset(); |
| 3893 ASSERT_TRUE(framer.SerializeRstStream(rst_stream, &output_)); |
| 3894 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 3895 } |
| 3672 SetFrameFlags(&frame, flags); | 3896 SetFrameFlags(&frame, flags); |
| 3673 | 3897 |
| 3674 EXPECT_CALL(visitor, OnRstStream(13, ERROR_CODE_CANCEL)); | 3898 EXPECT_CALL(visitor, OnRstStream(13, ERROR_CODE_CANCEL)); |
| 3675 | 3899 |
| 3676 framer.ProcessInput(frame.data(), frame.size()); | 3900 framer.ProcessInput(frame.data(), frame.size()); |
| 3677 | 3901 |
| 3678 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3902 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3679 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3903 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3680 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3904 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3681 } while (++flags != 0); | 3905 } while (++flags != 0); |
| 3682 } | 3906 } |
| 3683 | 3907 |
| 3684 TEST_P(SpdyFramerTest, SettingsFrameFlags) { | 3908 TEST_P(SpdyFramerTest, SettingsFrameFlags) { |
| 3685 uint8_t flags = 0; | 3909 uint8_t flags = 0; |
| 3686 do { | 3910 do { |
| 3687 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex | 3911 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex |
| 3688 << static_cast<int>(flags)); | 3912 << static_cast<int>(flags)); |
| 3689 | 3913 |
| 3690 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3914 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3691 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3915 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3692 framer.set_visitor(&visitor); | 3916 framer.set_visitor(&visitor); |
| 3693 | 3917 |
| 3694 SpdySettingsIR settings_ir; | 3918 SpdySettingsIR settings_ir; |
| 3695 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 16); | 3919 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 16); |
| 3696 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); | 3920 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); |
| 3921 if (use_output_) { |
| 3922 output_.Reset(); |
| 3923 ASSERT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
| 3924 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 3925 } |
| 3697 SetFrameFlags(&frame, flags); | 3926 SetFrameFlags(&frame, flags); |
| 3698 | 3927 |
| 3699 if (flags & SETTINGS_FLAG_ACK) { | 3928 if (flags & SETTINGS_FLAG_ACK) { |
| 3700 EXPECT_CALL(visitor, OnError(_)); | 3929 EXPECT_CALL(visitor, OnError(_)); |
| 3701 } else { | 3930 } else { |
| 3702 EXPECT_CALL(visitor, OnSettings(flags & SETTINGS_FLAG_ACK)); | 3931 EXPECT_CALL(visitor, OnSettings(flags & SETTINGS_FLAG_ACK)); |
| 3703 EXPECT_CALL(visitor, OnSetting(SETTINGS_INITIAL_WINDOW_SIZE, 16)); | 3932 EXPECT_CALL(visitor, OnSetting(SETTINGS_INITIAL_WINDOW_SIZE, 16)); |
| 3704 EXPECT_CALL(visitor, OnSettingsEnd()); | 3933 EXPECT_CALL(visitor, OnSettingsEnd()); |
| 3705 } | 3934 } |
| 3706 | 3935 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3724 do { | 3953 do { |
| 3725 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex | 3954 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex |
| 3726 << static_cast<int>(flags)); | 3955 << static_cast<int>(flags)); |
| 3727 | 3956 |
| 3728 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3957 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3729 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3958 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3730 framer.set_visitor(&visitor); | 3959 framer.set_visitor(&visitor); |
| 3731 | 3960 |
| 3732 SpdyGoAwayIR goaway_ir(97, ERROR_CODE_NO_ERROR, "test"); | 3961 SpdyGoAwayIR goaway_ir(97, ERROR_CODE_NO_ERROR, "test"); |
| 3733 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); | 3962 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
| 3963 if (use_output_) { |
| 3964 output_.Reset(); |
| 3965 ASSERT_TRUE(framer.SerializeGoAway(goaway_ir, &output_)); |
| 3966 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 3967 } |
| 3734 SetFrameFlags(&frame, flags); | 3968 SetFrameFlags(&frame, flags); |
| 3735 | 3969 |
| 3736 EXPECT_CALL(visitor, OnGoAway(97, ERROR_CODE_NO_ERROR)); | 3970 EXPECT_CALL(visitor, OnGoAway(97, ERROR_CODE_NO_ERROR)); |
| 3737 | 3971 |
| 3738 framer.ProcessInput(frame.data(), frame.size()); | 3972 framer.ProcessInput(frame.data(), frame.size()); |
| 3739 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 3973 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 3740 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 3974 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 3741 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 3975 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 3742 } while (++flags != 0); | 3976 } while (++flags != 0); |
| 3743 } | 3977 } |
| 3744 | 3978 |
| 3745 TEST_P(SpdyFramerTest, HeadersFrameFlags) { | 3979 TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
| 3746 uint8_t flags = 0; | 3980 uint8_t flags = 0; |
| 3747 do { | 3981 do { |
| 3748 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex | 3982 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex |
| 3749 << static_cast<int>(flags)); | 3983 << static_cast<int>(flags)); |
| 3750 | 3984 |
| 3751 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 3985 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3752 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 3986 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 3753 framer.set_visitor(&visitor); | 3987 framer.set_visitor(&visitor); |
| 3754 | 3988 |
| 3755 SpdyHeadersIR headers_ir(57); | 3989 SpdyHeadersIR headers_ir(57); |
| 3756 if (flags & HEADERS_FLAG_PRIORITY) { | 3990 if (flags & HEADERS_FLAG_PRIORITY) { |
| 3757 headers_ir.set_weight(3); | 3991 headers_ir.set_weight(3); |
| 3758 headers_ir.set_has_priority(true); | 3992 headers_ir.set_has_priority(true); |
| 3759 headers_ir.set_parent_stream_id(5); | 3993 headers_ir.set_parent_stream_id(5); |
| 3760 headers_ir.set_exclusive(true); | 3994 headers_ir.set_exclusive(true); |
| 3761 } | 3995 } |
| 3762 headers_ir.SetHeader("foo", "bar"); | 3996 headers_ir.SetHeader("foo", "bar"); |
| 3763 SpdySerializedFrame frame( | 3997 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
| 3764 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 3998 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 3765 uint8_t set_flags = flags & ~HEADERS_FLAG_PADDED; | 3999 uint8_t set_flags = flags & ~HEADERS_FLAG_PADDED; |
| 3766 SetFrameFlags(&frame, set_flags); | 4000 SetFrameFlags(&frame, set_flags); |
| 3767 | 4001 |
| 3768 // Expected callback values | 4002 // Expected callback values |
| 3769 SpdyStreamId stream_id = 57; | 4003 SpdyStreamId stream_id = 57; |
| 3770 bool has_priority = false; | 4004 bool has_priority = false; |
| 3771 SpdyPriority priority = 0; | 4005 SpdyPriority priority = 0; |
| 3772 SpdyStreamId parent_stream_id = 0; | 4006 SpdyStreamId parent_stream_id = 0; |
| 3773 bool exclusive = false; | 4007 bool exclusive = false; |
| 3774 bool fin = flags & CONTROL_FLAG_FIN; | 4008 bool fin = flags & CONTROL_FLAG_FIN; |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3900 framer.set_visitor(&visitor); | 4134 framer.set_visitor(&visitor); |
| 3901 framer.set_debug_visitor(&debug_visitor); | 4135 framer.set_debug_visitor(&debug_visitor); |
| 3902 | 4136 |
| 3903 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); | 4137 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); |
| 3904 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); | 4138 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); |
| 3905 EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false, false, false)); | 4139 EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false, false, false)); |
| 3906 EXPECT_CALL(visitor, OnHeaderFrameStart(42)).Times(1); | 4140 EXPECT_CALL(visitor, OnHeaderFrameStart(42)).Times(1); |
| 3907 | 4141 |
| 3908 SpdyHeadersIR headers_ir(42); | 4142 SpdyHeadersIR headers_ir(42); |
| 3909 headers_ir.SetHeader("foo", "bar"); | 4143 headers_ir.SetHeader("foo", "bar"); |
| 3910 SpdySerializedFrame frame0( | 4144 SpdySerializedFrame frame0(SpdyFramerPeer::SerializeHeaders( |
| 3911 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); | 4145 &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
| 3912 SetFrameFlags(&frame0, 0); | 4146 SetFrameFlags(&frame0, 0); |
| 3913 | 4147 |
| 3914 SpdyContinuationIR continuation(42); | 4148 SpdyContinuationIR continuation(42); |
| 3915 SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); | 4149 SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); |
| 4150 if (use_output_) { |
| 4151 output_.Reset(); |
| 4152 ASSERT_TRUE(framer.SerializeContinuation(continuation, &output_)); |
| 4153 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 4154 } |
| 3916 SetFrameFlags(&frame, flags); | 4155 SetFrameFlags(&frame, flags); |
| 3917 | 4156 |
| 3918 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, CONTINUATION, _)); | 4157 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, CONTINUATION, _)); |
| 3919 EXPECT_CALL(visitor, OnContinuation(42, flags & HEADERS_FLAG_END_HEADERS)); | 4158 EXPECT_CALL(visitor, OnContinuation(42, flags & HEADERS_FLAG_END_HEADERS)); |
| 3920 bool end = flags & HEADERS_FLAG_END_HEADERS; | 4159 bool end = flags & HEADERS_FLAG_END_HEADERS; |
| 3921 if (end) { | 4160 if (end) { |
| 3922 EXPECT_CALL(visitor, OnHeaderFrameEnd(42, _)).Times(1); | 4161 EXPECT_CALL(visitor, OnHeaderFrameEnd(42, _)).Times(1); |
| 3923 } | 4162 } |
| 3924 | 4163 |
| 3925 framer.ProcessInput(frame0.data(), frame0.size()); | 4164 framer.ProcessInput(frame0.data(), frame0.size()); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4022 const SpdyStreamId kStreamId = 0; | 4261 const SpdyStreamId kStreamId = 0; |
| 4023 | 4262 |
| 4024 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4263 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 4025 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 4264 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 4026 framer.set_visitor(&visitor); | 4265 framer.set_visitor(&visitor); |
| 4027 | 4266 |
| 4028 EXPECT_CALL(visitor, OnBlocked(kStreamId)); | 4267 EXPECT_CALL(visitor, OnBlocked(kStreamId)); |
| 4029 | 4268 |
| 4030 SpdyBlockedIR blocked_ir(0); | 4269 SpdyBlockedIR blocked_ir(0); |
| 4031 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir)); | 4270 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir)); |
| 4271 if (use_output_) { |
| 4272 output_.Reset(); |
| 4273 ASSERT_TRUE(framer.SerializeFrame(blocked_ir, &output_)); |
| 4274 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 4275 } |
| 4032 framer.ProcessInput(frame.data(), framer.GetBlockedSize()); | 4276 framer.ProcessInput(frame.data(), framer.GetBlockedSize()); |
| 4033 | 4277 |
| 4034 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4278 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 4035 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 4279 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 4036 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 4280 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 4037 } | 4281 } |
| 4038 | 4282 |
| 4039 TEST_P(SpdyFramerTest, OnAltSvcWithOrigin) { | 4283 TEST_P(SpdyFramerTest, OnAltSvcWithOrigin) { |
| 4040 const SpdyStreamId kStreamId = 0; // Stream id must be zero if origin given. | 4284 const SpdyStreamId kStreamId = 0; // Stream id must be zero if origin given. |
| 4041 | 4285 |
| 4042 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4286 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 4043 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 4287 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 4044 framer.set_visitor(&visitor); | 4288 framer.set_visitor(&visitor); |
| 4045 | 4289 |
| 4046 SpdyAltSvcWireFormat::AlternativeService altsvc1( | 4290 SpdyAltSvcWireFormat::AlternativeService altsvc1( |
| 4047 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()); | 4291 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()); |
| 4048 SpdyAltSvcWireFormat::AlternativeService altsvc2( | 4292 SpdyAltSvcWireFormat::AlternativeService altsvc2( |
| 4049 "p\"=i:d", "h_\\o\"st", 123, 42, SpdyAltSvcWireFormat::VersionVector{24}); | 4293 "p\"=i:d", "h_\\o\"st", 123, 42, SpdyAltSvcWireFormat::VersionVector{24}); |
| 4050 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; | 4294 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
| 4051 altsvc_vector.push_back(altsvc1); | 4295 altsvc_vector.push_back(altsvc1); |
| 4052 altsvc_vector.push_back(altsvc2); | 4296 altsvc_vector.push_back(altsvc2); |
| 4053 EXPECT_CALL(visitor, | 4297 EXPECT_CALL(visitor, |
| 4054 OnAltSvc(kStreamId, StringPiece("o_r|g!n"), altsvc_vector)); | 4298 OnAltSvc(kStreamId, StringPiece("o_r|g!n"), altsvc_vector)); |
| 4055 | 4299 |
| 4056 SpdyAltSvcIR altsvc_ir(kStreamId); | 4300 SpdyAltSvcIR altsvc_ir(kStreamId); |
| 4057 altsvc_ir.set_origin("o_r|g!n"); | 4301 altsvc_ir.set_origin("o_r|g!n"); |
| 4058 altsvc_ir.add_altsvc(altsvc1); | 4302 altsvc_ir.add_altsvc(altsvc1); |
| 4059 altsvc_ir.add_altsvc(altsvc2); | 4303 altsvc_ir.add_altsvc(altsvc2); |
| 4060 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); | 4304 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
| 4305 if (use_output_) { |
| 4306 output_.Reset(); |
| 4307 ASSERT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); |
| 4308 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 4309 } |
| 4061 framer.ProcessInput(frame.data(), frame.size()); | 4310 framer.ProcessInput(frame.data(), frame.size()); |
| 4062 | 4311 |
| 4063 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4312 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 4064 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 4313 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 4065 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 4314 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 4066 } | 4315 } |
| 4067 | 4316 |
| 4068 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) { | 4317 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) { |
| 4069 const SpdyStreamId kStreamId = 1; | 4318 const SpdyStreamId kStreamId = 1; |
| 4070 | 4319 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 4101 | 4350 |
| 4102 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 4351 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 4103 | 4352 |
| 4104 SpdyAltSvcIR altsvc_ir(kStreamId); | 4353 SpdyAltSvcIR altsvc_ir(kStreamId); |
| 4105 altsvc_ir.set_origin("o1"); | 4354 altsvc_ir.set_origin("o1"); |
| 4106 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( | 4355 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 4107 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); | 4356 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); |
| 4108 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( | 4357 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 4109 "", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector())); | 4358 "", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector())); |
| 4110 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); | 4359 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
| 4360 if (use_output_) { |
| 4361 output_.Reset(); |
| 4362 ASSERT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); |
| 4363 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 4364 } |
| 4111 framer.ProcessInput(frame.data(), frame.size()); | 4365 framer.ProcessInput(frame.data(), frame.size()); |
| 4112 | 4366 |
| 4113 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 4367 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
| 4114 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.spdy_framer_error()) | 4368 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.spdy_framer_error()) |
| 4115 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 4369 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 4116 } | 4370 } |
| 4117 | 4371 |
| 4118 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { | 4372 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { |
| 4119 const char kType = static_cast<unsigned char>(ALTSVC); | 4373 const char kType = static_cast<unsigned char>(ALTSVC); |
| 4120 const unsigned char kFrameDataOriginLenLargerThanFrame[] = { | 4374 const unsigned char kFrameDataOriginLenLargerThanFrame[] = { |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4223 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 4477 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
| 4224 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.spdy_framer_error()) | 4478 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.spdy_framer_error()) |
| 4225 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 4479 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 4226 } | 4480 } |
| 4227 | 4481 |
| 4228 // Tests handling of PRIORITY frames. | 4482 // Tests handling of PRIORITY frames. |
| 4229 TEST_P(SpdyFramerTest, ReadPriority) { | 4483 TEST_P(SpdyFramerTest, ReadPriority) { |
| 4230 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 4484 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 4231 SpdyPriorityIR priority(3, 1, 256, false); | 4485 SpdyPriorityIR priority(3, 1, 256, false); |
| 4232 SpdySerializedFrame frame(framer.SerializePriority(priority)); | 4486 SpdySerializedFrame frame(framer.SerializePriority(priority)); |
| 4487 if (use_output_) { |
| 4488 output_.Reset(); |
| 4489 ASSERT_TRUE(framer.SerializePriority(priority, &output_)); |
| 4490 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 4491 } |
| 4233 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4492 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 4234 framer.set_visitor(&visitor); | 4493 framer.set_visitor(&visitor); |
| 4235 EXPECT_CALL(visitor, OnPriority(3, 1, 256, false)); | 4494 EXPECT_CALL(visitor, OnPriority(3, 1, 256, false)); |
| 4236 framer.ProcessInput(frame.data(), frame.size()); | 4495 framer.ProcessInput(frame.data(), frame.size()); |
| 4237 | 4496 |
| 4238 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4497 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 4239 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 4498 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 4240 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 4499 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 4241 // TODO(mlavan): once we actually maintain a priority tree, | 4500 // TODO(mlavan): once we actually maintain a priority tree, |
| 4242 // check that state is adjusted correctly. | 4501 // check that state is adjusted correctly. |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4354 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 4613 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 4355 std::unique_ptr<TestSpdyVisitor> visitor( | 4614 std::unique_ptr<TestSpdyVisitor> visitor( |
| 4356 new TestSpdyVisitor(SpdyFramer::DISABLE_COMPRESSION)); | 4615 new TestSpdyVisitor(SpdyFramer::DISABLE_COMPRESSION)); |
| 4357 framer.set_visitor(visitor.get()); | 4616 framer.set_visitor(visitor.get()); |
| 4358 | 4617 |
| 4359 // Create two input frames. | 4618 // Create two input frames. |
| 4360 SpdyHeadersIR headers(1); | 4619 SpdyHeadersIR headers(1); |
| 4361 headers.SetHeader("alpha", "beta"); | 4620 headers.SetHeader("alpha", "beta"); |
| 4362 headers.SetHeader("gamma", "charlie"); | 4621 headers.SetHeader("gamma", "charlie"); |
| 4363 headers.SetHeader("cookie", "key1=value1; key2=value2"); | 4622 headers.SetHeader("cookie", "key1=value1; key2=value2"); |
| 4364 SpdySerializedFrame headers_frame( | 4623 SpdySerializedFrame headers_frame(SpdyFramerPeer::SerializeHeaders( |
| 4365 SpdyFramerPeer::SerializeHeaders(&framer, headers)); | 4624 &framer, headers, use_output_ ? &output_ : nullptr)); |
| 4366 | 4625 |
| 4367 const char four_score[] = "Four score and seven years ago"; | 4626 const char four_score[] = "Four score and seven years ago"; |
| 4368 SpdyDataIR four_score_ir(1, four_score); | 4627 SpdyDataIR four_score_ir(1, four_score); |
| 4369 SpdySerializedFrame four_score_frame(framer.SerializeData(four_score_ir)); | 4628 SpdySerializedFrame four_score_frame(framer.SerializeData(four_score_ir)); |
| 4370 | 4629 |
| 4371 // Put them in a single buffer (new variables here to make it easy to | 4630 // Put them in a single buffer (new variables here to make it easy to |
| 4372 // change the order and type of frames). | 4631 // change the order and type of frames). |
| 4373 SpdySerializedFrame frame1 = std::move(headers_frame); | 4632 SpdySerializedFrame frame1 = std::move(headers_frame); |
| 4374 SpdySerializedFrame frame2 = std::move(four_score_frame); | 4633 SpdySerializedFrame frame2 = std::move(four_score_frame); |
| 4375 | 4634 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4475 | 4734 |
| 4476 EXPECT_EQ(1, visitor->data_frame_count_); | 4735 EXPECT_EQ(1, visitor->data_frame_count_); |
| 4477 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); | 4736 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); |
| 4478 EXPECT_EQ(0, visitor->headers_frame_count_); | 4737 EXPECT_EQ(0, visitor->headers_frame_count_); |
| 4479 } | 4738 } |
| 4480 } | 4739 } |
| 4481 | 4740 |
| 4482 } // namespace test | 4741 } // namespace test |
| 4483 | 4742 |
| 4484 } // namespace net | 4743 } // namespace net |
| OLD | NEW |