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

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

Issue 1852423004: Implement SpdySerializedFrame move semantics. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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') | net/spdy/spdy_http_stream_unittest.cc » ('j') | 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>
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 size_t frame_len)); 48 size_t frame_len));
49 }; 49 };
50 50
51 class SpdyFramerTestUtil { 51 class SpdyFramerTestUtil {
52 public: 52 public:
53 // Decompress a single frame using the decompression context held by 53 // Decompress a single frame using the decompression context held by
54 // the SpdyFramer. The implemention is meant for use only in tests 54 // the SpdyFramer. The implemention is meant for use only in tests
55 // and will CHECK fail if the input is anything other than a single, 55 // and will CHECK fail if the input is anything other than a single,
56 // well-formed compressed frame. 56 // well-formed compressed frame.
57 // 57 //
58 // Returns a new decompressed SpdyFrame. 58 // Returns a new decompressed SpdySerializedFrame.
59 template<class SpdyFrameType> static SpdyFrame* DecompressFrame( 59 template <class SpdyFrameType>
60 SpdyFramer* framer, const SpdyFrameType& frame) { 60 static SpdySerializedFrame DecompressFrame(SpdyFramer* framer,
61 const SpdyFrameType& frame) {
61 DecompressionVisitor visitor(framer->protocol_version()); 62 DecompressionVisitor visitor(framer->protocol_version());
62 framer->set_visitor(&visitor); 63 framer->set_visitor(&visitor);
63 CHECK_EQ(frame.size(), framer->ProcessInput(frame.data(), frame.size())); 64 CHECK_EQ(frame.size(), framer->ProcessInput(frame.data(), frame.size()));
64 CHECK_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer->state()); 65 CHECK_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer->state());
65 framer->set_visitor(NULL); 66 framer->set_visitor(NULL);
66 67
67 char* buffer = visitor.ReleaseBuffer(); 68 char* buffer = visitor.ReleaseBuffer();
68 CHECK(buffer != NULL); 69 CHECK(buffer != NULL);
69 SpdyFrame* decompressed_frame = new SpdyFrame(buffer, visitor.size(), true); 70 SpdySerializedFrame decompressed_frame(buffer, visitor.size(), true);
70 SetFrameLength(decompressed_frame, 71 SetFrameLength(&decompressed_frame,
71 visitor.size() - framer->GetControlFrameHeaderSize(), 72 visitor.size() - framer->GetControlFrameHeaderSize(),
72 framer->protocol_version()); 73 framer->protocol_version());
73 return decompressed_frame; 74 return decompressed_frame;
74 } 75 }
75 76
76 class DecompressionVisitor : public SpdyFramerVisitorInterface { 77 class DecompressionVisitor : public SpdyFramerVisitorInterface {
77 public: 78 public:
78 explicit DecompressionVisitor(SpdyMajorVersion version) 79 explicit DecompressionVisitor(SpdyMajorVersion version)
79 : version_(version), size_(0), finished_(false) {} 80 : version_(version), size_(0), finished_(false) {}
80 81
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 SpdyPriority priority, 136 SpdyPriority priority,
136 bool fin, 137 bool fin,
137 bool unidirectional) override { 138 bool unidirectional) override {
138 SpdyFramer framer(version_); 139 SpdyFramer framer(version_);
139 framer.set_enable_compression(false); 140 framer.set_enable_compression(false);
140 SpdySynStreamIR syn_stream(stream_id); 141 SpdySynStreamIR syn_stream(stream_id);
141 syn_stream.set_associated_to_stream_id(associated_stream_id); 142 syn_stream.set_associated_to_stream_id(associated_stream_id);
142 syn_stream.set_priority(priority); 143 syn_stream.set_priority(priority);
143 syn_stream.set_fin(fin); 144 syn_stream.set_fin(fin);
144 syn_stream.set_unidirectional(unidirectional); 145 syn_stream.set_unidirectional(unidirectional);
145 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 146 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream));
146 ResetBuffer(); 147 ResetBuffer();
147 memcpy(buffer_.get(), frame->data(), framer.GetSynStreamMinimumSize()); 148 memcpy(buffer_.get(), frame.data(), framer.GetSynStreamMinimumSize());
148 size_ += framer.GetSynStreamMinimumSize(); 149 size_ += framer.GetSynStreamMinimumSize();
149 } 150 }
150 151
151 void OnSynReply(SpdyStreamId stream_id, bool fin) override { 152 void OnSynReply(SpdyStreamId stream_id, bool fin) override {
152 SpdyFramer framer(version_); 153 SpdyFramer framer(version_);
153 framer.set_enable_compression(false); 154 framer.set_enable_compression(false);
154 SpdyHeadersIR headers(stream_id); 155 SpdyHeadersIR headers(stream_id);
155 headers.set_fin(fin); 156 headers.set_fin(fin);
156 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); 157 SpdySerializedFrame frame(framer.SerializeHeaders(headers));
157 ResetBuffer(); 158 ResetBuffer();
158 memcpy(buffer_.get(), frame->data(), framer.GetHeadersMinimumSize()); 159 memcpy(buffer_.get(), frame.data(), framer.GetHeadersMinimumSize());
159 size_ += framer.GetSynStreamMinimumSize(); 160 size_ += framer.GetSynStreamMinimumSize();
160 } 161 }
161 162
162 void OnRstStream(SpdyStreamId stream_id, 163 void OnRstStream(SpdyStreamId stream_id,
163 SpdyRstStreamStatus status) override { 164 SpdyRstStreamStatus status) override {
164 LOG(FATAL); 165 LOG(FATAL);
165 } 166 }
166 void OnSetting(SpdySettingsIds id, uint8_t flags, uint32_t value) override { 167 void OnSetting(SpdySettingsIds id, uint8_t flags, uint32_t value) override {
167 LOG(FATAL); 168 LOG(FATAL);
168 } 169 }
(...skipping 12 matching lines...) Expand all
181 bool fin, 182 bool fin,
182 bool end) override { 183 bool end) override {
183 SpdyFramer framer(version_); 184 SpdyFramer framer(version_);
184 framer.set_enable_compression(false); 185 framer.set_enable_compression(false);
185 SpdyHeadersIR headers(stream_id); 186 SpdyHeadersIR headers(stream_id);
186 headers.set_has_priority(has_priority); 187 headers.set_has_priority(has_priority);
187 headers.set_priority(priority); 188 headers.set_priority(priority);
188 headers.set_parent_stream_id(parent_stream_id); 189 headers.set_parent_stream_id(parent_stream_id);
189 headers.set_exclusive(exclusive); 190 headers.set_exclusive(exclusive);
190 headers.set_fin(fin); 191 headers.set_fin(fin);
191 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); 192 SpdySerializedFrame frame(framer.SerializeHeaders(headers));
192 ResetBuffer(); 193 ResetBuffer();
193 memcpy(buffer_.get(), frame->data(), framer.GetHeadersMinimumSize()); 194 memcpy(buffer_.get(), frame.data(), framer.GetHeadersMinimumSize());
194 size_ += framer.GetHeadersMinimumSize(); 195 size_ += framer.GetHeadersMinimumSize();
195 } 196 }
196 197
197 void OnWindowUpdate(SpdyStreamId stream_id, 198 void OnWindowUpdate(SpdyStreamId stream_id,
198 int delta_window_size) override { 199 int delta_window_size) override {
199 LOG(FATAL); 200 LOG(FATAL);
200 } 201 }
201 202
202 void OnPushPromise(SpdyStreamId stream_id, 203 void OnPushPromise(SpdyStreamId stream_id,
203 SpdyStreamId promised_stream_id, 204 SpdyStreamId promised_stream_id,
204 bool end) override { 205 bool end) override {
205 SpdyFramer framer(version_); 206 SpdyFramer framer(version_);
206 framer.set_enable_compression(false); 207 framer.set_enable_compression(false);
207 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); 208 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id);
208 scoped_ptr<SpdyFrame> frame(framer.SerializePushPromise(push_promise)); 209 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
209 ResetBuffer(); 210 ResetBuffer();
210 memcpy(buffer_.get(), frame->data(), framer.GetPushPromiseMinimumSize()); 211 memcpy(buffer_.get(), frame.data(), framer.GetPushPromiseMinimumSize());
211 size_ += framer.GetPushPromiseMinimumSize(); 212 size_ += framer.GetPushPromiseMinimumSize();
212 } 213 }
213 214
214 void OnContinuation(SpdyStreamId stream_id, bool end) override { 215 void OnContinuation(SpdyStreamId stream_id, bool end) override {
215 LOG(FATAL); 216 LOG(FATAL);
216 } 217 }
217 218
218 void OnPriority(SpdyStreamId stream_id, 219 void OnPriority(SpdyStreamId stream_id,
219 SpdyStreamId parent_stream_id, 220 SpdyStreamId parent_stream_id,
220 uint8_t weight, 221 uint8_t weight,
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 static size_t ControlFrameBufferSize() { 619 static size_t ControlFrameBufferSize() {
619 return SpdyFramer::kControlFrameBufferSize; 620 return SpdyFramer::kControlFrameBufferSize;
620 } 621 }
621 static size_t GetNumberRequiredContinuationFrames(SpdyFramer* framer, 622 static size_t GetNumberRequiredContinuationFrames(SpdyFramer* framer,
622 size_t size) { 623 size_t size) {
623 return framer->GetNumberRequiredContinuationFrames(size); 624 return framer->GetNumberRequiredContinuationFrames(size);
624 } 625 }
625 }; 626 };
626 627
627 // Retrieves serialized headers from a HEADERS or SYN_STREAM frame. 628 // Retrieves serialized headers from a HEADERS or SYN_STREAM frame.
628 StringPiece GetSerializedHeaders(const SpdyFrame* frame, 629 StringPiece GetSerializedHeaders(const SpdySerializedFrame& frame,
629 const SpdyFramer& framer) { 630 const SpdyFramer& framer) {
630 SpdyFrameReader reader(frame->data(), frame->size()); 631 SpdyFrameReader reader(frame.data(), frame.size());
631 if (framer.protocol_version() == SPDY3) { 632 if (framer.protocol_version() == SPDY3) {
632 reader.Seek(2); // Seek past the frame length. 633 reader.Seek(2); // Seek past the frame length.
633 } else { 634 } else {
634 reader.Seek(3); // Seek past the frame length. 635 reader.Seek(3); // Seek past the frame length.
635 } 636 }
636 SpdyFrameType frame_type; 637 SpdyFrameType frame_type;
637 if (framer.protocol_version() == SPDY3) { 638 if (framer.protocol_version() == SPDY3) {
638 uint16_t serialized_type; 639 uint16_t serialized_type;
639 reader.ReadUInt16(&serialized_type); 640 reader.ReadUInt16(&serialized_type);
640 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), 641 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(),
641 serialized_type); 642 serialized_type);
642 DCHECK(frame_type == HEADERS || frame_type == SYN_STREAM) << frame_type; 643 DCHECK(frame_type == HEADERS || frame_type == SYN_STREAM) << frame_type;
643 } else { 644 } else {
644 uint8_t serialized_type; 645 uint8_t serialized_type;
645 reader.ReadUInt8(&serialized_type); 646 reader.ReadUInt8(&serialized_type);
646 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), 647 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(),
647 serialized_type); 648 serialized_type);
648 DCHECK_EQ(HEADERS, frame_type); 649 DCHECK_EQ(HEADERS, frame_type);
649 uint8_t flags; 650 uint8_t flags;
650 reader.ReadUInt8(&flags); 651 reader.ReadUInt8(&flags);
651 if (flags & HEADERS_FLAG_PRIORITY) { 652 if (flags & HEADERS_FLAG_PRIORITY) {
652 frame_type = SYN_STREAM; 653 frame_type = SYN_STREAM;
653 } 654 }
654 } 655 }
655 656
656 if (frame_type == SYN_STREAM) { 657 if (frame_type == SYN_STREAM) {
657 return StringPiece(frame->data() + framer.GetSynStreamMinimumSize(), 658 return StringPiece(frame.data() + framer.GetSynStreamMinimumSize(),
658 frame->size() - framer.GetSynStreamMinimumSize()); 659 frame.size() - framer.GetSynStreamMinimumSize());
659 } else { 660 } else {
660 return StringPiece(frame->data() + framer.GetHeadersMinimumSize(), 661 return StringPiece(frame.data() + framer.GetHeadersMinimumSize(),
661 frame->size() - framer.GetHeadersMinimumSize()); 662 frame.size() - framer.GetHeadersMinimumSize());
662 } 663 }
663 } 664 }
664 665
665 class SpdyFramerTest : public ::testing::TestWithParam<SpdyMajorVersion> { 666 class SpdyFramerTest : public ::testing::TestWithParam<SpdyMajorVersion> {
666 protected: 667 protected:
667 void SetUp() override { 668 void SetUp() override {
668 spdy_version_ = GetParam(); 669 spdy_version_ = GetParam();
669 } 670 }
670 671
671 void CompareFrame(const string& description, 672 void CompareFrame(const string& description,
672 const SpdyFrame& actual_frame, 673 const SpdySerializedFrame& actual_frame,
673 const unsigned char* expected, 674 const unsigned char* expected,
674 const int expected_len) { 675 const int expected_len) {
675 const unsigned char* actual = 676 const unsigned char* actual =
676 reinterpret_cast<const unsigned char*>(actual_frame.data()); 677 reinterpret_cast<const unsigned char*>(actual_frame.data());
677 CompareCharArraysWithHexError( 678 CompareCharArraysWithHexError(
678 description, actual, actual_frame.size(), expected, expected_len); 679 description, actual, actual_frame.size(), expected, expected_len);
679 } 680 }
680 681
681 void CompareFrames(const string& description, 682 void CompareFrames(const string& description,
682 const SpdyFrame& expected_frame, 683 const SpdySerializedFrame& expected_frame,
683 const SpdyFrame& actual_frame) { 684 const SpdySerializedFrame& actual_frame) {
684 CompareCharArraysWithHexError( 685 CompareCharArraysWithHexError(
685 description, 686 description,
686 reinterpret_cast<const unsigned char*>(expected_frame.data()), 687 reinterpret_cast<const unsigned char*>(expected_frame.data()),
687 expected_frame.size(), 688 expected_frame.size(),
688 reinterpret_cast<const unsigned char*>(actual_frame.data()), 689 reinterpret_cast<const unsigned char*>(actual_frame.data()),
689 actual_frame.size()); 690 actual_frame.size());
690 } 691 }
691 692
692 bool IsSpdy3() { return spdy_version_ == SPDY3; } 693 bool IsSpdy3() { return spdy_version_ == SPDY3; }
693 bool IsHttp2() { return spdy_version_ == HTTP2; } 694 bool IsHttp2() { return spdy_version_ == HTTP2; }
(...skipping 13 matching lines...) Expand all
707 // Not implemented for hpack. 708 // Not implemented for hpack.
708 return; 709 return;
709 } 710 }
710 711
711 SpdyFramer framer(spdy_version_); 712 SpdyFramer framer(spdy_version_);
712 framer.set_enable_compression(true); 713 framer.set_enable_compression(true);
713 SpdyHeadersIR headers(1); 714 SpdyHeadersIR headers(1);
714 headers.set_priority(1); 715 headers.set_priority(1);
715 headers.SetHeader("cookie", 716 headers.SetHeader("cookie",
716 "=; key=value; ; = ; foo; bar=; ; = ; k2=v2 ; ="); 717 "=; key=value; ; = ; foo; bar=; ; = ; k2=v2 ; =");
717 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); 718 SpdySerializedFrame frame(framer.SerializeHeaders(headers));
718 EXPECT_TRUE(frame.get() != NULL);
719 719
720 TestSpdyVisitor visitor(spdy_version_); 720 TestSpdyVisitor visitor(spdy_version_);
721 visitor.use_compression_ = true; 721 visitor.use_compression_ = true;
722 visitor.SimulateInFramer( 722 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
723 reinterpret_cast<unsigned char*>(frame->data()), 723 frame.size());
724 frame->size());
725 724
726 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 725 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
727 EXPECT_NE(headers.header_block(), visitor.headers_); 726 EXPECT_NE(headers.header_block(), visitor.headers_);
728 EXPECT_EQ(1u, visitor.headers_.size()); 727 EXPECT_EQ(1u, visitor.headers_.size());
729 EXPECT_EQ("key=value; foo; bar=; k2=v2 ", visitor.headers_["cookie"]); 728 EXPECT_EQ("key=value; foo; bar=; k2=v2 ", visitor.headers_["cookie"]);
730 } 729 }
731 730
732 // Test that we can encode and decode a SpdyHeaderBlock in serialized form. 731 // Test that we can encode and decode a SpdyHeaderBlock in serialized form.
733 TEST_P(SpdyFramerTest, HeaderBlockInBuffer) { 732 TEST_P(SpdyFramerTest, HeaderBlockInBuffer) {
734 SpdyFramer framer(spdy_version_); 733 SpdyFramer framer(spdy_version_);
735 framer.set_enable_compression(false); 734 framer.set_enable_compression(false);
736 735
737 // Encode the header block into a Headers frame. 736 // Encode the header block into a Headers frame.
738 SpdyHeadersIR headers(1); 737 SpdyHeadersIR headers(1);
739 headers.set_priority(1); 738 headers.set_priority(1);
740 headers.SetHeader("alpha", "beta"); 739 headers.SetHeader("alpha", "beta");
741 headers.SetHeader("gamma", "charlie"); 740 headers.SetHeader("gamma", "charlie");
742 headers.SetHeader("cookie", "key1=value1; key2=value2"); 741 headers.SetHeader("cookie", "key1=value1; key2=value2");
743 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); 742 SpdySerializedFrame frame(framer.SerializeHeaders(headers));
744 EXPECT_TRUE(frame.get() != NULL);
745 743
746 TestSpdyVisitor visitor(spdy_version_); 744 TestSpdyVisitor visitor(spdy_version_);
747 visitor.use_compression_ = false; 745 visitor.use_compression_ = false;
748 visitor.SimulateInFramer( 746 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
749 reinterpret_cast<unsigned char*>(frame->data()), 747 frame.size());
750 frame->size());
751 748
752 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 749 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
753 EXPECT_EQ(headers.header_block(), visitor.headers_); 750 EXPECT_EQ(headers.header_block(), visitor.headers_);
754 } 751 }
755 752
756 // Test that if there's not a full frame, we fail to parse it. 753 // Test that if there's not a full frame, we fail to parse it.
757 TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) { 754 TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) {
758 SpdyFramer framer(spdy_version_); 755 SpdyFramer framer(spdy_version_);
759 framer.set_enable_compression(false); 756 framer.set_enable_compression(false);
760 757
761 // Encode the header block into a Headers frame. 758 // Encode the header block into a Headers frame.
762 SpdyHeadersIR headers(1); 759 SpdyHeadersIR headers(1);
763 headers.set_priority(1); 760 headers.set_priority(1);
764 headers.SetHeader("alpha", "beta"); 761 headers.SetHeader("alpha", "beta");
765 headers.SetHeader("gamma", "charlie"); 762 headers.SetHeader("gamma", "charlie");
766 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); 763 SpdySerializedFrame frame(framer.SerializeHeaders(headers));
767 EXPECT_TRUE(frame.get() != NULL);
768 764
769 TestSpdyVisitor visitor(spdy_version_); 765 TestSpdyVisitor visitor(spdy_version_);
770 visitor.use_compression_ = false; 766 visitor.use_compression_ = false;
771 visitor.SimulateInFramer( 767 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
772 reinterpret_cast<unsigned char*>(frame->data()), 768 frame.size() - 2);
773 frame->size() - 2);
774 769
775 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 770 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
776 EXPECT_EQ(0u, visitor.headers_.size()); 771 EXPECT_EQ(0u, visitor.headers_.size());
777 } 772 }
778 773
779 // Test that we can encode and decode stream dependency values in a header 774 // Test that we can encode and decode stream dependency values in a header
780 // frame. 775 // frame.
781 TEST_P(SpdyFramerTest, HeaderStreamDependencyValues) { 776 TEST_P(SpdyFramerTest, HeaderStreamDependencyValues) {
782 if (!IsHttp2()) { 777 if (!IsHttp2()) {
783 return; 778 return;
784 } 779 }
785 780
786 SpdyFramer framer(spdy_version_); 781 SpdyFramer framer(spdy_version_);
787 framer.set_enable_compression(false); 782 framer.set_enable_compression(false);
788 783
789 const SpdyStreamId parent_stream_id_test_array[] = {0, 3}; 784 const SpdyStreamId parent_stream_id_test_array[] = {0, 3};
790 for (SpdyStreamId parent_stream_id : parent_stream_id_test_array) { 785 for (SpdyStreamId parent_stream_id : parent_stream_id_test_array) {
791 const bool exclusive_test_array[] = {true, false}; 786 const bool exclusive_test_array[] = {true, false};
792 for (bool exclusive : exclusive_test_array) { 787 for (bool exclusive : exclusive_test_array) {
793 SpdyHeadersIR headers(1); 788 SpdyHeadersIR headers(1);
794 headers.set_has_priority(true); 789 headers.set_has_priority(true);
795 headers.set_parent_stream_id(parent_stream_id); 790 headers.set_parent_stream_id(parent_stream_id);
796 headers.set_exclusive(exclusive); 791 headers.set_exclusive(exclusive);
797 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); 792 SpdySerializedFrame frame(framer.SerializeHeaders(headers));
798 EXPECT_TRUE(frame.get() != NULL);
799 793
800 TestSpdyVisitor visitor(spdy_version_); 794 TestSpdyVisitor visitor(spdy_version_);
801 visitor.use_compression_ = false; 795 visitor.use_compression_ = false;
802 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame->data()), 796 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
803 frame->size()); 797 frame.size());
804 798
805 EXPECT_TRUE(visitor.header_has_priority_); 799 EXPECT_TRUE(visitor.header_has_priority_);
806 EXPECT_EQ(parent_stream_id, visitor.header_parent_stream_id_); 800 EXPECT_EQ(parent_stream_id, visitor.header_parent_stream_id_);
807 EXPECT_EQ(exclusive, visitor.header_exclusive_); 801 EXPECT_EQ(exclusive, visitor.header_exclusive_);
808 } 802 }
809 } 803 }
810 } 804 }
811 805
812 // Test that if we receive a SYN_REPLY with stream ID zero, we signal an error 806 // Test that if we receive a SYN_REPLY with stream ID zero, we signal an error
813 // (but don't crash). 807 // (but don't crash).
814 TEST_P(SpdyFramerTest, SynReplyWithStreamIdZero) { 808 TEST_P(SpdyFramerTest, SynReplyWithStreamIdZero) {
815 if (!IsSpdy3()) { 809 if (!IsSpdy3()) {
816 return; 810 return;
817 } 811 }
818 812
819 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 813 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
820 SpdyFramer framer(spdy_version_); 814 SpdyFramer framer(spdy_version_);
821 framer.set_visitor(&visitor); 815 framer.set_visitor(&visitor);
822 816
823 SpdySynReplyIR syn_reply(0); 817 SpdySynReplyIR syn_reply(0);
824 syn_reply.SetHeader("alpha", "beta"); 818 syn_reply.SetHeader("alpha", "beta");
825 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeSynReply(syn_reply)); 819 SpdySerializedFrame frame(framer.SerializeSynReply(syn_reply));
826 ASSERT_TRUE(frame.get() != NULL);
827 820
828 // We shouldn't have to read the whole frame before we signal an error. 821 // We shouldn't have to read the whole frame before we signal an error.
829 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 822 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
830 EXPECT_GT(frame->size(), framer.ProcessInput(frame->data(), frame->size())); 823 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
831 EXPECT_TRUE(framer.HasError()); 824 EXPECT_TRUE(framer.HasError());
832 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) 825 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code())
833 << SpdyFramer::ErrorCodeToString(framer.error_code()); 826 << SpdyFramer::ErrorCodeToString(framer.error_code());
834 } 827 }
835 828
836 // Test that if we receive a HEADERS with stream ID zero, we signal an error 829 // Test that if we receive a HEADERS with stream ID zero, we signal an error
837 // (but don't crash). 830 // (but don't crash).
838 TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) { 831 TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) {
839 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 832 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
840 SpdyFramer framer(spdy_version_); 833 SpdyFramer framer(spdy_version_);
841 framer.set_visitor(&visitor); 834 framer.set_visitor(&visitor);
842 835
843 SpdyHeadersIR headers_ir(0); 836 SpdyHeadersIR headers_ir(0);
844 headers_ir.SetHeader("alpha", "beta"); 837 headers_ir.SetHeader("alpha", "beta");
845 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeHeaders(headers_ir)); 838 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
846 ASSERT_TRUE(frame.get() != NULL);
847 839
848 // We shouldn't have to read the whole frame before we signal an error. 840 // We shouldn't have to read the whole frame before we signal an error.
849 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 841 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
850 EXPECT_GT(frame->size(), framer.ProcessInput(frame->data(), frame->size())); 842 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
851 EXPECT_TRUE(framer.HasError()); 843 EXPECT_TRUE(framer.HasError());
852 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) 844 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code())
853 << SpdyFramer::ErrorCodeToString(framer.error_code()); 845 << SpdyFramer::ErrorCodeToString(framer.error_code());
854 } 846 }
855 847
856 // Test that if we receive a PUSH_PROMISE with stream ID zero, we signal an 848 // Test that if we receive a PUSH_PROMISE with stream ID zero, we signal an
857 // error (but don't crash). 849 // error (but don't crash).
858 TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) { 850 TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) {
859 if (!IsHttp2()) { 851 if (!IsHttp2()) {
860 return; 852 return;
861 } 853 }
862 854
863 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 855 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
864 SpdyFramer framer(spdy_version_); 856 SpdyFramer framer(spdy_version_);
865 framer.set_visitor(&visitor); 857 framer.set_visitor(&visitor);
866 858
867 SpdyPushPromiseIR push_promise(0, 4); 859 SpdyPushPromiseIR push_promise(0, 4);
868 push_promise.SetHeader("alpha", "beta"); 860 push_promise.SetHeader("alpha", "beta");
869 scoped_ptr<SpdySerializedFrame> frame( 861 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
870 framer.SerializePushPromise(push_promise));
871 ASSERT_TRUE(frame.get() != NULL);
872 862
873 // We shouldn't have to read the whole frame before we signal an error. 863 // We shouldn't have to read the whole frame before we signal an error.
874 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 864 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
875 EXPECT_GT(frame->size(), framer.ProcessInput(frame->data(), frame->size())); 865 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
876 EXPECT_TRUE(framer.HasError()); 866 EXPECT_TRUE(framer.HasError());
877 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) 867 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code())
878 << SpdyFramer::ErrorCodeToString(framer.error_code()); 868 << SpdyFramer::ErrorCodeToString(framer.error_code());
879 } 869 }
880 870
881 // Test that if we receive a PUSH_PROMISE with promised stream ID zero, we 871 // Test that if we receive a PUSH_PROMISE with promised stream ID zero, we
882 // signal an error (but don't crash). 872 // signal an error (but don't crash).
883 TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) { 873 TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) {
884 if (!IsHttp2()) { 874 if (!IsHttp2()) {
885 return; 875 return;
886 } 876 }
887 877
888 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 878 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
889 SpdyFramer framer(spdy_version_); 879 SpdyFramer framer(spdy_version_);
890 framer.set_visitor(&visitor); 880 framer.set_visitor(&visitor);
891 881
892 SpdyPushPromiseIR push_promise(3, 0); 882 SpdyPushPromiseIR push_promise(3, 0);
893 push_promise.SetHeader("alpha", "beta"); 883 push_promise.SetHeader("alpha", "beta");
894 scoped_ptr<SpdySerializedFrame> frame( 884 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
895 framer.SerializePushPromise(push_promise));
896 ASSERT_TRUE(frame.get() != NULL);
897 885
898 // We shouldn't have to read the whole frame before we signal an error. 886 // We shouldn't have to read the whole frame before we signal an error.
899 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 887 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
900 EXPECT_GT(frame->size(), framer.ProcessInput(frame->data(), frame->size())); 888 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
901 EXPECT_TRUE(framer.HasError()); 889 EXPECT_TRUE(framer.HasError());
902 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) 890 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code())
903 << SpdyFramer::ErrorCodeToString(framer.error_code()); 891 << SpdyFramer::ErrorCodeToString(framer.error_code());
904 } 892 }
905 893
906 TEST_P(SpdyFramerTest, DuplicateHeader) { 894 TEST_P(SpdyFramerTest, DuplicateHeader) {
907 if (!IsSpdy3()) { 895 if (!IsSpdy3()) {
908 // TODO(jgraettinger): Punting on this because we haven't determined 896 // TODO(jgraettinger): Punting on this because we haven't determined
909 // whether duplicate HPACK headers other than Cookie are an error. 897 // whether duplicate HPACK headers other than Cookie are an error.
910 // If they are, this will need to be updated to use HpackOutputStream. 898 // If they are, this will need to be updated to use HpackOutputStream.
(...skipping 15 matching lines...) Expand all
926 frame.WriteUInt32(2); // Number of headers. 914 frame.WriteUInt32(2); // Number of headers.
927 frame.WriteStringPiece32("name"); 915 frame.WriteStringPiece32("name");
928 frame.WriteStringPiece32("value1"); 916 frame.WriteStringPiece32("value1");
929 frame.WriteStringPiece32("name"); 917 frame.WriteStringPiece32("name");
930 frame.WriteStringPiece32("value2"); 918 frame.WriteStringPiece32("value2");
931 // write the length 919 // write the length
932 frame.RewriteLength(framer); 920 frame.RewriteLength(framer);
933 921
934 SpdyHeaderBlock new_headers; 922 SpdyHeaderBlock new_headers;
935 framer.set_enable_compression(false); 923 framer.set_enable_compression(false);
936 scoped_ptr<SpdyFrame> control_frame(frame.take()); 924 SpdySerializedFrame control_frame(frame.take());
937 StringPiece serialized_headers = 925 StringPiece serialized_headers = GetSerializedHeaders(control_frame, framer);
938 GetSerializedHeaders(control_frame.get(), framer);
939 // This should fail because duplicate headers are verboten by the spec. 926 // This should fail because duplicate headers are verboten by the spec.
940 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.data(), 927 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.data(),
941 serialized_headers.size(), 928 serialized_headers.size(),
942 &new_headers)); 929 &new_headers));
943 } 930 }
944 931
945 TEST_P(SpdyFramerTest, MultiValueHeader) { 932 TEST_P(SpdyFramerTest, MultiValueHeader) {
946 SpdyFramer framer(spdy_version_); 933 SpdyFramer framer(spdy_version_);
947 // Frame builder with plentiful buffer size. 934 // Frame builder with plentiful buffer size.
948 SpdyFrameBuilder frame(1024, spdy_version_); 935 SpdyFrameBuilder frame(1024, spdy_version_);
(...skipping 22 matching lines...) Expand all
971 header_set["name"] = value; 958 header_set["name"] = value;
972 string buffer; 959 string buffer;
973 HpackEncoder encoder(ObtainHpackHuffmanTable()); 960 HpackEncoder encoder(ObtainHpackHuffmanTable());
974 encoder.EncodeHeaderSetWithoutCompression(header_set, &buffer); 961 encoder.EncodeHeaderSetWithoutCompression(header_set, &buffer);
975 frame.WriteBytes(&buffer[0], buffer.size()); 962 frame.WriteBytes(&buffer[0], buffer.size());
976 } 963 }
977 // write the length 964 // write the length
978 frame.RewriteLength(framer); 965 frame.RewriteLength(framer);
979 966
980 framer.set_enable_compression(false); 967 framer.set_enable_compression(false);
981 scoped_ptr<SpdyFrame> control_frame(frame.take()); 968 SpdySerializedFrame control_frame(frame.take());
982 969
983 TestSpdyVisitor visitor(spdy_version_); 970 TestSpdyVisitor visitor(spdy_version_);
984 visitor.use_compression_ = false; 971 visitor.use_compression_ = false;
985 visitor.SimulateInFramer( 972 visitor.SimulateInFramer(
986 reinterpret_cast<unsigned char*>(control_frame->data()), 973 reinterpret_cast<unsigned char*>(control_frame.data()),
987 control_frame->size()); 974 control_frame.size());
988 975
989 EXPECT_THAT(visitor.headers_, 976 EXPECT_THAT(visitor.headers_,
990 testing::ElementsAre(testing::Pair("name", StringPiece(value)))); 977 testing::ElementsAre(testing::Pair("name", StringPiece(value))));
991 } 978 }
992 979
993 TEST_P(SpdyFramerTest, BasicCompression) { 980 TEST_P(SpdyFramerTest, BasicCompression) {
994 if (!IsSpdy3()) { 981 if (!IsSpdy3()) {
995 // Deflate compression doesn't apply to HPACK. 982 // Deflate compression doesn't apply to HPACK.
996 return; 983 return;
997 } 984 }
998 985
999 scoped_ptr<TestSpdyVisitor> visitor(new TestSpdyVisitor(spdy_version_)); 986 scoped_ptr<TestSpdyVisitor> visitor(new TestSpdyVisitor(spdy_version_));
1000 SpdyFramer framer(spdy_version_); 987 SpdyFramer framer(spdy_version_);
1001 framer.set_debug_visitor(visitor.get()); 988 framer.set_debug_visitor(visitor.get());
1002 SpdySynStreamIR syn_stream(1); 989 SpdySynStreamIR syn_stream(1);
1003 syn_stream.set_priority(1); 990 syn_stream.set_priority(1);
1004 syn_stream.SetHeader("server", "SpdyServer 1.0"); 991 syn_stream.SetHeader("server", "SpdyServer 1.0");
1005 syn_stream.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST"); 992 syn_stream.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST");
1006 syn_stream.SetHeader("status", "200"); 993 syn_stream.SetHeader("status", "200");
1007 syn_stream.SetHeader("version", "HTTP/1.1"); 994 syn_stream.SetHeader("version", "HTTP/1.1");
1008 syn_stream.SetHeader("content-type", "text/html"); 995 syn_stream.SetHeader("content-type", "text/html");
1009 syn_stream.SetHeader("content-length", "12"); 996 syn_stream.SetHeader("content-length", "12");
1010 scoped_ptr<SpdyFrame> frame1(framer.SerializeSynStream(syn_stream)); 997 SpdySerializedFrame frame1(framer.SerializeSynStream(syn_stream));
1011 size_t uncompressed_size1 = visitor->last_payload_len_; 998 size_t uncompressed_size1 = visitor->last_payload_len_;
1012 size_t compressed_size1 = 999 size_t compressed_size1 =
1013 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); 1000 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize();
1014 EXPECT_EQ(165u, uncompressed_size1); 1001 EXPECT_EQ(165u, uncompressed_size1);
1015 #if defined(USE_SYSTEM_ZLIB) 1002 #if defined(USE_SYSTEM_ZLIB)
1016 EXPECT_EQ(181u, compressed_size1); 1003 EXPECT_EQ(181u, compressed_size1);
1017 #else // !defined(USE_SYSTEM_ZLIB) 1004 #else // !defined(USE_SYSTEM_ZLIB)
1018 EXPECT_EQ(117u, compressed_size1); 1005 EXPECT_EQ(117u, compressed_size1);
1019 #endif // !defined(USE_SYSTEM_ZLIB) 1006 #endif // !defined(USE_SYSTEM_ZLIB)
1020 scoped_ptr<SpdyFrame> frame2(framer.SerializeSynStream(syn_stream)); 1007 SpdySerializedFrame frame2(framer.SerializeSynStream(syn_stream));
1021 size_t uncompressed_size2 = visitor->last_payload_len_; 1008 size_t uncompressed_size2 = visitor->last_payload_len_;
1022 size_t compressed_size2 = 1009 size_t compressed_size2 =
1023 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); 1010 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize();
1024 1011
1025 // Expect the second frame to be more compact than the first. 1012 // Expect the second frame to be more compact than the first.
1026 EXPECT_LE(frame2->size(), frame1->size()); 1013 EXPECT_LE(frame2.size(), frame1.size());
1027 1014
1028 // Decompress the first frame 1015 // Decompress the first frame
1029 scoped_ptr<SpdyFrame> frame3( 1016 SpdySerializedFrame frame3(
1030 SpdyFramerTestUtil::DecompressFrame(&framer, *frame1)); 1017 SpdyFramerTestUtil::DecompressFrame(&framer, frame1));
1031 1018
1032 // Decompress the second frame 1019 // Decompress the second frame
1033 visitor.reset(new TestSpdyVisitor(spdy_version_)); 1020 visitor.reset(new TestSpdyVisitor(spdy_version_));
1034 framer.set_debug_visitor(visitor.get()); 1021 framer.set_debug_visitor(visitor.get());
1035 scoped_ptr<SpdyFrame> frame4( 1022 SpdySerializedFrame frame4(
1036 SpdyFramerTestUtil::DecompressFrame(&framer, *frame2)); 1023 SpdyFramerTestUtil::DecompressFrame(&framer, frame2));
1037 size_t uncompressed_size4 = 1024 size_t uncompressed_size4 = frame4.size() - framer.GetSynStreamMinimumSize();
1038 frame4->size() - framer.GetSynStreamMinimumSize();
1039 size_t compressed_size4 = 1025 size_t compressed_size4 =
1040 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); 1026 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize();
1041 EXPECT_EQ(165u, uncompressed_size4); 1027 EXPECT_EQ(165u, uncompressed_size4);
1042 #if defined(USE_SYSTEM_ZLIB) 1028 #if defined(USE_SYSTEM_ZLIB)
1043 EXPECT_EQ(175u, compressed_size4); 1029 EXPECT_EQ(175u, compressed_size4);
1044 #else // !defined(USE_SYSTEM_ZLIB) 1030 #else // !defined(USE_SYSTEM_ZLIB)
1045 EXPECT_EQ(99u, compressed_size4); 1031 EXPECT_EQ(99u, compressed_size4);
1046 #endif // !defined(USE_SYSTEM_ZLIB) 1032 #endif // !defined(USE_SYSTEM_ZLIB)
1047 1033
1048 EXPECT_EQ(uncompressed_size1, uncompressed_size2); 1034 EXPECT_EQ(uncompressed_size1, uncompressed_size2);
1049 EXPECT_EQ(uncompressed_size1, uncompressed_size4); 1035 EXPECT_EQ(uncompressed_size1, uncompressed_size4);
1050 EXPECT_EQ(compressed_size2, compressed_size4); 1036 EXPECT_EQ(compressed_size2, compressed_size4);
1051 1037
1052 // Expect frames 3 & 4 to be the same. 1038 // Expect frames 3 & 4 to be the same.
1053 CompareFrames("Uncompressed SYN_STREAM", *frame3, *frame4); 1039 CompareFrames("Uncompressed SYN_STREAM", frame3, frame4);
1054 1040
1055 // Expect frames 3 to be the same as a uncompressed frame created 1041 // Expect frames 3 to be the same as a uncompressed frame created
1056 // from scratch. 1042 // from scratch.
1057 framer.set_enable_compression(false); 1043 framer.set_enable_compression(false);
1058 scoped_ptr<SpdyFrame> uncompressed_frame( 1044 SpdySerializedFrame uncompressed_frame(framer.SerializeSynStream(syn_stream));
1059 framer.SerializeSynStream(syn_stream)); 1045 CompareFrames("Uncompressed SYN_STREAM", frame3, uncompressed_frame);
1060 CompareFrames("Uncompressed SYN_STREAM", *frame3, *uncompressed_frame);
1061 } 1046 }
1062 1047
1063 TEST_P(SpdyFramerTest, CompressEmptyHeaders) { 1048 TEST_P(SpdyFramerTest, CompressEmptyHeaders) {
1064 // See crbug.com/172383 1049 // See crbug.com/172383
1065 SpdyHeadersIR headers(1); 1050 SpdyHeadersIR headers(1);
1066 headers.SetHeader("server", "SpdyServer 1.0"); 1051 headers.SetHeader("server", "SpdyServer 1.0");
1067 headers.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST"); 1052 headers.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST");
1068 headers.SetHeader("status", "200"); 1053 headers.SetHeader("status", "200");
1069 headers.SetHeader("version", "HTTP/1.1"); 1054 headers.SetHeader("version", "HTTP/1.1");
1070 headers.SetHeader("content-type", "text/html"); 1055 headers.SetHeader("content-type", "text/html");
1071 headers.SetHeader("content-length", "12"); 1056 headers.SetHeader("content-length", "12");
1072 headers.SetHeader("x-empty-header", ""); 1057 headers.SetHeader("x-empty-header", "");
1073 1058
1074 SpdyFramer framer(spdy_version_); 1059 SpdyFramer framer(spdy_version_);
1075 framer.set_enable_compression(true); 1060 framer.set_enable_compression(true);
1076 scoped_ptr<SpdyFrame> frame1(framer.SerializeHeaders(headers)); 1061 SpdySerializedFrame frame1(framer.SerializeHeaders(headers));
1077 } 1062 }
1078 1063
1079 TEST_P(SpdyFramerTest, Basic) { 1064 TEST_P(SpdyFramerTest, Basic) {
1080 const unsigned char kV3Input[] = { 1065 const unsigned char kV3Input[] = {
1081 0x80, 0x03, 0x00, 0x01, // SYN Stream #1 1066 0x80, 0x03, 0x00, 0x01, // SYN Stream #1
1082 0x00, 0x00, 0x00, 0x1a, 1067 0x00, 0x00, 0x00, 0x1a,
1083 0x00, 0x00, 0x00, 0x01, 1068 0x00, 0x00, 0x00, 0x01,
1084 0x00, 0x00, 0x00, 0x00, 1069 0x00, 0x00, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0x00, 1070 0x00, 0x00, 0x00, 0x00,
1086 0x00, 0x01, 0x00, 0x00, 1071 0x00, 0x01, 0x00, 0x00,
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1375 const char kValue1[] = "value1"; 1360 const char kValue1[] = "value1";
1376 const char kValue2[] = "value2"; 1361 const char kValue2[] = "value2";
1377 const char kValue3[] = "value3"; 1362 const char kValue3[] = "value3";
1378 1363
1379 // SYN_STREAM #1 1364 // SYN_STREAM #1
1380 SpdyHeaderBlock block; 1365 SpdyHeaderBlock block;
1381 block[kHeader1] = kValue1; 1366 block[kHeader1] = kValue1;
1382 block[kHeader2] = kValue2; 1367 block[kHeader2] = kValue2;
1383 SpdySynStreamIR syn_ir_1(1); 1368 SpdySynStreamIR syn_ir_1(1);
1384 syn_ir_1.set_header_block(block); 1369 syn_ir_1.set_header_block(block);
1385 scoped_ptr<SpdyFrame> syn_frame_1(send_framer.SerializeFrame(syn_ir_1)); 1370 SpdySerializedFrame syn_frame_1(send_framer.SerializeFrame(syn_ir_1));
1386 EXPECT_TRUE(syn_frame_1.get() != NULL);
1387 1371
1388 // SYN_STREAM #2 1372 // SYN_STREAM #2
1389 block[kHeader3] = kValue3; 1373 block[kHeader3] = kValue3;
1390 SpdySynStreamIR syn_stream(3); 1374 SpdySynStreamIR syn_stream(3);
1391 syn_stream.set_header_block(block); 1375 syn_stream.set_header_block(block);
1392 scoped_ptr<SpdyFrame> syn_frame_2(send_framer.SerializeSynStream(syn_stream)); 1376 SpdySerializedFrame syn_frame_2(send_framer.SerializeSynStream(syn_stream));
1393 EXPECT_TRUE(syn_frame_2.get() != NULL);
1394
1395 // Now start decompressing
1396 scoped_ptr<SpdyFrame> decompressed;
1397 scoped_ptr<SpdyFrame> uncompressed;
1398 StringPiece serialized_headers;
1399 SpdyHeaderBlock decompressed_headers;
1400 1377
1401 // Decompress SYN_STREAM #1 1378 // Decompress SYN_STREAM #1
1402 decompressed.reset( 1379 SpdySerializedFrame decompressed(
1403 SpdyFramerTestUtil::DecompressFrame(&recv_framer, *syn_frame_1)); 1380 SpdyFramerTestUtil::DecompressFrame(&recv_framer, syn_frame_1));
1404 EXPECT_TRUE(decompressed.get() != NULL); 1381 StringPiece serialized_headers =
1405 serialized_headers = GetSerializedHeaders(decompressed.get(), send_framer); 1382 GetSerializedHeaders(decompressed, send_framer);
1383 SpdyHeaderBlock decompressed_headers;
1406 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers.data(), 1384 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers.data(),
1407 serialized_headers.size(), 1385 serialized_headers.size(),
1408 &decompressed_headers)); 1386 &decompressed_headers));
1409 EXPECT_EQ(2u, decompressed_headers.size()); 1387 EXPECT_EQ(2u, decompressed_headers.size());
1410 EXPECT_EQ(kValue1, decompressed_headers[kHeader1]); 1388 EXPECT_EQ(kValue1, decompressed_headers[kHeader1]);
1411 EXPECT_EQ(kValue2, decompressed_headers[kHeader2]); 1389 EXPECT_EQ(kValue2, decompressed_headers[kHeader2]);
1412 1390
1413 // Decompress SYN_STREAM #2 1391 // Decompress SYN_STREAM #2
1414 decompressed.reset( 1392 decompressed = SpdyFramerTestUtil::DecompressFrame(&recv_framer, syn_frame_2);
1415 SpdyFramerTestUtil::DecompressFrame(&recv_framer, *syn_frame_2)); 1393 serialized_headers = GetSerializedHeaders(decompressed, send_framer);
1416 EXPECT_TRUE(decompressed.get() != NULL);
1417 serialized_headers = GetSerializedHeaders(decompressed.get(), send_framer);
1418 decompressed_headers.clear(); 1394 decompressed_headers.clear();
1419 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers.data(), 1395 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers.data(),
1420 serialized_headers.size(), 1396 serialized_headers.size(),
1421 &decompressed_headers)); 1397 &decompressed_headers));
1422 EXPECT_EQ(3u, decompressed_headers.size()); 1398 EXPECT_EQ(3u, decompressed_headers.size());
1423 EXPECT_EQ(kValue1, decompressed_headers[kHeader1]); 1399 EXPECT_EQ(kValue1, decompressed_headers[kHeader1]);
1424 EXPECT_EQ(kValue2, decompressed_headers[kHeader2]); 1400 EXPECT_EQ(kValue2, decompressed_headers[kHeader2]);
1425 EXPECT_EQ(kValue3, decompressed_headers[kHeader3]); 1401 EXPECT_EQ(kValue3, decompressed_headers[kHeader3]);
1426 } 1402 }
1427 1403
1428 // Verify we can decompress the stream even if handed over to the 1404 // Verify we can decompress the stream even if handed over to the
1429 // framer 1 byte at a time. 1405 // framer 1 byte at a time.
1430 TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) { 1406 TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) {
1431 SpdyFramer send_framer(spdy_version_); 1407 SpdyFramer send_framer(spdy_version_);
1432 1408
1433 send_framer.set_enable_compression(true); 1409 send_framer.set_enable_compression(true);
1434 1410
1435 const char kHeader1[] = "header1"; 1411 const char kHeader1[] = "header1";
1436 const char kHeader2[] = "header2"; 1412 const char kHeader2[] = "header2";
1437 const char kValue1[] = "value1"; 1413 const char kValue1[] = "value1";
1438 const char kValue2[] = "value2"; 1414 const char kValue2[] = "value2";
1439 1415
1440 SpdyHeadersIR headers(1); 1416 SpdyHeadersIR headers(1);
1441 headers.SetHeader(kHeader1, kValue1); 1417 headers.SetHeader(kHeader1, kValue1);
1442 headers.SetHeader(kHeader2, kValue2); 1418 headers.SetHeader(kHeader2, kValue2);
1443 scoped_ptr<SpdyFrame> headers_frame(send_framer.SerializeHeaders(headers)); 1419 SpdySerializedFrame headers_frame(send_framer.SerializeHeaders(headers));
1444 EXPECT_TRUE(headers_frame.get() != NULL);
1445 1420
1446 const char bytes[] = "this is a test test test test test!"; 1421 const char bytes[] = "this is a test test test test test!";
1447 SpdyDataIR data_ir(1, StringPiece(bytes, arraysize(bytes))); 1422 SpdyDataIR data_ir(1, StringPiece(bytes, arraysize(bytes)));
1448 data_ir.set_fin(true); 1423 data_ir.set_fin(true);
1449 scoped_ptr<SpdyFrame> send_frame(send_framer.SerializeData(data_ir)); 1424 SpdySerializedFrame send_frame(send_framer.SerializeData(data_ir));
1450 EXPECT_TRUE(send_frame.get() != NULL);
1451 1425
1452 // Run the inputs through the framer. 1426 // Run the inputs through the framer.
1453 TestSpdyVisitor visitor(spdy_version_); 1427 TestSpdyVisitor visitor(spdy_version_);
1454 visitor.use_compression_ = true; 1428 visitor.use_compression_ = true;
1455 const unsigned char* data; 1429 const unsigned char* data;
1456 data = reinterpret_cast<const unsigned char*>(headers_frame->data()); 1430 data = reinterpret_cast<const unsigned char*>(headers_frame.data());
1457 for (size_t idx = 0; idx < headers_frame->size(); ++idx) { 1431 for (size_t idx = 0; idx < headers_frame.size(); ++idx) {
1458 visitor.SimulateInFramer(data + idx, 1); 1432 visitor.SimulateInFramer(data + idx, 1);
1459 ASSERT_EQ(0, visitor.error_count_); 1433 ASSERT_EQ(0, visitor.error_count_);
1460 } 1434 }
1461 data = reinterpret_cast<const unsigned char*>(send_frame->data()); 1435 data = reinterpret_cast<const unsigned char*>(send_frame.data());
1462 for (size_t idx = 0; idx < send_frame->size(); ++idx) { 1436 for (size_t idx = 0; idx < send_frame.size(); ++idx) {
1463 visitor.SimulateInFramer(data + idx, 1); 1437 visitor.SimulateInFramer(data + idx, 1);
1464 ASSERT_EQ(0, visitor.error_count_); 1438 ASSERT_EQ(0, visitor.error_count_);
1465 } 1439 }
1466 1440
1467 EXPECT_EQ(0, visitor.error_count_); 1441 EXPECT_EQ(0, visitor.error_count_);
1468 EXPECT_EQ(0, visitor.syn_frame_count_); 1442 EXPECT_EQ(0, visitor.syn_frame_count_);
1469 EXPECT_EQ(0, visitor.syn_reply_frame_count_); 1443 EXPECT_EQ(0, visitor.syn_reply_frame_count_);
1470 EXPECT_EQ(1, visitor.headers_frame_count_); 1444 EXPECT_EQ(1, visitor.headers_frame_count_);
1471 EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_)); 1445 EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_));
1472 EXPECT_EQ(0, visitor.fin_frame_count_); 1446 EXPECT_EQ(0, visitor.fin_frame_count_);
1473 EXPECT_EQ(0, visitor.fin_flag_count_); 1447 EXPECT_EQ(0, visitor.fin_flag_count_);
1474 EXPECT_EQ(1, visitor.end_of_stream_count_); 1448 EXPECT_EQ(1, visitor.end_of_stream_count_);
1475 EXPECT_EQ(1, visitor.data_frame_count_); 1449 EXPECT_EQ(1, visitor.data_frame_count_);
1476 } 1450 }
1477 1451
1478 TEST_P(SpdyFramerTest, WindowUpdateFrame) { 1452 TEST_P(SpdyFramerTest, WindowUpdateFrame) {
1479 SpdyFramer framer(spdy_version_); 1453 SpdyFramer framer(spdy_version_);
1480 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( 1454 SpdySerializedFrame frame(
1481 SpdyWindowUpdateIR(1, 0x12345678))); 1455 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x12345678)));
1482 1456
1483 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; 1457 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678";
1484 const unsigned char kV3FrameData[] = { 1458 const unsigned char kV3FrameData[] = {
1485 0x80, 0x03, 0x00, 0x09, 1459 0x80, 0x03, 0x00, 0x09,
1486 0x00, 0x00, 0x00, 0x08, 1460 0x00, 0x00, 0x00, 0x08,
1487 0x00, 0x00, 0x00, 0x01, 1461 0x00, 0x00, 0x00, 0x01,
1488 0x12, 0x34, 0x56, 0x78 1462 0x12, 0x34, 0x56, 0x78
1489 }; 1463 };
1490 const unsigned char kH2FrameData[] = { 1464 const unsigned char kH2FrameData[] = {
1491 0x00, 0x00, 0x04, 0x08, 1465 0x00, 0x00, 0x04, 0x08,
1492 0x00, 0x00, 0x00, 0x00, 1466 0x00, 0x00, 0x00, 0x00,
1493 0x01, 0x12, 0x34, 0x56, 1467 0x01, 0x12, 0x34, 0x56,
1494 0x78 1468 0x78
1495 }; 1469 };
1496 1470
1497 if (IsSpdy3()) { 1471 if (IsSpdy3()) {
1498 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1472 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1499 } else { 1473 } else {
1500 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1474 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1501 } 1475 }
1502 } 1476 }
1503 1477
1504 TEST_P(SpdyFramerTest, CreateDataFrame) { 1478 TEST_P(SpdyFramerTest, CreateDataFrame) {
1505 SpdyFramer framer(spdy_version_); 1479 SpdyFramer framer(spdy_version_);
1506 1480
1507 { 1481 {
1508 const char kDescription[] = "'hello' data frame, no FIN"; 1482 const char kDescription[] = "'hello' data frame, no FIN";
1509 const unsigned char kV3FrameData[] = { 1483 const unsigned char kV3FrameData[] = {
1510 0x00, 0x00, 0x00, 0x01, 1484 0x00, 0x00, 0x00, 0x01,
(...skipping 11 matching lines...) Expand all
1522 0x00, 1496 0x00,
1523 0x01, 1497 0x01,
1524 'h', 1498 'h',
1525 'e', 1499 'e',
1526 'l', 1500 'l',
1527 'l', 1501 'l',
1528 'o'}; 1502 'o'};
1529 const char bytes[] = "hello"; 1503 const char bytes[] = "hello";
1530 1504
1531 SpdyDataIR data_ir(1, bytes); 1505 SpdyDataIR data_ir(1, bytes);
1532 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1506 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1533 if (IsSpdy3()) { 1507 if (IsSpdy3()) {
1534 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1508 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1535 } else { 1509 } else {
1536 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1510 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1537 } 1511 }
1538 1512
1539 SpdyDataIR data_header_ir(1); 1513 SpdyDataIR data_header_ir(1);
1540 data_header_ir.SetDataShallow(bytes); 1514 data_header_ir.SetDataShallow(bytes);
1541 frame.reset(framer.SerializeDataFrameHeaderWithPaddingLengthField( 1515 frame =
1542 data_header_ir)); 1516 framer.SerializeDataFrameHeaderWithPaddingLengthField(data_header_ir);
1543 CompareCharArraysWithHexError( 1517 CompareCharArraysWithHexError(
1544 kDescription, reinterpret_cast<const unsigned char*>(frame->data()), 1518 kDescription, reinterpret_cast<const unsigned char*>(frame.data()),
1545 framer.GetDataFrameMinimumSize(), 1519 framer.GetDataFrameMinimumSize(),
1546 IsSpdy3() ? kV3FrameData : kH2FrameData, 1520 IsSpdy3() ? kV3FrameData : kH2FrameData,
1547 framer.GetDataFrameMinimumSize()); 1521 framer.GetDataFrameMinimumSize());
1548 } 1522 }
1549 1523
1550 { 1524 {
1551 const char kDescription[] = "'hello' data frame with more padding, no FIN"; 1525 const char kDescription[] = "'hello' data frame with more padding, no FIN";
1552 const unsigned char kV3FrameData[] = { 1526 const unsigned char kV3FrameData[] = {
1553 0x00, 0x00, 0x00, 0x01, 1527 0x00, 0x00, 0x00, 0x01,
1554 0x00, 0x00, 0x00, 0x05, 1528 0x00, 0x00, 0x00, 0x05,
(...skipping 29 matching lines...) Expand all
1584 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1559 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1560 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1587 }; 1561 };
1588 const char bytes[] = "hello"; 1562 const char bytes[] = "hello";
1589 1563
1590 SpdyDataIR data_ir(1, bytes); 1564 SpdyDataIR data_ir(1, bytes);
1591 // 247 zeros and the pad length field make the overall padding to be 248 1565 // 247 zeros and the pad length field make the overall padding to be 248
1592 // bytes. 1566 // bytes.
1593 data_ir.set_padding_len(248); 1567 data_ir.set_padding_len(248);
1594 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1568 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1595 if (IsSpdy3()) { 1569 if (IsSpdy3()) {
1596 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1570 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1597 } else { 1571 } else {
1598 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1572 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1599 } 1573 }
1600 1574
1601 frame.reset(framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir)); 1575 frame = framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir);
1602 CompareCharArraysWithHexError( 1576 CompareCharArraysWithHexError(
1603 kDescription, reinterpret_cast<const unsigned char*>(frame->data()), 1577 kDescription, reinterpret_cast<const unsigned char*>(frame.data()),
1604 framer.GetDataFrameMinimumSize(), 1578 framer.GetDataFrameMinimumSize(),
1605 IsSpdy3() ? kV3FrameData : kH2FrameData, 1579 IsSpdy3() ? kV3FrameData : kH2FrameData,
1606 framer.GetDataFrameMinimumSize()); 1580 framer.GetDataFrameMinimumSize());
1607 } 1581 }
1608 1582
1609 { 1583 {
1610 const char kDescription[] = "'hello' data frame with few padding, no FIN"; 1584 const char kDescription[] = "'hello' data frame with few padding, no FIN";
1611 const unsigned char kV3FrameData[] = { 1585 const unsigned char kV3FrameData[] = {
1612 0x00, 0x00, 0x00, 0x01, 1586 0x00, 0x00, 0x00, 0x01,
1613 0x00, 0x00, 0x00, 0x05, 1587 0x00, 0x00, 0x00, 0x05,
1614 'h', 'e', 'l', 'l', 1588 'h', 'e', 'l', 'l',
1615 'o' 1589 'o'
1616 }; 1590 };
1617 1591
1618 const unsigned char kH2FrameData[] = { 1592 const unsigned char kH2FrameData[] = {
1619 0x00, 0x00, 0x0d, 0x00, // Length = 13. PADDED set. 1593 0x00, 0x00, 0x0d, 0x00, // Length = 13. PADDED set.
1620 0x08, 0x00, 0x00, 0x00, 1594 0x08, 0x00, 0x00, 0x00,
1621 0x01, 0x07, // Pad length field. 1595 0x01, 0x07, // Pad length field.
1622 'h', 'e', 'l', 'l', // Data 1596 'h', 'e', 'l', 'l', // Data
1623 'o', 1597 'o',
1624 0x00, 0x00, 0x00, 0x00, // Padding 1598 0x00, 0x00, 0x00, 0x00, // Padding
1625 0x00, 0x00, 0x00 1599 0x00, 0x00, 0x00
1626 }; 1600 };
1627 const char bytes[] = "hello"; 1601 const char bytes[] = "hello";
1628 1602
1629 SpdyDataIR data_ir(1, bytes); 1603 SpdyDataIR data_ir(1, bytes);
1630 // 7 zeros and the pad length field make the overall padding to be 8 bytes. 1604 // 7 zeros and the pad length field make the overall padding to be 8 bytes.
1631 data_ir.set_padding_len(8); 1605 data_ir.set_padding_len(8);
1632 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1606 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1633 if (IsSpdy3()) { 1607 if (IsSpdy3()) {
1634 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1608 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1635 } else { 1609 } else {
1636 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1610 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1637 } 1611 }
1638 } 1612 }
1639 1613
1640 { 1614 {
1641 const char kDescription[] = 1615 const char kDescription[] =
1642 "'hello' data frame with 1 byte padding, no FIN"; 1616 "'hello' data frame with 1 byte padding, no FIN";
1643 const unsigned char kV3FrameData[] = { 1617 const unsigned char kV3FrameData[] = {
1644 0x00, 0x00, 0x00, 0x01, 1618 0x00, 0x00, 0x00, 0x01,
1645 0x00, 0x00, 0x00, 0x05, 1619 0x00, 0x00, 0x00, 0x05,
1646 'h', 'e', 'l', 'l', 1620 'h', 'e', 'l', 'l',
1647 'o' 1621 'o'
1648 }; 1622 };
1649 1623
1650 const unsigned char kH2FrameData[] = { 1624 const unsigned char kH2FrameData[] = {
1651 0x00, 0x00, 0x06, 0x00, // Length = 6. PADDED set. 1625 0x00, 0x00, 0x06, 0x00, // Length = 6. PADDED set.
1652 0x08, 0x00, 0x00, 0x00, 1626 0x08, 0x00, 0x00, 0x00,
1653 0x01, 0x00, // Pad length field. 1627 0x01, 0x00, // Pad length field.
1654 'h', 'e', 'l', 'l', // Data 1628 'h', 'e', 'l', 'l', // Data
1655 'o', 1629 'o',
1656 }; 1630 };
1657 const char bytes[] = "hello"; 1631 const char bytes[] = "hello";
1658 1632
1659 SpdyDataIR data_ir(1, bytes); 1633 SpdyDataIR data_ir(1, bytes);
1660 // The pad length field itself is used for the 1-byte padding and no padding 1634 // The pad length field itself is used for the 1-byte padding and no padding
1661 // payload is needed. 1635 // payload is needed.
1662 data_ir.set_padding_len(1); 1636 data_ir.set_padding_len(1);
1663 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1637 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1664 if (IsSpdy3()) { 1638 if (IsSpdy3()) {
1665 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1639 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1666 } else { 1640 } else {
1667 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1641 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1668 } 1642 }
1669 1643
1670 frame.reset(framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir)); 1644 frame = framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir);
1671 CompareCharArraysWithHexError( 1645 CompareCharArraysWithHexError(
1672 kDescription, reinterpret_cast<const unsigned char*>(frame->data()), 1646 kDescription, reinterpret_cast<const unsigned char*>(frame.data()),
1673 framer.GetDataFrameMinimumSize(), 1647 framer.GetDataFrameMinimumSize(),
1674 IsSpdy3() ? kV3FrameData : kH2FrameData, 1648 IsSpdy3() ? kV3FrameData : kH2FrameData,
1675 framer.GetDataFrameMinimumSize()); 1649 framer.GetDataFrameMinimumSize());
1676 } 1650 }
1677 1651
1678 { 1652 {
1679 const char kDescription[] = "Data frame with negative data byte, no FIN"; 1653 const char kDescription[] = "Data frame with negative data byte, no FIN";
1680 const unsigned char kV3FrameData[] = { 1654 const unsigned char kV3FrameData[] = {
1681 0x00, 0x00, 0x00, 0x01, 1655 0x00, 0x00, 0x00, 0x01,
1682 0x00, 0x00, 0x00, 0x01, 1656 0x00, 0x00, 0x00, 0x01,
1683 0xff 1657 0xff
1684 }; 1658 };
1685 const unsigned char kH2FrameData[] = { 1659 const unsigned char kH2FrameData[] = {
1686 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff}; 1660 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff};
1687 SpdyDataIR data_ir(1, "\xff"); 1661 SpdyDataIR data_ir(1, "\xff");
1688 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1662 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1689 if (IsSpdy3()) { 1663 if (IsSpdy3()) {
1690 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1664 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1691 } else { 1665 } else {
1692 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1666 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1693 } 1667 }
1694 } 1668 }
1695 1669
1696 { 1670 {
1697 const char kDescription[] = "'hello' data frame, with FIN"; 1671 const char kDescription[] = "'hello' data frame, with FIN";
1698 const unsigned char kV3FrameData[] = { 1672 const unsigned char kV3FrameData[] = {
1699 0x00, 0x00, 0x00, 0x01, 1673 0x00, 0x00, 0x00, 0x01,
1700 0x01, 0x00, 0x00, 0x05, 1674 0x01, 0x00, 0x00, 0x05,
1701 'h', 'e', 'l', 'l', 1675 'h', 'e', 'l', 'l',
1702 'o' 1676 'o'
1703 }; 1677 };
1704 const unsigned char kH2FrameData[] = { 1678 const unsigned char kH2FrameData[] = {
1705 0x00, 0x00, 0x05, 0x00, 1679 0x00, 0x00, 0x05, 0x00,
1706 0x01, 0x00, 0x00, 0x00, 1680 0x01, 0x00, 0x00, 0x00,
1707 0x01, 'h', 'e', 'l', 1681 0x01, 'h', 'e', 'l',
1708 'l', 'o' 1682 'l', 'o'
1709 }; 1683 };
1710 SpdyDataIR data_ir(1, "hello"); 1684 SpdyDataIR data_ir(1, "hello");
1711 data_ir.set_fin(true); 1685 data_ir.set_fin(true);
1712 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1686 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1713 if (IsSpdy3()) { 1687 if (IsSpdy3()) {
1714 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1688 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1715 } else { 1689 } else {
1716 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1690 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1717 } 1691 }
1718 } 1692 }
1719 1693
1720 { 1694 {
1721 const char kDescription[] = "Empty data frame"; 1695 const char kDescription[] = "Empty data frame";
1722 const unsigned char kV3FrameData[] = { 1696 const unsigned char kV3FrameData[] = {
1723 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 1697 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
1724 }; 1698 };
1725 const unsigned char kH2FrameData[] = { 1699 const unsigned char kH2FrameData[] = {
1726 0x00, 0x00, 0x00, 0x00, 1700 0x00, 0x00, 0x00, 0x00,
1727 0x00, 0x00, 0x00, 0x00, 1701 0x00, 0x00, 0x00, 0x00,
1728 0x01, 1702 0x01,
1729 }; 1703 };
1730 SpdyDataIR data_ir(1, ""); 1704 SpdyDataIR data_ir(1, "");
1731 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1705 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1732 if (IsSpdy3()) { 1706 if (IsSpdy3()) {
1733 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1707 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1734 } else { 1708 } else {
1735 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1709 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1736 } 1710 }
1737 1711
1738 frame.reset(framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir)); 1712 frame = framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir);
1739 CompareCharArraysWithHexError( 1713 CompareCharArraysWithHexError(
1740 kDescription, reinterpret_cast<const unsigned char*>(frame->data()), 1714 kDescription, reinterpret_cast<const unsigned char*>(frame.data()),
1741 framer.GetDataFrameMinimumSize(), 1715 framer.GetDataFrameMinimumSize(),
1742 IsSpdy3() ? kV3FrameData : kH2FrameData, 1716 IsSpdy3() ? kV3FrameData : kH2FrameData,
1743 framer.GetDataFrameMinimumSize()); 1717 framer.GetDataFrameMinimumSize());
1744 } 1718 }
1745 1719
1746 { 1720 {
1747 const char kDescription[] = "Data frame with max stream ID"; 1721 const char kDescription[] = "Data frame with max stream ID";
1748 const unsigned char kV3FrameData[] = { 1722 const unsigned char kV3FrameData[] = {
1749 0x7f, 0xff, 0xff, 0xff, 1723 0x7f, 0xff, 0xff, 0xff,
1750 0x01, 0x00, 0x00, 0x05, 1724 0x01, 0x00, 0x00, 0x05,
1751 'h', 'e', 'l', 'l', 1725 'h', 'e', 'l', 'l',
1752 'o' 1726 'o'
1753 }; 1727 };
1754 const unsigned char kH2FrameData[] = { 1728 const unsigned char kH2FrameData[] = {
1755 0x00, 0x00, 0x05, 0x00, 1729 0x00, 0x00, 0x05, 0x00,
1756 0x01, 0x7f, 0xff, 0xff, 1730 0x01, 0x7f, 0xff, 0xff,
1757 0xff, 'h', 'e', 'l', 1731 0xff, 'h', 'e', 'l',
1758 'l', 'o' 1732 'l', 'o'
1759 }; 1733 };
1760 SpdyDataIR data_ir(0x7fffffff, "hello"); 1734 SpdyDataIR data_ir(0x7fffffff, "hello");
1761 data_ir.set_fin(true); 1735 data_ir.set_fin(true);
1762 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1736 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1763 if (IsSpdy3()) { 1737 if (IsSpdy3()) {
1764 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1738 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1765 } else { 1739 } else {
1766 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 1740 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1767 } 1741 }
1768 } 1742 }
1769 1743
1770 if (!IsHttp2()) { 1744 if (!IsHttp2()) {
1771 // This test does not apply to HTTP/2 because the max frame size is smaller 1745 // This test does not apply to HTTP/2 because the max frame size is smaller
1772 // than 4MB. 1746 // than 4MB.
1773 const char kDescription[] = "Large data frame"; 1747 const char kDescription[] = "Large data frame";
1774 const int kDataSize = 4 * 1024 * 1024; // 4 MB 1748 const int kDataSize = 4 * 1024 * 1024; // 4 MB
1775 const string kData(kDataSize, 'A'); 1749 const string kData(kDataSize, 'A');
1776 const unsigned char kFrameHeader[] = { 1750 const unsigned char kFrameHeader[] = {
1777 0x00, 0x00, 0x00, 0x01, 1751 0x00, 0x00, 0x00, 0x01,
1778 0x01, 0x40, 0x00, 0x00, 1752 0x01, 0x40, 0x00, 0x00,
1779 }; 1753 };
1780 1754
1781 const int kFrameSize = arraysize(kFrameHeader) + kDataSize; 1755 const int kFrameSize = arraysize(kFrameHeader) + kDataSize;
1782 scoped_ptr<unsigned char[]> expected_frame_data( 1756 scoped_ptr<unsigned char[]> expected_frame_data(
1783 new unsigned char[kFrameSize]); 1757 new unsigned char[kFrameSize]);
1784 memcpy(expected_frame_data.get(), kFrameHeader, arraysize(kFrameHeader)); 1758 memcpy(expected_frame_data.get(), kFrameHeader, arraysize(kFrameHeader));
1785 memset(expected_frame_data.get() + arraysize(kFrameHeader), 'A', kDataSize); 1759 memset(expected_frame_data.get() + arraysize(kFrameHeader), 'A', kDataSize);
1786 1760
1787 SpdyDataIR data_ir(1, kData); 1761 SpdyDataIR data_ir(1, kData);
1788 data_ir.set_fin(true); 1762 data_ir.set_fin(true);
1789 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1763 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1790 CompareFrame(kDescription, *frame, expected_frame_data.get(), kFrameSize); 1764 CompareFrame(kDescription, frame, expected_frame_data.get(), kFrameSize);
1791 } 1765 }
1792 } 1766 }
1793 1767
1794 TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) { 1768 TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
1795 if (!IsSpdy3()) { 1769 if (!IsSpdy3()) {
1796 return; 1770 return;
1797 } 1771 }
1798 1772
1799 SpdyFramer framer(spdy_version_); 1773 SpdyFramer framer(spdy_version_);
1800 framer.set_enable_compression(false); 1774 framer.set_enable_compression(false);
(...skipping 13 matching lines...) Expand all
1814 0x03, 'f', 'o', 'o', 1788 0x03, 'f', 'o', 'o',
1815 0x00, 0x00, 0x00, 0x03, 1789 0x00, 0x00, 0x00, 0x03,
1816 'f', 'o', 'o', 0x00, 1790 'f', 'o', 'o', 0x00,
1817 0x00, 0x00, 0x03, 'b', 1791 0x00, 0x00, 0x03, 'b',
1818 'a', 'r' 1792 'a', 'r'
1819 }; 1793 };
1820 SpdySynStreamIR syn_stream(1); 1794 SpdySynStreamIR syn_stream(1);
1821 syn_stream.set_priority(framer.GetLowestPriority()); 1795 syn_stream.set_priority(framer.GetLowestPriority());
1822 syn_stream.SetHeader("bar", "foo"); 1796 syn_stream.SetHeader("bar", "foo");
1823 syn_stream.SetHeader("foo", "bar"); 1797 syn_stream.SetHeader("foo", "bar");
1824 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 1798 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream));
1825 if (IsSpdy3()) { 1799 if (IsSpdy3()) {
1826 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1800 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1827 } else { 1801 } else {
1828 LOG(FATAL) << "Unsupported version in test."; 1802 LOG(FATAL) << "Unsupported version in test.";
1829 } 1803 }
1830 } 1804 }
1831 1805
1832 { 1806 {
1833 const char kDescription[] = 1807 const char kDescription[] =
1834 "SYN_STREAM frame with a 0-length header name, highest pri, FIN, " 1808 "SYN_STREAM frame with a 0-length header name, highest pri, FIN, "
1835 "max stream ID"; 1809 "max stream ID";
1836 1810
(...skipping 10 matching lines...) Expand all
1847 0x03, 'f', 'o', 'o', 1821 0x03, 'f', 'o', 'o',
1848 0x00, 0x00, 0x00, 0x03, 1822 0x00, 0x00, 0x00, 0x03,
1849 'b', 'a', 'r' 1823 'b', 'a', 'r'
1850 }; 1824 };
1851 SpdySynStreamIR syn_stream(0x7fffffff); 1825 SpdySynStreamIR syn_stream(0x7fffffff);
1852 syn_stream.set_associated_to_stream_id(0x7fffffff); 1826 syn_stream.set_associated_to_stream_id(0x7fffffff);
1853 syn_stream.set_priority(framer.GetHighestPriority()); 1827 syn_stream.set_priority(framer.GetHighestPriority());
1854 syn_stream.set_fin(true); 1828 syn_stream.set_fin(true);
1855 syn_stream.SetHeader("", "foo"); 1829 syn_stream.SetHeader("", "foo");
1856 syn_stream.SetHeader("foo", "bar"); 1830 syn_stream.SetHeader("foo", "bar");
1857 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 1831 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream));
1858 if (IsSpdy3()) { 1832 if (IsSpdy3()) {
1859 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1833 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1860 } else { 1834 } else {
1861 LOG(FATAL) << "Unsupported version in test."; 1835 LOG(FATAL) << "Unsupported version in test.";
1862 } 1836 }
1863 } 1837 }
1864 1838
1865 { 1839 {
1866 const char kDescription[] = 1840 const char kDescription[] =
1867 "SYN_STREAM frame with a 0-length header val, high pri, FIN, " 1841 "SYN_STREAM frame with a 0-length header val, high pri, FIN, "
1868 "max stream ID"; 1842 "max stream ID";
1869 1843
(...skipping 10 matching lines...) Expand all
1880 0x00, 0x00, 0x00, 0x03, 1854 0x00, 0x00, 0x00, 0x03,
1881 'f', 'o', 'o', 0x00, 1855 'f', 'o', 'o', 0x00,
1882 0x00, 0x00, 0x00 1856 0x00, 0x00, 0x00
1883 }; 1857 };
1884 SpdySynStreamIR syn_stream(0x7fffffff); 1858 SpdySynStreamIR syn_stream(0x7fffffff);
1885 syn_stream.set_associated_to_stream_id(0x7fffffff); 1859 syn_stream.set_associated_to_stream_id(0x7fffffff);
1886 syn_stream.set_priority(1); 1860 syn_stream.set_priority(1);
1887 syn_stream.set_fin(true); 1861 syn_stream.set_fin(true);
1888 syn_stream.SetHeader("bar", "foo"); 1862 syn_stream.SetHeader("bar", "foo");
1889 syn_stream.SetHeader("foo", ""); 1863 syn_stream.SetHeader("foo", "");
1890 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 1864 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream));
1891 if (IsSpdy3()) { 1865 if (IsSpdy3()) {
1892 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1866 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
1893 } else { 1867 } else {
1894 LOG(FATAL) << "Unsupported version in test."; 1868 LOG(FATAL) << "Unsupported version in test.";
1895 } 1869 }
1896 } 1870 }
1897 } 1871 }
1898 1872
1899 // TODO(phajdan.jr): Clean up after we no longer need 1873 // TODO(phajdan.jr): Clean up after we no longer need
1900 // to workaround http://crbug.com/139744. 1874 // to workaround http://crbug.com/139744.
1901 #if !defined(USE_SYSTEM_ZLIB) 1875 #if !defined(USE_SYSTEM_ZLIB)
1902 TEST_P(SpdyFramerTest, CreateSynStreamCompressed) { 1876 TEST_P(SpdyFramerTest, CreateSynStreamCompressed) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1944 0x0a, 0x20, 0x80, 0x92, 1918 0x0a, 0x20, 0x80, 0x92,
1945 0x12, 0x8b, 0x00, 0x02, 1919 0x12, 0x8b, 0x00, 0x02,
1946 0x08, 0x00, 0x00, 0x00, 1920 0x08, 0x00, 0x00, 0x00,
1947 0xff, 0xff, 1921 0xff, 0xff,
1948 }; 1922 };
1949 1923
1950 SpdySynStreamIR syn_stream(1); 1924 SpdySynStreamIR syn_stream(1);
1951 syn_stream.set_priority(4); 1925 syn_stream.set_priority(4);
1952 syn_stream.SetHeader("bar", "foo"); 1926 syn_stream.SetHeader("bar", "foo");
1953 syn_stream.SetHeader("foo", "bar"); 1927 syn_stream.SetHeader("foo", "bar");
1954 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 1928 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream));
1955 const unsigned char* frame_data = 1929 const unsigned char* frame_data =
1956 reinterpret_cast<const unsigned char*>(frame->data()); 1930 reinterpret_cast<const unsigned char*>(frame.data());
1957 if (IsSpdy3()) { 1931 if (IsSpdy3()) {
1958 if (memcmp(frame_data, 1932 if (memcmp(frame_data, kV3SIMDFrameData,
1959 kV3SIMDFrameData, 1933 std::min(arraysize(kV3SIMDFrameData), frame.size())) != 0) {
1960 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { 1934 CompareCharArraysWithHexError(kDescription, frame_data, frame.size(),
1961 CompareCharArraysWithHexError(kDescription, 1935 kV3FrameData, arraysize(kV3FrameData));
1962 frame_data,
1963 frame->size(),
1964 kV3FrameData,
1965 arraysize(kV3FrameData));
1966 } 1936 }
1967 } else { 1937 } else {
1968 LOG(FATAL) << "Unsupported version in test."; 1938 LOG(FATAL) << "Unsupported version in test.";
1969 } 1939 }
1970 } 1940 }
1971 } 1941 }
1972 #endif // !defined(USE_SYSTEM_ZLIB) 1942 #endif // !defined(USE_SYSTEM_ZLIB)
1973 1943
1974 TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) { 1944 TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
1975 if (!IsSpdy3()) { 1945 if (!IsSpdy3()) {
(...skipping 15 matching lines...) Expand all
1991 'b', 'a', 'r', 0x00, 1961 'b', 'a', 'r', 0x00,
1992 0x00, 0x00, 0x03, 'f', 1962 0x00, 0x00, 0x03, 'f',
1993 'o', 'o', 0x00, 0x00, 1963 'o', 'o', 0x00, 0x00,
1994 0x00, 0x03, 'f', 'o', 1964 0x00, 0x03, 'f', 'o',
1995 'o', 0x00, 0x00, 0x00, 1965 'o', 0x00, 0x00, 0x00,
1996 0x03, 'b', 'a', 'r' 1966 0x03, 'b', 'a', 'r'
1997 }; 1967 };
1998 SpdySynReplyIR syn_reply(1); 1968 SpdySynReplyIR syn_reply(1);
1999 syn_reply.SetHeader("bar", "foo"); 1969 syn_reply.SetHeader("bar", "foo");
2000 syn_reply.SetHeader("foo", "bar"); 1970 syn_reply.SetHeader("foo", "bar");
2001 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); 1971 SpdySerializedFrame frame(framer.SerializeSynReply(syn_reply));
2002 if (IsSpdy3()) { 1972 if (IsSpdy3()) {
2003 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1973 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2004 } else { 1974 } else {
2005 LOG(FATAL) << "Unsupported version in test."; 1975 LOG(FATAL) << "Unsupported version in test.";
2006 } 1976 }
2007 } 1977 }
2008 1978
2009 { 1979 {
2010 const char kDescription[] = 1980 const char kDescription[] =
2011 "SYN_REPLY frame with a 0-length header name, FIN, max stream ID"; 1981 "SYN_REPLY frame with a 0-length header name, FIN, max stream ID";
2012 1982
2013 const unsigned char kV3FrameData[] = { 1983 const unsigned char kV3FrameData[] = {
2014 0x80, 0x03, 0x00, 0x02, 1984 0x80, 0x03, 0x00, 0x02,
2015 0x01, 0x00, 0x00, 0x21, 1985 0x01, 0x00, 0x00, 0x21,
2016 0x7f, 0xff, 0xff, 0xff, 1986 0x7f, 0xff, 0xff, 0xff,
2017 0x00, 0x00, 0x00, 0x02, 1987 0x00, 0x00, 0x00, 0x02,
2018 0x00, 0x00, 0x00, 0x00, 1988 0x00, 0x00, 0x00, 0x00,
2019 0x00, 0x00, 0x00, 0x03, 1989 0x00, 0x00, 0x00, 0x03,
2020 'f', 'o', 'o', 0x00, 1990 'f', 'o', 'o', 0x00,
2021 0x00, 0x00, 0x03, 'f', 1991 0x00, 0x00, 0x03, 'f',
2022 'o', 'o', 0x00, 0x00, 1992 'o', 'o', 0x00, 0x00,
2023 0x00, 0x03, 'b', 'a', 1993 0x00, 0x03, 'b', 'a',
2024 'r' 1994 'r'
2025 }; 1995 };
2026 SpdySynReplyIR syn_reply(0x7fffffff); 1996 SpdySynReplyIR syn_reply(0x7fffffff);
2027 syn_reply.set_fin(true); 1997 syn_reply.set_fin(true);
2028 syn_reply.SetHeader("", "foo"); 1998 syn_reply.SetHeader("", "foo");
2029 syn_reply.SetHeader("foo", "bar"); 1999 syn_reply.SetHeader("foo", "bar");
2030 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); 2000 SpdySerializedFrame frame(framer.SerializeSynReply(syn_reply));
2031 if (IsSpdy3()) { 2001 if (IsSpdy3()) {
2032 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2002 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2033 } else { 2003 } else {
2034 LOG(FATAL) << "Unsupported version in test."; 2004 LOG(FATAL) << "Unsupported version in test.";
2035 } 2005 }
2036 } 2006 }
2037 2007
2038 { 2008 {
2039 const char kDescription[] = 2009 const char kDescription[] =
2040 "SYN_REPLY frame with a 0-length header val, FIN, max stream ID"; 2010 "SYN_REPLY frame with a 0-length header val, FIN, max stream ID";
2041 2011
2042 const unsigned char kV3FrameData[] = { 2012 const unsigned char kV3FrameData[] = {
2043 0x80, 0x03, 0x00, 0x02, 2013 0x80, 0x03, 0x00, 0x02,
2044 0x01, 0x00, 0x00, 0x21, 2014 0x01, 0x00, 0x00, 0x21,
2045 0x7f, 0xff, 0xff, 0xff, 2015 0x7f, 0xff, 0xff, 0xff,
2046 0x00, 0x00, 0x00, 0x02, 2016 0x00, 0x00, 0x00, 0x02,
2047 0x00, 0x00, 0x00, 0x03, 2017 0x00, 0x00, 0x00, 0x03,
2048 'b', 'a', 'r', 0x00, 2018 'b', 'a', 'r', 0x00,
2049 0x00, 0x00, 0x03, 'f', 2019 0x00, 0x00, 0x03, 'f',
2050 'o', 'o', 0x00, 0x00, 2020 'o', 'o', 0x00, 0x00,
2051 0x00, 0x03, 'f', 'o', 2021 0x00, 0x03, 'f', 'o',
2052 'o', 0x00, 0x00, 0x00, 2022 'o', 0x00, 0x00, 0x00,
2053 0x00 2023 0x00
2054 }; 2024 };
2055 SpdySynReplyIR syn_reply(0x7fffffff); 2025 SpdySynReplyIR syn_reply(0x7fffffff);
2056 syn_reply.set_fin(true); 2026 syn_reply.set_fin(true);
2057 syn_reply.SetHeader("bar", "foo"); 2027 syn_reply.SetHeader("bar", "foo");
2058 syn_reply.SetHeader("foo", ""); 2028 syn_reply.SetHeader("foo", "");
2059 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); 2029 SpdySerializedFrame frame(framer.SerializeSynReply(syn_reply));
2060 if (IsSpdy3()) { 2030 if (IsSpdy3()) {
2061 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2031 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2062 } else { 2032 } else {
2063 LOG(FATAL) << "Unsupported version in test."; 2033 LOG(FATAL) << "Unsupported version in test.";
2064 } 2034 }
2065 } 2035 }
2066 } 2036 }
2067 2037
2068 // TODO(phajdan.jr): Clean up after we no longer need 2038 // TODO(phajdan.jr): Clean up after we no longer need
2069 // to workaround http://crbug.com/139744. 2039 // to workaround http://crbug.com/139744.
2070 #if !defined(USE_SYSTEM_ZLIB) 2040 #if !defined(USE_SYSTEM_ZLIB)
2071 TEST_P(SpdyFramerTest, CreateSynReplyCompressed) { 2041 TEST_P(SpdyFramerTest, CreateSynReplyCompressed) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2108 0xcb, 0xcf, 0x07, 0x08, 2078 0xcb, 0xcf, 0x07, 0x08,
2109 0x20, 0x24, 0x0a, 0x20, 2079 0x20, 0x24, 0x0a, 0x20,
2110 0x80, 0x92, 0x12, 0x8b, 2080 0x80, 0x92, 0x12, 0x8b,
2111 0x00, 0x02, 0x08, 0x00, 2081 0x00, 0x02, 0x08, 0x00,
2112 0x00, 0x00, 0xff, 0xff, 2082 0x00, 0x00, 0xff, 0xff,
2113 }; 2083 };
2114 2084
2115 SpdySynReplyIR syn_reply(1); 2085 SpdySynReplyIR syn_reply(1);
2116 syn_reply.SetHeader("bar", "foo"); 2086 syn_reply.SetHeader("bar", "foo");
2117 syn_reply.SetHeader("foo", "bar"); 2087 syn_reply.SetHeader("foo", "bar");
2118 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); 2088 SpdySerializedFrame frame(framer.SerializeSynReply(syn_reply));
2119 const unsigned char* frame_data = 2089 const unsigned char* frame_data =
2120 reinterpret_cast<const unsigned char*>(frame->data()); 2090 reinterpret_cast<const unsigned char*>(frame.data());
2121 if (IsSpdy3()) { 2091 if (IsSpdy3()) {
2122 if (memcmp(frame_data, 2092 if (memcmp(frame_data, kV3SIMDFrameData,
2123 kV3SIMDFrameData, 2093 std::min(arraysize(kV3SIMDFrameData), frame.size())) != 0) {
2124 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { 2094 CompareCharArraysWithHexError(kDescription, frame_data, frame.size(),
2125 CompareCharArraysWithHexError(kDescription, 2095 kV3FrameData, arraysize(kV3FrameData));
2126 frame_data,
2127 frame->size(),
2128 kV3FrameData,
2129 arraysize(kV3FrameData));
2130 } 2096 }
2131 } else { 2097 } else {
2132 LOG(FATAL) << "Unsupported version in test."; 2098 LOG(FATAL) << "Unsupported version in test.";
2133 } 2099 }
2134 } 2100 }
2135 } 2101 }
2136 #endif // !defined(USE_SYSTEM_ZLIB) 2102 #endif // !defined(USE_SYSTEM_ZLIB)
2137 2103
2138 TEST_P(SpdyFramerTest, CreateRstStream) { 2104 TEST_P(SpdyFramerTest, CreateRstStream) {
2139 SpdyFramer framer(spdy_version_); 2105 SpdyFramer framer(spdy_version_);
2140 2106
2141 { 2107 {
2142 const char kDescription[] = "RST_STREAM frame"; 2108 const char kDescription[] = "RST_STREAM frame";
2143 const unsigned char kV3FrameData[] = { 2109 const unsigned char kV3FrameData[] = {
2144 0x80, 0x03, 0x00, 0x03, 2110 0x80, 0x03, 0x00, 0x03,
2145 0x00, 0x00, 0x00, 0x08, 2111 0x00, 0x00, 0x00, 0x08,
2146 0x00, 0x00, 0x00, 0x01, 2112 0x00, 0x00, 0x00, 0x01,
2147 0x00, 0x00, 0x00, 0x01, 2113 0x00, 0x00, 0x00, 0x01,
2148 }; 2114 };
2149 const unsigned char kH2FrameData[] = { 2115 const unsigned char kH2FrameData[] = {
2150 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 2116 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00,
2151 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 2117 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
2152 }; 2118 };
2153 SpdyRstStreamIR rst_stream(1, RST_STREAM_PROTOCOL_ERROR); 2119 SpdyRstStreamIR rst_stream(1, RST_STREAM_PROTOCOL_ERROR);
2154 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); 2120 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream));
2155 if (IsSpdy3()) { 2121 if (IsSpdy3()) {
2156 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2122 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2157 } else { 2123 } else {
2158 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2124 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2159 } 2125 }
2160 } 2126 }
2161 2127
2162 { 2128 {
2163 const char kDescription[] = "RST_STREAM frame with max stream ID"; 2129 const char kDescription[] = "RST_STREAM frame with max stream ID";
2164 const unsigned char kV3FrameData[] = { 2130 const unsigned char kV3FrameData[] = {
2165 0x80, 0x03, 0x00, 0x03, 2131 0x80, 0x03, 0x00, 0x03,
2166 0x00, 0x00, 0x00, 0x08, 2132 0x00, 0x00, 0x00, 0x08,
2167 0x7f, 0xff, 0xff, 0xff, 2133 0x7f, 0xff, 0xff, 0xff,
2168 0x00, 0x00, 0x00, 0x01, 2134 0x00, 0x00, 0x00, 0x01,
2169 }; 2135 };
2170 const unsigned char kH2FrameData[] = { 2136 const unsigned char kH2FrameData[] = {
2171 0x00, 0x00, 0x04, 0x03, 2137 0x00, 0x00, 0x04, 0x03,
2172 0x00, 0x7f, 0xff, 0xff, 2138 0x00, 0x7f, 0xff, 0xff,
2173 0xff, 0x00, 0x00, 0x00, 2139 0xff, 0x00, 0x00, 0x00,
2174 0x01, 2140 0x01,
2175 }; 2141 };
2176 SpdyRstStreamIR rst_stream(0x7FFFFFFF, RST_STREAM_PROTOCOL_ERROR); 2142 SpdyRstStreamIR rst_stream(0x7FFFFFFF, RST_STREAM_PROTOCOL_ERROR);
2177 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); 2143 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream));
2178 if (IsSpdy3()) { 2144 if (IsSpdy3()) {
2179 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2145 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2180 } else { 2146 } else {
2181 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2147 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2182 } 2148 }
2183 } 2149 }
2184 2150
2185 { 2151 {
2186 const char kDescription[] = "RST_STREAM frame with max status code"; 2152 const char kDescription[] = "RST_STREAM frame with max status code";
2187 const unsigned char kV3FrameData[] = { 2153 const unsigned char kV3FrameData[] = {
2188 0x80, 0x03, 0x00, 0x03, 2154 0x80, 0x03, 0x00, 0x03,
2189 0x00, 0x00, 0x00, 0x08, 2155 0x00, 0x00, 0x00, 0x08,
2190 0x7f, 0xff, 0xff, 0xff, 2156 0x7f, 0xff, 0xff, 0xff,
2191 0x00, 0x00, 0x00, 0x06, 2157 0x00, 0x00, 0x00, 0x06,
2192 }; 2158 };
2193 const unsigned char kH2FrameData[] = { 2159 const unsigned char kH2FrameData[] = {
2194 0x00, 0x00, 0x04, 0x03, 2160 0x00, 0x00, 0x04, 0x03,
2195 0x00, 0x7f, 0xff, 0xff, 2161 0x00, 0x7f, 0xff, 0xff,
2196 0xff, 0x00, 0x00, 0x00, 2162 0xff, 0x00, 0x00, 0x00,
2197 0x02, 2163 0x02,
2198 }; 2164 };
2199 SpdyRstStreamIR rst_stream(0x7FFFFFFF, RST_STREAM_INTERNAL_ERROR); 2165 SpdyRstStreamIR rst_stream(0x7FFFFFFF, RST_STREAM_INTERNAL_ERROR);
2200 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); 2166 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream));
2201 if (IsSpdy3()) { 2167 if (IsSpdy3()) {
2202 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2168 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2203 } else { 2169 } else {
2204 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2170 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2205 } 2171 }
2206 } 2172 }
2207 } 2173 }
2208 2174
2209 TEST_P(SpdyFramerTest, CreateSettings) { 2175 TEST_P(SpdyFramerTest, CreateSettings) {
2210 SpdyFramer framer(spdy_version_); 2176 SpdyFramer framer(spdy_version_);
2211 2177
2212 { 2178 {
2213 const char kDescription[] = "Network byte order SETTINGS frame"; 2179 const char kDescription[] = "Network byte order SETTINGS frame";
2214 2180
(...skipping 14 matching lines...) Expand all
2229 uint32_t kValue = 0x0a0b0c0d; 2195 uint32_t kValue = 0x0a0b0c0d;
2230 SpdySettingsIR settings_ir; 2196 SpdySettingsIR settings_ir;
2231 2197
2232 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); 2198 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01);
2233 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; 2199 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE;
2234 settings_ir.AddSetting(kId, 2200 settings_ir.AddSetting(kId,
2235 kFlags & SETTINGS_FLAG_PLEASE_PERSIST, 2201 kFlags & SETTINGS_FLAG_PLEASE_PERSIST,
2236 kFlags & SETTINGS_FLAG_PERSISTED, 2202 kFlags & SETTINGS_FLAG_PERSISTED,
2237 kValue); 2203 kValue);
2238 2204
2239 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); 2205 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir));
2240 if (IsSpdy3()) { 2206 if (IsSpdy3()) {
2241 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2207 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2242 } else { 2208 } else {
2243 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2209 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2244 } 2210 }
2245 } 2211 }
2246 2212
2247 { 2213 {
2248 const char kDescription[] = "Basic SETTINGS frame"; 2214 const char kDescription[] = "Basic SETTINGS frame";
2249 2215
2250 const unsigned char kV3FrameData[] = { 2216 const unsigned char kV3FrameData[] = {
2251 0x80, 0x03, 0x00, 0x04, 2217 0x80, 0x03, 0x00, 0x04,
2252 0x00, 0x00, 0x00, 0x24, 2218 0x00, 0x00, 0x00, 0x24,
2253 0x00, 0x00, 0x00, 0x04, 2219 0x00, 0x00, 0x00, 0x04,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2286 false, // persisted 2252 false, // persisted
2287 6); 2253 6);
2288 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3), 2254 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3),
2289 false, // persist 2255 false, // persist
2290 false, // persisted 2256 false, // persisted
2291 7); 2257 7);
2292 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 4), 2258 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 4),
2293 false, // persist 2259 false, // persist
2294 false, // persisted 2260 false, // persisted
2295 8); 2261 8);
2296 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); 2262 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir));
2297 2263
2298 if (IsSpdy3()) { 2264 if (IsSpdy3()) {
2299 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2265 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2300 } else { 2266 } else {
2301 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2267 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2302 } 2268 }
2303 } 2269 }
2304 2270
2305 { 2271 {
2306 const char kDescription[] = "Empty SETTINGS frame"; 2272 const char kDescription[] = "Empty SETTINGS frame";
2307 2273
2308 const unsigned char kV3FrameData[] = { 2274 const unsigned char kV3FrameData[] = {
2309 0x80, 0x03, 0x00, 0x04, 2275 0x80, 0x03, 0x00, 0x04,
2310 0x00, 0x00, 0x00, 0x04, 2276 0x00, 0x00, 0x00, 0x04,
2311 0x00, 0x00, 0x00, 0x00, 2277 0x00, 0x00, 0x00, 0x00,
2312 }; 2278 };
2313 const unsigned char kH2FrameData[] = { 2279 const unsigned char kH2FrameData[] = {
2314 0x00, 0x00, 0x00, 0x04, 2280 0x00, 0x00, 0x00, 0x04,
2315 0x00, 0x00, 0x00, 0x00, 2281 0x00, 0x00, 0x00, 0x00,
2316 0x00, 2282 0x00,
2317 }; 2283 };
2318 SpdySettingsIR settings_ir; 2284 SpdySettingsIR settings_ir;
2319 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); 2285 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir));
2320 if (IsSpdy3()) { 2286 if (IsSpdy3()) {
2321 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2287 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2322 } else { 2288 } else {
2323 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2289 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2324 } 2290 }
2325 } 2291 }
2326 } 2292 }
2327 2293
2328 TEST_P(SpdyFramerTest, CreatePingFrame) { 2294 TEST_P(SpdyFramerTest, CreatePingFrame) {
2329 SpdyFramer framer(spdy_version_); 2295 SpdyFramer framer(spdy_version_);
2330 2296
2331 { 2297 {
2332 const char kDescription[] = "PING frame"; 2298 const char kDescription[] = "PING frame";
2333 const unsigned char kV3FrameData[] = { 2299 const unsigned char kV3FrameData[] = {
2334 0x80, 0x03, 0x00, 0x06, 2300 0x80, 0x03, 0x00, 0x06,
2335 0x00, 0x00, 0x00, 0x04, 2301 0x00, 0x00, 0x00, 0x04,
2336 0x12, 0x34, 0x56, 0x78, 2302 0x12, 0x34, 0x56, 0x78,
2337 }; 2303 };
2338 const unsigned char kH2FrameData[] = { 2304 const unsigned char kH2FrameData[] = {
2339 0x00, 0x00, 0x08, 0x06, 2305 0x00, 0x00, 0x08, 0x06,
2340 0x00, 0x00, 0x00, 0x00, 2306 0x00, 0x00, 0x00, 0x00,
2341 0x00, 0x12, 0x34, 0x56, 2307 0x00, 0x12, 0x34, 0x56,
2342 0x78, 0x9a, 0xbc, 0xde, 2308 0x78, 0x9a, 0xbc, 0xde,
2343 0xff, 2309 0xff,
2344 }; 2310 };
2345 const unsigned char kH2FrameDataWithAck[] = { 2311 const unsigned char kH2FrameDataWithAck[] = {
2346 0x00, 0x00, 0x08, 0x06, 2312 0x00, 0x00, 0x08, 0x06,
2347 0x01, 0x00, 0x00, 0x00, 2313 0x01, 0x00, 0x00, 0x00,
2348 0x00, 0x12, 0x34, 0x56, 2314 0x00, 0x12, 0x34, 0x56,
2349 0x78, 0x9a, 0xbc, 0xde, 2315 0x78, 0x9a, 0xbc, 0xde,
2350 0xff, 2316 0xff,
2351 }; 2317 };
2352 scoped_ptr<SpdyFrame> frame; 2318 SpdySerializedFrame frame;
2353 if (IsSpdy3()) { 2319 if (IsSpdy3()) {
2354 frame.reset(framer.SerializePing(SpdyPingIR(0x12345678ull))); 2320 frame = framer.SerializePing(SpdyPingIR(0x12345678ull));
2355 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2321 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2356 } else { 2322 } else {
2357 const SpdyPingId kPingId = 0x123456789abcdeffULL; 2323 const SpdyPingId kPingId = 0x123456789abcdeffULL;
2358 SpdyPingIR ping_ir(kPingId); 2324 SpdyPingIR ping_ir(kPingId);
2359 // Tests SpdyPingIR when the ping is not an ack. 2325 // Tests SpdyPingIR when the ping is not an ack.
2360 ASSERT_FALSE(ping_ir.is_ack()); 2326 ASSERT_FALSE(ping_ir.is_ack());
2361 frame.reset(framer.SerializePing(ping_ir)); 2327 frame = framer.SerializePing(ping_ir);
2362 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2328 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2363 2329
2364 // Tests SpdyPingIR when the ping is an ack. 2330 // Tests SpdyPingIR when the ping is an ack.
2365 ping_ir.set_is_ack(true); 2331 ping_ir.set_is_ack(true);
2366 frame.reset(framer.SerializePing(ping_ir)); 2332 frame = framer.SerializePing(ping_ir);
2367 CompareFrame(kDescription, *frame, kH2FrameDataWithAck, 2333 CompareFrame(kDescription, frame, kH2FrameDataWithAck,
2368 arraysize(kH2FrameDataWithAck)); 2334 arraysize(kH2FrameDataWithAck));
2369
2370 } 2335 }
2371 } 2336 }
2372 } 2337 }
2373 2338
2374 TEST_P(SpdyFramerTest, CreateGoAway) { 2339 TEST_P(SpdyFramerTest, CreateGoAway) {
2375 SpdyFramer framer(spdy_version_); 2340 SpdyFramer framer(spdy_version_);
2376 2341
2377 { 2342 {
2378 const char kDescription[] = "GOAWAY frame"; 2343 const char kDescription[] = "GOAWAY frame";
2379 const unsigned char kV3FrameData[] = { 2344 const unsigned char kV3FrameData[] = {
2380 0x80, 0x03, 0x00, 0x07, 2345 0x80, 0x03, 0x00, 0x07,
2381 0x00, 0x00, 0x00, 0x08, 2346 0x00, 0x00, 0x00, 0x08,
2382 0x00, 0x00, 0x00, 0x00, // Stream Id 2347 0x00, 0x00, 0x00, 0x00, // Stream Id
2383 0x00, 0x00, 0x00, 0x00, // Status 2348 0x00, 0x00, 0x00, 0x00, // Status
2384 }; 2349 };
2385 const unsigned char kH2FrameData[] = { 2350 const unsigned char kH2FrameData[] = {
2386 0x00, 0x00, 0x0a, 0x07, 2351 0x00, 0x00, 0x0a, 0x07,
2387 0x00, 0x00, 0x00, 0x00, 2352 0x00, 0x00, 0x00, 0x00,
2388 0x00, 0x00, 0x00, 0x00, // Stream id 2353 0x00, 0x00, 0x00, 0x00, // Stream id
2389 0x00, 0x00, 0x00, 0x00, // Status 2354 0x00, 0x00, 0x00, 0x00, // Status
2390 0x00, 0x47, 0x41, // Opaque Description 2355 0x00, 0x47, 0x41, // Opaque Description
2391 }; 2356 };
2392 SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA"); 2357 SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA");
2393 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); 2358 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir));
2394 if (IsSpdy3()) { 2359 if (IsSpdy3()) {
2395 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2360 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2396 } else { 2361 } else {
2397 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2362 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2398 } 2363 }
2399 } 2364 }
2400 2365
2401 { 2366 {
2402 const char kDescription[] = "GOAWAY frame with max stream ID, status"; 2367 const char kDescription[] = "GOAWAY frame with max stream ID, status";
2403 const unsigned char kV3FrameData[] = { 2368 const unsigned char kV3FrameData[] = {
2404 0x80, 0x03, 0x00, 0x07, 2369 0x80, 0x03, 0x00, 0x07,
2405 0x00, 0x00, 0x00, 0x08, 2370 0x00, 0x00, 0x00, 0x08,
2406 0x7f, 0xff, 0xff, 0xff, // Stream Id 2371 0x7f, 0xff, 0xff, 0xff, // Stream Id
2407 0x00, 0x00, 0x00, 0x01, // Status: PROTOCOL_ERROR. 2372 0x00, 0x00, 0x00, 0x01, // Status: PROTOCOL_ERROR.
2408 }; 2373 };
2409 const unsigned char kH2FrameData[] = { 2374 const unsigned char kH2FrameData[] = {
2410 0x00, 0x00, 0x0a, 0x07, 2375 0x00, 0x00, 0x0a, 0x07,
2411 0x00, 0x00, 0x00, 0x00, 2376 0x00, 0x00, 0x00, 0x00,
2412 0x00, 0x7f, 0xff, 0xff, // Stream Id 2377 0x00, 0x7f, 0xff, 0xff, // Stream Id
2413 0xff, 0x00, 0x00, 0x00, // Status: INTERNAL_ERROR. 2378 0xff, 0x00, 0x00, 0x00, // Status: INTERNAL_ERROR.
2414 0x02, 0x47, 0x41, // Opaque Description 2379 0x02, 0x47, 0x41, // Opaque Description
2415 }; 2380 };
2416 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); 2381 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA");
2417 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); 2382 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir));
2418 if (IsSpdy3()) { 2383 if (IsSpdy3()) {
2419 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2384 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2420 } else { 2385 } else {
2421 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2386 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2422 } 2387 }
2423 } 2388 }
2424 } 2389 }
2425 2390
2426 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { 2391 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) {
2427 SpdyFramer framer(spdy_version_); 2392 SpdyFramer framer(spdy_version_);
2428 framer.set_enable_compression(false); 2393 framer.set_enable_compression(false);
2429 2394
2430 { 2395 {
2431 const char kDescription[] = "HEADERS frame, no FIN"; 2396 const char kDescription[] = "HEADERS frame, no FIN";
(...skipping 16 matching lines...) Expand all
2448 0x04, 0x00, 0x00, 0x00, // Stream 1 2413 0x04, 0x00, 0x00, 0x00, // Stream 1
2449 0x01, 0x00, 0x03, 0x62, // @.ba 2414 0x01, 0x00, 0x03, 0x62, // @.ba
2450 0x61, 0x72, 0x03, 0x66, // r.fo 2415 0x61, 0x72, 0x03, 0x66, // r.fo
2451 0x6f, 0x6f, 0x00, 0x03, // o@.f 2416 0x6f, 0x6f, 0x00, 0x03, // o@.f
2452 0x66, 0x6f, 0x6f, 0x03, // oo.b 2417 0x66, 0x6f, 0x6f, 0x03, // oo.b
2453 0x62, 0x61, 0x72, // ar 2418 0x62, 0x61, 0x72, // ar
2454 }; 2419 };
2455 SpdyHeadersIR headers_ir(1); 2420 SpdyHeadersIR headers_ir(1);
2456 headers_ir.SetHeader("bar", "foo"); 2421 headers_ir.SetHeader("bar", "foo");
2457 headers_ir.SetHeader("foo", "bar"); 2422 headers_ir.SetHeader("foo", "bar");
2458 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 2423 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
2459 if (IsSpdy3()) { 2424 if (IsSpdy3()) {
2460 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2425 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2461 } else { 2426 } else {
2462 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2427 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2463 } 2428 }
2464 } 2429 }
2465 2430
2466 { 2431 {
2467 const char kDescription[] = 2432 const char kDescription[] =
2468 "HEADERS frame with a 0-length header name, FIN, max stream ID"; 2433 "HEADERS frame with a 0-length header name, FIN, max stream ID";
2469 2434
2470 const unsigned char kV3FrameData[] = { 2435 const unsigned char kV3FrameData[] = {
2471 0x80, 0x03, 0x00, 0x08, 2436 0x80, 0x03, 0x00, 0x08,
2472 0x01, 0x00, 0x00, 0x21, 2437 0x01, 0x00, 0x00, 0x21,
(...skipping 12 matching lines...) Expand all
2485 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff 2450 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff
2486 0xff, 0x00, 0x00, 0x03, // @.. 2451 0xff, 0x00, 0x00, 0x03, // @..
2487 0x66, 0x6f, 0x6f, 0x00, // foo@ 2452 0x66, 0x6f, 0x6f, 0x00, // foo@
2488 0x03, 0x66, 0x6f, 0x6f, // .foo 2453 0x03, 0x66, 0x6f, 0x6f, // .foo
2489 0x03, 0x62, 0x61, 0x72, // .bar 2454 0x03, 0x62, 0x61, 0x72, // .bar
2490 }; 2455 };
2491 SpdyHeadersIR headers_ir(0x7fffffff); 2456 SpdyHeadersIR headers_ir(0x7fffffff);
2492 headers_ir.set_fin(true); 2457 headers_ir.set_fin(true);
2493 headers_ir.SetHeader("", "foo"); 2458 headers_ir.SetHeader("", "foo");
2494 headers_ir.SetHeader("foo", "bar"); 2459 headers_ir.SetHeader("foo", "bar");
2495 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 2460 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
2496 if (IsSpdy3()) { 2461 if (IsSpdy3()) {
2497 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2462 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2498 } else { 2463 } else {
2499 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2464 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2500 } 2465 }
2501 } 2466 }
2502 2467
2503 { 2468 {
2504 const char kDescription[] = 2469 const char kDescription[] =
2505 "HEADERS frame with a 0-length header val, FIN, max stream ID"; 2470 "HEADERS frame with a 0-length header val, FIN, max stream ID";
2506 2471
2507 const unsigned char kV3FrameData[] = { 2472 const unsigned char kV3FrameData[] = {
2508 0x80, 0x03, 0x00, 0x08, 2473 0x80, 0x03, 0x00, 0x08,
2509 0x01, 0x00, 0x00, 0x21, 2474 0x01, 0x00, 0x00, 0x21,
(...skipping 12 matching lines...) Expand all
2522 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff 2487 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff
2523 0xff, 0x00, 0x03, 0x62, // @.b 2488 0xff, 0x00, 0x03, 0x62, // @.b
2524 0x61, 0x72, 0x03, 0x66, // ar.f 2489 0x61, 0x72, 0x03, 0x66, // ar.f
2525 0x6f, 0x6f, 0x00, 0x03, // oo@. 2490 0x6f, 0x6f, 0x00, 0x03, // oo@.
2526 0x66, 0x6f, 0x6f, 0x00, // foo. 2491 0x66, 0x6f, 0x6f, 0x00, // foo.
2527 }; 2492 };
2528 SpdyHeadersIR headers_ir(0x7fffffff); 2493 SpdyHeadersIR headers_ir(0x7fffffff);
2529 headers_ir.set_fin(true); 2494 headers_ir.set_fin(true);
2530 headers_ir.SetHeader("bar", "foo"); 2495 headers_ir.SetHeader("bar", "foo");
2531 headers_ir.SetHeader("foo", ""); 2496 headers_ir.SetHeader("foo", "");
2532 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 2497 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
2533 if (IsSpdy3()) { 2498 if (IsSpdy3()) {
2534 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2499 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2535 } else { 2500 } else {
2536 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2501 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2537 } 2502 }
2538 } 2503 }
2539 2504
2540 { 2505 {
2541 const char kDescription[] = 2506 const char kDescription[] =
2542 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri"; 2507 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri";
2543 2508
2544 const unsigned char kH2FrameData[] = { 2509 const unsigned char kH2FrameData[] = {
2545 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY 2510 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY
2546 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff 2511 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff
2547 0xff, 0x00, 0x00, 0x00, // exclusive, parent stream 2512 0xff, 0x00, 0x00, 0x00, // exclusive, parent stream
2548 0x00, 0xdb, // weight 2513 0x00, 0xdb, // weight
2549 0x00, 0x03, 0x62, 0x61, // @.ba 2514 0x00, 0x03, 0x62, 0x61, // @.ba
2550 0x72, 0x03, 0x66, 0x6f, // r.fo 2515 0x72, 0x03, 0x66, 0x6f, // r.fo
2551 0x6f, 0x00, 0x03, 0x66, // o@.f 2516 0x6f, 0x00, 0x03, 0x66, // o@.f
2552 0x6f, 0x6f, 0x00, // oo. 2517 0x6f, 0x6f, 0x00, // oo.
2553 }; 2518 };
2554 SpdyHeadersIR headers_ir(0x7fffffff); 2519 SpdyHeadersIR headers_ir(0x7fffffff);
2555 headers_ir.set_fin(true); 2520 headers_ir.set_fin(true);
2556 headers_ir.set_priority(1); 2521 headers_ir.set_priority(1);
2557 headers_ir.set_has_priority(true); 2522 headers_ir.set_has_priority(true);
2558 headers_ir.SetHeader("bar", "foo"); 2523 headers_ir.SetHeader("bar", "foo");
2559 headers_ir.SetHeader("foo", ""); 2524 headers_ir.SetHeader("foo", "");
2560 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 2525 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
2561 if (IsSpdy3()) { 2526 if (IsSpdy3()) {
2562 // HEADERS with priority not supported. 2527 // HEADERS with priority not supported.
2563 } else { 2528 } else {
2564 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2529 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2565 } 2530 }
2566 } 2531 }
2567 2532
2568 { 2533 {
2569 const char kDescription[] = 2534 const char kDescription[] =
2570 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri, " 2535 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri, "
2571 "exclusive=true, parent_stream=0"; 2536 "exclusive=true, parent_stream=0";
2572 2537
2573 const unsigned char kH2FrameData[] = { 2538 const unsigned char kH2FrameData[] = {
2574 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY 2539 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY
2575 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff 2540 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff
2576 0xff, 0x80, 0x00, 0x00, // exclusive, parent stream 2541 0xff, 0x80, 0x00, 0x00, // exclusive, parent stream
2577 0x00, 0xdb, // weight 2542 0x00, 0xdb, // weight
2578 0x00, 0x03, 0x62, 0x61, // @.ba 2543 0x00, 0x03, 0x62, 0x61, // @.ba
2579 0x72, 0x03, 0x66, 0x6f, // r.fo 2544 0x72, 0x03, 0x66, 0x6f, // r.fo
2580 0x6f, 0x00, 0x03, 0x66, // o@.f 2545 0x6f, 0x00, 0x03, 0x66, // o@.f
2581 0x6f, 0x6f, 0x00, // oo. 2546 0x6f, 0x6f, 0x00, // oo.
2582 }; 2547 };
2583 SpdyHeadersIR headers_ir(0x7fffffff); 2548 SpdyHeadersIR headers_ir(0x7fffffff);
2584 headers_ir.set_fin(true); 2549 headers_ir.set_fin(true);
2585 headers_ir.set_priority(1); 2550 headers_ir.set_priority(1);
2586 headers_ir.set_has_priority(true); 2551 headers_ir.set_has_priority(true);
2587 headers_ir.set_exclusive(true); 2552 headers_ir.set_exclusive(true);
2588 headers_ir.set_parent_stream_id(0); 2553 headers_ir.set_parent_stream_id(0);
2589 headers_ir.SetHeader("bar", "foo"); 2554 headers_ir.SetHeader("bar", "foo");
2590 headers_ir.SetHeader("foo", ""); 2555 headers_ir.SetHeader("foo", "");
2591 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 2556 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
2592 if (IsSpdy3()) { 2557 if (IsSpdy3()) {
2593 // HEADERS with priority not supported. 2558 // HEADERS with priority not supported.
2594 } else { 2559 } else {
2595 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2560 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2596 } 2561 }
2597 } 2562 }
2598 2563
2599 { 2564 {
2600 const char kDescription[] = 2565 const char kDescription[] =
2601 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri, " 2566 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri, "
2602 "exclusive=false, parent_stream=max stream ID"; 2567 "exclusive=false, parent_stream=max stream ID";
2603 2568
2604 const unsigned char kH2FrameData[] = { 2569 const unsigned char kH2FrameData[] = {
2605 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY 2570 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY
2606 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff 2571 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff
2607 0xff, 0x7f, 0xff, 0xff, // exclusive, parent stream 2572 0xff, 0x7f, 0xff, 0xff, // exclusive, parent stream
2608 0xff, 0xdb, // weight 2573 0xff, 0xdb, // weight
2609 0x00, 0x03, 0x62, 0x61, // @.ba 2574 0x00, 0x03, 0x62, 0x61, // @.ba
2610 0x72, 0x03, 0x66, 0x6f, // r.fo 2575 0x72, 0x03, 0x66, 0x6f, // r.fo
2611 0x6f, 0x00, 0x03, 0x66, // o@.f 2576 0x6f, 0x00, 0x03, 0x66, // o@.f
2612 0x6f, 0x6f, 0x00, // oo. 2577 0x6f, 0x6f, 0x00, // oo.
2613 }; 2578 };
2614 SpdyHeadersIR headers_ir(0x7fffffff); 2579 SpdyHeadersIR headers_ir(0x7fffffff);
2615 headers_ir.set_fin(true); 2580 headers_ir.set_fin(true);
2616 headers_ir.set_priority(1); 2581 headers_ir.set_priority(1);
2617 headers_ir.set_has_priority(true); 2582 headers_ir.set_has_priority(true);
2618 headers_ir.set_exclusive(false); 2583 headers_ir.set_exclusive(false);
2619 headers_ir.set_parent_stream_id(0x7fffffff); 2584 headers_ir.set_parent_stream_id(0x7fffffff);
2620 headers_ir.SetHeader("bar", "foo"); 2585 headers_ir.SetHeader("bar", "foo");
2621 headers_ir.SetHeader("foo", ""); 2586 headers_ir.SetHeader("foo", "");
2622 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 2587 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
2623 if (IsSpdy3()) { 2588 if (IsSpdy3()) {
2624 // HEADERS with priority not supported. 2589 // HEADERS with priority not supported.
2625 } else { 2590 } else {
2626 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2591 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2627 } 2592 }
2628 } 2593 }
2629 2594
2630 { 2595 {
2631 const char kDescription[] = 2596 const char kDescription[] =
2632 "HEADERS frame with a 0-length header name, FIN, max stream ID, padded"; 2597 "HEADERS frame with a 0-length header name, FIN, max stream ID, padded";
2633 2598
2634 const unsigned char kH2FrameData[] = { 2599 const unsigned char kH2FrameData[] = {
2635 0x00, 0x00, 0x15, 0x01, // Headers 2600 0x00, 0x00, 0x15, 0x01, // Headers
2636 0x0d, 0x7f, 0xff, 0xff, // FIN | END_HEADERS | PADDED, Stream 2601 0x0d, 0x7f, 0xff, 0xff, // FIN | END_HEADERS | PADDED, Stream
2637 // 0x7fffffff 2602 // 0x7fffffff
2638 0xff, 0x05, 0x00, 0x00, // Pad length field 2603 0xff, 0x05, 0x00, 0x00, // Pad length field
2639 0x03, 0x66, 0x6f, 0x6f, // .foo 2604 0x03, 0x66, 0x6f, 0x6f, // .foo
2640 0x00, 0x03, 0x66, 0x6f, // @.fo 2605 0x00, 0x03, 0x66, 0x6f, // @.fo
2641 0x6f, 0x03, 0x62, 0x61, // o.ba 2606 0x6f, 0x03, 0x62, 0x61, // o.ba
2642 0x72, // r 2607 0x72, // r
2643 // Padding payload 2608 // Padding payload
2644 0x00, 0x00, 0x00, 0x00, 0x00, 2609 0x00, 0x00, 0x00, 0x00, 0x00,
2645 }; 2610 };
2646 SpdyHeadersIR headers_ir(0x7fffffff); 2611 SpdyHeadersIR headers_ir(0x7fffffff);
2647 headers_ir.set_fin(true); 2612 headers_ir.set_fin(true);
2648 headers_ir.SetHeader("", "foo"); 2613 headers_ir.SetHeader("", "foo");
2649 headers_ir.SetHeader("foo", "bar"); 2614 headers_ir.SetHeader("foo", "bar");
2650 headers_ir.set_padding_len(6); 2615 headers_ir.set_padding_len(6);
2651 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 2616 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
2652 if (IsSpdy3()) { 2617 if (IsSpdy3()) {
2653 // Padding is not supported. 2618 // Padding is not supported.
2654 } else { 2619 } else {
2655 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2620 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2656 } 2621 }
2657 } 2622 }
2658 } 2623 }
2659 2624
2660 // TODO(phajdan.jr): Clean up after we no longer need 2625 // TODO(phajdan.jr): Clean up after we no longer need
2661 // to workaround http://crbug.com/139744. 2626 // to workaround http://crbug.com/139744.
2662 #if !defined(USE_SYSTEM_ZLIB) 2627 #if !defined(USE_SYSTEM_ZLIB)
2663 TEST_P(SpdyFramerTest, CreateHeadersCompressed) { 2628 TEST_P(SpdyFramerTest, CreateHeadersCompressed) {
2664 SpdyFramer framer(spdy_version_); 2629 SpdyFramer framer(spdy_version_);
2665 framer.set_enable_compression(true); 2630 framer.set_enable_compression(true);
(...skipping 30 matching lines...) Expand all
2696 0xcb, 0xcf, 0x07, 0x08, 2661 0xcb, 0xcf, 0x07, 0x08,
2697 0x20, 0x24, 0x0a, 0x20, 2662 0x20, 0x24, 0x0a, 0x20,
2698 0x80, 0x92, 0x12, 0x8b, 2663 0x80, 0x92, 0x12, 0x8b,
2699 0x00, 0x02, 0x08, 0x00, 2664 0x00, 0x02, 0x08, 0x00,
2700 0x00, 0x00, 0xff, 0xff, 2665 0x00, 0x00, 0xff, 0xff,
2701 }; 2666 };
2702 2667
2703 SpdyHeadersIR headers_ir(1); 2668 SpdyHeadersIR headers_ir(1);
2704 headers_ir.SetHeader("bar", "foo"); 2669 headers_ir.SetHeader("bar", "foo");
2705 headers_ir.SetHeader("foo", "bar"); 2670 headers_ir.SetHeader("foo", "bar");
2706 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 2671 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
2707 const unsigned char* frame_data = 2672 const unsigned char* frame_data =
2708 reinterpret_cast<const unsigned char*>(frame->data()); 2673 reinterpret_cast<const unsigned char*>(frame.data());
2709 if (IsSpdy3()) { 2674 if (IsSpdy3()) {
2710 if (memcmp(frame_data, 2675 if (memcmp(frame_data, kV3SIMDFrameData,
2711 kV3SIMDFrameData, 2676 std::min(arraysize(kV3SIMDFrameData), frame.size())) != 0) {
2712 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { 2677 CompareCharArraysWithHexError(kDescription, frame_data, frame.size(),
2713 CompareCharArraysWithHexError(kDescription, 2678 kV3FrameData, arraysize(kV3FrameData));
2714 frame_data,
2715 frame->size(),
2716 kV3FrameData,
2717 arraysize(kV3FrameData));
2718 } 2679 }
2719 } else { 2680 } else {
2720 // Deflate compression doesn't apply to HPACK. 2681 // Deflate compression doesn't apply to HPACK.
2721 } 2682 }
2722 } 2683 }
2723 } 2684 }
2724 #endif // !defined(USE_SYSTEM_ZLIB) 2685 #endif // !defined(USE_SYSTEM_ZLIB)
2725 2686
2726 TEST_P(SpdyFramerTest, CreateWindowUpdate) { 2687 TEST_P(SpdyFramerTest, CreateWindowUpdate) {
2727 SpdyFramer framer(spdy_version_); 2688 SpdyFramer framer(spdy_version_);
2728 2689
2729 { 2690 {
2730 const char kDescription[] = "WINDOW_UPDATE frame"; 2691 const char kDescription[] = "WINDOW_UPDATE frame";
2731 const unsigned char kV3FrameData[] = { 2692 const unsigned char kV3FrameData[] = {
2732 0x80, 0x03, 0x00, 0x09, 2693 0x80, 0x03, 0x00, 0x09,
2733 0x00, 0x00, 0x00, 0x08, 2694 0x00, 0x00, 0x00, 0x08,
2734 0x00, 0x00, 0x00, 0x01, 2695 0x00, 0x00, 0x00, 0x01,
2735 0x00, 0x00, 0x00, 0x01, 2696 0x00, 0x00, 0x00, 0x01,
2736 }; 2697 };
2737 const unsigned char kH2FrameData[] = { 2698 const unsigned char kH2FrameData[] = {
2738 0x00, 0x00, 0x04, 0x08, 2699 0x00, 0x00, 0x04, 0x08,
2739 0x00, 0x00, 0x00, 0x00, 2700 0x00, 0x00, 0x00, 0x00,
2740 0x01, 0x00, 0x00, 0x00, 2701 0x01, 0x00, 0x00, 0x00,
2741 0x01, 2702 0x01,
2742 }; 2703 };
2743 scoped_ptr<SpdyFrame> frame( 2704 SpdySerializedFrame frame(
2744 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1))); 2705 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1)));
2745 if (IsSpdy3()) { 2706 if (IsSpdy3()) {
2746 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2707 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2747 } else { 2708 } else {
2748 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2709 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2749 } 2710 }
2750 } 2711 }
2751 2712
2752 { 2713 {
2753 const char kDescription[] = "WINDOW_UPDATE frame with max stream ID"; 2714 const char kDescription[] = "WINDOW_UPDATE frame with max stream ID";
2754 const unsigned char kV3FrameData[] = { 2715 const unsigned char kV3FrameData[] = {
2755 0x80, 0x03, 0x00, 0x09, 2716 0x80, 0x03, 0x00, 0x09,
2756 0x00, 0x00, 0x00, 0x08, 2717 0x00, 0x00, 0x00, 0x08,
2757 0x7f, 0xff, 0xff, 0xff, 2718 0x7f, 0xff, 0xff, 0xff,
2758 0x00, 0x00, 0x00, 0x01, 2719 0x00, 0x00, 0x00, 0x01,
2759 }; 2720 };
2760 const unsigned char kH2FrameData[] = { 2721 const unsigned char kH2FrameData[] = {
2761 0x00, 0x00, 0x04, 0x08, 2722 0x00, 0x00, 0x04, 0x08,
2762 0x00, 0x7f, 0xff, 0xff, 2723 0x00, 0x7f, 0xff, 0xff,
2763 0xff, 0x00, 0x00, 0x00, 2724 0xff, 0x00, 0x00, 0x00,
2764 0x01, 2725 0x01,
2765 }; 2726 };
2766 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( 2727 SpdySerializedFrame frame(
2767 SpdyWindowUpdateIR(0x7FFFFFFF, 1))); 2728 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(0x7FFFFFFF, 1)));
2768 if (IsSpdy3()) { 2729 if (IsSpdy3()) {
2769 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2730 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2770 } else { 2731 } else {
2771 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2732 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2772 } 2733 }
2773 } 2734 }
2774 2735
2775 { 2736 {
2776 const char kDescription[] = "WINDOW_UPDATE frame with max window delta"; 2737 const char kDescription[] = "WINDOW_UPDATE frame with max window delta";
2777 const unsigned char kV3FrameData[] = { 2738 const unsigned char kV3FrameData[] = {
2778 0x80, 0x03, 0x00, 0x09, 2739 0x80, 0x03, 0x00, 0x09,
2779 0x00, 0x00, 0x00, 0x08, 2740 0x00, 0x00, 0x00, 0x08,
2780 0x00, 0x00, 0x00, 0x01, 2741 0x00, 0x00, 0x00, 0x01,
2781 0x7f, 0xff, 0xff, 0xff, 2742 0x7f, 0xff, 0xff, 0xff,
2782 }; 2743 };
2783 const unsigned char kH2FrameData[] = { 2744 const unsigned char kH2FrameData[] = {
2784 0x00, 0x00, 0x04, 0x08, 2745 0x00, 0x00, 0x04, 0x08,
2785 0x00, 0x00, 0x00, 0x00, 2746 0x00, 0x00, 0x00, 0x00,
2786 0x01, 0x7f, 0xff, 0xff, 2747 0x01, 0x7f, 0xff, 0xff,
2787 0xff, 2748 0xff,
2788 }; 2749 };
2789 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( 2750 SpdySerializedFrame frame(
2790 SpdyWindowUpdateIR(1, 0x7FFFFFFF))); 2751 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x7FFFFFFF)));
2791 if (IsSpdy3()) { 2752 if (IsSpdy3()) {
2792 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2753 CompareFrame(kDescription, frame, kV3FrameData, arraysize(kV3FrameData));
2793 } else { 2754 } else {
2794 CompareFrame(kDescription, *frame, kH2FrameData, arraysize(kH2FrameData)); 2755 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2795 } 2756 }
2796 } 2757 }
2797 } 2758 }
2798 2759
2799 TEST_P(SpdyFramerTest, SerializeBlocked) { 2760 TEST_P(SpdyFramerTest, SerializeBlocked) {
2800 if (!IsHttp2()) { 2761 if (!IsHttp2()) {
2801 return; 2762 return;
2802 } 2763 }
2803 2764
2804 SpdyFramer framer(spdy_version_); 2765 SpdyFramer framer(spdy_version_);
2805 2766
2806 const char kDescription[] = "BLOCKED frame"; 2767 const char kDescription[] = "BLOCKED frame";
2807 const unsigned char kType = static_cast<unsigned char>( 2768 const unsigned char kType = static_cast<unsigned char>(
2808 SpdyConstants::SerializeFrameType(spdy_version_, BLOCKED)); 2769 SpdyConstants::SerializeFrameType(spdy_version_, BLOCKED));
2809 const unsigned char kFrameData[] = { 2770 const unsigned char kFrameData[] = {
2810 0x00, 0x00, 0x00, kType, 0x00, 2771 0x00, 0x00, 0x00, kType, 0x00,
2811 0x00, 0x00, 0x00, 0x00, 2772 0x00, 0x00, 0x00, 0x00,
2812 }; 2773 };
2813 SpdyBlockedIR blocked_ir(0); 2774 SpdyBlockedIR blocked_ir(0);
2814 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); 2775 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir));
2815 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); 2776 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2816 } 2777 }
2817 2778
2818 TEST_P(SpdyFramerTest, CreateBlocked) { 2779 TEST_P(SpdyFramerTest, CreateBlocked) {
2819 if (!IsHttp2()) { 2780 if (!IsHttp2()) {
2820 return; 2781 return;
2821 } 2782 }
2822 2783
2823 SpdyFramer framer(spdy_version_); 2784 SpdyFramer framer(spdy_version_);
2824 2785
2825 const char kDescription[] = "BLOCKED frame"; 2786 const char kDescription[] = "BLOCKED frame";
2826 const SpdyStreamId kStreamId = 3; 2787 const SpdyStreamId kStreamId = 3;
2827 2788
2828 scoped_ptr<SpdySerializedFrame> frame_serialized( 2789 SpdySerializedFrame frame_serialized(
2829 framer.SerializeBlocked(SpdyBlockedIR(kStreamId))); 2790 framer.SerializeBlocked(SpdyBlockedIR(kStreamId)));
2830 SpdyBlockedIR blocked_ir(kStreamId); 2791 SpdyBlockedIR blocked_ir(kStreamId);
2831 scoped_ptr<SpdySerializedFrame> frame_created( 2792 SpdySerializedFrame frame_created(framer.SerializeFrame(blocked_ir));
2832 framer.SerializeFrame(blocked_ir));
2833 2793
2834 CompareFrames(kDescription, *frame_serialized, *frame_created); 2794 CompareFrames(kDescription, frame_serialized, frame_created);
2835 } 2795 }
2836 2796
2837 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { 2797 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) {
2838 if (!IsHttp2()) { 2798 if (!IsHttp2()) {
2839 return; 2799 return;
2840 } 2800 }
2841 2801
2842 { 2802 {
2843 // Test framing PUSH_PROMISE without padding. 2803 // Test framing PUSH_PROMISE without padding.
2844 SpdyFramer framer(spdy_version_); 2804 SpdyFramer framer(spdy_version_);
2845 framer.set_enable_compression(false); 2805 framer.set_enable_compression(false);
2846 const char kDescription[] = "PUSH_PROMISE frame without padding"; 2806 const char kDescription[] = "PUSH_PROMISE frame without padding";
2847 2807
2848 const unsigned char kFrameData[] = { 2808 const unsigned char kFrameData[] = {
2849 0x00, 0x00, 0x16, 0x05, // PUSH_PROMISE 2809 0x00, 0x00, 0x16, 0x05, // PUSH_PROMISE
2850 0x04, 0x00, 0x00, 0x00, // END_HEADERS 2810 0x04, 0x00, 0x00, 0x00, // END_HEADERS
2851 0x2a, 0x00, 0x00, 0x00, // Stream 42 2811 0x2a, 0x00, 0x00, 0x00, // Stream 42
2852 0x39, 0x00, 0x03, 0x62, // Promised stream 57, @.b 2812 0x39, 0x00, 0x03, 0x62, // Promised stream 57, @.b
2853 0x61, 0x72, 0x03, 0x66, // ar.f 2813 0x61, 0x72, 0x03, 0x66, // ar.f
2854 0x6f, 0x6f, 0x00, 0x03, // oo@. 2814 0x6f, 0x6f, 0x00, 0x03, // oo@.
2855 0x66, 0x6f, 0x6f, 0x03, // foo. 2815 0x66, 0x6f, 0x6f, 0x03, // foo.
2856 0x62, 0x61, 0x72, // bar 2816 0x62, 0x61, 0x72, // bar
2857 }; 2817 };
2858 2818
2859 SpdyPushPromiseIR push_promise(42, 57); 2819 SpdyPushPromiseIR push_promise(42, 57);
2860 push_promise.SetHeader("bar", "foo"); 2820 push_promise.SetHeader("bar", "foo");
2861 push_promise.SetHeader("foo", "bar"); 2821 push_promise.SetHeader("foo", "bar");
2862 scoped_ptr<SpdySerializedFrame> frame( 2822 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
2863 framer.SerializePushPromise(push_promise)); 2823 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2864 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData));
2865 } 2824 }
2866 2825
2867 { 2826 {
2868 // Test framing PUSH_PROMISE with one byte of padding. 2827 // Test framing PUSH_PROMISE with one byte of padding.
2869 SpdyFramer framer(spdy_version_); 2828 SpdyFramer framer(spdy_version_);
2870 framer.set_enable_compression(false); 2829 framer.set_enable_compression(false);
2871 const char kDescription[] = "PUSH_PROMISE frame with one byte of padding"; 2830 const char kDescription[] = "PUSH_PROMISE frame with one byte of padding";
2872 2831
2873 const unsigned char kFrameData[] = { 2832 const unsigned char kFrameData[] = {
2874 0x00, 0x00, 0x17, 0x05, // PUSH_PROMISE 2833 0x00, 0x00, 0x17, 0x05, // PUSH_PROMISE
2875 0x0c, 0x00, 0x00, 0x00, // END_HEADERS | PADDED 2834 0x0c, 0x00, 0x00, 0x00, // END_HEADERS | PADDED
2876 0x2a, 0x00, 0x00, 0x00, // Stream 42, Pad length field 2835 0x2a, 0x00, 0x00, 0x00, // Stream 42, Pad length field
2877 0x00, 0x39, 0x00, 0x03, // Promised stream 57 2836 0x00, 0x39, 0x00, 0x03, // Promised stream 57
2878 0x62, 0x61, 0x72, 0x03, // bar. 2837 0x62, 0x61, 0x72, 0x03, // bar.
2879 0x66, 0x6f, 0x6f, 0x00, // foo@ 2838 0x66, 0x6f, 0x6f, 0x00, // foo@
2880 0x03, 0x66, 0x6f, 0x6f, // .foo 2839 0x03, 0x66, 0x6f, 0x6f, // .foo
2881 0x03, 0x62, 0x61, 0x72, // .bar 2840 0x03, 0x62, 0x61, 0x72, // .bar
2882 }; 2841 };
2883 2842
2884 SpdyPushPromiseIR push_promise(42, 57); 2843 SpdyPushPromiseIR push_promise(42, 57);
2885 push_promise.set_padding_len(1); 2844 push_promise.set_padding_len(1);
2886 push_promise.SetHeader("bar", "foo"); 2845 push_promise.SetHeader("bar", "foo");
2887 push_promise.SetHeader("foo", "bar"); 2846 push_promise.SetHeader("foo", "bar");
2888 scoped_ptr<SpdySerializedFrame> frame( 2847 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
2889 framer.SerializePushPromise(push_promise)); 2848 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2890 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData));
2891 } 2849 }
2892 2850
2893 { 2851 {
2894 // Test framing PUSH_PROMISE with 177 bytes of padding. 2852 // Test framing PUSH_PROMISE with 177 bytes of padding.
2895 SpdyFramer framer(spdy_version_); 2853 SpdyFramer framer(spdy_version_);
2896 framer.set_enable_compression(false); 2854 framer.set_enable_compression(false);
2897 const char kDescription[] = "PUSH_PROMISE frame with 177 bytes of padding"; 2855 const char kDescription[] = "PUSH_PROMISE frame with 177 bytes of padding";
2898 2856
2899 const unsigned char kFrameData[] = { 2857 const unsigned char kFrameData[] = {
2900 0x00, 0x00, 0xc7, 0x05, // PUSH_PROMISE 2858 0x00, 0x00, 0xc7, 0x05, // PUSH_PROMISE
(...skipping 19 matching lines...) Expand all
2920 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2922 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2923 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2924 }; 2882 };
2925 2883
2926 SpdyPushPromiseIR push_promise(42, 57); 2884 SpdyPushPromiseIR push_promise(42, 57);
2927 push_promise.set_padding_len(177); 2885 push_promise.set_padding_len(177);
2928 push_promise.SetHeader("bar", "foo"); 2886 push_promise.SetHeader("bar", "foo");
2929 push_promise.SetHeader("foo", "bar"); 2887 push_promise.SetHeader("foo", "bar");
2930 scoped_ptr<SpdySerializedFrame> frame( 2888 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
2931 framer.SerializePushPromise(push_promise)); 2889 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2932 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData));
2933 } 2890 }
2934 } 2891 }
2935 2892
2936 // Regression test for https://crbug.com/464748. 2893 // Regression test for https://crbug.com/464748.
2937 TEST_P(SpdyFramerTest, GetNumberRequiredContinuationFrames) { 2894 TEST_P(SpdyFramerTest, GetNumberRequiredContinuationFrames) {
2938 if (!IsHttp2()) { 2895 if (!IsHttp2()) {
2939 return; 2896 return;
2940 } 2897 }
2941 2898
2942 SpdyFramer framer(spdy_version_); 2899 SpdyFramer framer(spdy_version_);
(...skipping 23 matching lines...) Expand all
2966 0x61, 0x72, 0x03, 0x66, // ar.f 2923 0x61, 0x72, 0x03, 0x66, // ar.f
2967 0x6f, 0x6f, 0x00, 0x03, // oo@. 2924 0x6f, 0x6f, 0x00, 0x03, // oo@.
2968 0x66, 0x6f, 0x6f, 0x03, // foo. 2925 0x66, 0x6f, 0x6f, 0x03, // foo.
2969 0x62, 0x61, 0x72, // bar 2926 0x62, 0x61, 0x72, // bar
2970 }; 2927 };
2971 2928
2972 SpdyContinuationIR continuation(42); 2929 SpdyContinuationIR continuation(42);
2973 continuation.SetHeader("bar", "foo"); 2930 continuation.SetHeader("bar", "foo");
2974 continuation.SetHeader("foo", "bar"); 2931 continuation.SetHeader("foo", "bar");
2975 continuation.set_end_headers(true); 2932 continuation.set_end_headers(true);
2976 scoped_ptr<SpdySerializedFrame> frame( 2933 SpdySerializedFrame frame(framer.SerializeContinuation(continuation));
2977 framer.SerializeContinuation(continuation)); 2934 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2978 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData));
2979 } 2935 }
2980 2936
2981 TEST_P(SpdyFramerTest, CreatePushPromiseThenContinuationUncompressed) { 2937 TEST_P(SpdyFramerTest, CreatePushPromiseThenContinuationUncompressed) {
2982 if (!IsHttp2()) { 2938 if (!IsHttp2()) {
2983 return; 2939 return;
2984 } 2940 }
2985 2941
2986 { 2942 {
2987 // Test framing in a case such that a PUSH_PROMISE frame, with one byte of 2943 // Test framing in a case such that a PUSH_PROMISE frame, with one byte of
2988 // padding, cannot hold all the data payload, which is overflowed to the 2944 // padding, cannot hold all the data payload, which is overflowed to the
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3030 0x78, 0x78, 0x78, 0x78, // xxxx 2986 0x78, 0x78, 0x78, 0x78, // xxxx
3031 0x78, 0x78, 0x78, 0x78, // xxxx 2987 0x78, 0x78, 0x78, 0x78, // xxxx
3032 0x78, 0x78, 0x78, 0x78, // xxxx 2988 0x78, 0x78, 0x78, 0x78, // xxxx
3033 0x78, 0x78, 2989 0x78, 0x78,
3034 }; 2990 };
3035 2991
3036 SpdyPushPromiseIR push_promise(42, 57); 2992 SpdyPushPromiseIR push_promise(42, 57);
3037 push_promise.set_padding_len(1); 2993 push_promise.set_padding_len(1);
3038 string big_value(TestSpdyVisitor::sent_control_frame_max_size(), 'x'); 2994 string big_value(TestSpdyVisitor::sent_control_frame_max_size(), 'x');
3039 push_promise.SetHeader("xxx", big_value); 2995 push_promise.SetHeader("xxx", big_value);
3040 scoped_ptr<SpdySerializedFrame> frame( 2996 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
3041 framer.SerializePushPromise(push_promise));
3042 2997
3043 // The entire frame should look like below: 2998 // The entire frame should look like below:
3044 // Name Length in Byte 2999 // Name Length in Byte
3045 // ------------------------------------------- Begin of PUSH_PROMISE frame 3000 // ------------------------------------------- Begin of PUSH_PROMISE frame
3046 // PUSH_PROMISE header 9 3001 // PUSH_PROMISE header 9
3047 // Pad length field 1 3002 // Pad length field 1
3048 // Promised stream 4 3003 // Promised stream 4
3049 // Length field of key 2 3004 // Length field of key 2
3050 // Content of key 3 3005 // Content of key 3
3051 // Length field of value 3 3006 // Length field of value 3
3052 // Part of big_value 16361 3007 // Part of big_value 16361
3053 // ------------------------------------------- Begin of CONTINUATION frame 3008 // ------------------------------------------- Begin of CONTINUATION frame
3054 // CONTINUATION header 9 3009 // CONTINUATION header 9
3055 // Remaining of big_value 22 3010 // Remaining of big_value 22
3056 // ------------------------------------------- End 3011 // ------------------------------------------- End
3057 3012
3058 // Length of everything listed above except big_value. 3013 // Length of everything listed above except big_value.
3059 int len_non_data_payload = 31; 3014 int len_non_data_payload = 31;
3060 EXPECT_EQ( 3015 EXPECT_EQ(
3061 TestSpdyVisitor::sent_control_frame_max_size() + len_non_data_payload, 3016 TestSpdyVisitor::sent_control_frame_max_size() + len_non_data_payload,
3062 frame->size()); 3017 frame.size());
3063 3018
3064 // Partially compare the PUSH_PROMISE frame against the template. 3019 // Partially compare the PUSH_PROMISE frame against the template.
3065 const unsigned char* frame_data = 3020 const unsigned char* frame_data =
3066 reinterpret_cast<const unsigned char*>(frame->data()); 3021 reinterpret_cast<const unsigned char*>(frame.data());
3067 CompareCharArraysWithHexError(kDescription, 3022 CompareCharArraysWithHexError(kDescription,
3068 frame_data, 3023 frame_data,
3069 arraysize(kPartialPushPromiseFrameData), 3024 arraysize(kPartialPushPromiseFrameData),
3070 kPartialPushPromiseFrameData, 3025 kPartialPushPromiseFrameData,
3071 arraysize(kPartialPushPromiseFrameData)); 3026 arraysize(kPartialPushPromiseFrameData));
3072 3027
3073 // Compare the CONTINUATION frame against the template. 3028 // Compare the CONTINUATION frame against the template.
3074 frame_data += TestSpdyVisitor::sent_control_frame_max_size(); 3029 frame_data += TestSpdyVisitor::sent_control_frame_max_size();
3075 CompareCharArraysWithHexError(kDescription, 3030 CompareCharArraysWithHexError(kDescription,
3076 frame_data, 3031 frame_data,
(...skipping 22 matching lines...) Expand all
3099 's', 't', ':', '1', '2', '3', '"', ';', ' ', 'm', 'a', '=', 3054 's', 't', ':', '1', '2', '3', '"', ';', ' ', 'm', 'a', '=',
3100 '4', '2', ';', ' ', 'p', '=', '"', '0', '.', '2', '0', '"', 3055 '4', '2', ';', ' ', 'p', '=', '"', '0', '.', '2', '0', '"',
3101 ';', ' ', 'v', '=', '"', '2', '4', '"'}; 3056 ';', ' ', 'v', '=', '"', '2', '4', '"'};
3102 SpdyAltSvcIR altsvc_ir(3); 3057 SpdyAltSvcIR altsvc_ir(3);
3103 altsvc_ir.set_origin("origin"); 3058 altsvc_ir.set_origin("origin");
3104 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( 3059 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService(
3105 "pid1", "host", 443, 5, 1.0, SpdyAltSvcWireFormat::VersionVector{})); 3060 "pid1", "host", 443, 5, 1.0, SpdyAltSvcWireFormat::VersionVector{}));
3106 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( 3061 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService(
3107 "p\"=i:d", "h_\\o\"st", 123, 42, 0.2, 3062 "p\"=i:d", "h_\\o\"st", 123, 42, 0.2,
3108 SpdyAltSvcWireFormat::VersionVector{24})); 3063 SpdyAltSvcWireFormat::VersionVector{24}));
3109 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir)); 3064 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
3110 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); 3065 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
3111 } 3066 }
3112 3067
3113 TEST_P(SpdyFramerTest, CreatePriority) { 3068 TEST_P(SpdyFramerTest, CreatePriority) {
3114 if (!IsHttp2()) { 3069 if (!IsHttp2()) {
3115 return; 3070 return;
3116 } 3071 }
3117 3072
3118 SpdyFramer framer(spdy_version_); 3073 SpdyFramer framer(spdy_version_);
3119 3074
3120 const char kDescription[] = "PRIORITY frame"; 3075 const char kDescription[] = "PRIORITY frame";
3121 const unsigned char kType = static_cast<unsigned char>( 3076 const unsigned char kType = static_cast<unsigned char>(
3122 SpdyConstants::SerializeFrameType(spdy_version_, PRIORITY)); 3077 SpdyConstants::SerializeFrameType(spdy_version_, PRIORITY));
3123 const unsigned char kFrameData[] = { 3078 const unsigned char kFrameData[] = {
3124 0x00, 0x00, 0x05, kType, 0x00, 3079 0x00, 0x00, 0x05, kType, 0x00,
3125 0x00, 0x00, 0x00, 0x02, // Stream ID = 2 3080 0x00, 0x00, 0x00, 0x02, // Stream ID = 2
3126 0x80, 0x00, 0x00, 0x01, // Exclusive dependency, parent stream ID = 1 3081 0x80, 0x00, 0x00, 0x01, // Exclusive dependency, parent stream ID = 1
3127 0x10, // Weight = 16 3082 0x10, // Weight = 16
3128 }; 3083 };
3129 SpdyPriorityIR priority_ir(2, 1, 16, true); 3084 SpdyPriorityIR priority_ir(2, 1, 16, true);
3130 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(priority_ir)); 3085 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir));
3131 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); 3086 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
3132 SpdyPriorityIR priority2(2); 3087 SpdyPriorityIR priority2(2);
3133 priority2.set_parent_stream_id(1); 3088 priority2.set_parent_stream_id(1);
3134 priority2.set_weight(16); 3089 priority2.set_weight(16);
3135 priority2.set_exclusive(true); 3090 priority2.set_exclusive(true);
3136 frame.reset(framer.SerializeFrame(priority2)); 3091 frame = framer.SerializeFrame(priority2);
3137 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); 3092 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
3138 } 3093 }
3139 3094
3140 TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) { 3095 TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) {
3141 if (!IsSpdy3()) { 3096 if (!IsSpdy3()) {
3142 return; 3097 return;
3143 } 3098 }
3144 3099
3145 SpdyFramer framer(spdy_version_); 3100 SpdyFramer framer(spdy_version_);
3146 SpdySynStreamIR syn_stream(1); 3101 SpdySynStreamIR syn_stream(1);
3147 syn_stream.set_priority(1); 3102 syn_stream.set_priority(1);
3148 syn_stream.SetHeader("aa", "vv"); 3103 syn_stream.SetHeader("aa", "vv");
3149 syn_stream.SetHeader("bb", "ww"); 3104 syn_stream.SetHeader("bb", "ww");
3150 SpdyHeaderBlock headers = syn_stream.header_block(); 3105 SpdyHeaderBlock headers = syn_stream.header_block();
3151 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSynStream(syn_stream)); 3106 SpdySerializedFrame control_frame(framer.SerializeSynStream(syn_stream));
3152 EXPECT_TRUE(control_frame.get() != NULL);
3153 TestSpdyVisitor visitor(spdy_version_); 3107 TestSpdyVisitor visitor(spdy_version_);
3154 visitor.use_compression_ = true; 3108 visitor.use_compression_ = true;
3155 visitor.SimulateInFramer( 3109 visitor.SimulateInFramer(
3156 reinterpret_cast<unsigned char*>(control_frame->data()), 3110 reinterpret_cast<unsigned char*>(control_frame.data()),
3157 control_frame->size()); 3111 control_frame.size());
3158 EXPECT_EQ(1, visitor.syn_frame_count_); 3112 EXPECT_EQ(1, visitor.syn_frame_count_);
3159 EXPECT_EQ(headers, visitor.headers_); 3113 EXPECT_EQ(headers, visitor.headers_);
3160 } 3114 }
3161 3115
3162 TEST_P(SpdyFramerTest, ReadCompressedSynReplyHeaderBlock) { 3116 TEST_P(SpdyFramerTest, ReadCompressedSynReplyHeaderBlock) {
3163 if (!IsSpdy3()) { 3117 if (!IsSpdy3()) {
3164 return; 3118 return;
3165 } 3119 }
3166 3120
3167 SpdyFramer framer(spdy_version_); 3121 SpdyFramer framer(spdy_version_);
3168 SpdySynReplyIR syn_reply(1); 3122 SpdySynReplyIR syn_reply(1);
3169 syn_reply.SetHeader("alpha", "beta"); 3123 syn_reply.SetHeader("alpha", "beta");
3170 syn_reply.SetHeader("gamma", "delta"); 3124 syn_reply.SetHeader("gamma", "delta");
3171 SpdyHeaderBlock headers = syn_reply.header_block(); 3125 SpdyHeaderBlock headers = syn_reply.header_block();
3172 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSynReply(syn_reply)); 3126 SpdySerializedFrame control_frame(framer.SerializeSynReply(syn_reply));
3173 EXPECT_TRUE(control_frame.get() != NULL);
3174 TestSpdyVisitor visitor(spdy_version_); 3127 TestSpdyVisitor visitor(spdy_version_);
3175 visitor.use_compression_ = true; 3128 visitor.use_compression_ = true;
3176 visitor.SimulateInFramer( 3129 visitor.SimulateInFramer(
3177 reinterpret_cast<unsigned char*>(control_frame->data()), 3130 reinterpret_cast<unsigned char*>(control_frame.data()),
3178 control_frame->size()); 3131 control_frame.size());
3179 EXPECT_EQ(1, visitor.syn_reply_frame_count_); 3132 EXPECT_EQ(1, visitor.syn_reply_frame_count_);
3180 EXPECT_EQ(0, visitor.headers_frame_count_); 3133 EXPECT_EQ(0, visitor.headers_frame_count_);
3181 EXPECT_EQ(headers, visitor.headers_); 3134 EXPECT_EQ(headers, visitor.headers_);
3182 } 3135 }
3183 3136
3184 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { 3137 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) {
3185 SpdyFramer framer(spdy_version_); 3138 SpdyFramer framer(spdy_version_);
3186 SpdyHeadersIR headers_ir(1); 3139 SpdyHeadersIR headers_ir(1);
3187 headers_ir.SetHeader("alpha", "beta"); 3140 headers_ir.SetHeader("alpha", "beta");
3188 headers_ir.SetHeader("gamma", "delta"); 3141 headers_ir.SetHeader("gamma", "delta");
3189 SpdyHeaderBlock headers = headers_ir.header_block(); 3142 SpdyHeaderBlock headers = headers_ir.header_block();
3190 scoped_ptr<SpdyFrame> control_frame(framer.SerializeHeaders(headers_ir)); 3143 SpdySerializedFrame control_frame(framer.SerializeHeaders(headers_ir));
3191 EXPECT_TRUE(control_frame.get() != NULL);
3192 TestSpdyVisitor visitor(spdy_version_); 3144 TestSpdyVisitor visitor(spdy_version_);
3193 visitor.use_compression_ = true; 3145 visitor.use_compression_ = true;
3194 visitor.SimulateInFramer( 3146 visitor.SimulateInFramer(
3195 reinterpret_cast<unsigned char*>(control_frame->data()), 3147 reinterpret_cast<unsigned char*>(control_frame.data()),
3196 control_frame->size()); 3148 control_frame.size());
3197 EXPECT_EQ(1, visitor.headers_frame_count_); 3149 EXPECT_EQ(1, visitor.headers_frame_count_);
3198 // control_frame_header_data_count_ depends on the random sequence 3150 // control_frame_header_data_count_ depends on the random sequence
3199 // produced by rand(), so adding, removing or running single tests 3151 // produced by rand(), so adding, removing or running single tests
3200 // alters this value. The best we can do is assert that it happens 3152 // alters this value. The best we can do is assert that it happens
3201 // at least twice. 3153 // at least twice.
3202 EXPECT_LE(2, visitor.control_frame_header_data_count_); 3154 EXPECT_LE(2, visitor.control_frame_header_data_count_);
3203 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3155 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3204 EXPECT_EQ(0, visitor.end_of_stream_count_); 3156 EXPECT_EQ(0, visitor.end_of_stream_count_);
3205 EXPECT_EQ(headers, visitor.headers_); 3157 EXPECT_EQ(headers, visitor.headers_);
3206 } 3158 }
3207 3159
3208 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { 3160 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) {
3209 SpdyFramer framer(spdy_version_); 3161 SpdyFramer framer(spdy_version_);
3210 SpdyHeadersIR headers_ir(1); 3162 SpdyHeadersIR headers_ir(1);
3211 headers_ir.set_fin(true); 3163 headers_ir.set_fin(true);
3212 headers_ir.SetHeader("alpha", "beta"); 3164 headers_ir.SetHeader("alpha", "beta");
3213 headers_ir.SetHeader("gamma", "delta"); 3165 headers_ir.SetHeader("gamma", "delta");
3214 SpdyHeaderBlock headers = headers_ir.header_block(); 3166 SpdyHeaderBlock headers = headers_ir.header_block();
3215 scoped_ptr<SpdyFrame> control_frame(framer.SerializeHeaders(headers_ir)); 3167 SpdySerializedFrame control_frame(framer.SerializeHeaders(headers_ir));
3216 EXPECT_TRUE(control_frame.get() != NULL);
3217 TestSpdyVisitor visitor(spdy_version_); 3168 TestSpdyVisitor visitor(spdy_version_);
3218 visitor.use_compression_ = true; 3169 visitor.use_compression_ = true;
3219 visitor.SimulateInFramer( 3170 visitor.SimulateInFramer(
3220 reinterpret_cast<unsigned char*>(control_frame->data()), 3171 reinterpret_cast<unsigned char*>(control_frame.data()),
3221 control_frame->size()); 3172 control_frame.size());
3222 EXPECT_EQ(1, visitor.headers_frame_count_); 3173 EXPECT_EQ(1, visitor.headers_frame_count_);
3223 // control_frame_header_data_count_ depends on the random sequence 3174 // control_frame_header_data_count_ depends on the random sequence
3224 // produced by rand(), so adding, removing or running single tests 3175 // produced by rand(), so adding, removing or running single tests
3225 // alters this value. The best we can do is assert that it happens 3176 // alters this value. The best we can do is assert that it happens
3226 // at least twice. 3177 // at least twice.
3227 EXPECT_LE(2, visitor.control_frame_header_data_count_); 3178 EXPECT_LE(2, visitor.control_frame_header_data_count_);
3228 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3179 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3229 EXPECT_EQ(1, visitor.end_of_stream_count_); 3180 EXPECT_EQ(1, visitor.end_of_stream_count_);
3230 EXPECT_EQ(headers, visitor.headers_); 3181 EXPECT_EQ(headers, visitor.headers_);
3231 } 3182 }
3232 3183
3233 TEST_P(SpdyFramerTest, ControlFrameAtMaxSizeLimit) { 3184 TEST_P(SpdyFramerTest, ControlFrameAtMaxSizeLimit) {
3234 if (!IsSpdy3()) { 3185 if (!IsSpdy3()) {
3235 // TODO(jgraettinger): This test setup doesn't work with HPACK. 3186 // TODO(jgraettinger): This test setup doesn't work with HPACK.
3236 return; 3187 return;
3237 } 3188 }
3238 3189
3239 // First find the size of the header value in order to just reach the control 3190 // First find the size of the header value in order to just reach the control
3240 // frame max size. 3191 // frame max size.
3241 SpdyFramer framer(spdy_version_); 3192 SpdyFramer framer(spdy_version_);
3242 framer.set_enable_compression(false); 3193 framer.set_enable_compression(false);
3243 SpdySynStreamIR syn_stream(1); 3194 SpdySynStreamIR syn_stream(1);
3244 syn_stream.set_priority(1); 3195 syn_stream.set_priority(1);
3245 syn_stream.SetHeader("aa", ""); 3196 syn_stream.SetHeader("aa", "");
3246 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSynStream(syn_stream)); 3197 SpdySerializedFrame control_frame(framer.SerializeSynStream(syn_stream));
3247 const size_t kBigValueSize = 3198 const size_t kBigValueSize =
3248 TestSpdyVisitor::sent_control_frame_max_size() - control_frame->size(); 3199 TestSpdyVisitor::sent_control_frame_max_size() - control_frame.size();
3249 3200
3250 // Create a frame at exactly that size. 3201 // Create a frame at exactly that size.
3251 string big_value(kBigValueSize, 'x'); 3202 string big_value(kBigValueSize, 'x');
3252 syn_stream.SetHeader("aa", big_value); 3203 syn_stream.SetHeader("aa", big_value);
3253 control_frame.reset(framer.SerializeSynStream(syn_stream)); 3204 control_frame = framer.SerializeSynStream(syn_stream);
3254 EXPECT_TRUE(control_frame.get() != NULL);
3255 EXPECT_EQ(TestSpdyVisitor::sent_control_frame_max_size(), 3205 EXPECT_EQ(TestSpdyVisitor::sent_control_frame_max_size(),
3256 control_frame->size()); 3206 control_frame.size());
3257 3207
3258 TestSpdyVisitor visitor(spdy_version_); 3208 TestSpdyVisitor visitor(spdy_version_);
3259 visitor.SimulateInFramer( 3209 visitor.SimulateInFramer(
3260 reinterpret_cast<unsigned char*>(control_frame->data()), 3210 reinterpret_cast<unsigned char*>(control_frame.data()),
3261 control_frame->size()); 3211 control_frame.size());
3262 EXPECT_TRUE(visitor.header_buffer_valid_); 3212 EXPECT_TRUE(visitor.header_buffer_valid_);
3263 EXPECT_EQ(0, visitor.error_count_); 3213 EXPECT_EQ(0, visitor.error_count_);
3264 EXPECT_EQ(1, visitor.syn_frame_count_); 3214 EXPECT_EQ(1, visitor.syn_frame_count_);
3265 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3215 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3266 EXPECT_EQ(0, visitor.end_of_stream_count_); 3216 EXPECT_EQ(0, visitor.end_of_stream_count_);
3267 EXPECT_LT(kBigValueSize, visitor.header_buffer_length_); 3217 EXPECT_LT(kBigValueSize, visitor.header_buffer_length_);
3268 } 3218 }
3269 3219
3270 TEST_P(SpdyFramerTest, ControlFrameMaximumSize) { 3220 TEST_P(SpdyFramerTest, ControlFrameMaximumSize) {
3271 if (!IsSpdy3()) { 3221 if (!IsSpdy3()) {
3272 // TODO(jgraettinger): This test setup doesn't work with HPACK. 3222 // TODO(jgraettinger): This test setup doesn't work with HPACK.
3273 return; 3223 return;
3274 } 3224 }
3275 3225
3276 // First find the size of the header value in order to just reach the control 3226 // First find the size of the header value in order to just reach the control
3277 // frame max size. 3227 // frame max size.
3278 SpdyFramer framer(spdy_version_); 3228 SpdyFramer framer(spdy_version_);
3279 framer.set_enable_compression(false); 3229 framer.set_enable_compression(false);
3280 SpdySynStreamIR syn_stream(1); 3230 SpdySynStreamIR syn_stream(1);
3281 syn_stream.SetHeader("aa", ""); 3231 syn_stream.SetHeader("aa", "");
3282 syn_stream.set_priority(1); 3232 syn_stream.set_priority(1);
3283 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSynStream(syn_stream)); 3233 SpdySerializedFrame control_frame(framer.SerializeSynStream(syn_stream));
3284 const size_t kBigValueSize = 3234 const size_t kBigValueSize =
3285 SpdyConstants::GetFrameMaximumSize(spdy_version_) - control_frame->size(); 3235 SpdyConstants::GetFrameMaximumSize(spdy_version_) - control_frame.size();
3286 3236
3287 // Create a frame at exatly that size. 3237 // Create a frame at exatly that size.
3288 string big_value(kBigValueSize, 'x'); 3238 string big_value(kBigValueSize, 'x');
3289 syn_stream.SetHeader("aa", big_value); 3239 syn_stream.SetHeader("aa", big_value);
3290 // Upstream branches here and wraps HTTP/2 with EXPECT_DEBUG_DFATAL. We 3240 // Upstream branches here and wraps HTTP/2 with EXPECT_DEBUG_DFATAL. We
3291 // neither support that in Chromium, nor do we use the same DFATAL (see 3241 // neither support that in Chromium, nor do we use the same DFATAL (see
3292 // SpdyFrameBuilder::WriteFramePrefix()). 3242 // SpdyFrameBuilder::WriteFramePrefix()).
3293 control_frame.reset(framer.SerializeSynStream(syn_stream)); 3243 control_frame = framer.SerializeSynStream(syn_stream);
3294 3244
3295 EXPECT_TRUE(control_frame.get() != NULL);
3296 EXPECT_EQ(SpdyConstants::GetFrameMaximumSize(spdy_version_), 3245 EXPECT_EQ(SpdyConstants::GetFrameMaximumSize(spdy_version_),
3297 control_frame->size()); 3246 control_frame.size());
3298 3247
3299 TestSpdyVisitor visitor(spdy_version_); 3248 TestSpdyVisitor visitor(spdy_version_);
3300 visitor.SimulateInFramer( 3249 visitor.SimulateInFramer(
3301 reinterpret_cast<unsigned char*>(control_frame->data()), 3250 reinterpret_cast<unsigned char*>(control_frame.data()),
3302 control_frame->size()); 3251 control_frame.size());
3303 EXPECT_TRUE(visitor.header_buffer_valid_); 3252 EXPECT_TRUE(visitor.header_buffer_valid_);
3304 EXPECT_EQ(0, visitor.error_count_); 3253 EXPECT_EQ(0, visitor.error_count_);
3305 EXPECT_EQ(1, visitor.syn_frame_count_); 3254 EXPECT_EQ(1, visitor.syn_frame_count_);
3306 } 3255 }
3307 3256
3308 TEST_P(SpdyFramerTest, TooLargeHeadersFrameUsesContinuation) { 3257 TEST_P(SpdyFramerTest, TooLargeHeadersFrameUsesContinuation) {
3309 if (!IsHttp2()) { 3258 if (!IsHttp2()) {
3310 return; 3259 return;
3311 } 3260 }
3312 3261
3313 SpdyFramer framer(spdy_version_); 3262 SpdyFramer framer(spdy_version_);
3314 framer.set_enable_compression(false); 3263 framer.set_enable_compression(false);
3315 SpdyHeadersIR headers(1); 3264 SpdyHeadersIR headers(1);
3316 headers.set_padding_len(256); 3265 headers.set_padding_len(256);
3317 3266
3318 // Exact payload length will change with HPACK, but this should be long 3267 // Exact payload length will change with HPACK, but this should be long
3319 // enough to cause an overflow. 3268 // enough to cause an overflow.
3320 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); 3269 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size();
3321 string big_value(kBigValueSize, 'x'); 3270 string big_value(kBigValueSize, 'x');
3322 headers.SetHeader("aa", big_value); 3271 headers.SetHeader("aa", big_value);
3323 scoped_ptr<SpdyFrame> control_frame(framer.SerializeHeaders(headers)); 3272 SpdySerializedFrame control_frame(framer.SerializeHeaders(headers));
3324 EXPECT_TRUE(control_frame.get() != NULL); 3273 EXPECT_GT(control_frame.size(),
3325 EXPECT_GT(control_frame->size(),
3326 TestSpdyVisitor::sent_control_frame_max_size()); 3274 TestSpdyVisitor::sent_control_frame_max_size());
3327 3275
3328 TestSpdyVisitor visitor(spdy_version_); 3276 TestSpdyVisitor visitor(spdy_version_);
3329 visitor.SimulateInFramer( 3277 visitor.SimulateInFramer(
3330 reinterpret_cast<unsigned char*>(control_frame->data()), 3278 reinterpret_cast<unsigned char*>(control_frame.data()),
3331 control_frame->size()); 3279 control_frame.size());
3332 EXPECT_TRUE(visitor.header_buffer_valid_); 3280 EXPECT_TRUE(visitor.header_buffer_valid_);
3333 EXPECT_EQ(0, visitor.error_count_); 3281 EXPECT_EQ(0, visitor.error_count_);
3334 EXPECT_EQ(1, visitor.headers_frame_count_); 3282 EXPECT_EQ(1, visitor.headers_frame_count_);
3335 EXPECT_EQ(1, visitor.continuation_count_); 3283 EXPECT_EQ(1, visitor.continuation_count_);
3336 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3284 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3337 } 3285 }
3338 3286
3339 TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) { 3287 TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) {
3340 if (!IsHttp2()) { 3288 if (!IsHttp2()) {
3341 return; 3289 return;
3342 } 3290 }
3343 3291
3344 SpdyFramer framer(spdy_version_); 3292 SpdyFramer framer(spdy_version_);
3345 framer.set_enable_compression(false); 3293 framer.set_enable_compression(false);
3346 SpdyPushPromiseIR push_promise(1, 2); 3294 SpdyPushPromiseIR push_promise(1, 2);
3347 push_promise.set_padding_len(256); 3295 push_promise.set_padding_len(256);
3348 3296
3349 // Exact payload length will change with HPACK, but this should be long 3297 // Exact payload length will change with HPACK, but this should be long
3350 // enough to cause an overflow. 3298 // enough to cause an overflow.
3351 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); 3299 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size();
3352 string big_value(kBigValueSize, 'x'); 3300 string big_value(kBigValueSize, 'x');
3353 push_promise.SetHeader("aa", big_value); 3301 push_promise.SetHeader("aa", big_value);
3354 scoped_ptr<SpdyFrame> control_frame( 3302 SpdySerializedFrame control_frame(framer.SerializePushPromise(push_promise));
3355 framer.SerializePushPromise(push_promise)); 3303 EXPECT_GT(control_frame.size(),
3356 EXPECT_TRUE(control_frame.get() != NULL);
3357 EXPECT_GT(control_frame->size(),
3358 TestSpdyVisitor::sent_control_frame_max_size()); 3304 TestSpdyVisitor::sent_control_frame_max_size());
3359 3305
3360 TestSpdyVisitor visitor(spdy_version_); 3306 TestSpdyVisitor visitor(spdy_version_);
3361 visitor.SimulateInFramer( 3307 visitor.SimulateInFramer(
3362 reinterpret_cast<unsigned char*>(control_frame->data()), 3308 reinterpret_cast<unsigned char*>(control_frame.data()),
3363 control_frame->size()); 3309 control_frame.size());
3364 EXPECT_TRUE(visitor.header_buffer_valid_); 3310 EXPECT_TRUE(visitor.header_buffer_valid_);
3365 EXPECT_EQ(0, visitor.error_count_); 3311 EXPECT_EQ(0, visitor.error_count_);
3366 EXPECT_EQ(1, visitor.push_promise_frame_count_); 3312 EXPECT_EQ(1, visitor.push_promise_frame_count_);
3367 EXPECT_EQ(1, visitor.continuation_count_); 3313 EXPECT_EQ(1, visitor.continuation_count_);
3368 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3314 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3369 } 3315 }
3370 3316
3371 // Check that the framer stops delivering header data chunks once the visitor 3317 // Check that the framer stops delivering header data chunks once the visitor
3372 // declares it doesn't want any more. This is important to guard against 3318 // declares it doesn't want any more. This is important to guard against
3373 // "zip bomb" types of attacks. 3319 // "zip bomb" types of attacks.
3374 TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) { 3320 TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) {
3375 const size_t kHeaderBufferChunks = 4; 3321 const size_t kHeaderBufferChunks = 4;
3376 const size_t kHeaderBufferSize = 3322 const size_t kHeaderBufferSize =
3377 TestSpdyVisitor::header_data_chunk_max_size() * kHeaderBufferChunks; 3323 TestSpdyVisitor::header_data_chunk_max_size() * kHeaderBufferChunks;
3378 const size_t kBigValueSize = kHeaderBufferSize * 2; 3324 const size_t kBigValueSize = kHeaderBufferSize * 2;
3379 string big_value(kBigValueSize, 'x'); 3325 string big_value(kBigValueSize, 'x');
3380 SpdyFramer framer(spdy_version_); 3326 SpdyFramer framer(spdy_version_);
3381 SpdyHeadersIR headers(1); 3327 SpdyHeadersIR headers(1);
3382 headers.set_priority(1); 3328 headers.set_priority(1);
3383 headers.set_fin(true); 3329 headers.set_fin(true);
3384 headers.SetHeader("aa", big_value); 3330 headers.SetHeader("aa", big_value);
3385 scoped_ptr<SpdyFrame> control_frame(framer.SerializeHeaders(headers)); 3331 SpdySerializedFrame control_frame(framer.SerializeHeaders(headers));
3386 EXPECT_TRUE(control_frame.get() != NULL);
3387 TestSpdyVisitor visitor(spdy_version_); 3332 TestSpdyVisitor visitor(spdy_version_);
3388 visitor.set_header_buffer_size(kHeaderBufferSize); 3333 visitor.set_header_buffer_size(kHeaderBufferSize);
3389 visitor.use_compression_ = true; 3334 visitor.use_compression_ = true;
3390 visitor.SimulateInFramer( 3335 visitor.SimulateInFramer(
3391 reinterpret_cast<unsigned char*>(control_frame->data()), 3336 reinterpret_cast<unsigned char*>(control_frame.data()),
3392 control_frame->size()); 3337 control_frame.size());
3393 EXPECT_FALSE(visitor.header_buffer_valid_); 3338 EXPECT_FALSE(visitor.header_buffer_valid_);
3394 EXPECT_EQ(1, visitor.error_count_); 3339 EXPECT_EQ(1, visitor.error_count_);
3395 EXPECT_EQ(SpdyFramer::SPDY_CONTROL_PAYLOAD_TOO_LARGE, 3340 EXPECT_EQ(SpdyFramer::SPDY_CONTROL_PAYLOAD_TOO_LARGE,
3396 visitor.framer_.error_code()) 3341 visitor.framer_.error_code())
3397 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3342 << SpdyFramer::ErrorCodeToString(framer.error_code());
3398 3343
3399 // The framer should have stoped delivering chunks after the visitor 3344 // The framer should have stoped delivering chunks after the visitor
3400 // signaled "stop" by returning false from OnControlFrameHeaderData(). 3345 // signaled "stop" by returning false from OnControlFrameHeaderData().
3401 // 3346 //
3402 // control_frame_header_data_count_ depends on the random sequence 3347 // control_frame_header_data_count_ depends on the random sequence
(...skipping 15 matching lines...) Expand all
3418 } 3363 }
3419 3364
3420 SpdyFramer framer(spdy_version_); 3365 SpdyFramer framer(spdy_version_);
3421 framer.set_enable_compression(false); 3366 framer.set_enable_compression(false);
3422 // Construct a SYN_STREAM control frame without compressing the header block, 3367 // Construct a SYN_STREAM control frame without compressing the header block,
3423 // and have the framer try to decompress it. This will cause the framer to 3368 // and have the framer try to decompress it. This will cause the framer to
3424 // deal with a decompression error. 3369 // deal with a decompression error.
3425 SpdySynStreamIR syn_stream(1); 3370 SpdySynStreamIR syn_stream(1);
3426 syn_stream.set_priority(1); 3371 syn_stream.set_priority(1);
3427 syn_stream.SetHeader("aa", "alpha beta gamma delta"); 3372 syn_stream.SetHeader("aa", "alpha beta gamma delta");
3428 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSynStream(syn_stream)); 3373 SpdySerializedFrame control_frame(framer.SerializeSynStream(syn_stream));
3429 TestSpdyVisitor visitor(spdy_version_); 3374 TestSpdyVisitor visitor(spdy_version_);
3430 visitor.use_compression_ = true; 3375 visitor.use_compression_ = true;
3431 visitor.SimulateInFramer( 3376 visitor.SimulateInFramer(
3432 reinterpret_cast<unsigned char*>(control_frame->data()), 3377 reinterpret_cast<unsigned char*>(control_frame.data()),
3433 control_frame->size()); 3378 control_frame.size());
3434 EXPECT_EQ(1, visitor.error_count_); 3379 EXPECT_EQ(1, visitor.error_count_);
3435 EXPECT_EQ(SpdyFramer::SPDY_DECOMPRESS_FAILURE, visitor.framer_.error_code()) 3380 EXPECT_EQ(SpdyFramer::SPDY_DECOMPRESS_FAILURE, visitor.framer_.error_code())
3436 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3381 << SpdyFramer::ErrorCodeToString(framer.error_code());
3437 EXPECT_EQ(0u, visitor.header_buffer_length_); 3382 EXPECT_EQ(0u, visitor.header_buffer_length_);
3438 } 3383 }
3439 3384
3440 TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) { 3385 TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) {
3441 SpdyFramer framer(spdy_version_); 3386 SpdyFramer framer(spdy_version_);
3442 // Create a GoAway frame that has a few extra bytes at the end. 3387 // Create a GoAway frame that has a few extra bytes at the end.
3443 // We create enough overhead to overflow the framer's control frame buffer. 3388 // We create enough overhead to overflow the framer's control frame buffer.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3481 EXPECT_EQ(1, visitor.error_count_); // This generated an error. 3426 EXPECT_EQ(1, visitor.error_count_); // This generated an error.
3482 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, 3427 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME,
3483 visitor.framer_.error_code()) 3428 visitor.framer_.error_code())
3484 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3429 << SpdyFramer::ErrorCodeToString(framer.error_code());
3485 EXPECT_EQ(0, visitor.goaway_count_); // Frame not parsed. 3430 EXPECT_EQ(0, visitor.goaway_count_); // Frame not parsed.
3486 } 3431 }
3487 3432
3488 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) { 3433 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) {
3489 SpdyFramer framer(spdy_version_); 3434 SpdyFramer framer(spdy_version_);
3490 SpdySettingsIR settings_ir; 3435 SpdySettingsIR settings_ir;
3491 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 3436 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
3492 SetFrameLength(control_frame.get(), 0, spdy_version_); 3437 SetFrameLength(&control_frame, 0, spdy_version_);
3493 TestSpdyVisitor visitor(spdy_version_); 3438 TestSpdyVisitor visitor(spdy_version_);
3494 visitor.use_compression_ = false; 3439 visitor.use_compression_ = false;
3495 visitor.SimulateInFramer( 3440 visitor.SimulateInFramer(
3496 reinterpret_cast<unsigned char*>(control_frame->data()), 3441 reinterpret_cast<unsigned char*>(control_frame.data()),
3497 framer.GetControlFrameHeaderSize()); 3442 framer.GetControlFrameHeaderSize());
3498 if (IsSpdy3()) { 3443 if (IsSpdy3()) {
3499 // Should generate an error, since zero-len settings frames are unsupported. 3444 // Should generate an error, since zero-len settings frames are unsupported.
3500 EXPECT_EQ(1, visitor.error_count_); 3445 EXPECT_EQ(1, visitor.error_count_);
3501 } else { 3446 } else {
3502 // Zero-len settings frames are permitted as of HTTP/2. 3447 // Zero-len settings frames are permitted as of HTTP/2.
3503 EXPECT_EQ(0, visitor.error_count_); 3448 EXPECT_EQ(0, visitor.error_count_);
3504 } 3449 }
3505 } 3450 }
3506 3451
3507 // Tests handling of SETTINGS frames with invalid length. 3452 // Tests handling of SETTINGS frames with invalid length.
3508 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { 3453 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) {
3509 SpdyFramer framer(spdy_version_); 3454 SpdyFramer framer(spdy_version_);
3510 SpdySettingsIR settings_ir; 3455 SpdySettingsIR settings_ir;
3511 3456
3512 // Add a setting to pad the frame so that we don't get a buffer overflow when 3457 // Add a setting to pad the frame so that we don't get a buffer overflow when
3513 // calling SimulateInFramer() below. 3458 // calling SimulateInFramer() below.
3514 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 3459 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE,
3515 false, 3460 false,
3516 false, 3461 false,
3517 0x00000002); 3462 0x00000002);
3518 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 3463 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
3519 const size_t kNewLength = 14; 3464 const size_t kNewLength = 14;
3520 SetFrameLength(control_frame.get(), kNewLength, spdy_version_); 3465 SetFrameLength(&control_frame, kNewLength, spdy_version_);
3521 TestSpdyVisitor visitor(spdy_version_); 3466 TestSpdyVisitor visitor(spdy_version_);
3522 visitor.use_compression_ = false; 3467 visitor.use_compression_ = false;
3523 visitor.SimulateInFramer( 3468 visitor.SimulateInFramer(
3524 reinterpret_cast<unsigned char*>(control_frame->data()), 3469 reinterpret_cast<unsigned char*>(control_frame.data()),
3525 framer.GetControlFrameHeaderSize() + kNewLength); 3470 framer.GetControlFrameHeaderSize() + kNewLength);
3526 // Should generate an error, since its not possible to have a 3471 // Should generate an error, since its not possible to have a
3527 // settings frame of length kNewLength. 3472 // settings frame of length kNewLength.
3528 EXPECT_EQ(1, visitor.error_count_); 3473 EXPECT_EQ(1, visitor.error_count_);
3529 } 3474 }
3530 3475
3531 // Tests handling of SETTINGS frames larger than the frame buffer size. 3476 // Tests handling of SETTINGS frames larger than the frame buffer size.
3532 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { 3477 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) {
3533 SpdyFramer framer(spdy_version_); 3478 SpdyFramer framer(spdy_version_);
3534 SpdySettingsIR settings_ir; 3479 SpdySettingsIR settings_ir;
3535 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1), 3480 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1),
3536 false, // persist 3481 false, // persist
3537 false, // persisted 3482 false, // persisted
3538 5); 3483 5);
3539 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 2), 3484 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 2),
3540 false, // persist 3485 false, // persist
3541 false, // persisted 3486 false, // persisted
3542 6); 3487 6);
3543 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3), 3488 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3),
3544 false, // persist 3489 false, // persist
3545 false, // persisted 3490 false, // persisted
3546 7); 3491 7);
3547 3492
3548 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 3493 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
3549 EXPECT_LT(SpdyFramerPeer::ControlFrameBufferSize(), control_frame->size()); 3494 EXPECT_LT(SpdyFramerPeer::ControlFrameBufferSize(), control_frame.size());
3550 TestSpdyVisitor visitor(spdy_version_); 3495 TestSpdyVisitor visitor(spdy_version_);
3551 visitor.use_compression_ = false; 3496 visitor.use_compression_ = false;
3552 3497
3553 // Read all at once. 3498 // Read all at once.
3554 visitor.SimulateInFramer( 3499 visitor.SimulateInFramer(
3555 reinterpret_cast<unsigned char*>(control_frame->data()), 3500 reinterpret_cast<unsigned char*>(control_frame.data()),
3556 control_frame->size()); 3501 control_frame.size());
3557 EXPECT_EQ(0, visitor.error_count_); 3502 EXPECT_EQ(0, visitor.error_count_);
3558 EXPECT_EQ(3, visitor.setting_count_); 3503 EXPECT_EQ(3, visitor.setting_count_);
3559 if (IsHttp2()) { 3504 if (IsHttp2()) {
3560 EXPECT_EQ(1, visitor.settings_ack_sent_); 3505 EXPECT_EQ(1, visitor.settings_ack_sent_);
3561 } 3506 }
3562 3507
3563 // Read data in small chunks. 3508 // Read data in small chunks.
3564 size_t framed_data = 0; 3509 size_t framed_data = 0;
3565 size_t unframed_data = control_frame->size(); 3510 size_t unframed_data = control_frame.size();
3566 size_t kReadChunkSize = 5; // Read five bytes at a time. 3511 size_t kReadChunkSize = 5; // Read five bytes at a time.
3567 while (unframed_data > 0) { 3512 while (unframed_data > 0) {
3568 size_t to_read = std::min(kReadChunkSize, unframed_data); 3513 size_t to_read = std::min(kReadChunkSize, unframed_data);
3569 visitor.SimulateInFramer( 3514 visitor.SimulateInFramer(
3570 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data), 3515 reinterpret_cast<unsigned char*>(control_frame.data() + framed_data),
3571 to_read); 3516 to_read);
3572 unframed_data -= to_read; 3517 unframed_data -= to_read;
3573 framed_data += to_read; 3518 framed_data += to_read;
3574 } 3519 }
3575 EXPECT_EQ(0, visitor.error_count_); 3520 EXPECT_EQ(0, visitor.error_count_);
3576 EXPECT_EQ(3 * 2, visitor.setting_count_); 3521 EXPECT_EQ(3 * 2, visitor.setting_count_);
3577 if (IsHttp2()) { 3522 if (IsHttp2()) {
3578 EXPECT_EQ(2, visitor.settings_ack_sent_); 3523 EXPECT_EQ(2, visitor.settings_ack_sent_);
3579 } 3524 }
3580 } 3525 }
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
3733 3678
3734 const int kPaddingLen = 119; 3679 const int kPaddingLen = 119;
3735 const char data_payload[] = "hello"; 3680 const char data_payload[] = "hello";
3736 3681
3737 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3682 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3738 SpdyFramer framer(spdy_version_); 3683 SpdyFramer framer(spdy_version_);
3739 framer.set_visitor(&visitor); 3684 framer.set_visitor(&visitor);
3740 3685
3741 SpdyDataIR data_ir(1, data_payload); 3686 SpdyDataIR data_ir(1, data_payload);
3742 data_ir.set_padding_len(kPaddingLen); 3687 data_ir.set_padding_len(kPaddingLen);
3743 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 3688 SpdySerializedFrame frame(framer.SerializeData(data_ir));
3744 ASSERT_TRUE(frame.get() != NULL);
3745 3689
3746 int bytes_consumed = 0; 3690 int bytes_consumed = 0;
3747 3691
3748 // Send the frame header. 3692 // Send the frame header.
3749 EXPECT_CALL(visitor, OnDataFrameHeader(1, 3693 EXPECT_CALL(visitor, OnDataFrameHeader(1,
3750 kPaddingLen + strlen(data_payload), 3694 kPaddingLen + strlen(data_payload),
3751 false)); 3695 false));
3752 CHECK_EQ(framer.GetDataFrameMinimumSize(), 3696 CHECK_EQ(framer.GetDataFrameMinimumSize(),
3753 framer.ProcessInput(frame->data(), 3697 framer.ProcessInput(frame.data(), framer.GetDataFrameMinimumSize()));
3754 framer.GetDataFrameMinimumSize()));
3755 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_DATA_FRAME_PADDING_LENGTH); 3698 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_DATA_FRAME_PADDING_LENGTH);
3756 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3699 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3757 bytes_consumed += framer.GetDataFrameMinimumSize(); 3700 bytes_consumed += framer.GetDataFrameMinimumSize();
3758 3701
3759 // Send the padding length field. 3702 // Send the padding length field.
3760 EXPECT_CALL(visitor, OnStreamPadding(1, 1)); 3703 EXPECT_CALL(visitor, OnStreamPadding(1, 1));
3761 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); 3704 CHECK_EQ(1u, framer.ProcessInput(frame.data() + bytes_consumed, 1));
3762 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); 3705 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME);
3763 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3706 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3764 bytes_consumed += 1; 3707 bytes_consumed += 1;
3765 3708
3766 // Send the first two bytes of the data payload, i.e., "he". 3709 // Send the first two bytes of the data payload, i.e., "he".
3767 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false)); 3710 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false));
3768 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2)); 3711 CHECK_EQ(2u, framer.ProcessInput(frame.data() + bytes_consumed, 2));
3769 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); 3712 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME);
3770 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3713 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3771 bytes_consumed += 2; 3714 bytes_consumed += 2;
3772 3715
3773 // Send the rest three bytes of the data payload, i.e., "llo". 3716 // Send the rest three bytes of the data payload, i.e., "llo".
3774 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3, false)); 3717 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3, false));
3775 CHECK_EQ(3u, framer.ProcessInput(frame->data() + bytes_consumed, 3)); 3718 CHECK_EQ(3u, framer.ProcessInput(frame.data() + bytes_consumed, 3));
3776 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); 3719 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING);
3777 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3720 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3778 bytes_consumed += 3; 3721 bytes_consumed += 3;
3779 3722
3780 // Send the first 100 bytes of the padding payload. 3723 // Send the first 100 bytes of the padding payload.
3781 EXPECT_CALL(visitor, OnStreamPadding(1, 100)); 3724 EXPECT_CALL(visitor, OnStreamPadding(1, 100));
3782 CHECK_EQ(100u, framer.ProcessInput(frame->data() + bytes_consumed, 100)); 3725 CHECK_EQ(100u, framer.ProcessInput(frame.data() + bytes_consumed, 100));
3783 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); 3726 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING);
3784 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3727 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3785 bytes_consumed += 100; 3728 bytes_consumed += 100;
3786 3729
3787 // Send rest of the padding payload. 3730 // Send rest of the padding payload.
3788 EXPECT_CALL(visitor, OnStreamPadding(1, 18)); 3731 EXPECT_CALL(visitor, OnStreamPadding(1, 18));
3789 CHECK_EQ(18u, framer.ProcessInput(frame->data() + bytes_consumed, 18)); 3732 CHECK_EQ(18u, framer.ProcessInput(frame.data() + bytes_consumed, 18));
3790 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READY_FOR_FRAME); 3733 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READY_FOR_FRAME);
3791 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 3734 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3792 } 3735 }
3793 3736
3794 TEST_P(SpdyFramerTest, ReadWindowUpdate) { 3737 TEST_P(SpdyFramerTest, ReadWindowUpdate) {
3795 SpdyFramer framer(spdy_version_); 3738 SpdyFramer framer(spdy_version_);
3796 scoped_ptr<SpdyFrame> control_frame( 3739 SpdySerializedFrame control_frame(
3797 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); 3740 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2)));
3798 TestSpdyVisitor visitor(spdy_version_); 3741 TestSpdyVisitor visitor(spdy_version_);
3799 visitor.SimulateInFramer( 3742 visitor.SimulateInFramer(
3800 reinterpret_cast<unsigned char*>(control_frame->data()), 3743 reinterpret_cast<unsigned char*>(control_frame.data()),
3801 control_frame->size()); 3744 control_frame.size());
3802 EXPECT_EQ(1u, visitor.last_window_update_stream_); 3745 EXPECT_EQ(1u, visitor.last_window_update_stream_);
3803 EXPECT_EQ(2, visitor.last_window_update_delta_); 3746 EXPECT_EQ(2, visitor.last_window_update_delta_);
3804 } 3747 }
3805 3748
3806 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { 3749 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) {
3807 if (!IsHttp2()) { 3750 if (!IsHttp2()) {
3808 return; 3751 return;
3809 } 3752 }
3810 3753
3811 SpdyFramer framer(spdy_version_); 3754 SpdyFramer framer(spdy_version_);
3812 SpdyPushPromiseIR push_promise(42, 57); 3755 SpdyPushPromiseIR push_promise(42, 57);
3813 push_promise.SetHeader("foo", "bar"); 3756 push_promise.SetHeader("foo", "bar");
3814 push_promise.SetHeader("bar", "foofoo"); 3757 push_promise.SetHeader("bar", "foofoo");
3815 SpdyHeaderBlock headers = push_promise.header_block(); 3758 SpdyHeaderBlock headers = push_promise.header_block();
3816 scoped_ptr<SpdySerializedFrame> frame( 3759 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
3817 framer.SerializePushPromise(push_promise));
3818 EXPECT_TRUE(frame.get() != NULL);
3819 TestSpdyVisitor visitor(spdy_version_); 3760 TestSpdyVisitor visitor(spdy_version_);
3820 visitor.use_compression_ = true; 3761 visitor.use_compression_ = true;
3821 visitor.SimulateInFramer( 3762 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
3822 reinterpret_cast<unsigned char*>(frame->data()), 3763 frame.size());
3823 frame->size());
3824 EXPECT_EQ(42u, visitor.last_push_promise_stream_); 3764 EXPECT_EQ(42u, visitor.last_push_promise_stream_);
3825 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); 3765 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_);
3826 EXPECT_EQ(headers, visitor.headers_); 3766 EXPECT_EQ(headers, visitor.headers_);
3827 } 3767 }
3828 3768
3829 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { 3769 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) {
3830 if (!IsHttp2()) { 3770 if (!IsHttp2()) {
3831 return; 3771 return;
3832 } 3772 }
3833 3773
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
4137 visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame)); 4077 visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame));
4138 EXPECT_EQ(0, visitor.error_count_); 4078 EXPECT_EQ(0, visitor.error_count_);
4139 4079
4140 // Follow it up with a valid control frame to make sure we handle 4080 // Follow it up with a valid control frame to make sure we handle
4141 // subsequent frames correctly. 4081 // subsequent frames correctly.
4142 SpdySettingsIR settings_ir; 4082 SpdySettingsIR settings_ir;
4143 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1), 4083 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1),
4144 false, // persist 4084 false, // persist
4145 false, // persisted 4085 false, // persisted
4146 10); 4086 10);
4147 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 4087 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
4148 visitor.SimulateInFramer( 4088 visitor.SimulateInFramer(
4149 reinterpret_cast<unsigned char*>(control_frame->data()), 4089 reinterpret_cast<unsigned char*>(control_frame.data()),
4150 control_frame->size()); 4090 control_frame.size());
4151 EXPECT_EQ(0, visitor.error_count_); 4091 EXPECT_EQ(0, visitor.error_count_);
4152 EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_)); 4092 EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_));
4153 EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_)); 4093 EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_));
4154 } 4094 }
4155 4095
4156 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) { 4096 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) {
4157 if (!IsHttp2()) { 4097 if (!IsHttp2()) {
4158 return; 4098 return;
4159 } 4099 }
4160 4100
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
4397 4337
4398 uint8_t flags = 0; 4338 uint8_t flags = 0;
4399 do { 4339 do {
4400 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4340 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4401 4341
4402 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4342 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4403 SpdyFramer framer(spdy_version_); 4343 SpdyFramer framer(spdy_version_);
4404 framer.set_visitor(&visitor); 4344 framer.set_visitor(&visitor);
4405 4345
4406 SpdyDataIR data_ir(1, "hello"); 4346 SpdyDataIR data_ir(1, "hello");
4407 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 4347 SpdySerializedFrame frame(framer.SerializeData(data_ir));
4408 SetFrameFlags(frame.get(), flags, spdy_version_); 4348 SetFrameFlags(&frame, flags, spdy_version_);
4409 4349
4410 if (flags & ~DATA_FLAG_FIN) { 4350 if (flags & ~DATA_FLAG_FIN) {
4411 EXPECT_CALL(visitor, OnError(_)); 4351 EXPECT_CALL(visitor, OnError(_));
4412 } else { 4352 } else {
4413 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); 4353 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
4414 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); 4354 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false));
4415 if (flags & DATA_FLAG_FIN) { 4355 if (flags & DATA_FLAG_FIN) {
4416 EXPECT_CALL(visitor, OnStreamEnd(_)); 4356 EXPECT_CALL(visitor, OnStreamEnd(_));
4417 } 4357 }
4418 } 4358 }
4419 4359
4420 framer.ProcessInput(frame->data(), frame->size()); 4360 framer.ProcessInput(frame.data(), frame.size());
4421 if (flags & ~DATA_FLAG_FIN) { 4361 if (flags & ~DATA_FLAG_FIN) {
4422 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4362 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4423 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) 4363 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code())
4424 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4364 << SpdyFramer::ErrorCodeToString(framer.error_code());
4425 } else { 4365 } else {
4426 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4366 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4427 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4367 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4428 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4368 << SpdyFramer::ErrorCodeToString(framer.error_code());
4429 } 4369 }
4430 } while (++flags != 0); 4370 } while (++flags != 0);
4431 } 4371 }
4432 4372
4433 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3disabled) { 4373 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3disabled) {
4434 FLAGS_spdy_on_stream_end = false; 4374 FLAGS_spdy_on_stream_end = false;
4435 4375
4436 if (!IsSpdy3()) { 4376 if (!IsSpdy3()) {
4437 return; 4377 return;
4438 } 4378 }
4439 4379
4440 uint8_t flags = 0; 4380 uint8_t flags = 0;
4441 do { 4381 do {
4442 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4382 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4443 4383
4444 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4384 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4445 SpdyFramer framer(spdy_version_); 4385 SpdyFramer framer(spdy_version_);
4446 framer.set_visitor(&visitor); 4386 framer.set_visitor(&visitor);
4447 4387
4448 SpdyDataIR data_ir(1, "hello"); 4388 SpdyDataIR data_ir(1, "hello");
4449 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 4389 SpdySerializedFrame frame(framer.SerializeData(data_ir));
4450 SetFrameFlags(frame.get(), flags, spdy_version_); 4390 SetFrameFlags(&frame, flags, spdy_version_);
4451 4391
4452 if (flags & ~DATA_FLAG_FIN) { 4392 if (flags & ~DATA_FLAG_FIN) {
4453 EXPECT_CALL(visitor, OnError(_)); 4393 EXPECT_CALL(visitor, OnError(_));
4454 } else { 4394 } else {
4455 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); 4395 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
4456 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); 4396 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false));
4457 if (flags & DATA_FLAG_FIN) { 4397 if (flags & DATA_FLAG_FIN) {
4458 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); 4398 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true));
4459 } 4399 }
4460 } 4400 }
4461 4401
4462 framer.ProcessInput(frame->data(), frame->size()); 4402 framer.ProcessInput(frame.data(), frame.size());
4463 if (flags & ~DATA_FLAG_FIN) { 4403 if (flags & ~DATA_FLAG_FIN) {
4464 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4404 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4465 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, 4405 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS,
4466 framer.error_code()) 4406 framer.error_code())
4467 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4407 << SpdyFramer::ErrorCodeToString(framer.error_code());
4468 } else { 4408 } else {
4469 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4409 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4470 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4410 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4471 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4411 << SpdyFramer::ErrorCodeToString(framer.error_code());
4472 } 4412 }
(...skipping 12 matching lines...) Expand all
4485 4425
4486 uint8_t flags = 0; 4426 uint8_t flags = 0;
4487 do { 4427 do {
4488 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4428 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4489 4429
4490 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4430 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4491 SpdyFramer framer(spdy_version_); 4431 SpdyFramer framer(spdy_version_);
4492 framer.set_visitor(&visitor); 4432 framer.set_visitor(&visitor);
4493 4433
4494 SpdyDataIR data_ir(1, "hello"); 4434 SpdyDataIR data_ir(1, "hello");
4495 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 4435 SpdySerializedFrame frame(framer.SerializeData(data_ir));
4496 SetFrameFlags(frame.get(), flags, spdy_version_); 4436 SetFrameFlags(&frame, flags, spdy_version_);
4497 4437
4498 if (flags & ~valid_data_flags) { 4438 if (flags & ~valid_data_flags) {
4499 EXPECT_CALL(visitor, OnError(_)); 4439 EXPECT_CALL(visitor, OnError(_));
4500 } else { 4440 } else {
4501 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); 4441 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
4502 if (flags & DATA_FLAG_PADDED) { 4442 if (flags & DATA_FLAG_PADDED) {
4503 // The first byte of payload is parsed as padding length. 4443 // The first byte of payload is parsed as padding length.
4504 EXPECT_CALL(visitor, OnStreamPadding(_, 1)); 4444 EXPECT_CALL(visitor, OnStreamPadding(_, 1));
4505 // Expect Error since the frame ends prematurely. 4445 // Expect Error since the frame ends prematurely.
4506 EXPECT_CALL(visitor, OnError(_)); 4446 EXPECT_CALL(visitor, OnError(_));
4507 } else { 4447 } else {
4508 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); 4448 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false));
4509 if (flags & DATA_FLAG_FIN) { 4449 if (flags & DATA_FLAG_FIN) {
4510 EXPECT_CALL(visitor, OnStreamEnd(_)); 4450 EXPECT_CALL(visitor, OnStreamEnd(_));
4511 } 4451 }
4512 } 4452 }
4513 } 4453 }
4514 4454
4515 framer.ProcessInput(frame->data(), frame->size()); 4455 framer.ProcessInput(frame.data(), frame.size());
4516 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) { 4456 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) {
4517 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4457 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4518 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) 4458 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code())
4519 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4459 << SpdyFramer::ErrorCodeToString(framer.error_code());
4520 } else { 4460 } else {
4521 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4461 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4522 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4462 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4523 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4463 << SpdyFramer::ErrorCodeToString(framer.error_code());
4524 } 4464 }
4525 } while (++flags != 0); 4465 } while (++flags != 0);
(...skipping 11 matching lines...) Expand all
4537 4477
4538 uint8_t flags = 0; 4478 uint8_t flags = 0;
4539 do { 4479 do {
4540 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4480 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4541 4481
4542 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4482 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4543 SpdyFramer framer(spdy_version_); 4483 SpdyFramer framer(spdy_version_);
4544 framer.set_visitor(&visitor); 4484 framer.set_visitor(&visitor);
4545 4485
4546 SpdyDataIR data_ir(1, "hello"); 4486 SpdyDataIR data_ir(1, "hello");
4547 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 4487 SpdySerializedFrame frame(framer.SerializeData(data_ir));
4548 SetFrameFlags(frame.get(), flags, spdy_version_); 4488 SetFrameFlags(&frame, flags, spdy_version_);
4549 4489
4550 if (flags & ~valid_data_flags) { 4490 if (flags & ~valid_data_flags) {
4551 EXPECT_CALL(visitor, OnError(_)); 4491 EXPECT_CALL(visitor, OnError(_));
4552 } else { 4492 } else {
4553 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); 4493 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
4554 if (flags & DATA_FLAG_PADDED) { 4494 if (flags & DATA_FLAG_PADDED) {
4555 // The first byte of payload is parsed as padding length. 4495 // The first byte of payload is parsed as padding length.
4556 EXPECT_CALL(visitor, OnStreamPadding(_, 1)); 4496 EXPECT_CALL(visitor, OnStreamPadding(_, 1));
4557 // Expect Error since the frame ends prematurely. 4497 // Expect Error since the frame ends prematurely.
4558 EXPECT_CALL(visitor, OnError(_)); 4498 EXPECT_CALL(visitor, OnError(_));
4559 } else { 4499 } else {
4560 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); 4500 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false));
4561 if (flags & DATA_FLAG_FIN) { 4501 if (flags & DATA_FLAG_FIN) {
4562 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); 4502 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true));
4563 } 4503 }
4564 } 4504 }
4565 } 4505 }
4566 4506
4567 framer.ProcessInput(frame->data(), frame->size()); 4507 framer.ProcessInput(frame.data(), frame.size());
4568 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) { 4508 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) {
4569 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4509 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4570 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) 4510 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code())
4571 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4511 << SpdyFramer::ErrorCodeToString(framer.error_code());
4572 } else { 4512 } else {
4573 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4513 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4574 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4514 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4575 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4515 << SpdyFramer::ErrorCodeToString(framer.error_code());
4576 } 4516 }
4577 } while (++flags != 0); 4517 } while (++flags != 0);
(...skipping 15 matching lines...) Expand all
4593 SpdyFramer framer(spdy_version_); 4533 SpdyFramer framer(spdy_version_);
4594 framer.set_visitor(&visitor); 4534 framer.set_visitor(&visitor);
4595 framer.set_debug_visitor(&debug_visitor); 4535 framer.set_debug_visitor(&debug_visitor);
4596 4536
4597 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _)); 4537 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _));
4598 4538
4599 SpdySynStreamIR syn_stream(8); 4539 SpdySynStreamIR syn_stream(8);
4600 syn_stream.set_associated_to_stream_id(3); 4540 syn_stream.set_associated_to_stream_id(3);
4601 syn_stream.set_priority(1); 4541 syn_stream.set_priority(1);
4602 syn_stream.SetHeader("foo", "bar"); 4542 syn_stream.SetHeader("foo", "bar");
4603 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 4543 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream));
4604 SetFrameFlags(frame.get(), flags, spdy_version_); 4544 SetFrameFlags(&frame, flags, spdy_version_);
4605 4545
4606 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { 4546 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
4607 EXPECT_CALL(visitor, OnError(_)); 4547 EXPECT_CALL(visitor, OnError(_));
4608 } else { 4548 } else {
4609 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _)); 4549 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _));
4610 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN, 4550 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN,
4611 flags & CONTROL_FLAG_UNIDIRECTIONAL)); 4551 flags & CONTROL_FLAG_UNIDIRECTIONAL));
4612 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _)) 4552 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _))
4613 .WillRepeatedly(testing::Return(true)); 4553 .WillRepeatedly(testing::Return(true));
4614 if (flags & DATA_FLAG_FIN) { 4554 if (flags & DATA_FLAG_FIN) {
4615 EXPECT_CALL(visitor, OnStreamEnd(_)); 4555 EXPECT_CALL(visitor, OnStreamEnd(_));
4616 } else { 4556 } else {
4617 // Do not close the stream if we are expecting a CONTINUATION frame. 4557 // Do not close the stream if we are expecting a CONTINUATION frame.
4618 EXPECT_CALL(visitor, OnStreamEnd(_)).Times(0); 4558 EXPECT_CALL(visitor, OnStreamEnd(_)).Times(0);
4619 } 4559 }
4620 } 4560 }
4621 4561
4622 framer.ProcessInput(frame->data(), frame->size()); 4562 framer.ProcessInput(frame.data(), frame.size());
4623 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { 4563 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
4624 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4564 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4625 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4565 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4626 framer.error_code()) 4566 framer.error_code())
4627 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4567 << SpdyFramer::ErrorCodeToString(framer.error_code());
4628 } else { 4568 } else {
4629 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4569 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4630 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4570 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4631 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4571 << SpdyFramer::ErrorCodeToString(framer.error_code());
4632 } 4572 }
(...skipping 16 matching lines...) Expand all
4649 SpdyFramer framer(spdy_version_); 4589 SpdyFramer framer(spdy_version_);
4650 framer.set_visitor(&visitor); 4590 framer.set_visitor(&visitor);
4651 framer.set_debug_visitor(&debug_visitor); 4591 framer.set_debug_visitor(&debug_visitor);
4652 4592
4653 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _)); 4593 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _));
4654 4594
4655 SpdySynStreamIR syn_stream(8); 4595 SpdySynStreamIR syn_stream(8);
4656 syn_stream.set_associated_to_stream_id(3); 4596 syn_stream.set_associated_to_stream_id(3);
4657 syn_stream.set_priority(1); 4597 syn_stream.set_priority(1);
4658 syn_stream.SetHeader("foo", "bar"); 4598 syn_stream.SetHeader("foo", "bar");
4659 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 4599 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream));
4660 SetFrameFlags(frame.get(), flags, spdy_version_); 4600 SetFrameFlags(&frame, flags, spdy_version_);
4661 4601
4662 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { 4602 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
4663 EXPECT_CALL(visitor, OnError(_)); 4603 EXPECT_CALL(visitor, OnError(_));
4664 } else { 4604 } else {
4665 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _)); 4605 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _));
4666 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN, 4606 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN,
4667 flags & CONTROL_FLAG_UNIDIRECTIONAL)); 4607 flags & CONTROL_FLAG_UNIDIRECTIONAL));
4668 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _)) 4608 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _))
4669 .WillRepeatedly(testing::Return(true)); 4609 .WillRepeatedly(testing::Return(true));
4670 if (flags & DATA_FLAG_FIN) { 4610 if (flags & DATA_FLAG_FIN) {
4671 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); 4611 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true));
4672 } else { 4612 } else {
4673 // Do not close the stream if we are expecting a CONTINUATION frame. 4613 // Do not close the stream if we are expecting a CONTINUATION frame.
4674 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)).Times(0); 4614 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)).Times(0);
4675 } 4615 }
4676 } 4616 }
4677 4617
4678 framer.ProcessInput(frame->data(), frame->size()); 4618 framer.ProcessInput(frame.data(), frame.size());
4679 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { 4619 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
4680 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4620 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4681 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4621 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4682 framer.error_code()) 4622 framer.error_code())
4683 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4623 << SpdyFramer::ErrorCodeToString(framer.error_code());
4684 } else { 4624 } else {
4685 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4625 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4686 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4626 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4687 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4627 << SpdyFramer::ErrorCodeToString(framer.error_code());
4688 } 4628 }
(...skipping 10 matching lines...) Expand all
4699 uint8_t flags = 0; 4639 uint8_t flags = 0;
4700 do { 4640 do {
4701 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4641 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4702 4642
4703 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4643 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4704 SpdyFramer framer(spdy_version_); 4644 SpdyFramer framer(spdy_version_);
4705 framer.set_visitor(&visitor); 4645 framer.set_visitor(&visitor);
4706 4646
4707 SpdySynReplyIR syn_reply(37); 4647 SpdySynReplyIR syn_reply(37);
4708 syn_reply.SetHeader("foo", "bar"); 4648 syn_reply.SetHeader("foo", "bar");
4709 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); 4649 SpdySerializedFrame frame(framer.SerializeSynReply(syn_reply));
4710 SetFrameFlags(frame.get(), flags, spdy_version_); 4650 SetFrameFlags(&frame, flags, spdy_version_);
4711 4651
4712 if (flags & ~CONTROL_FLAG_FIN) { 4652 if (flags & ~CONTROL_FLAG_FIN) {
4713 EXPECT_CALL(visitor, OnError(_)); 4653 EXPECT_CALL(visitor, OnError(_));
4714 } else { 4654 } else {
4715 EXPECT_CALL(visitor, OnSynReply(37, flags & CONTROL_FLAG_FIN)); 4655 EXPECT_CALL(visitor, OnSynReply(37, flags & CONTROL_FLAG_FIN));
4716 EXPECT_CALL(visitor, OnControlFrameHeaderData(37, _, _)) 4656 EXPECT_CALL(visitor, OnControlFrameHeaderData(37, _, _))
4717 .WillRepeatedly(testing::Return(true)); 4657 .WillRepeatedly(testing::Return(true));
4718 if (flags & DATA_FLAG_FIN) { 4658 if (flags & DATA_FLAG_FIN) {
4719 EXPECT_CALL(visitor, OnStreamEnd(_)); 4659 EXPECT_CALL(visitor, OnStreamEnd(_));
4720 } 4660 }
4721 } 4661 }
4722 4662
4723 framer.ProcessInput(frame->data(), frame->size()); 4663 framer.ProcessInput(frame.data(), frame.size());
4724 if (flags & ~CONTROL_FLAG_FIN) { 4664 if (flags & ~CONTROL_FLAG_FIN) {
4725 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4665 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4726 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4666 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4727 framer.error_code()) 4667 framer.error_code())
4728 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4668 << SpdyFramer::ErrorCodeToString(framer.error_code());
4729 } else { 4669 } else {
4730 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4670 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4731 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4671 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4732 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4672 << SpdyFramer::ErrorCodeToString(framer.error_code());
4733 } 4673 }
(...skipping 10 matching lines...) Expand all
4744 uint8_t flags = 0; 4684 uint8_t flags = 0;
4745 do { 4685 do {
4746 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4686 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4747 4687
4748 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4688 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4749 SpdyFramer framer(spdy_version_); 4689 SpdyFramer framer(spdy_version_);
4750 framer.set_visitor(&visitor); 4690 framer.set_visitor(&visitor);
4751 4691
4752 SpdySynReplyIR syn_reply(37); 4692 SpdySynReplyIR syn_reply(37);
4753 syn_reply.SetHeader("foo", "bar"); 4693 syn_reply.SetHeader("foo", "bar");
4754 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); 4694 SpdySerializedFrame frame(framer.SerializeSynReply(syn_reply));
4755 SetFrameFlags(frame.get(), flags, spdy_version_); 4695 SetFrameFlags(&frame, flags, spdy_version_);
4756 4696
4757 if (flags & ~CONTROL_FLAG_FIN) { 4697 if (flags & ~CONTROL_FLAG_FIN) {
4758 EXPECT_CALL(visitor, OnError(_)); 4698 EXPECT_CALL(visitor, OnError(_));
4759 } else { 4699 } else {
4760 EXPECT_CALL(visitor, OnSynReply(37, flags & CONTROL_FLAG_FIN)); 4700 EXPECT_CALL(visitor, OnSynReply(37, flags & CONTROL_FLAG_FIN));
4761 EXPECT_CALL(visitor, OnControlFrameHeaderData(37, _, _)) 4701 EXPECT_CALL(visitor, OnControlFrameHeaderData(37, _, _))
4762 .WillRepeatedly(testing::Return(true)); 4702 .WillRepeatedly(testing::Return(true));
4763 if (flags & DATA_FLAG_FIN) { 4703 if (flags & DATA_FLAG_FIN) {
4764 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); 4704 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true));
4765 } 4705 }
4766 } 4706 }
4767 4707
4768 framer.ProcessInput(frame->data(), frame->size()); 4708 framer.ProcessInput(frame.data(), frame.size());
4769 if (flags & ~CONTROL_FLAG_FIN) { 4709 if (flags & ~CONTROL_FLAG_FIN) {
4770 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4710 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4771 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4711 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4772 framer.error_code()) 4712 framer.error_code())
4773 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4713 << SpdyFramer::ErrorCodeToString(framer.error_code());
4774 } else { 4714 } else {
4775 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4715 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4776 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4716 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4777 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4717 << SpdyFramer::ErrorCodeToString(framer.error_code());
4778 } 4718 }
4779 } while (++flags != 0); 4719 } while (++flags != 0);
4780 } 4720 }
4781 4721
4782 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { 4722 TEST_P(SpdyFramerTest, RstStreamFrameFlags) {
4783 uint8_t flags = 0; 4723 uint8_t flags = 0;
4784 do { 4724 do {
4785 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4725 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4786 4726
4787 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4727 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4788 SpdyFramer framer(spdy_version_); 4728 SpdyFramer framer(spdy_version_);
4789 framer.set_visitor(&visitor); 4729 framer.set_visitor(&visitor);
4790 4730
4791 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL); 4731 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL);
4792 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); 4732 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream));
4793 SetFrameFlags(frame.get(), flags, spdy_version_); 4733 SetFrameFlags(&frame, flags, spdy_version_);
4794 4734
4795 if (flags != 0) { 4735 if (flags != 0) {
4796 EXPECT_CALL(visitor, OnError(_)); 4736 EXPECT_CALL(visitor, OnError(_));
4797 } else { 4737 } else {
4798 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL)); 4738 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL));
4799 } 4739 }
4800 4740
4801 framer.ProcessInput(frame->data(), frame->size()); 4741 framer.ProcessInput(frame.data(), frame.size());
4802 if (flags != 0) { 4742 if (flags != 0) {
4803 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4743 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4804 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4744 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4805 framer.error_code()) 4745 framer.error_code())
4806 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4746 << SpdyFramer::ErrorCodeToString(framer.error_code());
4807 } else { 4747 } else {
4808 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4748 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4809 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4749 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4810 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4750 << SpdyFramer::ErrorCodeToString(framer.error_code());
4811 } 4751 }
(...skipping 11 matching lines...) Expand all
4823 4763
4824 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4764 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4825 SpdyFramer framer(spdy_version_); 4765 SpdyFramer framer(spdy_version_);
4826 framer.set_visitor(&visitor); 4766 framer.set_visitor(&visitor);
4827 4767
4828 SpdySettingsIR settings_ir; 4768 SpdySettingsIR settings_ir;
4829 settings_ir.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, 4769 settings_ir.AddSetting(SETTINGS_UPLOAD_BANDWIDTH,
4830 false, 4770 false,
4831 false, 4771 false,
4832 54321); 4772 54321);
4833 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); 4773 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir));
4834 SetFrameFlags(frame.get(), flags, spdy_version_); 4774 SetFrameFlags(&frame, flags, spdy_version_);
4835 4775
4836 if (flags & ~SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) { 4776 if (flags & ~SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) {
4837 EXPECT_CALL(visitor, OnError(_)); 4777 EXPECT_CALL(visitor, OnError(_));
4838 } else { 4778 } else {
4839 EXPECT_CALL(visitor, OnSettings( 4779 EXPECT_CALL(visitor, OnSettings(
4840 flags & SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS)); 4780 flags & SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS));
4841 EXPECT_CALL(visitor, OnSetting(SETTINGS_UPLOAD_BANDWIDTH, 4781 EXPECT_CALL(visitor, OnSetting(SETTINGS_UPLOAD_BANDWIDTH,
4842 SETTINGS_FLAG_NONE, 54321)); 4782 SETTINGS_FLAG_NONE, 54321));
4843 EXPECT_CALL(visitor, OnSettingsEnd()); 4783 EXPECT_CALL(visitor, OnSettingsEnd());
4844 } 4784 }
4845 4785
4846 framer.ProcessInput(frame->data(), frame->size()); 4786 framer.ProcessInput(frame.data(), frame.size());
4847 if (flags & ~SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) { 4787 if (flags & ~SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) {
4848 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4788 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4849 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4789 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4850 framer.error_code()) 4790 framer.error_code())
4851 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4791 << SpdyFramer::ErrorCodeToString(framer.error_code());
4852 } else { 4792 } else {
4853 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4793 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4854 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4794 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4855 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4795 << SpdyFramer::ErrorCodeToString(framer.error_code());
4856 } 4796 }
4857 } while (++flags != 0); 4797 } while (++flags != 0);
4858 } 4798 }
4859 4799
4860 TEST_P(SpdyFramerTest, SettingsFrameFlags) { 4800 TEST_P(SpdyFramerTest, SettingsFrameFlags) {
4861 if (!IsHttp2()) { 4801 if (!IsHttp2()) {
4862 return; 4802 return;
4863 } 4803 }
4864 4804
4865 uint8_t flags = 0; 4805 uint8_t flags = 0;
4866 do { 4806 do {
4867 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4807 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4868 4808
4869 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4809 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4870 SpdyFramer framer(spdy_version_); 4810 SpdyFramer framer(spdy_version_);
4871 framer.set_visitor(&visitor); 4811 framer.set_visitor(&visitor);
4872 4812
4873 SpdySettingsIR settings_ir; 4813 SpdySettingsIR settings_ir;
4874 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 0, 16); 4814 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 0, 16);
4875 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); 4815 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir));
4876 SetFrameFlags(frame.get(), flags, spdy_version_); 4816 SetFrameFlags(&frame, flags, spdy_version_);
4877 4817
4878 if (flags != 0) { 4818 if (flags != 0) {
4879 EXPECT_CALL(visitor, OnError(_)); 4819 EXPECT_CALL(visitor, OnError(_));
4880 } else { 4820 } else {
4881 EXPECT_CALL(visitor, OnSettings(flags & SETTINGS_FLAG_ACK)); 4821 EXPECT_CALL(visitor, OnSettings(flags & SETTINGS_FLAG_ACK));
4882 EXPECT_CALL(visitor, OnSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 16)); 4822 EXPECT_CALL(visitor, OnSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 16));
4883 EXPECT_CALL(visitor, OnSettingsEnd()); 4823 EXPECT_CALL(visitor, OnSettingsEnd());
4884 } 4824 }
4885 4825
4886 framer.ProcessInput(frame->data(), frame->size()); 4826 framer.ProcessInput(frame.data(), frame.size());
4887 if (flags & ~SETTINGS_FLAG_ACK) { 4827 if (flags & ~SETTINGS_FLAG_ACK) {
4888 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4828 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4889 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4829 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4890 framer.error_code()) 4830 framer.error_code())
4891 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4831 << SpdyFramer::ErrorCodeToString(framer.error_code());
4892 } else if (flags & SETTINGS_FLAG_ACK) { 4832 } else if (flags & SETTINGS_FLAG_ACK) {
4893 // The frame is invalid because ACK frames should have no payload. 4833 // The frame is invalid because ACK frames should have no payload.
4894 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4834 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4895 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, 4835 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME,
4896 framer.error_code()) 4836 framer.error_code())
4897 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4837 << SpdyFramer::ErrorCodeToString(framer.error_code());
4898 } else { 4838 } else {
4899 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4839 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4900 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4840 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4901 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4841 << SpdyFramer::ErrorCodeToString(framer.error_code());
4902 } 4842 }
4903 } while (++flags != 0); 4843 } while (++flags != 0);
4904 } 4844 }
4905 4845
4906 TEST_P(SpdyFramerTest, GoawayFrameFlags) { 4846 TEST_P(SpdyFramerTest, GoawayFrameFlags) {
4907 uint8_t flags = 0; 4847 uint8_t flags = 0;
4908 do { 4848 do {
4909 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4849 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4910 4850
4911 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4851 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4912 SpdyFramer framer(spdy_version_); 4852 SpdyFramer framer(spdy_version_);
4913 framer.set_visitor(&visitor); 4853 framer.set_visitor(&visitor);
4914 4854
4915 SpdyGoAwayIR goaway_ir(97, GOAWAY_OK, "test"); 4855 SpdyGoAwayIR goaway_ir(97, GOAWAY_OK, "test");
4916 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); 4856 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir));
4917 SetFrameFlags(frame.get(), flags, spdy_version_); 4857 SetFrameFlags(&frame, flags, spdy_version_);
4918 4858
4919 if (flags != 0) { 4859 if (flags != 0) {
4920 EXPECT_CALL(visitor, OnError(_)); 4860 EXPECT_CALL(visitor, OnError(_));
4921 } else { 4861 } else {
4922 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK)); 4862 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK));
4923 } 4863 }
4924 4864
4925 framer.ProcessInput(frame->data(), frame->size()); 4865 framer.ProcessInput(frame.data(), frame.size());
4926 if (flags != 0) { 4866 if (flags != 0) {
4927 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4867 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4928 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4868 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4929 framer.error_code()) 4869 framer.error_code())
4930 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4870 << SpdyFramer::ErrorCodeToString(framer.error_code());
4931 } else { 4871 } else {
4932 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4872 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4933 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4873 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4934 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4874 << SpdyFramer::ErrorCodeToString(framer.error_code());
4935 } 4875 }
(...skipping 12 matching lines...) Expand all
4948 framer.set_visitor(&visitor); 4888 framer.set_visitor(&visitor);
4949 4889
4950 SpdyHeadersIR headers_ir(57); 4890 SpdyHeadersIR headers_ir(57);
4951 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) { 4891 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) {
4952 headers_ir.set_priority(3); 4892 headers_ir.set_priority(3);
4953 headers_ir.set_has_priority(true); 4893 headers_ir.set_has_priority(true);
4954 headers_ir.set_parent_stream_id(5); 4894 headers_ir.set_parent_stream_id(5);
4955 headers_ir.set_exclusive(true); 4895 headers_ir.set_exclusive(true);
4956 } 4896 }
4957 headers_ir.SetHeader("foo", "bar"); 4897 headers_ir.SetHeader("foo", "bar");
4958 std::unique_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 4898 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
4959 uint8_t set_flags = flags; 4899 uint8_t set_flags = flags;
4960 if (IsHttp2()) { 4900 if (IsHttp2()) {
4961 // TODO(jgraettinger): Add padding to SpdyHeadersIR, 4901 // TODO(jgraettinger): Add padding to SpdyHeadersIR,
4962 // and implement framing. 4902 // and implement framing.
4963 set_flags &= ~HEADERS_FLAG_PADDED; 4903 set_flags &= ~HEADERS_FLAG_PADDED;
4964 } 4904 }
4965 SetFrameFlags(frame.get(), set_flags, spdy_version_); 4905 SetFrameFlags(&frame, set_flags, spdy_version_);
4966 4906
4967 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) { 4907 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) {
4968 EXPECT_CALL(visitor, OnError(_)); 4908 EXPECT_CALL(visitor, OnError(_));
4969 } else if (IsHttp2() && 4909 } else if (IsHttp2() &&
4970 flags & 4910 flags &
4971 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS | 4911 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS |
4972 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED | 4912 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED |
4973 HEADERS_FLAG_PRIORITY)) { 4913 HEADERS_FLAG_PRIORITY)) {
4974 EXPECT_CALL(visitor, OnError(_)); 4914 EXPECT_CALL(visitor, OnError(_));
4975 } else { 4915 } else {
(...skipping 17 matching lines...) Expand all
4993 .WillRepeatedly(testing::Return(true)); 4933 .WillRepeatedly(testing::Return(true));
4994 if (flags & DATA_FLAG_FIN && 4934 if (flags & DATA_FLAG_FIN &&
4995 (IsSpdy3() || flags & HEADERS_FLAG_END_HEADERS)) { 4935 (IsSpdy3() || flags & HEADERS_FLAG_END_HEADERS)) {
4996 EXPECT_CALL(visitor, OnStreamEnd(_)); 4936 EXPECT_CALL(visitor, OnStreamEnd(_));
4997 } else { 4937 } else {
4998 // Do not close the stream if we are expecting a CONTINUATION frame. 4938 // Do not close the stream if we are expecting a CONTINUATION frame.
4999 EXPECT_CALL(visitor, OnStreamEnd(_)).Times(0); 4939 EXPECT_CALL(visitor, OnStreamEnd(_)).Times(0);
5000 } 4940 }
5001 } 4941 }
5002 4942
5003 framer.ProcessInput(frame->data(), frame->size()); 4943 framer.ProcessInput(frame.data(), frame.size());
5004 if (IsSpdy3() && flags & ~CONTROL_FLAG_FIN) { 4944 if (IsSpdy3() && flags & ~CONTROL_FLAG_FIN) {
5005 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4945 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5006 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 4946 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
5007 framer.error_code()) 4947 framer.error_code())
5008 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4948 << SpdyFramer::ErrorCodeToString(framer.error_code());
5009 } else if (IsHttp2() && 4949 } else if (IsHttp2() &&
5010 flags & 4950 flags &
5011 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS | 4951 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS |
5012 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED | 4952 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED |
5013 HEADERS_FLAG_PRIORITY)) { 4953 HEADERS_FLAG_PRIORITY)) {
(...skipping 25 matching lines...) Expand all
5039 framer.set_visitor(&visitor); 4979 framer.set_visitor(&visitor);
5040 4980
5041 SpdyHeadersIR headers_ir(57); 4981 SpdyHeadersIR headers_ir(57);
5042 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) { 4982 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) {
5043 headers_ir.set_priority(3); 4983 headers_ir.set_priority(3);
5044 headers_ir.set_has_priority(true); 4984 headers_ir.set_has_priority(true);
5045 headers_ir.set_parent_stream_id(5); 4985 headers_ir.set_parent_stream_id(5);
5046 headers_ir.set_exclusive(true); 4986 headers_ir.set_exclusive(true);
5047 } 4987 }
5048 headers_ir.SetHeader("foo", "bar"); 4988 headers_ir.SetHeader("foo", "bar");
5049 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 4989 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir));
5050 uint8_t set_flags = flags; 4990 uint8_t set_flags = flags;
5051 if (IsHttp2()) { 4991 if (IsHttp2()) {
5052 // TODO(jgraettinger): Add padding to SpdyHeadersIR, 4992 // TODO(jgraettinger): Add padding to SpdyHeadersIR,
5053 // and implement framing. 4993 // and implement framing.
5054 set_flags &= ~HEADERS_FLAG_PADDED; 4994 set_flags &= ~HEADERS_FLAG_PADDED;
5055 } 4995 }
5056 SetFrameFlags(frame.get(), set_flags, spdy_version_); 4996 SetFrameFlags(&frame, set_flags, spdy_version_);
5057 4997
5058 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) { 4998 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) {
5059 EXPECT_CALL(visitor, OnError(_)); 4999 EXPECT_CALL(visitor, OnError(_));
5060 } else if (IsHttp2() && 5000 } else if (IsHttp2() &&
5061 flags & 5001 flags &
5062 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS | 5002 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS |
5063 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED | 5003 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED |
5064 HEADERS_FLAG_PRIORITY)) { 5004 HEADERS_FLAG_PRIORITY)) {
5065 EXPECT_CALL(visitor, OnError(_)); 5005 EXPECT_CALL(visitor, OnError(_));
5066 } else { 5006 } else {
(...skipping 17 matching lines...) Expand all
5084 .WillRepeatedly(testing::Return(true)); 5024 .WillRepeatedly(testing::Return(true));
5085 if (flags & DATA_FLAG_FIN && 5025 if (flags & DATA_FLAG_FIN &&
5086 (IsSpdy3() || flags & HEADERS_FLAG_END_HEADERS)) { 5026 (IsSpdy3() || flags & HEADERS_FLAG_END_HEADERS)) {
5087 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); 5027 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true));
5088 } else { 5028 } else {
5089 // Do not close the stream if we are expecting a CONTINUATION frame. 5029 // Do not close the stream if we are expecting a CONTINUATION frame.
5090 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)).Times(0); 5030 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)).Times(0);
5091 } 5031 }
5092 } 5032 }
5093 5033
5094 framer.ProcessInput(frame->data(), frame->size()); 5034 framer.ProcessInput(frame.data(), frame.size());
5095 if (IsSpdy3() && flags & ~CONTROL_FLAG_FIN) { 5035 if (IsSpdy3() && flags & ~CONTROL_FLAG_FIN) {
5096 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 5036 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5097 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 5037 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
5098 framer.error_code()) 5038 framer.error_code())
5099 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5039 << SpdyFramer::ErrorCodeToString(framer.error_code());
5100 } else if (IsHttp2() && flags & ~(CONTROL_FLAG_FIN | 5040 } else if (IsHttp2() && flags & ~(CONTROL_FLAG_FIN |
5101 HEADERS_FLAG_END_HEADERS | 5041 HEADERS_FLAG_END_HEADERS |
5102 HEADERS_FLAG_END_SEGMENT | 5042 HEADERS_FLAG_END_SEGMENT |
5103 HEADERS_FLAG_PADDED | 5043 HEADERS_FLAG_PADDED |
5104 HEADERS_FLAG_PRIORITY)) { 5044 HEADERS_FLAG_PRIORITY)) {
(...skipping 15 matching lines...) Expand all
5120 5060
5121 TEST_P(SpdyFramerTest, PingFrameFlags) { 5061 TEST_P(SpdyFramerTest, PingFrameFlags) {
5122 uint8_t flags = 0; 5062 uint8_t flags = 0;
5123 do { 5063 do {
5124 SCOPED_TRACE(testing::Message() << "Flags " << flags); 5064 SCOPED_TRACE(testing::Message() << "Flags " << flags);
5125 5065
5126 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5066 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5127 SpdyFramer framer(spdy_version_); 5067 SpdyFramer framer(spdy_version_);
5128 framer.set_visitor(&visitor); 5068 framer.set_visitor(&visitor);
5129 5069
5130 scoped_ptr<SpdyFrame> frame(framer.SerializePing(SpdyPingIR(42))); 5070 SpdySerializedFrame frame(framer.SerializePing(SpdyPingIR(42)));
5131 SetFrameFlags(frame.get(), flags, spdy_version_); 5071 SetFrameFlags(&frame, flags, spdy_version_);
5132 5072
5133 if (IsHttp2() && flags == PING_FLAG_ACK) { 5073 if (IsHttp2() && flags == PING_FLAG_ACK) {
5134 EXPECT_CALL(visitor, OnPing(42, true)); 5074 EXPECT_CALL(visitor, OnPing(42, true));
5135 } else if (flags == 0) { 5075 } else if (flags == 0) {
5136 EXPECT_CALL(visitor, OnPing(42, false)); 5076 EXPECT_CALL(visitor, OnPing(42, false));
5137 } else { 5077 } else {
5138 EXPECT_CALL(visitor, OnError(_)); 5078 EXPECT_CALL(visitor, OnError(_));
5139 } 5079 }
5140 5080
5141 framer.ProcessInput(frame->data(), frame->size()); 5081 framer.ProcessInput(frame.data(), frame.size());
5142 if ((IsHttp2() && flags == PING_FLAG_ACK) || flags == 0) { 5082 if ((IsHttp2() && flags == PING_FLAG_ACK) || flags == 0) {
5143 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5083 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5144 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5084 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5145 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5085 << SpdyFramer::ErrorCodeToString(framer.error_code());
5146 } else { 5086 } else {
5147 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 5087 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5148 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 5088 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
5149 framer.error_code()) 5089 framer.error_code())
5150 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5090 << SpdyFramer::ErrorCodeToString(framer.error_code());
5151 } 5091 }
5152 } while (++flags != 0); 5092 } while (++flags != 0);
5153 } 5093 }
5154 5094
5155 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) { 5095 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) {
5156 uint8_t flags = 0; 5096 uint8_t flags = 0;
5157 do { 5097 do {
5158 SCOPED_TRACE(testing::Message() << "Flags " << flags); 5098 SCOPED_TRACE(testing::Message() << "Flags " << flags);
5159 5099
5160 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5100 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5161 SpdyFramer framer(spdy_version_); 5101 SpdyFramer framer(spdy_version_);
5162 framer.set_visitor(&visitor); 5102 framer.set_visitor(&visitor);
5163 5103
5164 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( 5104 SpdySerializedFrame frame(
5165 SpdyWindowUpdateIR(4, 1024))); 5105 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(4, 1024)));
5166 SetFrameFlags(frame.get(), flags, spdy_version_); 5106 SetFrameFlags(&frame, flags, spdy_version_);
5167 5107
5168 if (flags != 0) { 5108 if (flags != 0) {
5169 EXPECT_CALL(visitor, OnError(_)); 5109 EXPECT_CALL(visitor, OnError(_));
5170 } else { 5110 } else {
5171 EXPECT_CALL(visitor, OnWindowUpdate(4, 1024)); 5111 EXPECT_CALL(visitor, OnWindowUpdate(4, 1024));
5172 } 5112 }
5173 5113
5174 framer.ProcessInput(frame->data(), frame->size()); 5114 framer.ProcessInput(frame.data(), frame.size());
5175 if (flags != 0) { 5115 if (flags != 0) {
5176 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 5116 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5177 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 5117 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
5178 framer.error_code()) 5118 framer.error_code())
5179 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5119 << SpdyFramer::ErrorCodeToString(framer.error_code());
5180 } else { 5120 } else {
5181 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5121 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5182 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5122 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5183 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5123 << SpdyFramer::ErrorCodeToString(framer.error_code());
5184 } 5124 }
(...skipping 12 matching lines...) Expand all
5197 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5137 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5198 testing::StrictMock<test::MockDebugVisitor> debug_visitor; 5138 testing::StrictMock<test::MockDebugVisitor> debug_visitor;
5199 SpdyFramer framer(spdy_version_); 5139 SpdyFramer framer(spdy_version_);
5200 framer.set_visitor(&visitor); 5140 framer.set_visitor(&visitor);
5201 framer.set_debug_visitor(&debug_visitor); 5141 framer.set_debug_visitor(&debug_visitor);
5202 5142
5203 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, PUSH_PROMISE, _, _)); 5143 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, PUSH_PROMISE, _, _));
5204 5144
5205 SpdyPushPromiseIR push_promise(42, 57); 5145 SpdyPushPromiseIR push_promise(42, 57);
5206 push_promise.SetHeader("foo", "bar"); 5146 push_promise.SetHeader("foo", "bar");
5207 scoped_ptr<SpdySerializedFrame> frame( 5147 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
5208 framer.SerializePushPromise(push_promise));
5209 // TODO(jgraettinger): Add padding to SpdyPushPromiseIR, 5148 // TODO(jgraettinger): Add padding to SpdyPushPromiseIR,
5210 // and implement framing. 5149 // and implement framing.
5211 SetFrameFlags(frame.get(), flags & ~HEADERS_FLAG_PADDED, spdy_version_); 5150 SetFrameFlags(&frame, flags & ~HEADERS_FLAG_PADDED, spdy_version_);
5212 5151
5213 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) { 5152 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) {
5214 EXPECT_CALL(visitor, OnError(_)); 5153 EXPECT_CALL(visitor, OnError(_));
5215 } else { 5154 } else {
5216 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, PUSH_PROMISE, _)); 5155 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, PUSH_PROMISE, _));
5217 EXPECT_CALL(visitor, OnPushPromise(42, 57, 5156 EXPECT_CALL(visitor, OnPushPromise(42, 57,
5218 flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE)); 5157 flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE));
5219 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) 5158 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _))
5220 .WillRepeatedly(testing::Return(true)); 5159 .WillRepeatedly(testing::Return(true));
5221 } 5160 }
5222 5161
5223 framer.ProcessInput(frame->data(), frame->size()); 5162 framer.ProcessInput(frame.data(), frame.size());
5224 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) { 5163 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) {
5225 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 5164 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5226 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 5165 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
5227 framer.error_code()) 5166 framer.error_code())
5228 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5167 << SpdyFramer::ErrorCodeToString(framer.error_code());
5229 } else { 5168 } else {
5230 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5169 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5231 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5170 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5232 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5171 << SpdyFramer::ErrorCodeToString(framer.error_code());
5233 } 5172 }
(...skipping 16 matching lines...) Expand all
5250 framer.set_debug_visitor(&debug_visitor); 5189 framer.set_debug_visitor(&debug_visitor);
5251 5190
5252 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); 5191 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _));
5253 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); 5192 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _));
5254 EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false, false, false)); 5193 EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false, false, false));
5255 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) 5194 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _))
5256 .WillRepeatedly(testing::Return(true)); 5195 .WillRepeatedly(testing::Return(true));
5257 5196
5258 SpdyHeadersIR headers_ir(42); 5197 SpdyHeadersIR headers_ir(42);
5259 headers_ir.SetHeader("foo", "bar"); 5198 headers_ir.SetHeader("foo", "bar");
5260 scoped_ptr<SpdyFrame> frame0(framer.SerializeHeaders(headers_ir)); 5199 SpdySerializedFrame frame0(framer.SerializeHeaders(headers_ir));
5261 SetFrameFlags(frame0.get(), 0, spdy_version_); 5200 SetFrameFlags(&frame0, 0, spdy_version_);
5262 5201
5263 SpdyContinuationIR continuation(42); 5202 SpdyContinuationIR continuation(42);
5264 continuation.SetHeader("foo", "bar"); 5203 continuation.SetHeader("foo", "bar");
5265 scoped_ptr<SpdySerializedFrame> frame( 5204 SpdySerializedFrame frame(framer.SerializeContinuation(continuation));
5266 framer.SerializeContinuation(continuation)); 5205 SetFrameFlags(&frame, flags, spdy_version_);
5267 SetFrameFlags(frame.get(), flags, spdy_version_);
5268 5206
5269 if (flags & ~(HEADERS_FLAG_END_HEADERS)) { 5207 if (flags & ~(HEADERS_FLAG_END_HEADERS)) {
5270 EXPECT_CALL(visitor, OnError(_)); 5208 EXPECT_CALL(visitor, OnError(_));
5271 } else { 5209 } else {
5272 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, CONTINUATION, _)); 5210 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, CONTINUATION, _));
5273 EXPECT_CALL(visitor, OnContinuation(42, 5211 EXPECT_CALL(visitor, OnContinuation(42,
5274 flags & HEADERS_FLAG_END_HEADERS)); 5212 flags & HEADERS_FLAG_END_HEADERS));
5275 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) 5213 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _))
5276 .WillRepeatedly(testing::Return(true)); 5214 .WillRepeatedly(testing::Return(true));
5277 } 5215 }
5278 5216
5279 framer.ProcessInput(frame0->data(), frame0->size()); 5217 framer.ProcessInput(frame0.data(), frame0.size());
5280 framer.ProcessInput(frame->data(), frame->size()); 5218 framer.ProcessInput(frame.data(), frame.size());
5281 if (flags & ~(HEADERS_FLAG_END_HEADERS)) { 5219 if (flags & ~(HEADERS_FLAG_END_HEADERS)) {
5282 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 5220 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5283 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, 5221 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
5284 framer.error_code()) 5222 framer.error_code())
5285 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5223 << SpdyFramer::ErrorCodeToString(framer.error_code());
5286 } else { 5224 } else {
5287 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5225 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5288 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5226 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5289 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5227 << SpdyFramer::ErrorCodeToString(framer.error_code());
5290 } 5228 }
(...skipping 12 matching lines...) Expand all
5303 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5241 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5304 testing::StrictMock<test::MockDebugVisitor> debug_visitor; 5242 testing::StrictMock<test::MockDebugVisitor> debug_visitor;
5305 SpdyFramer framer(spdy_version_); 5243 SpdyFramer framer(spdy_version_);
5306 framer.set_visitor(&visitor); 5244 framer.set_visitor(&visitor);
5307 framer.set_debug_visitor(&debug_visitor); 5245 framer.set_debug_visitor(&debug_visitor);
5308 5246
5309 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(1, SYN_STREAM, _, _)); 5247 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(1, SYN_STREAM, _, _));
5310 5248
5311 SpdySynStreamIR syn_stream(1); 5249 SpdySynStreamIR syn_stream(1);
5312 syn_stream.set_priority(1); 5250 syn_stream.set_priority(1);
5313 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 5251 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream));
5314 // Adjust size to remove the header block. 5252 // Adjust size to remove the header block.
5315 SetFrameLength( 5253 SetFrameLength(&frame, framer.GetSynStreamMinimumSize() -
5316 frame.get(), 5254 framer.GetControlFrameHeaderSize(),
5317 framer.GetSynStreamMinimumSize() - framer.GetControlFrameHeaderSize(), 5255 spdy_version_);
5318 spdy_version_);
5319 5256
5320 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(1, SYN_STREAM, _)); 5257 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(1, SYN_STREAM, _));
5321 EXPECT_CALL(visitor, OnSynStream(1, 0, 1, false, false)); 5258 EXPECT_CALL(visitor, OnSynStream(1, 0, 1, false, false));
5322 EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0)); 5259 EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0));
5323 5260
5324 framer.ProcessInput(frame->data(), framer.GetSynStreamMinimumSize()); 5261 framer.ProcessInput(frame.data(), framer.GetSynStreamMinimumSize());
5325 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5262 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5326 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5263 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5327 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5264 << SpdyFramer::ErrorCodeToString(framer.error_code());
5328 } 5265 }
5329 5266
5330 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { 5267 TEST_P(SpdyFramerTest, SettingsFlagsAndId) {
5331 const uint32_t kId = 0x020304; 5268 const uint32_t kId = 0x020304;
5332 const uint32_t kFlags = 0x01; 5269 const uint32_t kFlags = 0x01;
5333 const uint32_t kWireFormat = base::HostToNet32(0x01020304); 5270 const uint32_t kWireFormat = base::HostToNet32(0x01020304);
5334 5271
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
5479 5416
5480 const SpdyStreamId kStreamId = 0; 5417 const SpdyStreamId kStreamId = 0;
5481 5418
5482 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5419 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5483 SpdyFramer framer(spdy_version_); 5420 SpdyFramer framer(spdy_version_);
5484 framer.set_visitor(&visitor); 5421 framer.set_visitor(&visitor);
5485 5422
5486 EXPECT_CALL(visitor, OnBlocked(kStreamId)); 5423 EXPECT_CALL(visitor, OnBlocked(kStreamId));
5487 5424
5488 SpdyBlockedIR blocked_ir(0); 5425 SpdyBlockedIR blocked_ir(0);
5489 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); 5426 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir));
5490 framer.ProcessInput(frame->data(), framer.GetBlockedSize()); 5427 framer.ProcessInput(frame.data(), framer.GetBlockedSize());
5491 5428
5492 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5429 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5493 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5430 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5494 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5431 << SpdyFramer::ErrorCodeToString(framer.error_code());
5495 } 5432 }
5496 5433
5497 TEST_P(SpdyFramerTest, OnAltSvc) { 5434 TEST_P(SpdyFramerTest, OnAltSvc) {
5498 if (!IsHttp2()) { 5435 if (!IsHttp2()) {
5499 return; 5436 return;
5500 } 5437 }
(...skipping 12 matching lines...) Expand all
5513 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; 5450 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
5514 altsvc_vector.push_back(altsvc1); 5451 altsvc_vector.push_back(altsvc1);
5515 altsvc_vector.push_back(altsvc2); 5452 altsvc_vector.push_back(altsvc2);
5516 EXPECT_CALL(visitor, 5453 EXPECT_CALL(visitor,
5517 OnAltSvc(kStreamId, StringPiece("o_r|g!n"), altsvc_vector)); 5454 OnAltSvc(kStreamId, StringPiece("o_r|g!n"), altsvc_vector));
5518 5455
5519 SpdyAltSvcIR altsvc_ir(1); 5456 SpdyAltSvcIR altsvc_ir(1);
5520 altsvc_ir.set_origin("o_r|g!n"); 5457 altsvc_ir.set_origin("o_r|g!n");
5521 altsvc_ir.add_altsvc(altsvc1); 5458 altsvc_ir.add_altsvc(altsvc1);
5522 altsvc_ir.add_altsvc(altsvc2); 5459 altsvc_ir.add_altsvc(altsvc2);
5523 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir)); 5460 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
5524 framer.ProcessInput(frame->data(), frame->size()); 5461 framer.ProcessInput(frame.data(), frame.size());
5525 5462
5526 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5463 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5527 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5464 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5528 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5465 << SpdyFramer::ErrorCodeToString(framer.error_code());
5529 } 5466 }
5530 5467
5531 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) { 5468 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) {
5532 if (!IsHttp2()) { 5469 if (!IsHttp2()) {
5533 return; 5470 return;
5534 } 5471 }
(...skipping 10 matching lines...) Expand all
5545 "p\"=i:d", "h_\\o\"st", 123, 42, 0.2, 5482 "p\"=i:d", "h_\\o\"st", 123, 42, 0.2,
5546 SpdyAltSvcWireFormat::VersionVector{24}); 5483 SpdyAltSvcWireFormat::VersionVector{24});
5547 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; 5484 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
5548 altsvc_vector.push_back(altsvc1); 5485 altsvc_vector.push_back(altsvc1);
5549 altsvc_vector.push_back(altsvc2); 5486 altsvc_vector.push_back(altsvc2);
5550 EXPECT_CALL(visitor, OnAltSvc(kStreamId, StringPiece(""), altsvc_vector)); 5487 EXPECT_CALL(visitor, OnAltSvc(kStreamId, StringPiece(""), altsvc_vector));
5551 5488
5552 SpdyAltSvcIR altsvc_ir(1); 5489 SpdyAltSvcIR altsvc_ir(1);
5553 altsvc_ir.add_altsvc(altsvc1); 5490 altsvc_ir.add_altsvc(altsvc1);
5554 altsvc_ir.add_altsvc(altsvc2); 5491 altsvc_ir.add_altsvc(altsvc2);
5555 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir)); 5492 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
5556 framer.ProcessInput(frame->data(), frame->size()); 5493 framer.ProcessInput(frame.data(), frame.size());
5557 5494
5558 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5495 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5559 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5496 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5560 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5497 << SpdyFramer::ErrorCodeToString(framer.error_code());
5561 } 5498 }
5562 5499
5563 TEST_P(SpdyFramerTest, OnAltSvcEmptyProtocolId) { 5500 TEST_P(SpdyFramerTest, OnAltSvcEmptyProtocolId) {
5564 if (!IsHttp2()) { 5501 if (!IsHttp2()) {
5565 return; 5502 return;
5566 } 5503 }
5567 5504
5568 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5505 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5569 SpdyFramer framer(spdy_version_); 5506 SpdyFramer framer(spdy_version_);
5570 framer.set_visitor(&visitor); 5507 framer.set_visitor(&visitor);
5571 5508
5572 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 5509 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
5573 5510
5574 SpdyAltSvcIR altsvc_ir(1); 5511 SpdyAltSvcIR altsvc_ir(1);
5575 altsvc_ir.set_origin("o1"); 5512 altsvc_ir.set_origin("o1");
5576 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( 5513 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService(
5577 "pid1", "host", 443, 5, 1.0, SpdyAltSvcWireFormat::VersionVector())); 5514 "pid1", "host", 443, 5, 1.0, SpdyAltSvcWireFormat::VersionVector()));
5578 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( 5515 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService(
5579 "", "h1", 443, 10, 1.0, SpdyAltSvcWireFormat::VersionVector())); 5516 "", "h1", 443, 10, 1.0, SpdyAltSvcWireFormat::VersionVector()));
5580 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir)); 5517 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
5581 framer.ProcessInput(frame->data(), frame->size()); 5518 framer.ProcessInput(frame.data(), frame.size());
5582 5519
5583 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 5520 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5584 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) 5521 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code())
5585 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5522 << SpdyFramer::ErrorCodeToString(framer.error_code());
5586 } 5523 }
5587 5524
5588 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { 5525 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) {
5589 if (!IsHttp2()) { 5526 if (!IsHttp2()) {
5590 return; 5527 return;
5591 } 5528 }
5592 5529
5593 const SpdyStreamId kStreamId = 1; 5530 const SpdyStreamId kStreamId = 1;
5594 5531
5595 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5532 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5596 SpdyFramer framer(spdy_version_); 5533 SpdyFramer framer(spdy_version_);
5597 framer.set_visitor(&visitor); 5534 framer.set_visitor(&visitor);
5598 5535
5599 SpdyAltSvcWireFormat::AlternativeService altsvc( 5536 SpdyAltSvcWireFormat::AlternativeService altsvc(
5600 "pid", "h1", 443, 10, 1.0, SpdyAltSvcWireFormat::VersionVector()); 5537 "pid", "h1", 443, 10, 1.0, SpdyAltSvcWireFormat::VersionVector());
5601 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; 5538 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
5602 altsvc_vector.push_back(altsvc); 5539 altsvc_vector.push_back(altsvc);
5603 EXPECT_CALL(visitor, OnAltSvc(kStreamId, StringPiece("o1"), altsvc_vector)); 5540 EXPECT_CALL(visitor, OnAltSvc(kStreamId, StringPiece("o1"), altsvc_vector));
5604 5541
5605 SpdyAltSvcIR altsvc_ir(1); 5542 SpdyAltSvcIR altsvc_ir(1);
5606 altsvc_ir.set_origin("o1"); 5543 altsvc_ir.set_origin("o1");
5607 altsvc_ir.add_altsvc(altsvc); 5544 altsvc_ir.add_altsvc(altsvc);
5608 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir)); 5545 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
5609 framer.ProcessInput(frame->data(), frame->size()); 5546 framer.ProcessInput(frame.data(), frame.size());
5610 5547
5611 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5548 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5612 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5549 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5613 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5550 << SpdyFramer::ErrorCodeToString(framer.error_code());
5614 } 5551 }
5615 5552
5616 // Tests handling of ALTSVC frames delivered in small chunks. 5553 // Tests handling of ALTSVC frames delivered in small chunks.
5617 TEST_P(SpdyFramerTest, ReadChunkedAltSvcFrame) { 5554 TEST_P(SpdyFramerTest, ReadChunkedAltSvcFrame) {
5618 if (!IsHttp2()) { 5555 if (!IsHttp2()) {
5619 return; 5556 return;
5620 } 5557 }
5621 5558
5622 SpdyFramer framer(spdy_version_); 5559 SpdyFramer framer(spdy_version_);
5623 SpdyAltSvcIR altsvc_ir(1); 5560 SpdyAltSvcIR altsvc_ir(1);
5624 SpdyAltSvcWireFormat::AlternativeService altsvc1( 5561 SpdyAltSvcWireFormat::AlternativeService altsvc1(
5625 "pid1", "host", 443, 5, 1.0, SpdyAltSvcWireFormat::VersionVector()); 5562 "pid1", "host", 443, 5, 1.0, SpdyAltSvcWireFormat::VersionVector());
5626 SpdyAltSvcWireFormat::AlternativeService altsvc2( 5563 SpdyAltSvcWireFormat::AlternativeService altsvc2(
5627 "p\"=i:d", "h_\\o\"st", 123, 42, 0.2, 5564 "p\"=i:d", "h_\\o\"st", 123, 42, 0.2,
5628 SpdyAltSvcWireFormat::VersionVector{24}); 5565 SpdyAltSvcWireFormat::VersionVector{24});
5629 altsvc_ir.add_altsvc(altsvc1); 5566 altsvc_ir.add_altsvc(altsvc1);
5630 altsvc_ir.add_altsvc(altsvc2); 5567 altsvc_ir.add_altsvc(altsvc2);
5631 5568
5632 scoped_ptr<SpdyFrame> control_frame(framer.SerializeAltSvc(altsvc_ir)); 5569 SpdySerializedFrame control_frame(framer.SerializeAltSvc(altsvc_ir));
5633 TestSpdyVisitor visitor(spdy_version_); 5570 TestSpdyVisitor visitor(spdy_version_);
5634 visitor.use_compression_ = false; 5571 visitor.use_compression_ = false;
5635 5572
5636 // Read data in small chunks. 5573 // Read data in small chunks.
5637 size_t framed_data = 0; 5574 size_t framed_data = 0;
5638 size_t unframed_data = control_frame->size(); 5575 size_t unframed_data = control_frame.size();
5639 size_t kReadChunkSize = 5; // Read five bytes at a time. 5576 size_t kReadChunkSize = 5; // Read five bytes at a time.
5640 while (unframed_data > 0) { 5577 while (unframed_data > 0) {
5641 size_t to_read = std::min(kReadChunkSize, unframed_data); 5578 size_t to_read = std::min(kReadChunkSize, unframed_data);
5642 visitor.SimulateInFramer( 5579 visitor.SimulateInFramer(
5643 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data), 5580 reinterpret_cast<unsigned char*>(control_frame.data() + framed_data),
5644 to_read); 5581 to_read);
5645 unframed_data -= to_read; 5582 unframed_data -= to_read;
5646 framed_data += to_read; 5583 framed_data += to_read;
5647 } 5584 }
5648 EXPECT_EQ(0, visitor.error_count_); 5585 EXPECT_EQ(0, visitor.error_count_);
5649 EXPECT_EQ(1, visitor.altsvc_count_); 5586 EXPECT_EQ(1, visitor.altsvc_count_);
5650 ASSERT_EQ(2u, visitor.test_altsvc_ir_.altsvc_vector().size()); 5587 ASSERT_EQ(2u, visitor.test_altsvc_ir_.altsvc_vector().size());
5651 EXPECT_TRUE(visitor.test_altsvc_ir_.altsvc_vector()[0] == altsvc1); 5588 EXPECT_TRUE(visitor.test_altsvc_ir_.altsvc_vector()[0] == altsvc1);
5652 EXPECT_TRUE(visitor.test_altsvc_ir_.altsvc_vector()[1] == altsvc2); 5589 EXPECT_TRUE(visitor.test_altsvc_ir_.altsvc_vector()[1] == altsvc2);
5653 } 5590 }
5654 5591
5655 // Tests handling of PRIORITY frames. 5592 // Tests handling of PRIORITY frames.
5656 TEST_P(SpdyFramerTest, ReadPriority) { 5593 TEST_P(SpdyFramerTest, ReadPriority) {
5657 if (!IsHttp2()) { 5594 if (!IsHttp2()) {
5658 return; 5595 return;
5659 } 5596 }
5660 5597
5661 SpdyFramer framer(spdy_version_); 5598 SpdyFramer framer(spdy_version_);
5662 SpdyPriorityIR priority(3, 1, 255, false); 5599 SpdyPriorityIR priority(3, 1, 255, false);
5663 scoped_ptr<SpdySerializedFrame> frame(framer.SerializePriority(priority)); 5600 SpdySerializedFrame frame(framer.SerializePriority(priority));
5664 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5601 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5665 framer.set_visitor(&visitor); 5602 framer.set_visitor(&visitor);
5666 EXPECT_CALL(visitor, OnPriority(3, 1, 255, false)); 5603 EXPECT_CALL(visitor, OnPriority(3, 1, 255, false));
5667 framer.ProcessInput(frame->data(), frame->size()); 5604 framer.ProcessInput(frame.data(), frame.size());
5668 5605
5669 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5606 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5670 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5607 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5671 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5608 << SpdyFramer::ErrorCodeToString(framer.error_code());
5672 // TODO(mlavan): once we actually maintain a priority tree, 5609 // TODO(mlavan): once we actually maintain a priority tree,
5673 // check that state is adjusted correctly. 5610 // check that state is adjusted correctly.
5674 } 5611 }
5675 5612
5676 TEST_P(SpdyFramerTest, PriorityWeightMapping) { 5613 TEST_P(SpdyFramerTest, PriorityWeightMapping) {
5677 if (!IsHttp2()) { 5614 if (!IsHttp2()) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
5734 SpdyFramer framer(spdy_version_); 5671 SpdyFramer framer(spdy_version_);
5735 scoped_ptr<TestSpdyVisitor> visitor(new TestSpdyVisitor(spdy_version_)); 5672 scoped_ptr<TestSpdyVisitor> visitor(new TestSpdyVisitor(spdy_version_));
5736 framer.set_visitor(visitor.get()); 5673 framer.set_visitor(visitor.get());
5737 5674
5738 // Create two input frames. 5675 // Create two input frames.
5739 SpdyHeadersIR headers(1); 5676 SpdyHeadersIR headers(1);
5740 headers.set_priority(1); 5677 headers.set_priority(1);
5741 headers.SetHeader("alpha", "beta"); 5678 headers.SetHeader("alpha", "beta");
5742 headers.SetHeader("gamma", "charlie"); 5679 headers.SetHeader("gamma", "charlie");
5743 headers.SetHeader("cookie", "key1=value1; key2=value2"); 5680 headers.SetHeader("cookie", "key1=value1; key2=value2");
5744 scoped_ptr<SpdyFrame> headers_frame(framer.SerializeHeaders(headers)); 5681 SpdySerializedFrame headers_frame(framer.SerializeHeaders(headers));
5745 5682
5746 const char four_score[] = "Four score and seven years ago"; 5683 const char four_score[] = "Four score and seven years ago";
5747 SpdyDataIR four_score_ir(1, four_score); 5684 SpdyDataIR four_score_ir(1, four_score);
5748 scoped_ptr<SpdyFrame> four_score_frame(framer.SerializeData(four_score_ir)); 5685 SpdySerializedFrame four_score_frame(framer.SerializeData(four_score_ir));
5749 5686
5750 // Put them in a single buffer (new variables here to make it easy to 5687 // Put them in a single buffer (new variables here to make it easy to
5751 // change the order and type of frames). 5688 // change the order and type of frames).
5752 SpdyFrame* frame1 = headers_frame.get(); 5689 SpdySerializedFrame frame1 = std::move(headers_frame);
5753 SpdyFrame* frame2 = four_score_frame.get(); 5690 SpdySerializedFrame frame2 = std::move(four_score_frame);
5754 5691
5755 const size_t frame1_size = frame1->size(); 5692 const size_t frame1_size = frame1.size();
5756 const size_t frame2_size = frame2->size(); 5693 const size_t frame2_size = frame2.size();
5757 5694
5758 LOG(INFO) << "frame1_size = " << frame1_size; 5695 LOG(INFO) << "frame1_size = " << frame1_size;
5759 LOG(INFO) << "frame2_size = " << frame2_size; 5696 LOG(INFO) << "frame2_size = " << frame2_size;
5760 5697
5761 string input_buffer; 5698 string input_buffer;
5762 input_buffer.append(frame1->data(), frame1_size); 5699 input_buffer.append(frame1.data(), frame1_size);
5763 input_buffer.append(frame2->data(), frame2_size); 5700 input_buffer.append(frame2.data(), frame2_size);
5764 5701
5765 const char* buf = input_buffer.data(); 5702 const char* buf = input_buffer.data();
5766 const size_t buf_size = input_buffer.size(); 5703 const size_t buf_size = input_buffer.size();
5767 5704
5768 LOG(INFO) << "buf_size = " << buf_size; 5705 LOG(INFO) << "buf_size = " << buf_size;
5769 5706
5770 size_t processed = framer.ProcessInput(buf, buf_size); 5707 size_t processed = framer.ProcessInput(buf, buf_size);
5771 EXPECT_EQ(buf_size, processed); 5708 EXPECT_EQ(buf_size, processed);
5772 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 5709 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5773 EXPECT_EQ(1, visitor->headers_frame_count_); 5710 EXPECT_EQ(1, visitor->headers_frame_count_);
5774 EXPECT_EQ(1, visitor->data_frame_count_); 5711 EXPECT_EQ(1, visitor->data_frame_count_);
5775 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); 5712 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));
5776 } 5713 }
5777 5714
5778 // Test that SpdyFramer stops after processing a full frame if 5715 // Test that SpdyFramer stops after processing a full frame if
5779 // process_single_input_frame is set. Input to ProcessInput has two frames, but 5716 // process_single_input_frame is set. Input to ProcessInput has two frames, but
5780 // only processes the first when we give it the first frame split at any point, 5717 // only processes the first when we give it the first frame split at any point,
5781 // or give it more than one frame in the input buffer. 5718 // or give it more than one frame in the input buffer.
5782 TEST_P(SpdyFramerTest, ProcessAtMostOneFrame) { 5719 TEST_P(SpdyFramerTest, ProcessAtMostOneFrame) {
5783 SpdyFramer framer(spdy_version_); 5720 SpdyFramer framer(spdy_version_);
5784 framer.set_process_single_input_frame(true); 5721 framer.set_process_single_input_frame(true);
5785 scoped_ptr<TestSpdyVisitor> visitor; 5722 scoped_ptr<TestSpdyVisitor> visitor;
5786 5723
5787 // Create two input frames. 5724 // Create two input frames.
5788 const char four_score[] = "Four score and ..."; 5725 const char four_score[] = "Four score and ...";
5789 SpdyDataIR four_score_ir(1, four_score); 5726 SpdyDataIR four_score_ir(1, four_score);
5790 scoped_ptr<SpdyFrame> four_score_frame(framer.SerializeData(four_score_ir)); 5727 SpdySerializedFrame four_score_frame(framer.SerializeData(four_score_ir));
5791 5728
5792 SpdyHeadersIR headers(2); 5729 SpdyHeadersIR headers(2);
5793 headers.SetHeader("alpha", "beta"); 5730 headers.SetHeader("alpha", "beta");
5794 headers.SetHeader("gamma", "charlie"); 5731 headers.SetHeader("gamma", "charlie");
5795 headers.SetHeader("cookie", "key1=value1; key2=value2"); 5732 headers.SetHeader("cookie", "key1=value1; key2=value2");
5796 scoped_ptr<SpdyFrame> headers_frame(framer.SerializeHeaders(headers)); 5733 SpdySerializedFrame headers_frame(framer.SerializeHeaders(headers));
5797 5734
5798 // Put them in a single buffer (new variables here to make it easy to 5735 // Put them in a single buffer (new variables here to make it easy to
5799 // change the order and type of frames). 5736 // change the order and type of frames).
5800 SpdyFrame* frame1 = four_score_frame.get(); 5737 SpdySerializedFrame frame1 = std::move(four_score_frame);
5801 SpdyFrame* frame2 = headers_frame.get(); 5738 SpdySerializedFrame frame2 = std::move(headers_frame);
5802 5739
5803 const size_t frame1_size = frame1->size(); 5740 const size_t frame1_size = frame1.size();
5804 const size_t frame2_size = frame2->size(); 5741 const size_t frame2_size = frame2.size();
5805 5742
5806 LOG(INFO) << "frame1_size = " << frame1_size; 5743 LOG(INFO) << "frame1_size = " << frame1_size;
5807 LOG(INFO) << "frame2_size = " << frame2_size; 5744 LOG(INFO) << "frame2_size = " << frame2_size;
5808 5745
5809 string input_buffer; 5746 string input_buffer;
5810 input_buffer.append(frame1->data(), frame1_size); 5747 input_buffer.append(frame1.data(), frame1_size);
5811 input_buffer.append(frame2->data(), frame2_size); 5748 input_buffer.append(frame2.data(), frame2_size);
5812 5749
5813 const char* buf = input_buffer.data(); 5750 const char* buf = input_buffer.data();
5814 const size_t buf_size = input_buffer.size(); 5751 const size_t buf_size = input_buffer.size();
5815 5752
5816 LOG(INFO) << "buf_size = " << buf_size; 5753 LOG(INFO) << "buf_size = " << buf_size;
5817 5754
5818 for (size_t first_size = 0; first_size <= buf_size; ++first_size) { 5755 for (size_t first_size = 0; first_size <= buf_size; ++first_size) {
5819 LOG(INFO) << "first_size = " << first_size; 5756 LOG(INFO) << "first_size = " << first_size;
5820 visitor.reset(new TestSpdyVisitor(spdy_version_)); 5757 visitor.reset(new TestSpdyVisitor(spdy_version_));
5821 framer.set_visitor(visitor.get()); 5758 framer.set_visitor(visitor.get());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5853 5790
5854 EXPECT_EQ(1, visitor->data_frame_count_); 5791 EXPECT_EQ(1, visitor->data_frame_count_);
5855 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); 5792 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));
5856 EXPECT_EQ(0, visitor->headers_frame_count_); 5793 EXPECT_EQ(0, visitor->headers_frame_count_);
5857 } 5794 }
5858 } 5795 }
5859 5796
5860 } // namespace test 5797 } // namespace test
5861 5798
5862 } // namespace net 5799 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_http_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698