| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/spdy_framer.h" | 5 #include "net/spdy/spdy_framer.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |