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 |