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

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

Issue 2753043002: Create new versions of SerializeXXX() functions that uses pre-allocated buffer in SpdyFrameBuilder. (Closed)
Patch Set: git cl format Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698