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

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

Issue 2566513004: This change removes SpdyFramer::set_enable_compression() in favor of a constructor parameter. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/spdy_framer_decoder_adapter.cc ('k') | net/spdy/spdy_test_util_common.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/spdy/spdy_framer.h" 5 #include "net/spdy/spdy_framer.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 // 62 //
63 // Returns a new decompressed SpdySerializedFrame. 63 // Returns a new decompressed SpdySerializedFrame.
64 template <class SpdyFrameType> 64 template <class SpdyFrameType>
65 static SpdySerializedFrame DecompressFrame(SpdyFramer* framer, 65 static SpdySerializedFrame DecompressFrame(SpdyFramer* framer,
66 const SpdyFrameType& frame) { 66 const SpdyFrameType& frame) {
67 DecompressionVisitor visitor; 67 DecompressionVisitor visitor;
68 framer->set_visitor(&visitor); 68 framer->set_visitor(&visitor);
69 CHECK_EQ(frame.size(), framer->ProcessInput(frame.data(), frame.size())); 69 CHECK_EQ(frame.size(), framer->ProcessInput(frame.data(), frame.size()));
70 CHECK_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer->state()); 70 CHECK_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer->state());
71 framer->set_visitor(nullptr); 71 framer->set_visitor(nullptr);
72 SpdyFramer serializer; 72 SpdyFramer serializer(SpdyFramer::DISABLE_COMPRESSION);
73 serializer.set_enable_compression(false);
74 return serializer.SerializeFrame(visitor.GetFrame()); 73 return serializer.SerializeFrame(visitor.GetFrame());
75 } 74 }
76 75
77 class DecompressionVisitor : public SpdyFramerVisitorInterface { 76 class DecompressionVisitor : public SpdyFramerVisitorInterface {
78 public: 77 public:
79 DecompressionVisitor() : finished_(false) {} 78 DecompressionVisitor() : finished_(false) {}
80 79
81 const SpdyFrameIR& GetFrame() const { 80 const SpdyFrameIR& GetFrame() const {
82 CHECK(finished_); 81 CHECK(finished_);
83 return *frame_; 82 return *frame_;
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 } 264 }
266 }; 265 };
267 266
268 class TestSpdyVisitor : public SpdyFramerVisitorInterface, 267 class TestSpdyVisitor : public SpdyFramerVisitorInterface,
269 public SpdyFramerDebugVisitorInterface { 268 public SpdyFramerDebugVisitorInterface {
270 public: 269 public:
271 // This is larger than our max frame size because header blocks that 270 // This is larger than our max frame size because header blocks that
272 // are too long can spill over into CONTINUATION frames. 271 // are too long can spill over into CONTINUATION frames.
273 static const size_t kDefaultHeaderBufferSize = 16 * 1024 * 1024; 272 static const size_t kDefaultHeaderBufferSize = 16 * 1024 * 1024;
274 273
275 TestSpdyVisitor() 274 explicit TestSpdyVisitor(SpdyFramer::CompressionOption option)
276 : use_compression_(false), 275 : framer_(option),
277 error_count_(0), 276 error_count_(0),
278 headers_frame_count_(0), 277 headers_frame_count_(0),
279 push_promise_frame_count_(0), 278 push_promise_frame_count_(0),
280 goaway_count_(0), 279 goaway_count_(0),
281 setting_count_(0), 280 setting_count_(0),
282 settings_ack_sent_(0), 281 settings_ack_sent_(0),
283 settings_ack_received_(0), 282 settings_ack_received_(0),
284 continuation_count_(0), 283 continuation_count_(0),
285 altsvc_count_(0), 284 altsvc_count_(0),
286 priority_count_(0), 285 priority_count_(0),
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 void OnReceiveCompressedFrame(SpdyStreamId stream_id, 486 void OnReceiveCompressedFrame(SpdyStreamId stream_id,
488 SpdyFrameType type, 487 SpdyFrameType type,
489 size_t frame_len) override { 488 size_t frame_len) override {
490 VLOG(1) << "OnReceiveCompressedFrame(" << stream_id << ", " << type << ", " 489 VLOG(1) << "OnReceiveCompressedFrame(" << stream_id << ", " << type << ", "
491 << frame_len << ")"; 490 << frame_len << ")";
492 last_frame_len_ = frame_len; 491 last_frame_len_ = frame_len;
493 } 492 }
494 493
495 // Convenience function which runs a framer simulation with particular input. 494 // Convenience function which runs a framer simulation with particular input.
496 void SimulateInFramer(const unsigned char* input, size_t size) { 495 void SimulateInFramer(const unsigned char* input, size_t size) {
497 framer_.set_enable_compression(use_compression_);
498 framer_.set_visitor(this); 496 framer_.set_visitor(this);
499 size_t input_remaining = size; 497 size_t input_remaining = size;
500 const char* input_ptr = reinterpret_cast<const char*>(input); 498 const char* input_ptr = reinterpret_cast<const char*>(input);
501 while (input_remaining > 0 && 499 while (input_remaining > 0 &&
502 framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { 500 framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) {
503 // To make the tests more interesting, we feed random (and small) chunks 501 // To make the tests more interesting, we feed random (and small) chunks
504 // into the framer. This simulates getting strange-sized reads from 502 // into the framer. This simulates getting strange-sized reads from
505 // the socket. 503 // the socket.
506 const size_t kMaxReadSize = 32; 504 const size_t kMaxReadSize = 32;
507 size_t bytes_read = 505 size_t bytes_read =
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 // excluding the size of the header. 541 // excluding the size of the header.
544 static size_t received_control_frame_max_size() { 542 static size_t received_control_frame_max_size() {
545 return kSpdyInitialFrameSizeLimit; 543 return kSpdyInitialFrameSizeLimit;
546 } 544 }
547 545
548 static size_t header_data_chunk_max_size() { 546 static size_t header_data_chunk_max_size() {
549 return SpdyFramer::kHeaderDataChunkMaxSize; 547 return SpdyFramer::kHeaderDataChunkMaxSize;
550 } 548 }
551 549
552 SpdyFramer framer_; 550 SpdyFramer framer_;
553 bool use_compression_;
554 551
555 // Counters from the visitor callbacks. 552 // Counters from the visitor callbacks.
556 int error_count_; 553 int error_count_;
557 int headers_frame_count_; 554 int headers_frame_count_;
558 int push_promise_frame_count_; 555 int push_promise_frame_count_;
559 int goaway_count_; 556 int goaway_count_;
560 int setting_count_; 557 int setting_count_;
561 int settings_ack_sent_; 558 int settings_ack_sent_;
562 int settings_ack_received_; 559 int settings_ack_received_;
563 int continuation_count_; 560 int continuation_count_;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 INSTANTIATE_TEST_CASE_P(SpdyFramerTests, 667 INSTANTIATE_TEST_CASE_P(SpdyFramerTests,
671 SpdyFramerTest, 668 SpdyFramerTest,
672 ::testing::Combine(::testing::Values(DECODER_SELF, 669 ::testing::Combine(::testing::Values(DECODER_SELF,
673 DECODER_NESTED, 670 DECODER_NESTED,
674 DECODER_HTTP2), 671 DECODER_HTTP2),
675 ::testing::Values(HPACK_DECODER_1, 672 ::testing::Values(HPACK_DECODER_1,
676 HPACK_DECODER_2))); 673 HPACK_DECODER_2)));
677 674
678 // Test that we can encode and decode a SpdyHeaderBlock in serialized form. 675 // Test that we can encode and decode a SpdyHeaderBlock in serialized form.
679 TEST_P(SpdyFramerTest, HeaderBlockInBuffer) { 676 TEST_P(SpdyFramerTest, HeaderBlockInBuffer) {
680 SpdyFramer framer; 677 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
681 framer.set_enable_compression(false);
682 678
683 // Encode the header block into a Headers frame. 679 // Encode the header block into a Headers frame.
684 SpdyHeadersIR headers(1); 680 SpdyHeadersIR headers(1);
685 headers.SetHeader("alpha", "beta"); 681 headers.SetHeader("alpha", "beta");
686 headers.SetHeader("gamma", "charlie"); 682 headers.SetHeader("gamma", "charlie");
687 headers.SetHeader("cookie", "key1=value1; key2=value2"); 683 headers.SetHeader("cookie", "key1=value1; key2=value2");
688 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); 684 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers));
689 685
690 TestSpdyVisitor visitor; 686 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
691 visitor.use_compression_ = false;
692 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), 687 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
693 frame.size()); 688 frame.size());
694 689
695 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 690 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
696 EXPECT_EQ(headers.header_block(), visitor.headers_); 691 EXPECT_EQ(headers.header_block(), visitor.headers_);
697 } 692 }
698 693
699 // Test that if there's not a full frame, we fail to parse it. 694 // Test that if there's not a full frame, we fail to parse it.
700 TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) { 695 TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) {
701 SpdyFramer framer; 696 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
702 framer.set_enable_compression(false);
703 697
704 // Encode the header block into a Headers frame. 698 // Encode the header block into a Headers frame.
705 SpdyHeadersIR headers(1); 699 SpdyHeadersIR headers(1);
706 headers.SetHeader("alpha", "beta"); 700 headers.SetHeader("alpha", "beta");
707 headers.SetHeader("gamma", "charlie"); 701 headers.SetHeader("gamma", "charlie");
708 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); 702 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers));
709 703
710 TestSpdyVisitor visitor; 704 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
711 visitor.use_compression_ = false;
712 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), 705 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
713 frame.size() - 2); 706 frame.size() - 2);
714 707
715 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 708 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
716 EXPECT_EQ(0u, visitor.headers_.size()); 709 EXPECT_EQ(0u, visitor.headers_.size());
717 } 710 }
718 711
719 // Test that we treat incoming upper-case or mixed-case header values as 712 // Test that we treat incoming upper-case or mixed-case header values as
720 // malformed. 713 // malformed.
721 TEST_P(SpdyFramerTest, RejectUpperCaseHeaderBlockValue) { 714 TEST_P(SpdyFramerTest, RejectUpperCaseHeaderBlockValue) {
722 SpdyFramer framer; 715 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
723 framer.set_enable_compression(false);
724 716
725 SpdyFrameBuilder frame(1024); 717 SpdyFrameBuilder frame(1024);
726 frame.BeginNewFrame(framer, HEADERS, 0, 1); 718 frame.BeginNewFrame(framer, HEADERS, 0, 1);
727 frame.WriteUInt32(1); 719 frame.WriteUInt32(1);
728 frame.WriteStringPiece32("Name1"); 720 frame.WriteStringPiece32("Name1");
729 frame.WriteStringPiece32("value1"); 721 frame.WriteStringPiece32("value1");
730 frame.RewriteLength(framer); 722 frame.RewriteLength(framer);
731 723
732 SpdyFrameBuilder frame2(1024); 724 SpdyFrameBuilder frame2(1024);
733 frame2.BeginNewFrame(framer, HEADERS, 0, 1); 725 frame2.BeginNewFrame(framer, HEADERS, 0, 1);
(...skipping 13 matching lines...) Expand all
747 SpdyHeaderBlock new_headers; 739 SpdyHeaderBlock new_headers;
748 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer( 740 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(
749 serialized_headers.data(), serialized_headers.size(), &new_headers)); 741 serialized_headers.data(), serialized_headers.size(), &new_headers));
750 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer( 742 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(
751 serialized_headers2.data(), serialized_headers2.size(), &new_headers)); 743 serialized_headers2.data(), serialized_headers2.size(), &new_headers));
752 } 744 }
753 745
754 // Test that we can encode and decode stream dependency values in a header 746 // Test that we can encode and decode stream dependency values in a header
755 // frame. 747 // frame.
756 TEST_P(SpdyFramerTest, HeaderStreamDependencyValues) { 748 TEST_P(SpdyFramerTest, HeaderStreamDependencyValues) {
757 SpdyFramer framer; 749 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
758 framer.set_enable_compression(false);
759 750
760 const SpdyStreamId parent_stream_id_test_array[] = {0, 3}; 751 const SpdyStreamId parent_stream_id_test_array[] = {0, 3};
761 for (SpdyStreamId parent_stream_id : parent_stream_id_test_array) { 752 for (SpdyStreamId parent_stream_id : parent_stream_id_test_array) {
762 const bool exclusive_test_array[] = {true, false}; 753 const bool exclusive_test_array[] = {true, false};
763 for (bool exclusive : exclusive_test_array) { 754 for (bool exclusive : exclusive_test_array) {
764 SpdyHeadersIR headers(1); 755 SpdyHeadersIR headers(1);
765 headers.set_has_priority(true); 756 headers.set_has_priority(true);
766 headers.set_parent_stream_id(parent_stream_id); 757 headers.set_parent_stream_id(parent_stream_id);
767 headers.set_exclusive(exclusive); 758 headers.set_exclusive(exclusive);
768 SpdySerializedFrame frame( 759 SpdySerializedFrame frame(
769 SpdyFramerPeer::SerializeHeaders(&framer, headers)); 760 SpdyFramerPeer::SerializeHeaders(&framer, headers));
770 761
771 TestSpdyVisitor visitor; 762 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
772 visitor.use_compression_ = false;
773 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), 763 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
774 frame.size()); 764 frame.size());
775 765
776 EXPECT_TRUE(visitor.header_has_priority_); 766 EXPECT_TRUE(visitor.header_has_priority_);
777 EXPECT_EQ(parent_stream_id, visitor.header_parent_stream_id_); 767 EXPECT_EQ(parent_stream_id, visitor.header_parent_stream_id_);
778 EXPECT_EQ(exclusive, visitor.header_exclusive_); 768 EXPECT_EQ(exclusive, visitor.header_exclusive_);
779 } 769 }
780 } 770 }
781 } 771 }
782 772
783 // Test that if we receive a frame with payload length field at the 773 // Test that if we receive a frame with payload length field at the
784 // advertised max size, we do not set an error in ProcessInput. 774 // advertised max size, we do not set an error in ProcessInput.
785 TEST_P(SpdyFramerTest, AcceptMaxFrameSizeSetting) { 775 TEST_P(SpdyFramerTest, AcceptMaxFrameSizeSetting) {
786 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 776 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
787 SpdyFramer framer; 777 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
788 framer.set_visitor(&visitor); 778 framer.set_visitor(&visitor);
789 779
790 // DATA frame with maximum allowed payload length. 780 // DATA frame with maximum allowed payload length.
791 unsigned char kH2FrameData[] = { 781 unsigned char kH2FrameData[] = {
792 0x00, 0x40, 0x00, // Length: 2^14 782 0x00, 0x40, 0x00, // Length: 2^14
793 0x00, // Type: HEADERS 783 0x00, // Type: HEADERS
794 0x00, // Flags: None 784 0x00, // Flags: None
795 0x00, 0x00, 0x00, 0x01, // Stream: 1 785 0x00, 0x00, 0x00, 0x01, // Stream: 1
796 0x00, 0x00, 0x00, 0x00, // Junk payload 786 0x00, 0x00, 0x00, 0x00, // Junk payload
797 }; 787 };
798 788
799 SpdySerializedFrame frame(reinterpret_cast<char*>(kH2FrameData), 789 SpdySerializedFrame frame(reinterpret_cast<char*>(kH2FrameData),
800 sizeof(kH2FrameData), false); 790 sizeof(kH2FrameData), false);
801 791
802 EXPECT_CALL(visitor, OnDataFrameHeader(1, 1 << 14, false)); 792 EXPECT_CALL(visitor, OnDataFrameHeader(1, 1 << 14, false));
803 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 4)); 793 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 4));
804 framer.ProcessInput(frame.data(), frame.size()); 794 framer.ProcessInput(frame.data(), frame.size());
805 EXPECT_FALSE(framer.HasError()); 795 EXPECT_FALSE(framer.HasError());
806 } 796 }
807 797
808 // Test that if we receive a frame with payload length larger than the 798 // Test that if we receive a frame with payload length larger than the
809 // advertised max size, we set an error of SPDY_INVALID_CONTROL_FRAME_SIZE. 799 // advertised max size, we set an error of SPDY_INVALID_CONTROL_FRAME_SIZE.
810 TEST_P(SpdyFramerTest, ExceedMaxFrameSizeSetting) { 800 TEST_P(SpdyFramerTest, ExceedMaxFrameSizeSetting) {
811 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 801 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
812 SpdyFramer framer; 802 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
813 framer.set_visitor(&visitor); 803 framer.set_visitor(&visitor);
814 804
815 // DATA frame with too large payload length. 805 // DATA frame with too large payload length.
816 unsigned char kH2FrameData[] = { 806 unsigned char kH2FrameData[] = {
817 0x00, 0x40, 0x01, // Length: 2^14 + 1 807 0x00, 0x40, 0x01, // Length: 2^14 + 1
818 0x00, // Type: HEADERS 808 0x00, // Type: HEADERS
819 0x00, // Flags: None 809 0x00, // Flags: None
820 0x00, 0x00, 0x00, 0x01, // Stream: 1 810 0x00, 0x00, 0x00, 0x01, // Stream: 1
821 0x00, 0x00, 0x00, 0x00, // Junk payload 811 0x00, 0x00, 0x00, 0x00, // Junk payload
822 }; 812 };
823 813
824 SpdySerializedFrame frame(reinterpret_cast<char*>(kH2FrameData), 814 SpdySerializedFrame frame(reinterpret_cast<char*>(kH2FrameData),
825 sizeof(kH2FrameData), false); 815 sizeof(kH2FrameData), false);
826 816
827 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 817 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
828 framer.ProcessInput(frame.data(), frame.size()); 818 framer.ProcessInput(frame.data(), frame.size());
829 EXPECT_TRUE(framer.HasError()); 819 EXPECT_TRUE(framer.HasError());
830 EXPECT_EQ(SpdyFramer::SPDY_OVERSIZED_PAYLOAD, framer.error_code()) 820 EXPECT_EQ(SpdyFramer::SPDY_OVERSIZED_PAYLOAD, framer.error_code())
831 << SpdyFramer::ErrorCodeToString(framer.error_code()); 821 << SpdyFramer::ErrorCodeToString(framer.error_code());
832 } 822 }
833 823
834 // Test that if we receive a DATA frame with padding length larger than the 824 // Test that if we receive a DATA frame with padding length larger than the
835 // payload length, we set an error of SPDY_INVALID_PADDING 825 // payload length, we set an error of SPDY_INVALID_PADDING
836 TEST_P(SpdyFramerTest, OversizedDataPaddingError) { 826 TEST_P(SpdyFramerTest, OversizedDataPaddingError) {
837 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 827 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
838 SpdyFramer framer; 828 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
839 framer.set_visitor(&visitor); 829 framer.set_visitor(&visitor);
840 830
841 // DATA frame with invalid padding length. 831 // DATA frame with invalid padding length.
842 // |kH2FrameData| has to be |unsigned char|, because Chromium on Windows uses 832 // |kH2FrameData| has to be |unsigned char|, because Chromium on Windows uses
843 // MSVC, where |char| is signed by default, which would not compile because of 833 // MSVC, where |char| is signed by default, which would not compile because of
844 // the element exceeding 127. 834 // the element exceeding 127.
845 unsigned char kH2FrameData[] = { 835 unsigned char kH2FrameData[] = {
846 0x00, 0x00, 0x05, // Length: 5 836 0x00, 0x00, 0x05, // Length: 5
847 0x00, // Type: DATA 837 0x00, // Type: DATA
848 0x09, // Flags: END_STREAM|PADDED 838 0x09, // Flags: END_STREAM|PADDED
(...skipping 14 matching lines...) Expand all
863 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 853 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
864 EXPECT_TRUE(framer.HasError()); 854 EXPECT_TRUE(framer.HasError());
865 EXPECT_EQ(SpdyFramer::SPDY_INVALID_PADDING, framer.error_code()) 855 EXPECT_EQ(SpdyFramer::SPDY_INVALID_PADDING, framer.error_code())
866 << SpdyFramer::ErrorCodeToString(framer.error_code()); 856 << SpdyFramer::ErrorCodeToString(framer.error_code());
867 } 857 }
868 858
869 // Test that if we receive a DATA frame with padding length not larger than the 859 // Test that if we receive a DATA frame with padding length not larger than the
870 // payload length, we do not set an error of SPDY_INVALID_PADDING 860 // payload length, we do not set an error of SPDY_INVALID_PADDING
871 TEST_P(SpdyFramerTest, CorrectlySizedDataPaddingNoError) { 861 TEST_P(SpdyFramerTest, CorrectlySizedDataPaddingNoError) {
872 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 862 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
873 SpdyFramer framer; 863 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
874 framer.set_visitor(&visitor); 864 framer.set_visitor(&visitor);
875 865
876 // DATA frame with valid Padding length 866 // DATA frame with valid Padding length
877 char kH2FrameData[] = { 867 char kH2FrameData[] = {
878 0x00, 0x00, 0x05, // Length: 5 868 0x00, 0x00, 0x05, // Length: 5
879 0x00, // Type: DATA 869 0x00, // Type: DATA
880 0x08, // Flags: PADDED 870 0x08, // Flags: PADDED
881 0x00, 0x00, 0x00, 0x01, // Stream: 1 871 0x00, 0x00, 0x00, 0x01, // Stream: 1
882 0x04, // PadLen: 4 trailing bytes 872 0x04, // PadLen: 4 trailing bytes
883 0x00, 0x00, 0x00, 0x00, // Padding 873 0x00, 0x00, 0x00, 0x00, // Padding
(...skipping 14 matching lines...) Expand all
898 EXPECT_EQ(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 888 EXPECT_EQ(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
899 EXPECT_FALSE(framer.HasError()); 889 EXPECT_FALSE(framer.HasError());
900 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 890 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
901 << SpdyFramer::ErrorCodeToString(framer.error_code()); 891 << SpdyFramer::ErrorCodeToString(framer.error_code());
902 } 892 }
903 893
904 // Test that if we receive a HEADERS frame with padding length larger than the 894 // Test that if we receive a HEADERS frame with padding length larger than the
905 // payload length, we set an error of SPDY_INVALID_PADDING 895 // payload length, we set an error of SPDY_INVALID_PADDING
906 TEST_P(SpdyFramerTest, OversizedHeadersPaddingError) { 896 TEST_P(SpdyFramerTest, OversizedHeadersPaddingError) {
907 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 897 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
908 SpdyFramer framer; 898 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
909 framer.set_visitor(&visitor); 899 framer.set_visitor(&visitor);
910 900
911 // HEADERS frame with invalid padding length. 901 // HEADERS frame with invalid padding length.
912 // |kH2FrameData| has to be |unsigned char|, because Chromium on Windows uses 902 // |kH2FrameData| has to be |unsigned char|, because Chromium on Windows uses
913 // MSVC, where |char| is signed by default, which would not compile because of 903 // MSVC, where |char| is signed by default, which would not compile because of
914 // the element exceeding 127. 904 // the element exceeding 127.
915 unsigned char kH2FrameData[] = { 905 unsigned char kH2FrameData[] = {
916 0x00, 0x00, 0x05, // Length: 5 906 0x00, 0x00, 0x05, // Length: 5
917 0x01, // Type: HEADERS 907 0x01, // Type: HEADERS
918 0x08, // Flags: PADDED 908 0x08, // Flags: PADDED
(...skipping 11 matching lines...) Expand all
930 EXPECT_EQ(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 920 EXPECT_EQ(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
931 EXPECT_TRUE(framer.HasError()); 921 EXPECT_TRUE(framer.HasError());
932 EXPECT_EQ(SpdyFramer::SPDY_INVALID_PADDING, framer.error_code()) 922 EXPECT_EQ(SpdyFramer::SPDY_INVALID_PADDING, framer.error_code())
933 << SpdyFramer::ErrorCodeToString(framer.error_code()); 923 << SpdyFramer::ErrorCodeToString(framer.error_code());
934 } 924 }
935 925
936 // Test that if we receive a HEADERS frame with padding length not larger 926 // Test that if we receive a HEADERS frame with padding length not larger
937 // than the payload length, we do not set an error of SPDY_INVALID_PADDING 927 // than the payload length, we do not set an error of SPDY_INVALID_PADDING
938 TEST_P(SpdyFramerTest, CorrectlySizedHeadersPaddingNoError) { 928 TEST_P(SpdyFramerTest, CorrectlySizedHeadersPaddingNoError) {
939 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 929 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
940 SpdyFramer framer; 930 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
941 framer.set_visitor(&visitor); 931 framer.set_visitor(&visitor);
942 932
943 // HEADERS frame with invalid Padding length 933 // HEADERS frame with invalid Padding length
944 char kH2FrameData[] = { 934 char kH2FrameData[] = {
945 0x00, 0x00, 0x05, // Length: 5 935 0x00, 0x00, 0x05, // Length: 5
946 0x01, // Type: HEADERS 936 0x01, // Type: HEADERS
947 0x08, // Flags: PADDED 937 0x08, // Flags: PADDED
948 0x00, 0x00, 0x00, 0x01, // Stream: 1 938 0x00, 0x00, 0x00, 0x01, // Stream: 1
949 0x04, // PadLen: 4 trailing bytes 939 0x04, // PadLen: 4 trailing bytes
950 0x00, 0x00, 0x00, 0x00, // Padding 940 0x00, 0x00, 0x00, 0x00, // Padding
951 }; 941 };
952 942
953 SpdySerializedFrame frame(kH2FrameData, sizeof(kH2FrameData), false); 943 SpdySerializedFrame frame(kH2FrameData, sizeof(kH2FrameData), false);
954 944
955 EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false)); 945 EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false));
956 EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1); 946 EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1);
957 EXPECT_EQ(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 947 EXPECT_EQ(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
958 EXPECT_FALSE(framer.HasError()); 948 EXPECT_FALSE(framer.HasError());
959 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 949 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
960 << SpdyFramer::ErrorCodeToString(framer.error_code()); 950 << SpdyFramer::ErrorCodeToString(framer.error_code());
961 } 951 }
962 952
963 // Test that if we receive a DATA with stream ID zero, we signal an error 953 // Test that if we receive a DATA with stream ID zero, we signal an error
964 // (but don't crash). 954 // (but don't crash).
965 TEST_P(SpdyFramerTest, DataWithStreamIdZero) { 955 TEST_P(SpdyFramerTest, DataWithStreamIdZero) {
966 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 956 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
967 SpdyFramer framer; 957 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
968 framer.set_visitor(&visitor); 958 framer.set_visitor(&visitor);
969 959
970 const char bytes[] = "hello"; 960 const char bytes[] = "hello";
971 SpdyDataIR data_ir(0, bytes); 961 SpdyDataIR data_ir(0, bytes);
972 SpdySerializedFrame frame(framer.SerializeData(data_ir)); 962 SpdySerializedFrame frame(framer.SerializeData(data_ir));
973 963
974 // We shouldn't have to read the whole frame before we signal an error. 964 // We shouldn't have to read the whole frame before we signal an error.
975 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 965 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
976 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 966 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
977 EXPECT_TRUE(framer.HasError()); 967 EXPECT_TRUE(framer.HasError());
978 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code()) 968 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code())
979 << SpdyFramer::ErrorCodeToString(framer.error_code()); 969 << SpdyFramer::ErrorCodeToString(framer.error_code());
980 } 970 }
981 971
982 // Test that if we receive a HEADERS with stream ID zero, we signal an error 972 // Test that if we receive a HEADERS with stream ID zero, we signal an error
983 // (but don't crash). 973 // (but don't crash).
984 TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) { 974 TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) {
985 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 975 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
986 SpdyFramer framer; 976 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
987 framer.set_visitor(&visitor); 977 framer.set_visitor(&visitor);
988 978
989 SpdyHeadersIR headers(0); 979 SpdyHeadersIR headers(0);
990 headers.SetHeader("alpha", "beta"); 980 headers.SetHeader("alpha", "beta");
991 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); 981 SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers));
992 982
993 // We shouldn't have to read the whole frame before we signal an error. 983 // We shouldn't have to read the whole frame before we signal an error.
994 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 984 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
995 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 985 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
996 EXPECT_TRUE(framer.HasError()); 986 EXPECT_TRUE(framer.HasError());
997 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code()) 987 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code())
998 << SpdyFramer::ErrorCodeToString(framer.error_code()); 988 << SpdyFramer::ErrorCodeToString(framer.error_code());
999 } 989 }
1000 990
1001 // Test that if we receive a PRIORITY with stream ID zero, we signal an error 991 // Test that if we receive a PRIORITY with stream ID zero, we signal an error
1002 // (but don't crash). 992 // (but don't crash).
1003 TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) { 993 TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) {
1004 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 994 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
1005 SpdyFramer framer; 995 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1006 framer.set_visitor(&visitor); 996 framer.set_visitor(&visitor);
1007 997
1008 SpdyPriorityIR priority_ir(0, 1, 16, true); 998 SpdyPriorityIR priority_ir(0, 1, 16, true);
1009 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); 999 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir));
1010 1000
1011 // We shouldn't have to read the whole frame before we signal an error. 1001 // We shouldn't have to read the whole frame before we signal an error.
1012 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 1002 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
1013 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 1003 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
1014 EXPECT_TRUE(framer.HasError()); 1004 EXPECT_TRUE(framer.HasError());
1015 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code()) 1005 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code())
1016 << SpdyFramer::ErrorCodeToString(framer.error_code()); 1006 << SpdyFramer::ErrorCodeToString(framer.error_code());
1017 } 1007 }
1018 1008
1019 // Test that if we receive a RST_STREAM with stream ID zero, we signal an error 1009 // Test that if we receive a RST_STREAM with stream ID zero, we signal an error
1020 // (but don't crash). 1010 // (but don't crash).
1021 TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) { 1011 TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) {
1022 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 1012 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
1023 SpdyFramer framer; 1013 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1024 framer.set_visitor(&visitor); 1014 framer.set_visitor(&visitor);
1025 1015
1026 SpdyRstStreamIR rst_stream_ir(0, RST_STREAM_PROTOCOL_ERROR); 1016 SpdyRstStreamIR rst_stream_ir(0, RST_STREAM_PROTOCOL_ERROR);
1027 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream_ir)); 1017 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream_ir));
1028 1018
1029 // We shouldn't have to read the whole frame before we signal an error. 1019 // We shouldn't have to read the whole frame before we signal an error.
1030 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 1020 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
1031 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 1021 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
1032 EXPECT_TRUE(framer.HasError()); 1022 EXPECT_TRUE(framer.HasError());
1033 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code()) 1023 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code())
1034 << SpdyFramer::ErrorCodeToString(framer.error_code()); 1024 << SpdyFramer::ErrorCodeToString(framer.error_code());
1035 } 1025 }
1036 1026
1037 // Test that if we receive a SETTINGS with stream ID other than zero, 1027 // Test that if we receive a SETTINGS with stream ID other than zero,
1038 // we signal an error (but don't crash). 1028 // we signal an error (but don't crash).
1039 TEST_P(SpdyFramerTest, SettingsWithStreamIdNotZero) { 1029 TEST_P(SpdyFramerTest, SettingsWithStreamIdNotZero) {
1040 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 1030 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
1041 SpdyFramer framer; 1031 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1042 framer.set_visitor(&visitor); 1032 framer.set_visitor(&visitor);
1043 1033
1044 // Settings frame with invalid StreamID of 0x01 1034 // Settings frame with invalid StreamID of 0x01
1045 char kH2FrameData[] = { 1035 char kH2FrameData[] = {
1046 0x00, 0x00, 0x06, // Length: 6 1036 0x00, 0x00, 0x06, // Length: 6
1047 0x04, // Type: SETTINGS 1037 0x04, // Type: SETTINGS
1048 0x00, // Flags: none 1038 0x00, // Flags: none
1049 0x00, 0x00, 0x00, 0x01, // Stream: 1 1039 0x00, 0x00, 0x00, 0x01, // Stream: 1
1050 0x00, 0x04, // Param: INITIAL_WINDOW_SIZE 1040 0x00, 0x04, // Param: INITIAL_WINDOW_SIZE
1051 0x0a, 0x0b, 0x0c, 0x0d, // Value: 168496141 1041 0x0a, 0x0b, 0x0c, 0x0d, // Value: 168496141
1052 }; 1042 };
1053 1043
1054 SpdySerializedFrame frame(kH2FrameData, sizeof(kH2FrameData), false); 1044 SpdySerializedFrame frame(kH2FrameData, sizeof(kH2FrameData), false);
1055 1045
1056 // We shouldn't have to read the whole frame before we signal an error. 1046 // We shouldn't have to read the whole frame before we signal an error.
1057 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 1047 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
1058 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 1048 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
1059 EXPECT_TRUE(framer.HasError()); 1049 EXPECT_TRUE(framer.HasError());
1060 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code()) 1050 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code())
1061 << SpdyFramer::ErrorCodeToString(framer.error_code()); 1051 << SpdyFramer::ErrorCodeToString(framer.error_code());
1062 } 1052 }
1063 1053
1064 // Test that if we receive a GOAWAY with stream ID other than zero, 1054 // Test that if we receive a GOAWAY with stream ID other than zero,
1065 // we signal an error (but don't crash). 1055 // we signal an error (but don't crash).
1066 TEST_P(SpdyFramerTest, GoawayWithStreamIdNotZero) { 1056 TEST_P(SpdyFramerTest, GoawayWithStreamIdNotZero) {
1067 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 1057 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
1068 SpdyFramer framer; 1058 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1069 framer.set_visitor(&visitor); 1059 framer.set_visitor(&visitor);
1070 1060
1071 // GOAWAY frame with invalid StreamID of 0x01 1061 // GOAWAY frame with invalid StreamID of 0x01
1072 char kH2FrameData[] = { 1062 char kH2FrameData[] = {
1073 0x00, 0x00, 0x0a, // Length: 10 1063 0x00, 0x00, 0x0a, // Length: 10
1074 0x07, // Type: GOAWAY 1064 0x07, // Type: GOAWAY
1075 0x00, // Flags: none 1065 0x00, // Flags: none
1076 0x00, 0x00, 0x00, 0x01, // Stream: 1 1066 0x00, 0x00, 0x00, 0x01, // Stream: 1
1077 0x00, 0x00, 0x00, 0x00, // Last: 0 1067 0x00, 0x00, 0x00, 0x00, // Last: 0
1078 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR 1068 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR
1079 0x47, 0x41, // Description 1069 0x47, 0x41, // Description
1080 }; 1070 };
1081 1071
1082 SpdySerializedFrame frame(kH2FrameData, sizeof(kH2FrameData), false); 1072 SpdySerializedFrame frame(kH2FrameData, sizeof(kH2FrameData), false);
1083 1073
1084 // We shouldn't have to read the whole frame before we signal an error. 1074 // We shouldn't have to read the whole frame before we signal an error.
1085 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 1075 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
1086 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 1076 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
1087 EXPECT_TRUE(framer.HasError()); 1077 EXPECT_TRUE(framer.HasError());
1088 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code()) 1078 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code())
1089 << SpdyFramer::ErrorCodeToString(framer.error_code()); 1079 << SpdyFramer::ErrorCodeToString(framer.error_code());
1090 } 1080 }
1091 1081
1092 // Test that if we receive a CONTINUATION with stream ID zero, we signal an 1082 // Test that if we receive a CONTINUATION with stream ID zero, we signal an
1093 // SPDY_INVALID_STREAM_ID. 1083 // SPDY_INVALID_STREAM_ID.
1094 TEST_P(SpdyFramerTest, ContinuationWithStreamIdZero) { 1084 TEST_P(SpdyFramerTest, ContinuationWithStreamIdZero) {
1095 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 1085 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
1096 SpdyFramer framer; 1086 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1097 framer.set_visitor(&visitor); 1087 framer.set_visitor(&visitor);
1098 1088
1099 SpdyContinuationIR continuation(0); 1089 SpdyContinuationIR continuation(0);
1100 auto some_nonsense_encoding = 1090 auto some_nonsense_encoding =
1101 base::MakeUnique<string>("some nonsense encoding"); 1091 base::MakeUnique<string>("some nonsense encoding");
1102 continuation.take_encoding(std::move(some_nonsense_encoding)); 1092 continuation.take_encoding(std::move(some_nonsense_encoding));
1103 continuation.set_end_headers(true); 1093 continuation.set_end_headers(true);
1104 SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); 1094 SpdySerializedFrame frame(framer.SerializeContinuation(continuation));
1105 1095
1106 // We shouldn't have to read the whole frame before we signal an error. 1096 // We shouldn't have to read the whole frame before we signal an error.
1107 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 1097 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
1108 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 1098 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
1109 EXPECT_TRUE(framer.HasError()); 1099 EXPECT_TRUE(framer.HasError());
1110 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code()) 1100 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code())
1111 << SpdyFramer::ErrorCodeToString(framer.error_code()); 1101 << SpdyFramer::ErrorCodeToString(framer.error_code());
1112 } 1102 }
1113 1103
1114 // Test that if we receive a PUSH_PROMISE with stream ID zero, we signal an 1104 // Test that if we receive a PUSH_PROMISE with stream ID zero, we signal an
1115 // SPDY_INVALID_STREAM_ID. 1105 // SPDY_INVALID_STREAM_ID.
1116 TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) { 1106 TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) {
1117 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 1107 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
1118 SpdyFramer framer; 1108 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1119 framer.set_visitor(&visitor); 1109 framer.set_visitor(&visitor);
1120 1110
1121 SpdyPushPromiseIR push_promise(0, 4); 1111 SpdyPushPromiseIR push_promise(0, 4);
1122 push_promise.SetHeader("alpha", "beta"); 1112 push_promise.SetHeader("alpha", "beta");
1123 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); 1113 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
1124 1114
1125 // We shouldn't have to read the whole frame before we signal an error. 1115 // We shouldn't have to read the whole frame before we signal an error.
1126 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 1116 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
1127 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); 1117 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size()));
1128 EXPECT_TRUE(framer.HasError()); 1118 EXPECT_TRUE(framer.HasError());
1129 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code()) 1119 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.error_code())
1130 << SpdyFramer::ErrorCodeToString(framer.error_code()); 1120 << SpdyFramer::ErrorCodeToString(framer.error_code());
1131 } 1121 }
1132 1122
1133 // Test that if we receive a PUSH_PROMISE with promised stream ID zero, we 1123 // Test that if we receive a PUSH_PROMISE with promised stream ID zero, we
1134 // signal SPDY_INVALID_STREAM_ID. 1124 // signal SPDY_INVALID_STREAM_ID.
1135 TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) { 1125 TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) {
1136 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 1126 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
1137 SpdyFramer framer; 1127 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1138 framer.set_visitor(&visitor); 1128 framer.set_visitor(&visitor);
1139 1129
1140 SpdyPushPromiseIR push_promise(3, 0); 1130 SpdyPushPromiseIR push_promise(3, 0);
1141 push_promise.SetHeader("alpha", "beta"); 1131 push_promise.SetHeader("alpha", "beta");
1142 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); 1132 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
1143 1133
1144 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 1134 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
1145 framer.ProcessInput(frame.data(), frame.size()); 1135 framer.ProcessInput(frame.data(), frame.size());
1146 EXPECT_TRUE(framer.HasError()); 1136 EXPECT_TRUE(framer.HasError());
1147 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) 1137 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code())
1148 << SpdyFramer::ErrorCodeToString(framer.error_code()); 1138 << SpdyFramer::ErrorCodeToString(framer.error_code());
1149 } 1139 }
1150 1140
1151 TEST_P(SpdyFramerTest, DuplicateHeader) { 1141 TEST_P(SpdyFramerTest, DuplicateHeader) {
1152 SpdyFramer framer; 1142 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
1153 // Frame builder with plentiful buffer size. 1143 // Frame builder with plentiful buffer size.
1154 SpdyFrameBuilder frame(1024); 1144 SpdyFrameBuilder frame(1024);
1155 frame.BeginNewFrame(framer, HEADERS, 0, 3); 1145 frame.BeginNewFrame(framer, HEADERS, 0, 3);
1156 1146
1157 frame.WriteUInt32(2); // Number of headers. 1147 frame.WriteUInt32(2); // Number of headers.
1158 frame.WriteStringPiece32("name"); 1148 frame.WriteStringPiece32("name");
1159 frame.WriteStringPiece32("value1"); 1149 frame.WriteStringPiece32("value1");
1160 frame.WriteStringPiece32("name"); 1150 frame.WriteStringPiece32("name");
1161 frame.WriteStringPiece32("value2"); 1151 frame.WriteStringPiece32("value2");
1162 // write the length 1152 // write the length
1163 frame.RewriteLength(framer); 1153 frame.RewriteLength(framer);
1164 1154
1165 SpdyHeaderBlock new_headers; 1155 SpdyHeaderBlock new_headers;
1166 framer.set_enable_compression(false);
1167 SpdySerializedFrame control_frame(frame.take()); 1156 SpdySerializedFrame control_frame(frame.take());
1168 StringPiece serialized_headers = GetSerializedHeaders(control_frame, framer); 1157 StringPiece serialized_headers = GetSerializedHeaders(control_frame, framer);
1169 // This should fail because duplicate headers are verboten by the spec. 1158 // This should fail because duplicate headers are verboten by the spec.
1170 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer( 1159 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(
1171 serialized_headers.data(), serialized_headers.size(), &new_headers)); 1160 serialized_headers.data(), serialized_headers.size(), &new_headers));
1172 } 1161 }
1173 1162
1174 TEST_P(SpdyFramerTest, MultiValueHeader) { 1163 TEST_P(SpdyFramerTest, MultiValueHeader) {
1175 SpdyFramer framer; 1164 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
1176 // Frame builder with plentiful buffer size. 1165 // Frame builder with plentiful buffer size.
1177 SpdyFrameBuilder frame(1024); 1166 SpdyFrameBuilder frame(1024);
1178 frame.BeginNewFrame(framer, HEADERS, 1167 frame.BeginNewFrame(framer, HEADERS,
1179 HEADERS_FLAG_PRIORITY | HEADERS_FLAG_END_HEADERS, 3); 1168 HEADERS_FLAG_PRIORITY | HEADERS_FLAG_END_HEADERS, 3);
1180 frame.WriteUInt32(0); // Priority exclusivity and dependent stream. 1169 frame.WriteUInt32(0); // Priority exclusivity and dependent stream.
1181 frame.WriteUInt8(255); // Priority weight. 1170 frame.WriteUInt8(255); // Priority weight.
1182 1171
1183 string value("value1\0value2", 13); 1172 string value("value1\0value2", 13);
1184 // TODO(jgraettinger): If this pattern appears again, move to test class. 1173 // TODO(jgraettinger): If this pattern appears again, move to test class.
1185 SpdyHeaderBlock header_set; 1174 SpdyHeaderBlock header_set;
1186 header_set["name"] = value; 1175 header_set["name"] = value;
1187 string buffer; 1176 string buffer;
1188 HpackEncoder encoder(ObtainHpackHuffmanTable()); 1177 HpackEncoder encoder(ObtainHpackHuffmanTable());
1189 encoder.EncodeHeaderSetWithoutCompression(header_set, &buffer); 1178 encoder.EncodeHeaderSetWithoutCompression(header_set, &buffer);
1190 frame.WriteBytes(&buffer[0], buffer.size()); 1179 frame.WriteBytes(&buffer[0], buffer.size());
1191 // write the length 1180 // write the length
1192 frame.RewriteLength(framer); 1181 frame.RewriteLength(framer);
1193 1182
1194 framer.set_enable_compression(false);
1195 SpdySerializedFrame control_frame(frame.take()); 1183 SpdySerializedFrame control_frame(frame.take());
1196 1184
1197 TestSpdyVisitor visitor; 1185 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
1198 visitor.use_compression_ = false;
1199 visitor.SimulateInFramer( 1186 visitor.SimulateInFramer(
1200 reinterpret_cast<unsigned char*>(control_frame.data()), 1187 reinterpret_cast<unsigned char*>(control_frame.data()),
1201 control_frame.size()); 1188 control_frame.size());
1202 1189
1203 EXPECT_THAT(visitor.headers_, 1190 EXPECT_THAT(visitor.headers_,
1204 testing::ElementsAre(testing::Pair("name", StringPiece(value)))); 1191 testing::ElementsAre(testing::Pair("name", StringPiece(value))));
1205 } 1192 }
1206 1193
1207 TEST_P(SpdyFramerTest, CompressEmptyHeaders) { 1194 TEST_P(SpdyFramerTest, CompressEmptyHeaders) {
1208 // See crbug.com/172383 1195 // See crbug.com/172383
1209 SpdyHeadersIR headers(1); 1196 SpdyHeadersIR headers(1);
1210 headers.SetHeader("server", "SpdyServer 1.0"); 1197 headers.SetHeader("server", "SpdyServer 1.0");
1211 headers.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST"); 1198 headers.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST");
1212 headers.SetHeader("status", "200"); 1199 headers.SetHeader("status", "200");
1213 headers.SetHeader("version", "HTTP/1.1"); 1200 headers.SetHeader("version", "HTTP/1.1");
1214 headers.SetHeader("content-type", "text/html"); 1201 headers.SetHeader("content-type", "text/html");
1215 headers.SetHeader("content-length", "12"); 1202 headers.SetHeader("content-length", "12");
1216 headers.SetHeader("x-empty-header", ""); 1203 headers.SetHeader("x-empty-header", "");
1217 1204
1218 SpdyFramer framer; 1205 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1219 framer.set_enable_compression(true);
1220 SpdySerializedFrame frame1( 1206 SpdySerializedFrame frame1(
1221 SpdyFramerPeer::SerializeHeaders(&framer, headers)); 1207 SpdyFramerPeer::SerializeHeaders(&framer, headers));
1222 } 1208 }
1223 1209
1224 TEST_P(SpdyFramerTest, Basic) { 1210 TEST_P(SpdyFramerTest, Basic) {
1225 // Send HEADERS frames with PRIORITY and END_HEADERS set. 1211 // Send HEADERS frames with PRIORITY and END_HEADERS set.
1226 // frame-format off 1212 // frame-format off
1227 const unsigned char kH2Input[] = { 1213 const unsigned char kH2Input[] = {
1228 0x00, 0x00, 0x05, // Length: 5 1214 0x00, 0x00, 0x05, // Length: 5
1229 0x01, // Type: HEADERS 1215 0x01, // Type: HEADERS
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 0x00, 0x00, 0x00, 0x03, // Stream: 3 1264 0x00, 0x00, 0x00, 0x03, // Stream: 3
1279 1265
1280 0x00, 0x00, 0x04, // Length: 4 1266 0x00, 0x00, 0x04, // Length: 4
1281 0x03, // Type: RST_STREAM 1267 0x03, // Type: RST_STREAM
1282 0x00, // Flags: none 1268 0x00, // Flags: none
1283 0x00, 0x00, 0x00, 0x03, // Stream: 3 1269 0x00, 0x00, 0x00, 0x03, // Stream: 3
1284 0x00, 0x00, 0x00, 0x08, // Error: CANCEL 1270 0x00, 0x00, 0x00, 0x08, // Error: CANCEL
1285 }; 1271 };
1286 // frame-format on 1272 // frame-format on
1287 1273
1288 TestSpdyVisitor visitor; 1274 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
1289 visitor.SimulateInFramer(kH2Input, sizeof(kH2Input)); 1275 visitor.SimulateInFramer(kH2Input, sizeof(kH2Input));
1290 1276
1291 EXPECT_EQ(24, visitor.data_bytes_); 1277 EXPECT_EQ(24, visitor.data_bytes_);
1292 EXPECT_EQ(0, visitor.error_count_); 1278 EXPECT_EQ(0, visitor.error_count_);
1293 EXPECT_EQ(2, visitor.fin_frame_count_); 1279 EXPECT_EQ(2, visitor.fin_frame_count_);
1294 1280
1295 EXPECT_EQ(3, visitor.headers_frame_count_); 1281 EXPECT_EQ(3, visitor.headers_frame_count_);
1296 EXPECT_TRUE(visitor.fin_opaque_data_.empty()); 1282 EXPECT_TRUE(visitor.fin_opaque_data_.empty());
1297 1283
1298 EXPECT_EQ(0, visitor.fin_flag_count_); 1284 EXPECT_EQ(0, visitor.fin_flag_count_);
(...skipping 29 matching lines...) Expand all
1328 0xde, 0xad, 0xbe, 0xef, // 1314 0xde, 0xad, 0xbe, 0xef, //
1329 1315
1330 0x00, 0x00, 0x04, // Length: 4 1316 0x00, 0x00, 0x04, // Length: 4
1331 0x00, // Type: DATA 1317 0x00, // Type: DATA
1332 0x01, // Flags: END_STREAM 1318 0x01, // Flags: END_STREAM
1333 0x00, 0x00, 0x00, 0x01, // Stream: 1 1319 0x00, 0x00, 0x00, 0x01, // Stream: 1
1334 0xde, 0xad, 0xbe, 0xef, // Payload 1320 0xde, 0xad, 0xbe, 0xef, // Payload
1335 }; 1321 };
1336 // frame-format on 1322 // frame-format on
1337 1323
1338 TestSpdyVisitor visitor; 1324 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
1339 visitor.SimulateInFramer(kH2Input, sizeof(kH2Input)); 1325 visitor.SimulateInFramer(kH2Input, sizeof(kH2Input));
1340 1326
1341 EXPECT_EQ(0, visitor.error_count_); 1327 EXPECT_EQ(0, visitor.error_count_);
1342 EXPECT_EQ(2, visitor.headers_frame_count_); 1328 EXPECT_EQ(2, visitor.headers_frame_count_);
1343 EXPECT_EQ(16, visitor.data_bytes_); 1329 EXPECT_EQ(16, visitor.data_bytes_);
1344 EXPECT_EQ(0, visitor.fin_frame_count_); 1330 EXPECT_EQ(0, visitor.fin_frame_count_);
1345 EXPECT_EQ(0, visitor.fin_flag_count_); 1331 EXPECT_EQ(0, visitor.fin_flag_count_);
1346 EXPECT_EQ(1, visitor.end_of_stream_count_); 1332 EXPECT_EQ(1, visitor.end_of_stream_count_);
1347 EXPECT_EQ(2, visitor.data_frame_count_); 1333 EXPECT_EQ(2, visitor.data_frame_count_);
1348 } 1334 }
(...skipping 10 matching lines...) Expand all
1359 0x82, // Weight: 131 1345 0x82, // Weight: 131
1360 1346
1361 0x00, 0x00, 0x01, // Length: 1 1347 0x00, 0x00, 0x01, // Length: 1
1362 0x01, // Type: HEADERS 1348 0x01, // Type: HEADERS
1363 0x05, // Flags: END_STREAM|END_HEADERS 1349 0x05, // Flags: END_STREAM|END_HEADERS
1364 0x00, 0x00, 0x00, 0x01, // Stream: 1 1350 0x00, 0x00, 0x00, 0x01, // Stream: 1
1365 0x8c, // :status: 200 1351 0x8c, // :status: 200
1366 }; 1352 };
1367 // frame-format on 1353 // frame-format on
1368 1354
1369 TestSpdyVisitor visitor; 1355 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
1370 visitor.SimulateInFramer(kH2Input, sizeof(kH2Input)); 1356 visitor.SimulateInFramer(kH2Input, sizeof(kH2Input));
1371 1357
1372 EXPECT_EQ(0, visitor.error_count_); 1358 EXPECT_EQ(0, visitor.error_count_);
1373 EXPECT_EQ(2, visitor.headers_frame_count_); 1359 EXPECT_EQ(2, visitor.headers_frame_count_);
1374 EXPECT_EQ(0, visitor.data_bytes_); 1360 EXPECT_EQ(0, visitor.data_bytes_);
1375 EXPECT_EQ(0, visitor.fin_frame_count_); 1361 EXPECT_EQ(0, visitor.fin_frame_count_);
1376 EXPECT_EQ(1, visitor.fin_flag_count_); 1362 EXPECT_EQ(1, visitor.fin_flag_count_);
1377 EXPECT_EQ(1, visitor.end_of_stream_count_); 1363 EXPECT_EQ(1, visitor.end_of_stream_count_);
1378 EXPECT_EQ(0, visitor.data_frame_count_); 1364 EXPECT_EQ(0, visitor.data_frame_count_);
1379 } 1365 }
1380 1366
1381 // Verify we can decompress the stream even if handed over to the 1367 // Verify we can decompress the stream even if handed over to the
1382 // framer 1 byte at a time. 1368 // framer 1 byte at a time.
1383 TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) { 1369 TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) {
1384 SpdyFramer framer; 1370 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1385
1386 framer.set_enable_compression(true);
1387 1371
1388 const char kHeader1[] = "header1"; 1372 const char kHeader1[] = "header1";
1389 const char kHeader2[] = "header2"; 1373 const char kHeader2[] = "header2";
1390 const char kValue1[] = "value1"; 1374 const char kValue1[] = "value1";
1391 const char kValue2[] = "value2"; 1375 const char kValue2[] = "value2";
1392 1376
1393 SpdyHeadersIR headers(1); 1377 SpdyHeadersIR headers(1);
1394 headers.SetHeader(kHeader1, kValue1); 1378 headers.SetHeader(kHeader1, kValue1);
1395 headers.SetHeader(kHeader2, kValue2); 1379 headers.SetHeader(kHeader2, kValue2);
1396 SpdySerializedFrame headers_frame( 1380 SpdySerializedFrame headers_frame(
1397 SpdyFramerPeer::SerializeHeaders(&framer, headers)); 1381 SpdyFramerPeer::SerializeHeaders(&framer, headers));
1398 1382
1399 const char bytes[] = "this is a test test test test test!"; 1383 const char bytes[] = "this is a test test test test test!";
1400 SpdyDataIR data_ir(1, StringPiece(bytes, arraysize(bytes))); 1384 SpdyDataIR data_ir(1, StringPiece(bytes, arraysize(bytes)));
1401 data_ir.set_fin(true); 1385 data_ir.set_fin(true);
1402 SpdySerializedFrame send_frame(framer.SerializeData(data_ir)); 1386 SpdySerializedFrame send_frame(framer.SerializeData(data_ir));
1403 1387
1404 // Run the inputs through the framer. 1388 // Run the inputs through the framer.
1405 TestSpdyVisitor visitor; 1389 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION);
1406 visitor.use_compression_ = true;
1407 const unsigned char* data; 1390 const unsigned char* data;
1408 data = reinterpret_cast<const unsigned char*>(headers_frame.data()); 1391 data = reinterpret_cast<const unsigned char*>(headers_frame.data());
1409 for (size_t idx = 0; idx < headers_frame.size(); ++idx) { 1392 for (size_t idx = 0; idx < headers_frame.size(); ++idx) {
1410 visitor.SimulateInFramer(data + idx, 1); 1393 visitor.SimulateInFramer(data + idx, 1);
1411 ASSERT_EQ(0, visitor.error_count_); 1394 ASSERT_EQ(0, visitor.error_count_);
1412 } 1395 }
1413 data = reinterpret_cast<const unsigned char*>(send_frame.data()); 1396 data = reinterpret_cast<const unsigned char*>(send_frame.data());
1414 for (size_t idx = 0; idx < send_frame.size(); ++idx) { 1397 for (size_t idx = 0; idx < send_frame.size(); ++idx) {
1415 visitor.SimulateInFramer(data + idx, 1); 1398 visitor.SimulateInFramer(data + idx, 1);
1416 ASSERT_EQ(0, visitor.error_count_); 1399 ASSERT_EQ(0, visitor.error_count_);
1417 } 1400 }
1418 1401
1419 EXPECT_EQ(0, visitor.error_count_); 1402 EXPECT_EQ(0, visitor.error_count_);
1420 EXPECT_EQ(1, visitor.headers_frame_count_); 1403 EXPECT_EQ(1, visitor.headers_frame_count_);
1421 EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_)); 1404 EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_));
1422 EXPECT_EQ(0, visitor.fin_frame_count_); 1405 EXPECT_EQ(0, visitor.fin_frame_count_);
1423 EXPECT_EQ(0, visitor.fin_flag_count_); 1406 EXPECT_EQ(0, visitor.fin_flag_count_);
1424 EXPECT_EQ(1, visitor.end_of_stream_count_); 1407 EXPECT_EQ(1, visitor.end_of_stream_count_);
1425 EXPECT_EQ(1, visitor.data_frame_count_); 1408 EXPECT_EQ(1, visitor.data_frame_count_);
1426 } 1409 }
1427 1410
1428 TEST_P(SpdyFramerTest, WindowUpdateFrame) { 1411 TEST_P(SpdyFramerTest, WindowUpdateFrame) {
1429 SpdyFramer framer; 1412 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1430 SpdySerializedFrame frame( 1413 SpdySerializedFrame frame(
1431 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x12345678))); 1414 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x12345678)));
1432 1415
1433 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; 1416 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678";
1434 const unsigned char kH2FrameData[] = { 1417 const unsigned char kH2FrameData[] = {
1435 0x00, 0x00, 0x04, // Length: 4 1418 0x00, 0x00, 0x04, // Length: 4
1436 0x08, // Type: WINDOW_UPDATE 1419 0x08, // Type: WINDOW_UPDATE
1437 0x00, // Flags: none 1420 0x00, // Flags: none
1438 0x00, 0x00, 0x00, 0x01, // Stream: 1 1421 0x00, 0x00, 0x00, 0x01, // Stream: 1
1439 0x12, 0x34, 0x56, 0x78, // Increment: 305419896 1422 0x12, 0x34, 0x56, 0x78, // Increment: 305419896
1440 }; 1423 };
1441 1424
1442 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); 1425 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1443 } 1426 }
1444 1427
1445 TEST_P(SpdyFramerTest, CreateDataFrame) { 1428 TEST_P(SpdyFramerTest, CreateDataFrame) {
1446 SpdyFramer framer; 1429 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1447 1430
1448 { 1431 {
1449 const char kDescription[] = "'hello' data frame, no FIN"; 1432 const char kDescription[] = "'hello' data frame, no FIN";
1450 // frame-format off 1433 // frame-format off
1451 const unsigned char kH2FrameData[] = { 1434 const unsigned char kH2FrameData[] = {
1452 0x00, 0x00, 0x05, // Length: 5 1435 0x00, 0x00, 0x05, // Length: 5
1453 0x00, // Type: DATA 1436 0x00, // Type: DATA
1454 0x00, // Flags: none 1437 0x00, // Flags: none
1455 0x00, 0x00, 0x00, 0x01, // Stream: 1 1438 0x00, 0x00, 0x00, 0x01, // Stream: 1
1456 'h', 'e', 'l', 'l', // Payload 1439 'h', 'e', 'l', 'l', // Payload
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 0x6f, // 1621 0x6f, //
1639 }; 1622 };
1640 SpdyDataIR data_ir(0x7fffffff, "hello"); 1623 SpdyDataIR data_ir(0x7fffffff, "hello");
1641 data_ir.set_fin(true); 1624 data_ir.set_fin(true);
1642 SpdySerializedFrame frame(framer.SerializeData(data_ir)); 1625 SpdySerializedFrame frame(framer.SerializeData(data_ir));
1643 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); 1626 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1644 } 1627 }
1645 } 1628 }
1646 1629
1647 TEST_P(SpdyFramerTest, CreateRstStream) { 1630 TEST_P(SpdyFramerTest, CreateRstStream) {
1648 SpdyFramer framer; 1631 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1649 1632
1650 { 1633 {
1651 const char kDescription[] = "RST_STREAM frame"; 1634 const char kDescription[] = "RST_STREAM frame";
1652 const unsigned char kH2FrameData[] = { 1635 const unsigned char kH2FrameData[] = {
1653 0x00, 0x00, 0x04, // Length: 4 1636 0x00, 0x00, 0x04, // Length: 4
1654 0x03, // Type: RST_STREAM 1637 0x03, // Type: RST_STREAM
1655 0x00, // Flags: none 1638 0x00, // Flags: none
1656 0x00, 0x00, 0x00, 0x01, // Stream: 1 1639 0x00, 0x00, 0x00, 0x01, // Stream: 1
1657 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR 1640 0x00, 0x00, 0x00, 0x01, // Error: PROTOCOL_ERROR
1658 }; 1641 };
(...skipping 25 matching lines...) Expand all
1684 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff 1667 0x7f, 0xff, 0xff, 0xff, // Stream: 0x7fffffff
1685 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR 1668 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR
1686 }; 1669 };
1687 SpdyRstStreamIR rst_stream(0x7FFFFFFF, RST_STREAM_INTERNAL_ERROR); 1670 SpdyRstStreamIR rst_stream(0x7FFFFFFF, RST_STREAM_INTERNAL_ERROR);
1688 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); 1671 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream));
1689 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); 1672 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1690 } 1673 }
1691 } 1674 }
1692 1675
1693 TEST_P(SpdyFramerTest, CreateSettings) { 1676 TEST_P(SpdyFramerTest, CreateSettings) {
1694 SpdyFramer framer; 1677 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1695 1678
1696 { 1679 {
1697 const char kDescription[] = "Network byte order SETTINGS frame"; 1680 const char kDescription[] = "Network byte order SETTINGS frame";
1698 1681
1699 const unsigned char kH2FrameData[] = { 1682 const unsigned char kH2FrameData[] = {
1700 0x00, 0x00, 0x06, // Length: 6 1683 0x00, 0x00, 0x06, // Length: 6
1701 0x04, // Type: SETTINGS 1684 0x04, // Type: SETTINGS
1702 0x00, // Flags: none 1685 0x00, // Flags: none
1703 0x00, 0x00, 0x00, 0x00, // Stream: 0 1686 0x00, 0x00, 0x00, 0x00, // Stream: 0
1704 0x00, 0x04, // Param: INITIAL_WINDOW_SIZE 1687 0x00, 0x04, // Param: INITIAL_WINDOW_SIZE
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1768 0x00, // Flags: none 1751 0x00, // Flags: none
1769 0x00, 0x00, 0x00, 0x00, // Stream: 0 1752 0x00, 0x00, 0x00, 0x00, // Stream: 0
1770 }; 1753 };
1771 SpdySettingsIR settings_ir; 1754 SpdySettingsIR settings_ir;
1772 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); 1755 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir));
1773 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); 1756 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1774 } 1757 }
1775 } 1758 }
1776 1759
1777 TEST_P(SpdyFramerTest, CreatePingFrame) { 1760 TEST_P(SpdyFramerTest, CreatePingFrame) {
1778 SpdyFramer framer; 1761 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1779 1762
1780 { 1763 {
1781 const char kDescription[] = "PING frame"; 1764 const char kDescription[] = "PING frame";
1782 const unsigned char kH2FrameData[] = { 1765 const unsigned char kH2FrameData[] = {
1783 0x00, 0x00, 0x08, // Length: 8 1766 0x00, 0x00, 0x08, // Length: 8
1784 0x06, // Type: PING 1767 0x06, // Type: PING
1785 0x00, // Flags: none 1768 0x00, // Flags: none
1786 0x00, 0x00, 0x00, 0x00, // Stream: 0 1769 0x00, 0x00, 0x00, 0x00, // Stream: 0
1787 0x12, 0x34, 0x56, 0x78, // Opaque 1770 0x12, 0x34, 0x56, 0x78, // Opaque
1788 0x9a, 0xbc, 0xde, 0xff, // Data 1771 0x9a, 0xbc, 0xde, 0xff, // Data
(...skipping 16 matching lines...) Expand all
1805 1788
1806 // Tests SpdyPingIR when the ping is an ack. 1789 // Tests SpdyPingIR when the ping is an ack.
1807 ping_ir.set_is_ack(true); 1790 ping_ir.set_is_ack(true);
1808 frame = framer.SerializePing(ping_ir); 1791 frame = framer.SerializePing(ping_ir);
1809 CompareFrame(kDescription, frame, kH2FrameDataWithAck, 1792 CompareFrame(kDescription, frame, kH2FrameDataWithAck,
1810 arraysize(kH2FrameDataWithAck)); 1793 arraysize(kH2FrameDataWithAck));
1811 } 1794 }
1812 } 1795 }
1813 1796
1814 TEST_P(SpdyFramerTest, CreateGoAway) { 1797 TEST_P(SpdyFramerTest, CreateGoAway) {
1815 SpdyFramer framer; 1798 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
1816 1799
1817 { 1800 {
1818 const char kDescription[] = "GOAWAY frame"; 1801 const char kDescription[] = "GOAWAY frame";
1819 const unsigned char kH2FrameData[] = { 1802 const unsigned char kH2FrameData[] = {
1820 0x00, 0x00, 0x0a, // Length: 10 1803 0x00, 0x00, 0x0a, // Length: 10
1821 0x07, // Type: GOAWAY 1804 0x07, // Type: GOAWAY
1822 0x00, // Flags: none 1805 0x00, // Flags: none
1823 0x00, 0x00, 0x00, 0x00, // Stream: 0 1806 0x00, 0x00, 0x00, 0x00, // Stream: 0
1824 0x00, 0x00, 0x00, 0x00, // Last: 0 1807 0x00, 0x00, 0x00, 0x00, // Last: 0
1825 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR 1808 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR
(...skipping 15 matching lines...) Expand all
1841 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR 1824 0x00, 0x00, 0x00, 0x02, // Error: INTERNAL_ERROR
1842 0x47, 0x41, // Description 1825 0x47, 0x41, // Description
1843 }; 1826 };
1844 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); 1827 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA");
1845 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); 1828 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir));
1846 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); 1829 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
1847 } 1830 }
1848 } 1831 }
1849 1832
1850 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { 1833 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) {
1851 SpdyFramer framer; 1834 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
1852 framer.set_enable_compression(false);
1853 1835
1854 { 1836 {
1855 const char kDescription[] = "HEADERS frame, no FIN"; 1837 const char kDescription[] = "HEADERS frame, no FIN";
1856 // frame-format off 1838 // frame-format off
1857 const unsigned char kH2FrameData[] = { 1839 const unsigned char kH2FrameData[] = {
1858 0x00, 0x00, 0x12, // Length: 18 1840 0x00, 0x00, 0x12, // Length: 18
1859 0x01, // Type: HEADERS 1841 0x01, // Type: HEADERS
1860 0x04, // Flags: END_HEADERS 1842 0x04, // Flags: END_HEADERS
1861 0x00, 0x00, 0x00, 0x01, // Stream: 1 1843 0x00, 0x00, 0x00, 0x01, // Stream: 1
1862 1844
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
2093 SpdySerializedFrame frame( 2075 SpdySerializedFrame frame(
2094 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); 2076 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir));
2095 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); 2077 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2096 } 2078 }
2097 } 2079 }
2098 2080
2099 // TODO(phajdan.jr): Clean up after we no longer need 2081 // TODO(phajdan.jr): Clean up after we no longer need
2100 // to workaround http://crbug.com/139744. 2082 // to workaround http://crbug.com/139744.
2101 #if !defined(USE_SYSTEM_ZLIB) 2083 #if !defined(USE_SYSTEM_ZLIB)
2102 TEST_P(SpdyFramerTest, CreateHeadersCompressed) { 2084 TEST_P(SpdyFramerTest, CreateHeadersCompressed) {
2103 SpdyFramer framer; 2085 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2104 framer.set_enable_compression(true);
2105 2086
2106 { 2087 {
2107 SpdyHeadersIR headers_ir(1); 2088 SpdyHeadersIR headers_ir(1);
2108 headers_ir.SetHeader("bar", "foo"); 2089 headers_ir.SetHeader("bar", "foo");
2109 headers_ir.SetHeader("foo", "bar"); 2090 headers_ir.SetHeader("foo", "bar");
2110 SpdySerializedFrame frame( 2091 SpdySerializedFrame frame(
2111 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); 2092 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir));
2112 // Deflate compression doesn't apply to HPACK. 2093 // Deflate compression doesn't apply to HPACK.
2113 } 2094 }
2114 } 2095 }
2115 #endif // !defined(USE_SYSTEM_ZLIB) 2096 #endif // !defined(USE_SYSTEM_ZLIB)
2116 2097
2117 TEST_P(SpdyFramerTest, CreateWindowUpdate) { 2098 TEST_P(SpdyFramerTest, CreateWindowUpdate) {
2118 SpdyFramer framer; 2099 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2119 2100
2120 { 2101 {
2121 const char kDescription[] = "WINDOW_UPDATE frame"; 2102 const char kDescription[] = "WINDOW_UPDATE frame";
2122 const unsigned char kH2FrameData[] = { 2103 const unsigned char kH2FrameData[] = {
2123 0x00, 0x00, 0x04, // Length: 4 2104 0x00, 0x00, 0x04, // Length: 4
2124 0x08, // Type: WINDOW_UPDATE 2105 0x08, // Type: WINDOW_UPDATE
2125 0x00, // Flags: none 2106 0x00, // Flags: none
2126 0x00, 0x00, 0x00, 0x01, // Stream: 1 2107 0x00, 0x00, 0x00, 0x01, // Stream: 1
2127 0x00, 0x00, 0x00, 0x01, // Increment: 1 2108 0x00, 0x00, 0x00, 0x01, // Increment: 1
2128 }; 2109 };
(...skipping 25 matching lines...) Expand all
2154 0x00, 0x00, 0x00, 0x01, // Stream: 1 2135 0x00, 0x00, 0x00, 0x01, // Stream: 1
2155 0x7f, 0xff, 0xff, 0xff, // Increment: 0x7fffffff 2136 0x7f, 0xff, 0xff, 0xff, // Increment: 0x7fffffff
2156 }; 2137 };
2157 SpdySerializedFrame frame( 2138 SpdySerializedFrame frame(
2158 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x7FFFFFFF))); 2139 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x7FFFFFFF)));
2159 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); 2140 CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData));
2160 } 2141 }
2161 } 2142 }
2162 2143
2163 TEST_P(SpdyFramerTest, SerializeBlocked) { 2144 TEST_P(SpdyFramerTest, SerializeBlocked) {
2164 SpdyFramer framer; 2145 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2165 2146
2166 const char kDescription[] = "BLOCKED frame"; 2147 const char kDescription[] = "BLOCKED frame";
2167 const unsigned char kType = 2148 const unsigned char kType =
2168 static_cast<unsigned char>(SpdyConstants::SerializeFrameType(BLOCKED)); 2149 static_cast<unsigned char>(SpdyConstants::SerializeFrameType(BLOCKED));
2169 const unsigned char kFrameData[] = { 2150 const unsigned char kFrameData[] = {
2170 0x00, 0x00, 0x00, // Length: 0 2151 0x00, 0x00, 0x00, // Length: 0
2171 kType, // Type: BLOCKED 2152 kType, // Type: BLOCKED
2172 0x00, // Flags: none 2153 0x00, // Flags: none
2173 0x00, 0x00, 0x00, 0x00, // Stream: 0 2154 0x00, 0x00, 0x00, 0x00, // Stream: 0
2174 }; 2155 };
2175 SpdyBlockedIR blocked_ir(0); 2156 SpdyBlockedIR blocked_ir(0);
2176 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir)); 2157 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir));
2177 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); 2158 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2178 } 2159 }
2179 2160
2180 TEST_P(SpdyFramerTest, CreateBlocked) { 2161 TEST_P(SpdyFramerTest, CreateBlocked) {
2181 SpdyFramer framer; 2162 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2182 2163
2183 const char kDescription[] = "BLOCKED frame"; 2164 const char kDescription[] = "BLOCKED frame";
2184 const SpdyStreamId kStreamId = 3; 2165 const SpdyStreamId kStreamId = 3;
2185 2166
2186 SpdySerializedFrame frame_serialized( 2167 SpdySerializedFrame frame_serialized(
2187 framer.SerializeBlocked(SpdyBlockedIR(kStreamId))); 2168 framer.SerializeBlocked(SpdyBlockedIR(kStreamId)));
2188 SpdyBlockedIR blocked_ir(kStreamId); 2169 SpdyBlockedIR blocked_ir(kStreamId);
2189 SpdySerializedFrame frame_created(framer.SerializeFrame(blocked_ir)); 2170 SpdySerializedFrame frame_created(framer.SerializeFrame(blocked_ir));
2190 2171
2191 CompareFrames(kDescription, frame_serialized, frame_created); 2172 CompareFrames(kDescription, frame_serialized, frame_created);
2192 } 2173 }
2193 2174
2194 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { 2175 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) {
2195 { 2176 {
2196 // Test framing PUSH_PROMISE without padding. 2177 // Test framing PUSH_PROMISE without padding.
2197 SpdyFramer framer; 2178 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
2198 framer.set_enable_compression(false);
2199 const char kDescription[] = "PUSH_PROMISE frame without padding"; 2179 const char kDescription[] = "PUSH_PROMISE frame without padding";
2200 2180
2201 // frame-format off 2181 // frame-format off
2202 const unsigned char kFrameData[] = { 2182 const unsigned char kFrameData[] = {
2203 0x00, 0x00, 0x16, // Length: 22 2183 0x00, 0x00, 0x16, // Length: 22
2204 0x05, // Type: PUSH_PROMISE 2184 0x05, // Type: PUSH_PROMISE
2205 0x04, // Flags: END_HEADERS 2185 0x04, // Flags: END_HEADERS
2206 0x00, 0x00, 0x00, 0x29, // Stream: 41 2186 0x00, 0x00, 0x00, 0x29, // Stream: 41
2207 0x00, 0x00, 0x00, 0x3a, // Promise: 58 2187 0x00, 0x00, 0x00, 0x3a, // Promise: 58
2208 2188
(...skipping 13 matching lines...) Expand all
2222 2202
2223 SpdyPushPromiseIR push_promise(41, 58); 2203 SpdyPushPromiseIR push_promise(41, 58);
2224 push_promise.SetHeader("bar", "foo"); 2204 push_promise.SetHeader("bar", "foo");
2225 push_promise.SetHeader("foo", "bar"); 2205 push_promise.SetHeader("foo", "bar");
2226 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); 2206 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
2227 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); 2207 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2228 } 2208 }
2229 2209
2230 { 2210 {
2231 // Test framing PUSH_PROMISE with one byte of padding. 2211 // Test framing PUSH_PROMISE with one byte of padding.
2232 SpdyFramer framer; 2212 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
2233 framer.set_enable_compression(false);
2234 const char kDescription[] = "PUSH_PROMISE frame with one byte of padding"; 2213 const char kDescription[] = "PUSH_PROMISE frame with one byte of padding";
2235 2214
2236 // frame-format off 2215 // frame-format off
2237 const unsigned char kFrameData[] = { 2216 const unsigned char kFrameData[] = {
2238 0x00, 0x00, 0x17, // Length: 23 2217 0x00, 0x00, 0x17, // Length: 23
2239 0x05, // Type: PUSH_PROMISE 2218 0x05, // Type: PUSH_PROMISE
2240 0x0c, // Flags: END_HEADERS|PADDED 2219 0x0c, // Flags: END_HEADERS|PADDED
2241 0x00, 0x00, 0x00, 0x29, // Stream: 41 2220 0x00, 0x00, 0x00, 0x29, // Stream: 41
2242 0x00, // PadLen: 0 trailing bytes 2221 0x00, // PadLen: 0 trailing bytes
2243 0x00, 0x00, 0x00, 0x3a, // Promise: 58 2222 0x00, 0x00, 0x00, 0x3a, // Promise: 58
(...skipping 15 matching lines...) Expand all
2259 SpdyPushPromiseIR push_promise(41, 58); 2238 SpdyPushPromiseIR push_promise(41, 58);
2260 push_promise.set_padding_len(1); 2239 push_promise.set_padding_len(1);
2261 push_promise.SetHeader("bar", "foo"); 2240 push_promise.SetHeader("bar", "foo");
2262 push_promise.SetHeader("foo", "bar"); 2241 push_promise.SetHeader("foo", "bar");
2263 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); 2242 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
2264 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); 2243 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2265 } 2244 }
2266 2245
2267 { 2246 {
2268 // Test framing PUSH_PROMISE with 177 bytes of padding. 2247 // Test framing PUSH_PROMISE with 177 bytes of padding.
2269 SpdyFramer framer; 2248 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
2270 framer.set_enable_compression(false);
2271 const char kDescription[] = "PUSH_PROMISE frame with 177 bytes of padding"; 2249 const char kDescription[] = "PUSH_PROMISE frame with 177 bytes of padding";
2272 2250
2273 // frame-format off 2251 // frame-format off
2274 // clang-format off 2252 // clang-format off
2275 const unsigned char kFrameData[] = { 2253 const unsigned char kFrameData[] = {
2276 0x00, 0x00, 0xc7, // Length: 199 2254 0x00, 0x00, 0xc7, // Length: 199
2277 0x05, // Type: PUSH_PROMISE 2255 0x05, // Type: PUSH_PROMISE
2278 0x0c, // Flags: END_HEADERS|PADDED 2256 0x0c, // Flags: END_HEADERS|PADDED
2279 0x00, 0x00, 0x00, 0x2a, // Stream: 42 2257 0x00, 0x00, 0x00, 0x2a, // Stream: 42
2280 0xb0, // PadLen: 176 trailing bytes 2258 0xb0, // PadLen: 176 trailing bytes
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2317 push_promise.set_padding_len(177); 2295 push_promise.set_padding_len(177);
2318 push_promise.SetHeader("bar", "foo"); 2296 push_promise.SetHeader("bar", "foo");
2319 push_promise.SetHeader("foo", "bar"); 2297 push_promise.SetHeader("foo", "bar");
2320 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); 2298 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
2321 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); 2299 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2322 } 2300 }
2323 } 2301 }
2324 2302
2325 // Regression test for https://crbug.com/464748. 2303 // Regression test for https://crbug.com/464748.
2326 TEST_P(SpdyFramerTest, GetNumberRequiredContinuationFrames) { 2304 TEST_P(SpdyFramerTest, GetNumberRequiredContinuationFrames) {
2327 SpdyFramer framer; 2305 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2328 EXPECT_EQ(1u, SpdyFramerPeer::GetNumberRequiredContinuationFrames( 2306 EXPECT_EQ(1u, SpdyFramerPeer::GetNumberRequiredContinuationFrames(
2329 &framer, 16383 + 16374)); 2307 &framer, 16383 + 16374));
2330 EXPECT_EQ(2u, SpdyFramerPeer::GetNumberRequiredContinuationFrames( 2308 EXPECT_EQ(2u, SpdyFramerPeer::GetNumberRequiredContinuationFrames(
2331 &framer, 16383 + 16374 + 1)); 2309 &framer, 16383 + 16374 + 1));
2332 EXPECT_EQ(2u, SpdyFramerPeer::GetNumberRequiredContinuationFrames( 2310 EXPECT_EQ(2u, SpdyFramerPeer::GetNumberRequiredContinuationFrames(
2333 &framer, 16383 + 2 * 16374)); 2311 &framer, 16383 + 2 * 16374));
2334 EXPECT_EQ(3u, SpdyFramerPeer::GetNumberRequiredContinuationFrames( 2312 EXPECT_EQ(3u, SpdyFramerPeer::GetNumberRequiredContinuationFrames(
2335 &framer, 16383 + 2 * 16374 + 1)); 2313 &framer, 16383 + 2 * 16374 + 1));
2336 } 2314 }
2337 2315
2338 TEST_P(SpdyFramerTest, CreateContinuationUncompressed) { 2316 TEST_P(SpdyFramerTest, CreateContinuationUncompressed) {
2339 SpdyFramer framer; 2317 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
2340 framer.set_enable_compression(false);
2341 const char kDescription[] = "CONTINUATION frame"; 2318 const char kDescription[] = "CONTINUATION frame";
2342 2319
2343 // frame-format off 2320 // frame-format off
2344 const unsigned char kFrameData[] = { 2321 const unsigned char kFrameData[] = {
2345 0x00, 0x00, 0x12, // Length: 18 2322 0x00, 0x00, 0x12, // Length: 18
2346 0x09, // Type: CONTINUATION 2323 0x09, // Type: CONTINUATION
2347 0x04, // Flags: END_HEADERS 2324 0x04, // Flags: END_HEADERS
2348 0x00, 0x00, 0x00, 0x2a, // Stream: 42 2325 0x00, 0x00, 0x00, 0x2a, // Stream: 42
2349 2326
2350 0x00, // Unindexed Entry 2327 0x00, // Unindexed Entry
(...skipping 22 matching lines...) Expand all
2373 continuation.set_end_headers(true); 2350 continuation.set_end_headers(true);
2374 2351
2375 SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); 2352 SpdySerializedFrame frame(framer.SerializeContinuation(continuation));
2376 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); 2353 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2377 } 2354 }
2378 2355
2379 // Test that if we send an unexpected CONTINUATION 2356 // Test that if we send an unexpected CONTINUATION
2380 // we signal an error (but don't crash). 2357 // we signal an error (but don't crash).
2381 TEST_P(SpdyFramerTest, SendUnexpectedContinuation) { 2358 TEST_P(SpdyFramerTest, SendUnexpectedContinuation) {
2382 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 2359 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
2383 SpdyFramer framer; 2360 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2384 framer.set_visitor(&visitor); 2361 framer.set_visitor(&visitor);
2385 2362
2386 // frame-format off 2363 // frame-format off
2387 char kH2FrameData[] = { 2364 char kH2FrameData[] = {
2388 0x00, 0x00, 0x12, // Length: 18 2365 0x00, 0x00, 0x12, // Length: 18
2389 0x09, // Type: CONTINUATION 2366 0x09, // Type: CONTINUATION
2390 0x04, // Flags: END_HEADERS 2367 0x04, // Flags: END_HEADERS
2391 0x00, 0x00, 0x00, 0x2a, // Stream: 42 2368 0x00, 0x00, 0x00, 0x2a, // Stream: 42
2392 2369
2393 0x00, // Unindexed Entry 2370 0x00, // Unindexed Entry
(...skipping 18 matching lines...) Expand all
2412 EXPECT_TRUE(framer.HasError()); 2389 EXPECT_TRUE(framer.HasError());
2413 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, framer.error_code()) 2390 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, framer.error_code())
2414 << SpdyFramer::ErrorCodeToString(framer.error_code()); 2391 << SpdyFramer::ErrorCodeToString(framer.error_code());
2415 } 2392 }
2416 2393
2417 TEST_P(SpdyFramerTest, CreatePushPromiseThenContinuationUncompressed) { 2394 TEST_P(SpdyFramerTest, CreatePushPromiseThenContinuationUncompressed) {
2418 { 2395 {
2419 // Test framing in a case such that a PUSH_PROMISE frame, with one byte of 2396 // Test framing in a case such that a PUSH_PROMISE frame, with one byte of
2420 // padding, cannot hold all the data payload, which is overflowed to the 2397 // padding, cannot hold all the data payload, which is overflowed to the
2421 // consecutive CONTINUATION frame. 2398 // consecutive CONTINUATION frame.
2422 SpdyFramer framer; 2399 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
2423 framer.set_enable_compression(false);
2424 const char kDescription[] = 2400 const char kDescription[] =
2425 "PUSH_PROMISE and CONTINUATION frames with one byte of padding"; 2401 "PUSH_PROMISE and CONTINUATION frames with one byte of padding";
2426 2402
2427 // frame-format off 2403 // frame-format off
2428 const unsigned char kPartialPushPromiseFrameData[] = { 2404 const unsigned char kPartialPushPromiseFrameData[] = {
2429 0x00, 0x3f, 0xf6, // Length: 16374 2405 0x00, 0x3f, 0xf6, // Length: 16374
2430 0x05, // Type: PUSH_PROMISE 2406 0x05, // Type: PUSH_PROMISE
2431 0x08, // Flags: PADDED 2407 0x08, // Flags: PADDED
2432 0x00, 0x00, 0x00, 0x2a, // Stream: 42 2408 0x00, 0x00, 0x00, 0x2a, // Stream: 42
2433 0x00, // PadLen: 0 trailing bytes 2409 0x00, // PadLen: 0 trailing bytes
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2509 2485
2510 // Compare the CONTINUATION frame against the template. 2486 // Compare the CONTINUATION frame against the template.
2511 frame_data += TestSpdyVisitor::sent_control_frame_max_size(); 2487 frame_data += TestSpdyVisitor::sent_control_frame_max_size();
2512 CompareCharArraysWithHexError( 2488 CompareCharArraysWithHexError(
2513 kDescription, frame_data, arraysize(kContinuationFrameData), 2489 kDescription, frame_data, arraysize(kContinuationFrameData),
2514 kContinuationFrameData, arraysize(kContinuationFrameData)); 2490 kContinuationFrameData, arraysize(kContinuationFrameData));
2515 } 2491 }
2516 } 2492 }
2517 2493
2518 TEST_P(SpdyFramerTest, CreateAltSvc) { 2494 TEST_P(SpdyFramerTest, CreateAltSvc) {
2519 SpdyFramer framer; 2495 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2520 2496
2521 const char kDescription[] = "ALTSVC frame"; 2497 const char kDescription[] = "ALTSVC frame";
2522 const char kType = 2498 const char kType =
2523 static_cast<unsigned char>(SpdyConstants::SerializeFrameType(ALTSVC)); 2499 static_cast<unsigned char>(SpdyConstants::SerializeFrameType(ALTSVC));
2524 const unsigned char kFrameData[] = { 2500 const unsigned char kFrameData[] = {
2525 0x00, 0x00, 0x49, kType, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 'o', 2501 0x00, 0x00, 0x49, kType, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 'o',
2526 'r', 'i', 'g', 'i', 'n', 'p', 'i', 'd', '1', '=', '"', 'h', 2502 'r', 'i', 'g', 'i', 'n', 'p', 'i', 'd', '1', '=', '"', 'h',
2527 'o', 's', 't', ':', '4', '4', '3', '"', ';', ' ', 'm', 'a', 2503 'o', 's', 't', ':', '4', '4', '3', '"', ';', ' ', 'm', 'a',
2528 '=', '5', ',', 'p', '%', '2', '2', '%', '3', 'D', 'i', '%', 2504 '=', '5', ',', 'p', '%', '2', '2', '%', '3', 'D', 'i', '%',
2529 '3', 'A', 'd', '=', '"', 'h', '_', '\\', '\\', 'o', '\\', '"', 2505 '3', 'A', 'd', '=', '"', 'h', '_', '\\', '\\', 'o', '\\', '"',
2530 's', 't', ':', '1', '2', '3', '"', ';', ' ', 'm', 'a', '=', 2506 's', 't', ':', '1', '2', '3', '"', ';', ' ', 'm', 'a', '=',
2531 '4', '2', ';', ' ', 'v', '=', '"', '2', '4', '"'}; 2507 '4', '2', ';', ' ', 'v', '=', '"', '2', '4', '"'};
2532 SpdyAltSvcIR altsvc_ir(3); 2508 SpdyAltSvcIR altsvc_ir(3);
2533 altsvc_ir.set_origin("origin"); 2509 altsvc_ir.set_origin("origin");
2534 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( 2510 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService(
2535 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); 2511 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()));
2536 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( 2512 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService(
2537 "p\"=i:d", "h_\\o\"st", 123, 42, 2513 "p\"=i:d", "h_\\o\"st", 123, 42,
2538 SpdyAltSvcWireFormat::VersionVector{24})); 2514 SpdyAltSvcWireFormat::VersionVector{24}));
2539 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); 2515 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
2540 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); 2516 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2541 } 2517 }
2542 2518
2543 TEST_P(SpdyFramerTest, CreatePriority) { 2519 TEST_P(SpdyFramerTest, CreatePriority) {
2544 SpdyFramer framer; 2520 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2545 2521
2546 const char kDescription[] = "PRIORITY frame"; 2522 const char kDescription[] = "PRIORITY frame";
2547 const unsigned char kFrameData[] = { 2523 const unsigned char kFrameData[] = {
2548 0x00, 0x00, 0x05, // Length: 5 2524 0x00, 0x00, 0x05, // Length: 5
2549 0x02, // Type: PRIORITY 2525 0x02, // Type: PRIORITY
2550 0x00, // Flags: none 2526 0x00, // Flags: none
2551 0x00, 0x00, 0x00, 0x02, // Stream: 2 2527 0x00, 0x00, 0x00, 0x02, // Stream: 2
2552 0x80, 0x00, 0x00, 0x01, // Parent: 1 (Exclusive) 2528 0x80, 0x00, 0x00, 0x01, // Parent: 1 (Exclusive)
2553 0x10, // Weight: 17 2529 0x10, // Weight: 17
2554 }; 2530 };
2555 SpdyPriorityIR priority_ir(2, 1, 17, true); 2531 SpdyPriorityIR priority_ir(2, 1, 17, true);
2556 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); 2532 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir));
2557 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); 2533 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2558 SpdyPriorityIR priority2(2); 2534 SpdyPriorityIR priority2(2);
2559 priority2.set_parent_stream_id(1); 2535 priority2.set_parent_stream_id(1);
2560 priority2.set_weight(17); 2536 priority2.set_weight(17);
2561 priority2.set_exclusive(true); 2537 priority2.set_exclusive(true);
2562 frame = framer.SerializeFrame(priority2); 2538 frame = framer.SerializeFrame(priority2);
2563 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); 2539 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData));
2564 } 2540 }
2565 2541
2566 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { 2542 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) {
2567 SpdyFramer framer; 2543 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2568 SpdyHeadersIR headers_ir(1); 2544 SpdyHeadersIR headers_ir(1);
2569 headers_ir.SetHeader("alpha", "beta"); 2545 headers_ir.SetHeader("alpha", "beta");
2570 headers_ir.SetHeader("gamma", "delta"); 2546 headers_ir.SetHeader("gamma", "delta");
2571 SpdySerializedFrame control_frame( 2547 SpdySerializedFrame control_frame(
2572 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); 2548 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir));
2573 TestSpdyVisitor visitor; 2549 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION);
2574 visitor.use_compression_ = true;
2575 visitor.SimulateInFramer( 2550 visitor.SimulateInFramer(
2576 reinterpret_cast<unsigned char*>(control_frame.data()), 2551 reinterpret_cast<unsigned char*>(control_frame.data()),
2577 control_frame.size()); 2552 control_frame.size());
2578 EXPECT_EQ(1, visitor.headers_frame_count_); 2553 EXPECT_EQ(1, visitor.headers_frame_count_);
2579 EXPECT_EQ(0, visitor.control_frame_header_data_count_); 2554 EXPECT_EQ(0, visitor.control_frame_header_data_count_);
2580 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 2555 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
2581 EXPECT_EQ(0, visitor.end_of_stream_count_); 2556 EXPECT_EQ(0, visitor.end_of_stream_count_);
2582 EXPECT_EQ(headers_ir.header_block(), visitor.headers_); 2557 EXPECT_EQ(headers_ir.header_block(), visitor.headers_);
2583 } 2558 }
2584 2559
2585 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { 2560 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) {
2586 SpdyFramer framer; 2561 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2587 SpdyHeadersIR headers_ir(1); 2562 SpdyHeadersIR headers_ir(1);
2588 headers_ir.set_fin(true); 2563 headers_ir.set_fin(true);
2589 headers_ir.SetHeader("alpha", "beta"); 2564 headers_ir.SetHeader("alpha", "beta");
2590 headers_ir.SetHeader("gamma", "delta"); 2565 headers_ir.SetHeader("gamma", "delta");
2591 SpdySerializedFrame control_frame( 2566 SpdySerializedFrame control_frame(
2592 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); 2567 SpdyFramerPeer::SerializeHeaders(&framer, headers_ir));
2593 TestSpdyVisitor visitor; 2568 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION);
2594 visitor.use_compression_ = true;
2595 visitor.SimulateInFramer( 2569 visitor.SimulateInFramer(
2596 reinterpret_cast<unsigned char*>(control_frame.data()), 2570 reinterpret_cast<unsigned char*>(control_frame.data()),
2597 control_frame.size()); 2571 control_frame.size());
2598 EXPECT_EQ(1, visitor.headers_frame_count_); 2572 EXPECT_EQ(1, visitor.headers_frame_count_);
2599 EXPECT_EQ(0, visitor.control_frame_header_data_count_); 2573 EXPECT_EQ(0, visitor.control_frame_header_data_count_);
2600 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 2574 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
2601 EXPECT_EQ(1, visitor.end_of_stream_count_); 2575 EXPECT_EQ(1, visitor.end_of_stream_count_);
2602 EXPECT_EQ(headers_ir.header_block(), visitor.headers_); 2576 EXPECT_EQ(headers_ir.header_block(), visitor.headers_);
2603 } 2577 }
2604 2578
2605 TEST_P(SpdyFramerTest, TooLargeHeadersFrameUsesContinuation) { 2579 TEST_P(SpdyFramerTest, TooLargeHeadersFrameUsesContinuation) {
2606 SpdyFramer framer; 2580 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
2607 framer.set_enable_compression(false);
2608 SpdyHeadersIR headers(1); 2581 SpdyHeadersIR headers(1);
2609 headers.set_padding_len(256); 2582 headers.set_padding_len(256);
2610 2583
2611 // Exact payload length will change with HPACK, but this should be long 2584 // Exact payload length will change with HPACK, but this should be long
2612 // enough to cause an overflow. 2585 // enough to cause an overflow.
2613 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); 2586 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size();
2614 string big_value(kBigValueSize, 'x'); 2587 string big_value(kBigValueSize, 'x');
2615 headers.SetHeader("aa", big_value); 2588 headers.SetHeader("aa", big_value);
2616 SpdySerializedFrame control_frame( 2589 SpdySerializedFrame control_frame(
2617 SpdyFramerPeer::SerializeHeaders(&framer, headers)); 2590 SpdyFramerPeer::SerializeHeaders(&framer, headers));
2618 EXPECT_GT(control_frame.size(), 2591 EXPECT_GT(control_frame.size(),
2619 TestSpdyVisitor::sent_control_frame_max_size()); 2592 TestSpdyVisitor::sent_control_frame_max_size());
2620 2593
2621 TestSpdyVisitor visitor; 2594 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2622 visitor.SimulateInFramer( 2595 visitor.SimulateInFramer(
2623 reinterpret_cast<unsigned char*>(control_frame.data()), 2596 reinterpret_cast<unsigned char*>(control_frame.data()),
2624 control_frame.size()); 2597 control_frame.size());
2625 EXPECT_TRUE(visitor.header_buffer_valid_); 2598 EXPECT_TRUE(visitor.header_buffer_valid_);
2626 EXPECT_EQ(0, visitor.error_count_); 2599 EXPECT_EQ(0, visitor.error_count_);
2627 EXPECT_EQ(1, visitor.headers_frame_count_); 2600 EXPECT_EQ(1, visitor.headers_frame_count_);
2628 EXPECT_EQ(1, visitor.continuation_count_); 2601 EXPECT_EQ(1, visitor.continuation_count_);
2629 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 2602 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
2630 } 2603 }
2631 2604
2632 TEST_P(SpdyFramerTest, MultipleContinuationFramesWithIterator) { 2605 TEST_P(SpdyFramerTest, MultipleContinuationFramesWithIterator) {
2633 SpdyFramer framer; 2606 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
2634 framer.set_enable_compression(false);
2635 auto headers = base::MakeUnique<SpdyHeadersIR>(1); 2607 auto headers = base::MakeUnique<SpdyHeadersIR>(1);
2636 headers->set_padding_len(256); 2608 headers->set_padding_len(256);
2637 2609
2638 // Exact payload length will change with HPACK, but this should be long 2610 // Exact payload length will change with HPACK, but this should be long
2639 // enough to cause an overflow. 2611 // enough to cause an overflow.
2640 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); 2612 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size();
2641 string big_valuex(kBigValueSize, 'x'); 2613 string big_valuex(kBigValueSize, 'x');
2642 headers->SetHeader("aa", big_valuex); 2614 headers->SetHeader("aa", big_valuex);
2643 string big_valuez(kBigValueSize, 'z'); 2615 string big_valuez(kBigValueSize, 'z');
2644 headers->SetHeader("bb", big_valuez); 2616 headers->SetHeader("bb", big_valuez);
2645 2617
2646 SpdyFramer::SpdyHeaderFrameIterator frame_it(&framer, std::move(headers)); 2618 SpdyFramer::SpdyHeaderFrameIterator frame_it(&framer, std::move(headers));
2647 2619
2648 EXPECT_TRUE(frame_it.HasNextFrame()); 2620 EXPECT_TRUE(frame_it.HasNextFrame());
2649 SpdySerializedFrame headers_frame(frame_it.NextFrame()); 2621 SpdySerializedFrame headers_frame(frame_it.NextFrame());
2650 EXPECT_EQ(headers_frame.size(), 2622 EXPECT_EQ(headers_frame.size(),
2651 TestSpdyVisitor::sent_control_frame_max_size()); 2623 TestSpdyVisitor::sent_control_frame_max_size());
2652 2624
2653 TestSpdyVisitor visitor; 2625 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2654 visitor.SimulateInFramer( 2626 visitor.SimulateInFramer(
2655 reinterpret_cast<unsigned char*>(headers_frame.data()), 2627 reinterpret_cast<unsigned char*>(headers_frame.data()),
2656 headers_frame.size()); 2628 headers_frame.size());
2657 EXPECT_TRUE(visitor.header_buffer_valid_); 2629 EXPECT_TRUE(visitor.header_buffer_valid_);
2658 EXPECT_EQ(0, visitor.error_count_); 2630 EXPECT_EQ(0, visitor.error_count_);
2659 EXPECT_EQ(1, visitor.headers_frame_count_); 2631 EXPECT_EQ(1, visitor.headers_frame_count_);
2660 EXPECT_EQ(0, visitor.continuation_count_); 2632 EXPECT_EQ(0, visitor.continuation_count_);
2661 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 2633 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
2662 2634
2663 EXPECT_TRUE(frame_it.HasNextFrame()); 2635 EXPECT_TRUE(frame_it.HasNextFrame());
(...skipping 21 matching lines...) Expand all
2685 EXPECT_TRUE(visitor.header_buffer_valid_); 2657 EXPECT_TRUE(visitor.header_buffer_valid_);
2686 EXPECT_EQ(0, visitor.error_count_); 2658 EXPECT_EQ(0, visitor.error_count_);
2687 EXPECT_EQ(1, visitor.headers_frame_count_); 2659 EXPECT_EQ(1, visitor.headers_frame_count_);
2688 EXPECT_EQ(2, visitor.continuation_count_); 2660 EXPECT_EQ(2, visitor.continuation_count_);
2689 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 2661 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
2690 2662
2691 EXPECT_FALSE(frame_it.HasNextFrame()); 2663 EXPECT_FALSE(frame_it.HasNextFrame());
2692 } 2664 }
2693 2665
2694 TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) { 2666 TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) {
2695 SpdyFramer framer; 2667 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
2696 framer.set_enable_compression(false);
2697 SpdyPushPromiseIR push_promise(1, 2); 2668 SpdyPushPromiseIR push_promise(1, 2);
2698 push_promise.set_padding_len(256); 2669 push_promise.set_padding_len(256);
2699 2670
2700 // Exact payload length will change with HPACK, but this should be long 2671 // Exact payload length will change with HPACK, but this should be long
2701 // enough to cause an overflow. 2672 // enough to cause an overflow.
2702 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); 2673 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size();
2703 string big_value(kBigValueSize, 'x'); 2674 string big_value(kBigValueSize, 'x');
2704 push_promise.SetHeader("aa", big_value); 2675 push_promise.SetHeader("aa", big_value);
2705 SpdySerializedFrame control_frame(framer.SerializePushPromise(push_promise)); 2676 SpdySerializedFrame control_frame(framer.SerializePushPromise(push_promise));
2706 EXPECT_GT(control_frame.size(), 2677 EXPECT_GT(control_frame.size(),
2707 TestSpdyVisitor::sent_control_frame_max_size()); 2678 TestSpdyVisitor::sent_control_frame_max_size());
2708 2679
2709 TestSpdyVisitor visitor; 2680 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2710 visitor.SimulateInFramer( 2681 visitor.SimulateInFramer(
2711 reinterpret_cast<unsigned char*>(control_frame.data()), 2682 reinterpret_cast<unsigned char*>(control_frame.data()),
2712 control_frame.size()); 2683 control_frame.size());
2713 EXPECT_TRUE(visitor.header_buffer_valid_); 2684 EXPECT_TRUE(visitor.header_buffer_valid_);
2714 EXPECT_EQ(0, visitor.error_count_); 2685 EXPECT_EQ(0, visitor.error_count_);
2715 EXPECT_EQ(1, visitor.push_promise_frame_count_); 2686 EXPECT_EQ(1, visitor.push_promise_frame_count_);
2716 EXPECT_EQ(1, visitor.continuation_count_); 2687 EXPECT_EQ(1, visitor.continuation_count_);
2717 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 2688 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
2718 } 2689 }
2719 2690
2720 // Check that the framer stops delivering header data chunks once the visitor 2691 // Check that the framer stops delivering header data chunks once the visitor
2721 // declares it doesn't want any more. This is important to guard against 2692 // declares it doesn't want any more. This is important to guard against
2722 // "zip bomb" types of attacks. 2693 // "zip bomb" types of attacks.
2723 TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) { 2694 TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) {
2724 const size_t kHeaderBufferChunks = 4; 2695 const size_t kHeaderBufferChunks = 4;
2725 const size_t kHeaderBufferSize = 2696 const size_t kHeaderBufferSize =
2726 TestSpdyVisitor::header_data_chunk_max_size() * kHeaderBufferChunks; 2697 TestSpdyVisitor::header_data_chunk_max_size() * kHeaderBufferChunks;
2727 const size_t kBigValueSize = kHeaderBufferSize * 2; 2698 const size_t kBigValueSize = kHeaderBufferSize * 2;
2728 string big_value(kBigValueSize, 'x'); 2699 string big_value(kBigValueSize, 'x');
2729 SpdyFramer framer; 2700 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2730 SpdyHeadersIR headers(1); 2701 SpdyHeadersIR headers(1);
2731 headers.set_fin(true); 2702 headers.set_fin(true);
2732 headers.SetHeader("aa", big_value); 2703 headers.SetHeader("aa", big_value);
2733 SpdySerializedFrame control_frame( 2704 SpdySerializedFrame control_frame(
2734 SpdyFramerPeer::SerializeHeaders(&framer, headers)); 2705 SpdyFramerPeer::SerializeHeaders(&framer, headers));
2735 TestSpdyVisitor visitor; 2706 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION);
2736 visitor.set_header_buffer_size(kHeaderBufferSize); 2707 visitor.set_header_buffer_size(kHeaderBufferSize);
2737 visitor.use_compression_ = true;
2738 visitor.SimulateInFramer( 2708 visitor.SimulateInFramer(
2739 reinterpret_cast<unsigned char*>(control_frame.data()), 2709 reinterpret_cast<unsigned char*>(control_frame.data()),
2740 control_frame.size()); 2710 control_frame.size());
2741 // It's up to the visitor to ignore extraneous header data; the framer 2711 // It's up to the visitor to ignore extraneous header data; the framer
2742 // won't throw an error. 2712 // won't throw an error.
2743 EXPECT_GT(visitor.header_bytes_received_, visitor.header_buffer_size_); 2713 EXPECT_GT(visitor.header_bytes_received_, visitor.header_buffer_size_);
2744 EXPECT_EQ(1, visitor.end_of_stream_count_); 2714 EXPECT_EQ(1, visitor.end_of_stream_count_);
2745 } 2715 }
2746 2716
2747 TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) { 2717 TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) {
2748 SpdyFramer framer; 2718 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2749 // Create a GoAway frame that has a few extra bytes at the end. 2719 // Create a GoAway frame that has a few extra bytes at the end.
2750 // We create enough overhead to overflow the framer's control frame buffer. 2720 // We create enough overhead to overflow the framer's control frame buffer.
2751 ASSERT_LE(SpdyFramerPeer::ControlFrameBufferSize(), 250u); 2721 ASSERT_LE(SpdyFramerPeer::ControlFrameBufferSize(), 250u);
2752 const size_t length = SpdyFramerPeer::ControlFrameBufferSize() + 1; 2722 const size_t length = SpdyFramerPeer::ControlFrameBufferSize() + 1;
2753 2723
2754 // HTTP/2 GOAWAY frames are only bound by a minimal length, since they may 2724 // HTTP/2 GOAWAY frames are only bound by a minimal length, since they may
2755 // carry opaque data. Verify that minimal length is tested. 2725 // carry opaque data. Verify that minimal length is tested.
2756 ASSERT_GT(framer.GetGoAwayMinimumSize(), SpdyConstants::kFrameHeaderSize); 2726 ASSERT_GT(framer.GetGoAwayMinimumSize(), SpdyConstants::kFrameHeaderSize);
2757 const size_t less_than_min_length = 2727 const size_t less_than_min_length =
2758 framer.GetGoAwayMinimumSize() - SpdyConstants::kFrameHeaderSize - 1; 2728 framer.GetGoAwayMinimumSize() - SpdyConstants::kFrameHeaderSize - 1;
2759 ASSERT_LE(less_than_min_length, std::numeric_limits<unsigned char>::max()); 2729 ASSERT_LE(less_than_min_length, std::numeric_limits<unsigned char>::max());
2760 const unsigned char kH2Len = static_cast<unsigned char>(less_than_min_length); 2730 const unsigned char kH2Len = static_cast<unsigned char>(less_than_min_length);
2761 const unsigned char kH2FrameData[] = { 2731 const unsigned char kH2FrameData[] = {
2762 0x00, 0x00, kH2Len, // Length: min length - 1 2732 0x00, 0x00, kH2Len, // Length: min length - 1
2763 0x07, // Type: GOAWAY 2733 0x07, // Type: GOAWAY
2764 0x00, // Flags: none 2734 0x00, // Flags: none
2765 0x00, 0x00, 0x00, 0x00, // Stream: 0 2735 0x00, 0x00, 0x00, 0x00, // Stream: 0
2766 0x00, 0x00, 0x00, 0x00, // Last: 0 2736 0x00, 0x00, 0x00, 0x00, // Last: 0
2767 0x00, 0x00, 0x00, // Truncated Status Field 2737 0x00, 0x00, 0x00, // Truncated Status Field
2768 }; 2738 };
2769 const size_t pad_length = 2739 const size_t pad_length =
2770 length + SpdyConstants::kFrameHeaderSize - sizeof(kH2FrameData); 2740 length + SpdyConstants::kFrameHeaderSize - sizeof(kH2FrameData);
2771 string pad(pad_length, 'A'); 2741 string pad(pad_length, 'A');
2772 TestSpdyVisitor visitor; 2742 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2773 2743
2774 visitor.SimulateInFramer(kH2FrameData, sizeof(kH2FrameData)); 2744 visitor.SimulateInFramer(kH2FrameData, sizeof(kH2FrameData));
2775 visitor.SimulateInFramer(reinterpret_cast<const unsigned char*>(pad.c_str()), 2745 visitor.SimulateInFramer(reinterpret_cast<const unsigned char*>(pad.c_str()),
2776 pad.length()); 2746 pad.length());
2777 2747
2778 EXPECT_EQ(1, visitor.error_count_); // This generated an error. 2748 EXPECT_EQ(1, visitor.error_count_); // This generated an error.
2779 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, 2749 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME,
2780 visitor.framer_.error_code()) 2750 visitor.framer_.error_code())
2781 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 2751 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
2782 EXPECT_EQ(0, visitor.goaway_count_); // Frame not parsed. 2752 EXPECT_EQ(0, visitor.goaway_count_); // Frame not parsed.
2783 } 2753 }
2784 2754
2785 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) { 2755 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) {
2786 SpdyFramer framer; 2756 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2787 SpdySettingsIR settings_ir; 2757 SpdySettingsIR settings_ir;
2788 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); 2758 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
2789 SetFrameLength(&control_frame, 0); 2759 SetFrameLength(&control_frame, 0);
2790 TestSpdyVisitor visitor; 2760 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2791 visitor.use_compression_ = false;
2792 visitor.SimulateInFramer( 2761 visitor.SimulateInFramer(
2793 reinterpret_cast<unsigned char*>(control_frame.data()), 2762 reinterpret_cast<unsigned char*>(control_frame.data()),
2794 framer.GetFrameHeaderSize()); 2763 framer.GetFrameHeaderSize());
2795 // Zero-len settings frames are permitted as of HTTP/2. 2764 // Zero-len settings frames are permitted as of HTTP/2.
2796 EXPECT_EQ(0, visitor.error_count_); 2765 EXPECT_EQ(0, visitor.error_count_);
2797 } 2766 }
2798 2767
2799 // Tests handling of SETTINGS frames with invalid length. 2768 // Tests handling of SETTINGS frames with invalid length.
2800 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { 2769 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) {
2801 SpdyFramer framer; 2770 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2802 SpdySettingsIR settings_ir; 2771 SpdySettingsIR settings_ir;
2803 2772
2804 // Add settings to more than fill the frame so that we don't get a buffer 2773 // Add settings to more than fill the frame so that we don't get a buffer
2805 // overflow when calling SimulateInFramer() below. These settings must be 2774 // overflow when calling SimulateInFramer() below. These settings must be
2806 // distinct parameters because SpdySettingsIR has a map for settings, and will 2775 // distinct parameters because SpdySettingsIR has a map for settings, and will
2807 // collapse multiple copies of the same parameter. 2776 // collapse multiple copies of the same parameter.
2808 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, false, false, 2777 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, false, false,
2809 0x00000002); 2778 0x00000002);
2810 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, false, false, 2779 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, false, false,
2811 0x00000002); 2780 0x00000002);
2812 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); 2781 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
2813 const size_t kNewLength = 8; 2782 const size_t kNewLength = 8;
2814 SetFrameLength(&control_frame, kNewLength); 2783 SetFrameLength(&control_frame, kNewLength);
2815 TestSpdyVisitor visitor; 2784 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2816 visitor.use_compression_ = false;
2817 visitor.SimulateInFramer( 2785 visitor.SimulateInFramer(
2818 reinterpret_cast<unsigned char*>(control_frame.data()), 2786 reinterpret_cast<unsigned char*>(control_frame.data()),
2819 framer.GetFrameHeaderSize() + kNewLength); 2787 framer.GetFrameHeaderSize() + kNewLength);
2820 // Should generate an error, since its not possible to have a 2788 // Should generate an error, since its not possible to have a
2821 // settings frame of length kNewLength. 2789 // settings frame of length kNewLength.
2822 EXPECT_EQ(1, visitor.error_count_); 2790 EXPECT_EQ(1, visitor.error_count_);
2823 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE, 2791 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE,
2824 visitor.framer_.error_code()) 2792 visitor.framer_.error_code())
2825 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 2793 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
2826 } 2794 }
2827 2795
2828 // Tests handling of SETTINGS frames larger than the frame buffer size. 2796 // Tests handling of SETTINGS frames larger than the frame buffer size.
2829 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { 2797 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) {
2830 SpdyFramer framer; 2798 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2831 SpdySettingsIR settings_ir; 2799 SpdySettingsIR settings_ir;
2832 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 2800 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE,
2833 false, // persist 2801 false, // persist
2834 false, // persisted 2802 false, // persisted
2835 5); 2803 5);
2836 settings_ir.AddSetting(SETTINGS_ENABLE_PUSH, 2804 settings_ir.AddSetting(SETTINGS_ENABLE_PUSH,
2837 false, // persist 2805 false, // persist
2838 false, // persisted 2806 false, // persisted
2839 6); 2807 6);
2840 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 2808 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS,
2841 false, // persist 2809 false, // persist
2842 false, // persisted 2810 false, // persisted
2843 7); 2811 7);
2844 2812
2845 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); 2813 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
2846 EXPECT_LT(SpdyFramerPeer::ControlFrameBufferSize(), control_frame.size()); 2814 EXPECT_LT(SpdyFramerPeer::ControlFrameBufferSize(), control_frame.size());
2847 TestSpdyVisitor visitor; 2815 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2848 visitor.use_compression_ = false;
2849 2816
2850 // Read all at once. 2817 // Read all at once.
2851 visitor.SimulateInFramer( 2818 visitor.SimulateInFramer(
2852 reinterpret_cast<unsigned char*>(control_frame.data()), 2819 reinterpret_cast<unsigned char*>(control_frame.data()),
2853 control_frame.size()); 2820 control_frame.size());
2854 EXPECT_EQ(0, visitor.error_count_); 2821 EXPECT_EQ(0, visitor.error_count_);
2855 EXPECT_EQ(3, visitor.setting_count_); 2822 EXPECT_EQ(3, visitor.setting_count_);
2856 EXPECT_EQ(1, visitor.settings_ack_sent_); 2823 EXPECT_EQ(1, visitor.settings_ack_sent_);
2857 2824
2858 // Read data in small chunks. 2825 // Read data in small chunks.
2859 size_t framed_data = 0; 2826 size_t framed_data = 0;
2860 size_t unframed_data = control_frame.size(); 2827 size_t unframed_data = control_frame.size();
2861 size_t kReadChunkSize = 5; // Read five bytes at a time. 2828 size_t kReadChunkSize = 5; // Read five bytes at a time.
2862 while (unframed_data > 0) { 2829 while (unframed_data > 0) {
2863 size_t to_read = std::min(kReadChunkSize, unframed_data); 2830 size_t to_read = std::min(kReadChunkSize, unframed_data);
2864 visitor.SimulateInFramer( 2831 visitor.SimulateInFramer(
2865 reinterpret_cast<unsigned char*>(control_frame.data() + framed_data), 2832 reinterpret_cast<unsigned char*>(control_frame.data() + framed_data),
2866 to_read); 2833 to_read);
2867 unframed_data -= to_read; 2834 unframed_data -= to_read;
2868 framed_data += to_read; 2835 framed_data += to_read;
2869 } 2836 }
2870 EXPECT_EQ(0, visitor.error_count_); 2837 EXPECT_EQ(0, visitor.error_count_);
2871 EXPECT_EQ(3 * 2, visitor.setting_count_); 2838 EXPECT_EQ(3 * 2, visitor.setting_count_);
2872 EXPECT_EQ(2, visitor.settings_ack_sent_); 2839 EXPECT_EQ(2, visitor.settings_ack_sent_);
2873 } 2840 }
2874 2841
2875 // Tests handling of SETTINGS frame with duplicate entries. 2842 // Tests handling of SETTINGS frame with duplicate entries.
2876 TEST_P(SpdyFramerTest, ReadDuplicateSettings) { 2843 TEST_P(SpdyFramerTest, ReadDuplicateSettings) {
2877 SpdyFramer framer; 2844 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2878 2845
2879 const unsigned char kH2FrameData[] = { 2846 const unsigned char kH2FrameData[] = {
2880 0x00, 0x00, 0x12, // Length: 18 2847 0x00, 0x00, 0x12, // Length: 18
2881 0x04, // Type: SETTINGS 2848 0x04, // Type: SETTINGS
2882 0x00, // Flags: none 2849 0x00, // Flags: none
2883 0x00, 0x00, 0x00, 0x00, // Stream: 0 2850 0x00, 0x00, 0x00, 0x00, // Stream: 0
2884 0x00, 0x01, // Param: HEADER_TABLE_SIZE 2851 0x00, 0x01, // Param: HEADER_TABLE_SIZE
2885 0x00, 0x00, 0x00, 0x02, // Value: 2 2852 0x00, 0x00, 0x00, 0x02, // Value: 2
2886 0x00, 0x01, // Param: HEADER_TABLE_SIZE 2853 0x00, 0x01, // Param: HEADER_TABLE_SIZE
2887 0x00, 0x00, 0x00, 0x03, // Value: 3 2854 0x00, 0x00, 0x00, 0x03, // Value: 3
2888 0x00, 0x03, // Param: MAX_CONCURRENT_STREAMS 2855 0x00, 0x03, // Param: MAX_CONCURRENT_STREAMS
2889 0x00, 0x00, 0x00, 0x03, // Value: 3 2856 0x00, 0x00, 0x00, 0x03, // Value: 3
2890 }; 2857 };
2891 2858
2892 TestSpdyVisitor visitor; 2859 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2893 visitor.use_compression_ = false;
2894 visitor.SimulateInFramer(kH2FrameData, sizeof(kH2FrameData)); 2860 visitor.SimulateInFramer(kH2FrameData, sizeof(kH2FrameData));
2895 2861
2896 // In HTTP/2, duplicate settings are allowed; 2862 // In HTTP/2, duplicate settings are allowed;
2897 // each setting replaces the previous value for that setting. 2863 // each setting replaces the previous value for that setting.
2898 EXPECT_EQ(3, visitor.setting_count_); 2864 EXPECT_EQ(3, visitor.setting_count_);
2899 EXPECT_EQ(0, visitor.error_count_); 2865 EXPECT_EQ(0, visitor.error_count_);
2900 EXPECT_EQ(1, visitor.settings_ack_sent_); 2866 EXPECT_EQ(1, visitor.settings_ack_sent_);
2901 } 2867 }
2902 2868
2903 // Tests handling of SETTINGS frame with a setting we don't recognize. 2869 // Tests handling of SETTINGS frame with a setting we don't recognize.
2904 TEST_P(SpdyFramerTest, ReadUnknownSettingsId) { 2870 TEST_P(SpdyFramerTest, ReadUnknownSettingsId) {
2905 SpdyFramer framer; 2871 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2906 const unsigned char kH2FrameData[] = { 2872 const unsigned char kH2FrameData[] = {
2907 0x00, 0x00, 0x06, // Length: 6 2873 0x00, 0x00, 0x06, // Length: 6
2908 0x04, // Type: SETTINGS 2874 0x04, // Type: SETTINGS
2909 0x00, // Flags: none 2875 0x00, // Flags: none
2910 0x00, 0x00, 0x00, 0x00, // Stream: 0 2876 0x00, 0x00, 0x00, 0x00, // Stream: 0
2911 0x00, 0x10, // Param: 16 2877 0x00, 0x10, // Param: 16
2912 0x00, 0x00, 0x00, 0x02, // Value: 2 2878 0x00, 0x00, 0x00, 0x02, // Value: 2
2913 }; 2879 };
2914 2880
2915 TestSpdyVisitor visitor; 2881 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2916 visitor.use_compression_ = false;
2917 visitor.SimulateInFramer(kH2FrameData, sizeof(kH2FrameData)); 2882 visitor.SimulateInFramer(kH2FrameData, sizeof(kH2FrameData));
2918 2883
2919 // In HTTP/2, we ignore unknown settings because of extensions. 2884 // In HTTP/2, we ignore unknown settings because of extensions.
2920 EXPECT_EQ(0, visitor.setting_count_); 2885 EXPECT_EQ(0, visitor.setting_count_);
2921 EXPECT_EQ(0, visitor.error_count_); 2886 EXPECT_EQ(0, visitor.error_count_);
2922 } 2887 }
2923 2888
2924 // Tests handling of SETTINGS frame with entries out of order. 2889 // Tests handling of SETTINGS frame with entries out of order.
2925 TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { 2890 TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) {
2926 SpdyFramer framer; 2891 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2927 const unsigned char kH2FrameData[] = { 2892 const unsigned char kH2FrameData[] = {
2928 0x00, 0x00, 0x12, // Length: 18 2893 0x00, 0x00, 0x12, // Length: 18
2929 0x04, // Type: SETTINGS 2894 0x04, // Type: SETTINGS
2930 0x00, // Flags: none 2895 0x00, // Flags: none
2931 0x00, 0x00, 0x00, 0x00, // Stream: 0 2896 0x00, 0x00, 0x00, 0x00, // Stream: 0
2932 0x00, 0x02, // Param: ENABLE_PUSH 2897 0x00, 0x02, // Param: ENABLE_PUSH
2933 0x00, 0x00, 0x00, 0x02, // Value: 2 2898 0x00, 0x00, 0x00, 0x02, // Value: 2
2934 0x00, 0x01, // Param: HEADER_TABLE_SIZE 2899 0x00, 0x01, // Param: HEADER_TABLE_SIZE
2935 0x00, 0x00, 0x00, 0x03, // Value: 3 2900 0x00, 0x00, 0x00, 0x03, // Value: 3
2936 0x00, 0x03, // Param: MAX_CONCURRENT_STREAMS 2901 0x00, 0x03, // Param: MAX_CONCURRENT_STREAMS
2937 0x00, 0x00, 0x00, 0x03, // Value: 3 2902 0x00, 0x00, 0x00, 0x03, // Value: 3
2938 }; 2903 };
2939 2904
2940 TestSpdyVisitor visitor; 2905 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2941 visitor.use_compression_ = false;
2942 visitor.SimulateInFramer(kH2FrameData, sizeof(kH2FrameData)); 2906 visitor.SimulateInFramer(kH2FrameData, sizeof(kH2FrameData));
2943 2907
2944 // In HTTP/2, settings are allowed in any order. 2908 // In HTTP/2, settings are allowed in any order.
2945 EXPECT_EQ(3, visitor.setting_count_); 2909 EXPECT_EQ(3, visitor.setting_count_);
2946 EXPECT_EQ(0, visitor.error_count_); 2910 EXPECT_EQ(0, visitor.error_count_);
2947 } 2911 }
2948 2912
2949 TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) { 2913 TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) {
2950 SpdyFramer framer; 2914 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2951 2915
2952 const unsigned char kFrameData[] = { 2916 const unsigned char kFrameData[] = {
2953 0x00, 0x00, 0x00, // Length: 0 2917 0x00, 0x00, 0x00, // Length: 0
2954 0x04, // Type: SETTINGS 2918 0x04, // Type: SETTINGS
2955 0x01, // Flags: ACK 2919 0x01, // Flags: ACK
2956 0x00, 0x00, 0x00, 0x00, // Stream: 0 2920 0x00, 0x00, 0x00, 0x00, // Stream: 0
2957 }; 2921 };
2958 2922
2959 TestSpdyVisitor visitor; 2923 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
2960 visitor.use_compression_ = false;
2961 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); 2924 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData));
2962 2925
2963 EXPECT_EQ(0, visitor.error_count_); 2926 EXPECT_EQ(0, visitor.error_count_);
2964 EXPECT_EQ(0, visitor.setting_count_); 2927 EXPECT_EQ(0, visitor.setting_count_);
2965 EXPECT_EQ(1, visitor.settings_ack_received_); 2928 EXPECT_EQ(1, visitor.settings_ack_received_);
2966 } 2929 }
2967 2930
2968 TEST_P(SpdyFramerTest, ProcessDataFrameWithPadding) { 2931 TEST_P(SpdyFramerTest, ProcessDataFrameWithPadding) {
2969 const int kPaddingLen = 119; 2932 const int kPaddingLen = 119;
2970 const char data_payload[] = "hello"; 2933 const char data_payload[] = "hello";
2971 2934
2972 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 2935 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
2973 SpdyFramer framer; 2936 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
2974 framer.set_visitor(&visitor); 2937 framer.set_visitor(&visitor);
2975 2938
2976 SpdyDataIR data_ir(1, data_payload); 2939 SpdyDataIR data_ir(1, data_payload);
2977 data_ir.set_padding_len(kPaddingLen); 2940 data_ir.set_padding_len(kPaddingLen);
2978 SpdySerializedFrame frame(framer.SerializeData(data_ir)); 2941 SpdySerializedFrame frame(framer.SerializeData(data_ir));
2979 2942
2980 int bytes_consumed = 0; 2943 int bytes_consumed = 0;
2981 2944
2982 // Send the frame header. 2945 // Send the frame header.
2983 EXPECT_CALL(visitor, 2946 EXPECT_CALL(visitor,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3017 bytes_consumed += 100; 2980 bytes_consumed += 100;
3018 2981
3019 // Send rest of the padding payload. 2982 // Send rest of the padding payload.
3020 EXPECT_CALL(visitor, OnStreamPadding(1, 18)); 2983 EXPECT_CALL(visitor, OnStreamPadding(1, 18));
3021 CHECK_EQ(18u, framer.ProcessInput(frame.data() + bytes_consumed, 18)); 2984 CHECK_EQ(18u, framer.ProcessInput(frame.data() + bytes_consumed, 18));
3022 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READY_FOR_FRAME); 2985 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READY_FOR_FRAME);
3023 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); 2986 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3024 } 2987 }
3025 2988
3026 TEST_P(SpdyFramerTest, ReadWindowUpdate) { 2989 TEST_P(SpdyFramerTest, ReadWindowUpdate) {
3027 SpdyFramer framer; 2990 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3028 SpdySerializedFrame control_frame( 2991 SpdySerializedFrame control_frame(
3029 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); 2992 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2)));
3030 TestSpdyVisitor visitor; 2993 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3031 visitor.SimulateInFramer( 2994 visitor.SimulateInFramer(
3032 reinterpret_cast<unsigned char*>(control_frame.data()), 2995 reinterpret_cast<unsigned char*>(control_frame.data()),
3033 control_frame.size()); 2996 control_frame.size());
3034 EXPECT_EQ(1u, visitor.last_window_update_stream_); 2997 EXPECT_EQ(1u, visitor.last_window_update_stream_);
3035 EXPECT_EQ(2, visitor.last_window_update_delta_); 2998 EXPECT_EQ(2, visitor.last_window_update_delta_);
3036 } 2999 }
3037 3000
3038 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { 3001 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) {
3039 SpdyFramer framer; 3002 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3040 SpdyPushPromiseIR push_promise(42, 57); 3003 SpdyPushPromiseIR push_promise(42, 57);
3041 push_promise.SetHeader("foo", "bar"); 3004 push_promise.SetHeader("foo", "bar");
3042 push_promise.SetHeader("bar", "foofoo"); 3005 push_promise.SetHeader("bar", "foofoo");
3043 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); 3006 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
3044 TestSpdyVisitor visitor; 3007 TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION);
3045 visitor.use_compression_ = true;
3046 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), 3008 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()),
3047 frame.size()); 3009 frame.size());
3048 EXPECT_EQ(42u, visitor.last_push_promise_stream_); 3010 EXPECT_EQ(42u, visitor.last_push_promise_stream_);
3049 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); 3011 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_);
3050 EXPECT_EQ(push_promise.header_block(), visitor.headers_); 3012 EXPECT_EQ(push_promise.header_block(), visitor.headers_);
3051 } 3013 }
3052 3014
3053 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { 3015 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) {
3054 // frame-format off 3016 // frame-format off
3055 const unsigned char kInput[] = { 3017 const unsigned char kInput[] = {
(...skipping 29 matching lines...) Expand all
3085 'o', 'o', 'k', 'i', 'e', // Name (continued) 3047 'o', 'o', 'k', 'i', 'e', // Name (continued)
3086 0x00, // Value Len: 0 3048 0x00, // Value Len: 0
3087 0x00, // Unindexed Entry 3049 0x00, // Unindexed Entry
3088 0x04, // Name Len: 4 3050 0x04, // Name Len: 4
3089 'n', 'a', 'm', 'e', // Name 3051 'n', 'a', 'm', 'e', // Name
3090 0x05, // Value Len: 5 3052 0x05, // Value Len: 5
3091 'v', 'a', 'l', 'u', 'e', // Value 3053 'v', 'a', 'l', 'u', 'e', // Value
3092 }; 3054 };
3093 // frame-format on 3055 // frame-format on
3094 3056
3095 SpdyFramer framer; 3057 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3096 TestSpdyVisitor visitor;
3097 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3058 visitor.SimulateInFramer(kInput, sizeof(kInput));
3098 3059
3099 EXPECT_EQ(0, visitor.error_count_); 3060 EXPECT_EQ(0, visitor.error_count_);
3100 EXPECT_EQ(1, visitor.headers_frame_count_); 3061 EXPECT_EQ(1, visitor.headers_frame_count_);
3101 EXPECT_EQ(2, visitor.continuation_count_); 3062 EXPECT_EQ(2, visitor.continuation_count_);
3102 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 3063 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
3103 EXPECT_EQ(0, visitor.end_of_stream_count_); 3064 EXPECT_EQ(0, visitor.end_of_stream_count_);
3104 3065
3105 EXPECT_THAT( 3066 EXPECT_THAT(
3106 visitor.headers_, 3067 visitor.headers_,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3141 'o', 'o', 'k', 'i', 'e', // Name (continued) 3102 'o', 'o', 'k', 'i', 'e', // Name (continued)
3142 0x00, // Value Len: 0 3103 0x00, // Value Len: 0
3143 0x00, // Unindexed Entry 3104 0x00, // Unindexed Entry
3144 0x04, // Name Len: 4 3105 0x04, // Name Len: 4
3145 'n', 'a', 'm', 'e', // Name 3106 'n', 'a', 'm', 'e', // Name
3146 0x05, // Value Len: 5 3107 0x05, // Value Len: 5
3147 'v', 'a', 'l', 'u', 'e', // Value 3108 'v', 'a', 'l', 'u', 'e', // Value
3148 }; 3109 };
3149 // frame-format on 3110 // frame-format on
3150 3111
3151 SpdyFramer framer; 3112 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3152 TestSpdyVisitor visitor; 3113 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3153 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3114 visitor.SimulateInFramer(kInput, sizeof(kInput));
3154 3115
3155 EXPECT_EQ(0, visitor.error_count_); 3116 EXPECT_EQ(0, visitor.error_count_);
3156 EXPECT_EQ(1, visitor.headers_frame_count_); 3117 EXPECT_EQ(1, visitor.headers_frame_count_);
3157 EXPECT_EQ(2, visitor.continuation_count_); 3118 EXPECT_EQ(2, visitor.continuation_count_);
3158 EXPECT_EQ(1, visitor.fin_flag_count_); 3119 EXPECT_EQ(1, visitor.fin_flag_count_);
3159 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 3120 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
3160 EXPECT_EQ(1, visitor.end_of_stream_count_); 3121 EXPECT_EQ(1, visitor.end_of_stream_count_);
3161 3122
3162 EXPECT_THAT( 3123 EXPECT_THAT(
(...skipping 26 matching lines...) Expand all
3189 0x00, 0x00, 0x12, 0x09, // CONTINUATION 3150 0x00, 0x00, 0x12, 0x09, // CONTINUATION
3190 0x04, 0x00, 0x00, 0x00, // END_HEADERS 3151 0x04, 0x00, 0x00, 0x00, // END_HEADERS
3191 0x01, 'o', 'o', 'k', // Stream 1 3152 0x01, 'o', 'o', 'k', // Stream 1
3192 'i', 'e', 0x00, 0x00, 3153 'i', 'e', 0x00, 0x00,
3193 0x04, 'n', 'a', 'm', 3154 0x04, 'n', 'a', 'm',
3194 'e', 0x05, 'v', 'a', 3155 'e', 0x05, 'v', 'a',
3195 'l', 'u', 'e', 3156 'l', 'u', 'e',
3196 }; 3157 };
3197 // frame-format on 3158 // frame-format on
3198 3159
3199 SpdyFramer framer; 3160 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3200 TestSpdyVisitor visitor; 3161 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3201 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3162 visitor.SimulateInFramer(kInput, sizeof(kInput));
3202 3163
3203 EXPECT_EQ(0, visitor.error_count_); 3164 EXPECT_EQ(0, visitor.error_count_);
3204 EXPECT_EQ(1u, visitor.last_push_promise_stream_); 3165 EXPECT_EQ(1u, visitor.last_push_promise_stream_);
3205 EXPECT_EQ(42u, visitor.last_push_promise_promised_stream_); 3166 EXPECT_EQ(42u, visitor.last_push_promise_promised_stream_);
3206 EXPECT_EQ(2, visitor.continuation_count_); 3167 EXPECT_EQ(2, visitor.continuation_count_);
3207 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 3168 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
3208 EXPECT_EQ(0, visitor.end_of_stream_count_); 3169 EXPECT_EQ(0, visitor.end_of_stream_count_);
3209 3170
3210 EXPECT_THAT( 3171 EXPECT_THAT(
(...skipping 19 matching lines...) Expand all
3230 0xa9, // Type: UnknownFrameType(169) 3191 0xa9, // Type: UnknownFrameType(169)
3231 0x00, // Flags: none 3192 0x00, // Flags: none
3232 0x00, 0x00, 0x00, 0x01, // Stream: 1 3193 0x00, 0x00, 0x00, 0x01, // Stream: 1
3233 0x00, 0x06, 0x63, 0x6f, // Payload 3194 0x00, 0x06, 0x63, 0x6f, // Payload
3234 0x6f, 0x6b, 0x69, 0x65, // 3195 0x6f, 0x6b, 0x69, 0x65, //
3235 0x08, 0x62, 0x61, 0x7a, // 3196 0x08, 0x62, 0x61, 0x7a, //
3236 0x3d, 0x62, 0x69, 0x6e, // 3197 0x3d, 0x62, 0x69, 0x6e, //
3237 0x67, 0x00, 0x06, 0x63, // 3198 0x67, 0x00, 0x06, 0x63, //
3238 }; 3199 };
3239 3200
3240 SpdyFramer framer; 3201 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3241 TestSpdyVisitor visitor; 3202 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3242 // Assume the unknown frame is allowed 3203 // Assume the unknown frame is allowed
3243 visitor.on_unknown_frame_result_ = true; 3204 visitor.on_unknown_frame_result_ = true;
3244 framer.set_visitor(&visitor); 3205 framer.set_visitor(&visitor);
3245 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3206 visitor.SimulateInFramer(kInput, sizeof(kInput));
3246 3207
3247 EXPECT_EQ(1, visitor.error_count_); 3208 EXPECT_EQ(1, visitor.error_count_);
3248 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code()) 3209 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code())
3249 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 3210 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
3250 EXPECT_EQ(1, visitor.headers_frame_count_); 3211 EXPECT_EQ(1, visitor.headers_frame_count_);
3251 EXPECT_EQ(0, visitor.continuation_count_); 3212 EXPECT_EQ(0, visitor.continuation_count_);
(...skipping 15 matching lines...) Expand all
3267 0x09, // Type: CONTINUATION 3228 0x09, // Type: CONTINUATION
3268 0x00, // Flags: none 3229 0x00, // Flags: none
3269 0x00, 0x00, 0x00, 0x02, // Stream: 2 3230 0x00, 0x00, 0x00, 0x02, // Stream: 2
3270 0x00, 0x06, 0x63, 0x6f, // HPACK 3231 0x00, 0x06, 0x63, 0x6f, // HPACK
3271 0x6f, 0x6b, 0x69, 0x65, // 3232 0x6f, 0x6b, 0x69, 0x65, //
3272 0x08, 0x62, 0x61, 0x7a, // 3233 0x08, 0x62, 0x61, 0x7a, //
3273 0x3d, 0x62, 0x69, 0x6e, // 3234 0x3d, 0x62, 0x69, 0x6e, //
3274 0x67, 0x00, 0x06, 0x63, // 3235 0x67, 0x00, 0x06, 0x63, //
3275 }; 3236 };
3276 3237
3277 SpdyFramer framer; 3238 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3278 TestSpdyVisitor visitor; 3239 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3279 framer.set_visitor(&visitor); 3240 framer.set_visitor(&visitor);
3280 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3241 visitor.SimulateInFramer(kInput, sizeof(kInput));
3281 3242
3282 EXPECT_EQ(1, visitor.error_count_); 3243 EXPECT_EQ(1, visitor.error_count_);
3283 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code()) 3244 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code())
3284 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 3245 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
3285 EXPECT_EQ(1, visitor.headers_frame_count_); 3246 EXPECT_EQ(1, visitor.headers_frame_count_);
3286 EXPECT_EQ(0, visitor.continuation_count_); 3247 EXPECT_EQ(0, visitor.continuation_count_);
3287 EXPECT_EQ(0u, visitor.header_buffer_length_); 3248 EXPECT_EQ(0u, visitor.header_buffer_length_);
3288 } 3249 }
3289 3250
3290 TEST_P(SpdyFramerTest, ReadContinuationOutOfOrder) { 3251 TEST_P(SpdyFramerTest, ReadContinuationOutOfOrder) {
3291 const unsigned char kInput[] = { 3252 const unsigned char kInput[] = {
3292 0x00, 0x00, 0x18, // Length: 24 3253 0x00, 0x00, 0x18, // Length: 24
3293 0x09, // Type: CONTINUATION 3254 0x09, // Type: CONTINUATION
3294 0x00, // Flags: none 3255 0x00, // Flags: none
3295 0x00, 0x00, 0x00, 0x01, // Stream: 1 3256 0x00, 0x00, 0x00, 0x01, // Stream: 1
3296 0x00, 0x06, 0x63, 0x6f, // HPACK 3257 0x00, 0x06, 0x63, 0x6f, // HPACK
3297 0x6f, 0x6b, 0x69, 0x65, // 3258 0x6f, 0x6b, 0x69, 0x65, //
3298 0x07, 0x66, 0x6f, 0x6f, // 3259 0x07, 0x66, 0x6f, 0x6f, //
3299 0x3d, 0x62, 0x61, 0x72, // 3260 0x3d, 0x62, 0x61, 0x72, //
3300 }; 3261 };
3301 3262
3302 SpdyFramer framer; 3263 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3303 TestSpdyVisitor visitor; 3264 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3304 framer.set_visitor(&visitor); 3265 framer.set_visitor(&visitor);
3305 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3266 visitor.SimulateInFramer(kInput, sizeof(kInput));
3306 3267
3307 EXPECT_EQ(1, visitor.error_count_); 3268 EXPECT_EQ(1, visitor.error_count_);
3308 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code()) 3269 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code())
3309 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 3270 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
3310 EXPECT_EQ(0, visitor.continuation_count_); 3271 EXPECT_EQ(0, visitor.continuation_count_);
3311 EXPECT_EQ(0u, visitor.header_buffer_length_); 3272 EXPECT_EQ(0u, visitor.header_buffer_length_);
3312 } 3273 }
3313 3274
3314 TEST_P(SpdyFramerTest, ExpectContinuationReceiveData) { 3275 TEST_P(SpdyFramerTest, ExpectContinuationReceiveData) {
3315 const unsigned char kInput[] = { 3276 const unsigned char kInput[] = {
3316 0x00, 0x00, 0x10, // Length: 16 3277 0x00, 0x00, 0x10, // Length: 16
3317 0x01, // Type: HEADERS 3278 0x01, // Type: HEADERS
3318 0x00, // Flags: none 3279 0x00, // Flags: none
3319 0x00, 0x00, 0x00, 0x01, // Stream: 1 3280 0x00, 0x00, 0x00, 0x01, // Stream: 1
3320 0x00, 0x06, 0x63, 0x6f, // HPACK 3281 0x00, 0x06, 0x63, 0x6f, // HPACK
3321 0x6f, 0x6b, 0x69, 0x65, // 3282 0x6f, 0x6b, 0x69, 0x65, //
3322 0x07, 0x66, 0x6f, 0x6f, // 3283 0x07, 0x66, 0x6f, 0x6f, //
3323 0x3d, 0x62, 0x61, 0x72, // 3284 0x3d, 0x62, 0x61, 0x72, //
3324 3285
3325 0x00, 0x00, 0x00, // Length: 0 3286 0x00, 0x00, 0x00, // Length: 0
3326 0x00, // Type: DATA 3287 0x00, // Type: DATA
3327 0x01, // Flags: END_STREAM 3288 0x01, // Flags: END_STREAM
3328 0x00, 0x00, 0x00, 0x04, // Stream: 4 3289 0x00, 0x00, 0x00, 0x04, // Stream: 4
3329 3290
3330 0xde, 0xad, 0xbe, 0xef, // Truncated Frame Header 3291 0xde, 0xad, 0xbe, 0xef, // Truncated Frame Header
3331 }; 3292 };
3332 3293
3333 SpdyFramer framer; 3294 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3334 TestSpdyVisitor visitor; 3295 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3335 framer.set_visitor(&visitor); 3296 framer.set_visitor(&visitor);
3336 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3297 visitor.SimulateInFramer(kInput, sizeof(kInput));
3337 3298
3338 EXPECT_EQ(1, visitor.error_count_); 3299 EXPECT_EQ(1, visitor.error_count_);
3339 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code()) 3300 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code())
3340 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 3301 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
3341 EXPECT_EQ(1, visitor.headers_frame_count_); 3302 EXPECT_EQ(1, visitor.headers_frame_count_);
3342 EXPECT_EQ(0, visitor.continuation_count_); 3303 EXPECT_EQ(0, visitor.continuation_count_);
3343 EXPECT_EQ(0u, visitor.header_buffer_length_); 3304 EXPECT_EQ(0u, visitor.header_buffer_length_);
3344 EXPECT_EQ(0, visitor.data_frame_count_); 3305 EXPECT_EQ(0, visitor.data_frame_count_);
(...skipping 13 matching lines...) Expand all
3358 0x00, 0x00, 0x10, // Length: 16 3319 0x00, 0x00, 0x10, // Length: 16
3359 0x01, // Type: HEADERS 3320 0x01, // Type: HEADERS
3360 0x00, // Flags: none 3321 0x00, // Flags: none
3361 0x00, 0x00, 0x00, 0x01, // Stream: 1 3322 0x00, 0x00, 0x00, 0x01, // Stream: 1
3362 0x00, 0x06, 0x63, 0x6f, // HPACK 3323 0x00, 0x06, 0x63, 0x6f, // HPACK
3363 0x6f, 0x6b, 0x69, 0x65, // 3324 0x6f, 0x6b, 0x69, 0x65, //
3364 0x07, 0x66, 0x6f, 0x6f, // 3325 0x07, 0x66, 0x6f, 0x6f, //
3365 0x3d, 0x62, 0x61, 0x72, // 3326 0x3d, 0x62, 0x61, 0x72, //
3366 }; 3327 };
3367 3328
3368 SpdyFramer framer; 3329 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3369 TestSpdyVisitor visitor; 3330 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3370 framer.set_visitor(&visitor); 3331 framer.set_visitor(&visitor);
3371 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3332 visitor.SimulateInFramer(kInput, sizeof(kInput));
3372 3333
3373 EXPECT_EQ(1, visitor.error_count_); 3334 EXPECT_EQ(1, visitor.error_count_);
3374 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code()) 3335 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, visitor.framer_.error_code())
3375 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 3336 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
3376 EXPECT_EQ(1, visitor.headers_frame_count_); 3337 EXPECT_EQ(1, visitor.headers_frame_count_);
3377 EXPECT_EQ(0, visitor.continuation_count_); 3338 EXPECT_EQ(0, visitor.continuation_count_);
3378 EXPECT_EQ(0u, visitor.header_buffer_length_); 3339 EXPECT_EQ(0u, visitor.header_buffer_length_);
3379 EXPECT_EQ(0, visitor.data_frame_count_); 3340 EXPECT_EQ(0, visitor.data_frame_count_);
3380 } 3341 }
3381 3342
3382 TEST_P(SpdyFramerTest, ReadGarbage) { 3343 TEST_P(SpdyFramerTest, ReadGarbage) {
3383 SpdyFramer framer; 3344 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3384 unsigned char garbage_frame[256]; 3345 unsigned char garbage_frame[256];
3385 memset(garbage_frame, ~0, sizeof(garbage_frame)); 3346 memset(garbage_frame, ~0, sizeof(garbage_frame));
3386 TestSpdyVisitor visitor; 3347 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3387 visitor.use_compression_ = false;
3388 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); 3348 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame));
3389 EXPECT_EQ(1, visitor.error_count_); 3349 EXPECT_EQ(1, visitor.error_count_);
3390 } 3350 }
3391 3351
3392 TEST_P(SpdyFramerTest, ReadUnknownExtensionFrame) { 3352 TEST_P(SpdyFramerTest, ReadUnknownExtensionFrame) {
3393 SpdyFramer framer; 3353 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3394 3354
3395 // The unrecognized frame type should still have a valid length. 3355 // The unrecognized frame type should still have a valid length.
3396 const unsigned char unknown_frame[] = { 3356 const unsigned char unknown_frame[] = {
3397 0x00, 0x00, 0x08, // Length: 8 3357 0x00, 0x00, 0x08, // Length: 8
3398 0xff, // Type: UnknownFrameType(255) 3358 0xff, // Type: UnknownFrameType(255)
3399 0xff, // Flags: 0xff 3359 0xff, // Flags: 0xff
3400 0xff, 0xff, 0xff, 0xff, // Stream: 0x7fffffff (R-bit set) 3360 0xff, 0xff, 0xff, 0xff, // Stream: 0x7fffffff (R-bit set)
3401 0xff, 0xff, 0xff, 0xff, // Payload 3361 0xff, 0xff, 0xff, 0xff, // Payload
3402 0xff, 0xff, 0xff, 0xff, // 3362 0xff, 0xff, 0xff, 0xff, //
3403 }; 3363 };
3404 TestSpdyVisitor visitor; 3364 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3405 3365
3406 // Simulate the case where the stream id validation checks out. 3366 // Simulate the case where the stream id validation checks out.
3407 visitor.on_unknown_frame_result_ = true; 3367 visitor.on_unknown_frame_result_ = true;
3408 visitor.use_compression_ = false;
3409 visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame)); 3368 visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame));
3410 EXPECT_EQ(0, visitor.error_count_); 3369 EXPECT_EQ(0, visitor.error_count_);
3411 3370
3412 // Follow it up with a valid control frame to make sure we handle 3371 // Follow it up with a valid control frame to make sure we handle
3413 // subsequent frames correctly. 3372 // subsequent frames correctly.
3414 SpdySettingsIR settings_ir; 3373 SpdySettingsIR settings_ir;
3415 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 3374 settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE,
3416 false, // persist 3375 false, // persist
3417 false, // persisted 3376 false, // persisted
3418 10); 3377 10);
3419 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); 3378 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
3420 visitor.SimulateInFramer( 3379 visitor.SimulateInFramer(
3421 reinterpret_cast<unsigned char*>(control_frame.data()), 3380 reinterpret_cast<unsigned char*>(control_frame.data()),
3422 control_frame.size()); 3381 control_frame.size());
3423 EXPECT_EQ(0, visitor.error_count_); 3382 EXPECT_EQ(0, visitor.error_count_);
3424 EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_)); 3383 EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_));
3425 EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_)); 3384 EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_));
3426 } 3385 }
3427 3386
3428 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) { 3387 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) {
3429 SpdyFramer framer; 3388 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3430 const unsigned char kFrameData[] = { 3389 const unsigned char kFrameData[] = {
3431 0x00, 0x00, 0x08, // Length: 8 3390 0x00, 0x00, 0x08, // Length: 8
3432 0xff, // Type: UnknownFrameType(255) 3391 0xff, // Type: UnknownFrameType(255)
3433 0xff, // Flags: 0xff 3392 0xff, // Flags: 0xff
3434 0xff, 0xff, 0xff, 0xff, // Stream: 0x7fffffff (R-bit set) 3393 0xff, 0xff, 0xff, 0xff, // Stream: 0x7fffffff (R-bit set)
3435 0xff, 0xff, 0xff, 0xff, // Payload 3394 0xff, 0xff, 0xff, 0xff, // Payload
3436 0xff, 0xff, 0xff, 0xff, // 3395 0xff, 0xff, 0xff, 0xff, //
3437 }; 3396 };
3438 TestSpdyVisitor visitor; 3397 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3439 visitor.use_compression_ = false;
3440 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData)); 3398 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData));
3441 EXPECT_EQ(1, visitor.error_count_); 3399 EXPECT_EQ(1, visitor.error_count_);
3442 } 3400 }
3443 3401
3444 TEST_P(SpdyFramerTest, ReadGarbageHPACKEncoding) { 3402 TEST_P(SpdyFramerTest, ReadGarbageHPACKEncoding) {
3445 const unsigned char kInput[] = { 3403 const unsigned char kInput[] = {
3446 0x00, 0x12, 0x01, // Length: 4609 3404 0x00, 0x12, 0x01, // Length: 4609
3447 0x04, // Type: SETTINGS 3405 0x04, // Type: SETTINGS
3448 0x00, // Flags: none 3406 0x00, // Flags: none
3449 0x00, 0x00, 0x01, 0xef, // Stream: 495 3407 0x00, 0x00, 0x01, 0xef, // Stream: 495
3450 0xef, 0xff, // Param: 61439 3408 0xef, 0xff, // Param: 61439
3451 0xff, 0xff, 0xff, 0xff, // Value: 4294967295 3409 0xff, 0xff, 0xff, 0xff, // Value: 4294967295
3452 0xff, 0xff, // Param: 0xffff 3410 0xff, 0xff, // Param: 0xffff
3453 0xff, 0xff, 0xff, 0xff, // Value: 4294967295 3411 0xff, 0xff, 0xff, 0xff, // Value: 4294967295
3454 0xff, 0xff, 0xff, 0xff, // Settings (Truncated) 3412 0xff, 0xff, 0xff, 0xff, // Settings (Truncated)
3455 0xff, // 3413 0xff, //
3456 }; 3414 };
3457 3415
3458 TestSpdyVisitor visitor; 3416 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
3459 visitor.SimulateInFramer(kInput, arraysize(kInput)); 3417 visitor.SimulateInFramer(kInput, arraysize(kInput));
3460 EXPECT_EQ(1, visitor.error_count_); 3418 EXPECT_EQ(1, visitor.error_count_);
3461 } 3419 }
3462 3420
3463 TEST_P(SpdyFramerTest, SizesTest) { 3421 TEST_P(SpdyFramerTest, SizesTest) {
3464 SpdyFramer framer; 3422 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3465 EXPECT_EQ(9u, framer.GetDataFrameMinimumSize()); 3423 EXPECT_EQ(9u, framer.GetDataFrameMinimumSize());
3466 EXPECT_EQ(9u, framer.GetFrameHeaderSize()); 3424 EXPECT_EQ(9u, framer.GetFrameHeaderSize());
3467 EXPECT_EQ(13u, framer.GetRstStreamMinimumSize()); 3425 EXPECT_EQ(13u, framer.GetRstStreamMinimumSize());
3468 EXPECT_EQ(9u, framer.GetSettingsMinimumSize()); 3426 EXPECT_EQ(9u, framer.GetSettingsMinimumSize());
3469 EXPECT_EQ(17u, framer.GetPingSize()); 3427 EXPECT_EQ(17u, framer.GetPingSize());
3470 EXPECT_EQ(17u, framer.GetGoAwayMinimumSize()); 3428 EXPECT_EQ(17u, framer.GetGoAwayMinimumSize());
3471 EXPECT_EQ(9u, framer.GetHeadersMinimumSize()); 3429 EXPECT_EQ(9u, framer.GetHeadersMinimumSize());
3472 EXPECT_EQ(13u, framer.GetWindowUpdateSize()); 3430 EXPECT_EQ(13u, framer.GetWindowUpdateSize());
3473 EXPECT_EQ(9u, framer.GetBlockedSize()); 3431 EXPECT_EQ(9u, framer.GetBlockedSize());
3474 EXPECT_EQ(13u, framer.GetPushPromiseMinimumSize()); 3432 EXPECT_EQ(13u, framer.GetPushPromiseMinimumSize());
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
3579 3537
3580 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { 3538 TEST_P(SpdyFramerTest, DataFrameFlagsV4) {
3581 uint8_t valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_PADDED; 3539 uint8_t valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_PADDED;
3582 3540
3583 uint8_t flags = 0; 3541 uint8_t flags = 0;
3584 do { 3542 do {
3585 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3543 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3586 << static_cast<int>(flags)); 3544 << static_cast<int>(flags));
3587 3545
3588 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3546 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3589 SpdyFramer framer; 3547 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3590 framer.set_visitor(&visitor); 3548 framer.set_visitor(&visitor);
3591 3549
3592 SpdyDataIR data_ir(1, "hello"); 3550 SpdyDataIR data_ir(1, "hello");
3593 SpdySerializedFrame frame(framer.SerializeData(data_ir)); 3551 SpdySerializedFrame frame(framer.SerializeData(data_ir));
3594 SetFrameFlags(&frame, flags); 3552 SetFrameFlags(&frame, flags);
3595 3553
3596 if (flags & ~valid_data_flags) { 3554 if (flags & ~valid_data_flags) {
3597 EXPECT_CALL(visitor, OnError(_)); 3555 EXPECT_CALL(visitor, OnError(_));
3598 } else { 3556 } else {
3599 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); 3557 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
(...skipping 28 matching lines...) Expand all
3628 } while (++flags != 0); 3586 } while (++flags != 0);
3629 } 3587 }
3630 3588
3631 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { 3589 TEST_P(SpdyFramerTest, RstStreamFrameFlags) {
3632 uint8_t flags = 0; 3590 uint8_t flags = 0;
3633 do { 3591 do {
3634 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3592 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3635 << static_cast<int>(flags)); 3593 << static_cast<int>(flags));
3636 3594
3637 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3595 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3638 SpdyFramer framer; 3596 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3639 framer.set_visitor(&visitor); 3597 framer.set_visitor(&visitor);
3640 3598
3641 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL); 3599 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL);
3642 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); 3600 SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream));
3643 SetFrameFlags(&frame, flags); 3601 SetFrameFlags(&frame, flags);
3644 3602
3645 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL)); 3603 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL));
3646 3604
3647 framer.ProcessInput(frame.data(), frame.size()); 3605 framer.ProcessInput(frame.data(), frame.size());
3648 3606
3649 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 3607 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
3650 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 3608 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
3651 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3609 << SpdyFramer::ErrorCodeToString(framer.error_code());
3652 } while (++flags != 0); 3610 } while (++flags != 0);
3653 } 3611 }
3654 3612
3655 TEST_P(SpdyFramerTest, SettingsFrameFlags) { 3613 TEST_P(SpdyFramerTest, SettingsFrameFlags) {
3656 uint8_t flags = 0; 3614 uint8_t flags = 0;
3657 do { 3615 do {
3658 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3616 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3659 << static_cast<int>(flags)); 3617 << static_cast<int>(flags));
3660 3618
3661 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3619 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3662 SpdyFramer framer; 3620 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3663 framer.set_visitor(&visitor); 3621 framer.set_visitor(&visitor);
3664 3622
3665 SpdySettingsIR settings_ir; 3623 SpdySettingsIR settings_ir;
3666 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 0, 16); 3624 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 0, 16);
3667 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); 3625 SpdySerializedFrame frame(framer.SerializeSettings(settings_ir));
3668 SetFrameFlags(&frame, flags); 3626 SetFrameFlags(&frame, flags);
3669 3627
3670 if (flags & SETTINGS_FLAG_ACK) { 3628 if (flags & SETTINGS_FLAG_ACK) {
3671 EXPECT_CALL(visitor, OnError(_)); 3629 EXPECT_CALL(visitor, OnError(_));
3672 } else { 3630 } else {
(...skipping 17 matching lines...) Expand all
3690 } while (++flags != 0); 3648 } while (++flags != 0);
3691 } 3649 }
3692 3650
3693 TEST_P(SpdyFramerTest, GoawayFrameFlags) { 3651 TEST_P(SpdyFramerTest, GoawayFrameFlags) {
3694 uint8_t flags = 0; 3652 uint8_t flags = 0;
3695 do { 3653 do {
3696 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3654 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3697 << static_cast<int>(flags)); 3655 << static_cast<int>(flags));
3698 3656
3699 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3657 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3700 SpdyFramer framer; 3658 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3701 framer.set_visitor(&visitor); 3659 framer.set_visitor(&visitor);
3702 3660
3703 SpdyGoAwayIR goaway_ir(97, GOAWAY_OK, "test"); 3661 SpdyGoAwayIR goaway_ir(97, GOAWAY_OK, "test");
3704 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); 3662 SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir));
3705 SetFrameFlags(&frame, flags); 3663 SetFrameFlags(&frame, flags);
3706 3664
3707 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK)); 3665 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK));
3708 3666
3709 framer.ProcessInput(frame.data(), frame.size()); 3667 framer.ProcessInput(frame.data(), frame.size());
3710 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 3668 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
3711 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 3669 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
3712 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3670 << SpdyFramer::ErrorCodeToString(framer.error_code());
3713 } while (++flags != 0); 3671 } while (++flags != 0);
3714 } 3672 }
3715 3673
3716 TEST_P(SpdyFramerTest, HeadersFrameFlags) { 3674 TEST_P(SpdyFramerTest, HeadersFrameFlags) {
3717 uint8_t flags = 0; 3675 uint8_t flags = 0;
3718 do { 3676 do {
3719 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3677 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3720 << static_cast<int>(flags)); 3678 << static_cast<int>(flags));
3721 3679
3722 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3680 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3723 SpdyFramer framer; 3681 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3724 framer.set_visitor(&visitor); 3682 framer.set_visitor(&visitor);
3725 3683
3726 SpdyHeadersIR headers_ir(57); 3684 SpdyHeadersIR headers_ir(57);
3727 if (flags & HEADERS_FLAG_PRIORITY) { 3685 if (flags & HEADERS_FLAG_PRIORITY) {
3728 headers_ir.set_weight(3); 3686 headers_ir.set_weight(3);
3729 headers_ir.set_has_priority(true); 3687 headers_ir.set_has_priority(true);
3730 headers_ir.set_parent_stream_id(5); 3688 headers_ir.set_parent_stream_id(5);
3731 headers_ir.set_exclusive(true); 3689 headers_ir.set_exclusive(true);
3732 } 3690 }
3733 headers_ir.SetHeader("foo", "bar"); 3691 headers_ir.SetHeader("foo", "bar");
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3770 } while (++flags != 0); 3728 } while (++flags != 0);
3771 } 3729 }
3772 3730
3773 TEST_P(SpdyFramerTest, PingFrameFlags) { 3731 TEST_P(SpdyFramerTest, PingFrameFlags) {
3774 uint8_t flags = 0; 3732 uint8_t flags = 0;
3775 do { 3733 do {
3776 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3734 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3777 << static_cast<int>(flags)); 3735 << static_cast<int>(flags));
3778 3736
3779 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3737 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3780 SpdyFramer framer; 3738 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3781 framer.set_visitor(&visitor); 3739 framer.set_visitor(&visitor);
3782 3740
3783 SpdySerializedFrame frame(framer.SerializePing(SpdyPingIR(42))); 3741 SpdySerializedFrame frame(framer.SerializePing(SpdyPingIR(42)));
3784 SetFrameFlags(&frame, flags); 3742 SetFrameFlags(&frame, flags);
3785 3743
3786 if (flags & PING_FLAG_ACK) { 3744 if (flags & PING_FLAG_ACK) {
3787 EXPECT_CALL(visitor, OnPing(42, true)); 3745 EXPECT_CALL(visitor, OnPing(42, true));
3788 } else { 3746 } else {
3789 EXPECT_CALL(visitor, OnPing(42, false)); 3747 EXPECT_CALL(visitor, OnPing(42, false));
3790 } 3748 }
3791 3749
3792 framer.ProcessInput(frame.data(), frame.size()); 3750 framer.ProcessInput(frame.data(), frame.size());
3793 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 3751 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
3794 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 3752 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
3795 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3753 << SpdyFramer::ErrorCodeToString(framer.error_code());
3796 } while (++flags != 0); 3754 } while (++flags != 0);
3797 } 3755 }
3798 3756
3799 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) { 3757 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) {
3800 uint8_t flags = 0; 3758 uint8_t flags = 0;
3801 do { 3759 do {
3802 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3760 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3803 << static_cast<int>(flags)); 3761 << static_cast<int>(flags));
3804 3762
3805 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3763 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3806 SpdyFramer framer; 3764 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3807 framer.set_visitor(&visitor); 3765 framer.set_visitor(&visitor);
3808 3766
3809 SpdySerializedFrame frame( 3767 SpdySerializedFrame frame(
3810 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(4, 1024))); 3768 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(4, 1024)));
3811 SetFrameFlags(&frame, flags); 3769 SetFrameFlags(&frame, flags);
3812 3770
3813 EXPECT_CALL(visitor, OnWindowUpdate(4, 1024)); 3771 EXPECT_CALL(visitor, OnWindowUpdate(4, 1024));
3814 3772
3815 framer.ProcessInput(frame.data(), frame.size()); 3773 framer.ProcessInput(frame.data(), frame.size());
3816 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 3774 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
3817 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 3775 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
3818 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3776 << SpdyFramer::ErrorCodeToString(framer.error_code());
3819 } while (++flags != 0); 3777 } while (++flags != 0);
3820 } 3778 }
3821 3779
3822 TEST_P(SpdyFramerTest, PushPromiseFrameFlags) { 3780 TEST_P(SpdyFramerTest, PushPromiseFrameFlags) {
3823 const SpdyStreamId client_id = 123; // Must be odd. 3781 const SpdyStreamId client_id = 123; // Must be odd.
3824 const SpdyStreamId promised_id = 22; // Must be even. 3782 const SpdyStreamId promised_id = 22; // Must be even.
3825 uint8_t flags = 0; 3783 uint8_t flags = 0;
3826 do { 3784 do {
3827 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3785 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3828 << static_cast<int>(flags)); 3786 << static_cast<int>(flags));
3829 3787
3830 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3788 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3831 testing::StrictMock<test::MockDebugVisitor> debug_visitor; 3789 testing::StrictMock<test::MockDebugVisitor> debug_visitor;
3832 SpdyFramer framer; 3790 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3833 framer.set_visitor(&visitor); 3791 framer.set_visitor(&visitor);
3834 framer.set_debug_visitor(&debug_visitor); 3792 framer.set_debug_visitor(&debug_visitor);
3835 3793
3836 EXPECT_CALL(debug_visitor, 3794 EXPECT_CALL(debug_visitor,
3837 OnSendCompressedFrame(client_id, PUSH_PROMISE, _, _)); 3795 OnSendCompressedFrame(client_id, PUSH_PROMISE, _, _));
3838 3796
3839 SpdyPushPromiseIR push_promise(client_id, promised_id); 3797 SpdyPushPromiseIR push_promise(client_id, promised_id);
3840 push_promise.SetHeader("foo", "bar"); 3798 push_promise.SetHeader("foo", "bar");
3841 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); 3799 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise));
3842 // TODO(jgraettinger): Add padding to SpdyPushPromiseIR, 3800 // TODO(jgraettinger): Add padding to SpdyPushPromiseIR,
(...skipping 17 matching lines...) Expand all
3860 } 3818 }
3861 3819
3862 TEST_P(SpdyFramerTest, ContinuationFrameFlags) { 3820 TEST_P(SpdyFramerTest, ContinuationFrameFlags) {
3863 uint8_t flags = 0; 3821 uint8_t flags = 0;
3864 do { 3822 do {
3865 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex 3823 SCOPED_TRACE(testing::Message() << "Flags " << flags << std::hex
3866 << static_cast<int>(flags)); 3824 << static_cast<int>(flags));
3867 3825
3868 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3826 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3869 testing::StrictMock<test::MockDebugVisitor> debug_visitor; 3827 testing::StrictMock<test::MockDebugVisitor> debug_visitor;
3870 SpdyFramer framer; 3828 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3871 framer.set_visitor(&visitor); 3829 framer.set_visitor(&visitor);
3872 framer.set_debug_visitor(&debug_visitor); 3830 framer.set_debug_visitor(&debug_visitor);
3873 3831
3874 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); 3832 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _));
3875 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); 3833 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _));
3876 EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false, false, false)); 3834 EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false, false, false));
3877 EXPECT_CALL(visitor, OnHeaderFrameStart(42)).Times(1); 3835 EXPECT_CALL(visitor, OnHeaderFrameStart(42)).Times(1);
3878 3836
3879 SpdyHeadersIR headers_ir(42); 3837 SpdyHeadersIR headers_ir(42);
3880 headers_ir.SetHeader("foo", "bar"); 3838 headers_ir.SetHeader("foo", "bar");
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3928 }; 3886 };
3929 const unsigned char kH2RstStreamNumStatusCodes[] = { 3887 const unsigned char kH2RstStreamNumStatusCodes[] = {
3930 0x00, 0x00, 0x04, // Length: 4 3888 0x00, 0x00, 0x04, // Length: 4
3931 0x03, // Type: RST_STREAM 3889 0x03, // Type: RST_STREAM
3932 0x00, // Flags: none 3890 0x00, // Flags: none
3933 0x00, 0x00, 0x00, 0x01, // Stream: 1 3891 0x00, 0x00, 0x00, 0x01, // Stream: 1
3934 0x00, 0x00, 0x00, 0xff, // Error: 255 3892 0x00, 0x00, 0x00, 0xff, // Error: 255
3935 }; 3893 };
3936 3894
3937 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3895 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3938 SpdyFramer framer; 3896 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3939 framer.set_visitor(&visitor); 3897 framer.set_visitor(&visitor);
3940 3898
3941 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_NO_ERROR)); 3899 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_NO_ERROR));
3942 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid), 3900 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid),
3943 arraysize(kH2RstStreamInvalid)); 3901 arraysize(kH2RstStreamInvalid));
3944 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 3902 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
3945 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 3903 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
3946 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3904 << SpdyFramer::ErrorCodeToString(framer.error_code());
3947 3905
3948 framer.Reset(); 3906 framer.Reset();
3949 3907
3950 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INTERNAL_ERROR)); 3908 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INTERNAL_ERROR));
3951 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes), 3909 framer.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes),
3952 arraysize(kH2RstStreamNumStatusCodes)); 3910 arraysize(kH2RstStreamNumStatusCodes));
3953 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 3911 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
3954 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 3912 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
3955 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3913 << SpdyFramer::ErrorCodeToString(framer.error_code());
3956 } 3914 }
3957 3915
3958 // Test handling of GOAWAY frames with out-of-bounds status code. 3916 // Test handling of GOAWAY frames with out-of-bounds status code.
3959 TEST_P(SpdyFramerTest, GoAwayStatusBounds) { 3917 TEST_P(SpdyFramerTest, GoAwayStatusBounds) {
3960 SpdyFramer framer; 3918 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3961 const unsigned char kH2FrameData[] = { 3919 const unsigned char kH2FrameData[] = {
3962 0x00, 0x00, 0x0a, // Length: 10 3920 0x00, 0x00, 0x0a, // Length: 10
3963 0x07, // Type: GOAWAY 3921 0x07, // Type: GOAWAY
3964 0x00, // Flags: none 3922 0x00, // Flags: none
3965 0x00, 0x00, 0x00, 0x00, // Stream: 0 3923 0x00, 0x00, 0x00, 0x00, // Stream: 0
3966 0x00, 0x00, 0x00, 0x01, // Last: 1 3924 0x00, 0x00, 0x00, 0x01, // Last: 1
3967 0xff, 0xff, 0xff, 0xff, // Error: 0xffffffff 3925 0xff, 0xff, 0xff, 0xff, // Error: 0xffffffff
3968 0x47, 0x41, // Description 3926 0x47, 0x41, // Description
3969 }; 3927 };
3970 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3928 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
(...skipping 12 matching lines...) Expand all
3983 const unsigned char kH2FrameData[] = { 3941 const unsigned char kH2FrameData[] = {
3984 0x00, 0x00, 0x08, // Length: 8 3942 0x00, 0x00, 0x08, // Length: 8
3985 0x07, // Type: GOAWAY 3943 0x07, // Type: GOAWAY
3986 0x00, // Flags: none 3944 0x00, // Flags: none
3987 0x00, 0x00, 0x00, 0x00, // Stream: 0 3945 0x00, 0x00, 0x00, 0x00, // Stream: 0
3988 0xff, 0xff, 0xff, 0xff, // Last: 0x7fffffff (R-bit set) 3946 0xff, 0xff, 0xff, 0xff, // Last: 0x7fffffff (R-bit set)
3989 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR 3947 0x00, 0x00, 0x00, 0x00, // Error: NO_ERROR
3990 }; 3948 };
3991 3949
3992 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3950 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3993 SpdyFramer framer; 3951 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
3994 framer.set_visitor(&visitor); 3952 framer.set_visitor(&visitor);
3995 3953
3996 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_OK)); 3954 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_OK));
3997 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), 3955 framer.ProcessInput(reinterpret_cast<const char*>(kH2FrameData),
3998 arraysize(kH2FrameData)); 3956 arraysize(kH2FrameData));
3999 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 3957 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4000 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 3958 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4001 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3959 << SpdyFramer::ErrorCodeToString(framer.error_code());
4002 } 3960 }
4003 3961
4004 TEST_P(SpdyFramerTest, OnBlocked) { 3962 TEST_P(SpdyFramerTest, OnBlocked) {
4005 const SpdyStreamId kStreamId = 0; 3963 const SpdyStreamId kStreamId = 0;
4006 3964
4007 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3965 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4008 SpdyFramer framer; 3966 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4009 framer.set_visitor(&visitor); 3967 framer.set_visitor(&visitor);
4010 3968
4011 EXPECT_CALL(visitor, OnBlocked(kStreamId)); 3969 EXPECT_CALL(visitor, OnBlocked(kStreamId));
4012 3970
4013 SpdyBlockedIR blocked_ir(0); 3971 SpdyBlockedIR blocked_ir(0);
4014 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir)); 3972 SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir));
4015 framer.ProcessInput(frame.data(), framer.GetBlockedSize()); 3973 framer.ProcessInput(frame.data(), framer.GetBlockedSize());
4016 3974
4017 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 3975 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4018 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 3976 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4019 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3977 << SpdyFramer::ErrorCodeToString(framer.error_code());
4020 } 3978 }
4021 3979
4022 TEST_P(SpdyFramerTest, OnAltSvc) { 3980 TEST_P(SpdyFramerTest, OnAltSvc) {
4023 const SpdyStreamId kStreamId = 1; 3981 const SpdyStreamId kStreamId = 1;
4024 3982
4025 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 3983 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4026 SpdyFramer framer; 3984 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4027 framer.set_visitor(&visitor); 3985 framer.set_visitor(&visitor);
4028 3986
4029 SpdyAltSvcWireFormat::AlternativeService altsvc1( 3987 SpdyAltSvcWireFormat::AlternativeService altsvc1(
4030 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()); 3988 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector());
4031 SpdyAltSvcWireFormat::AlternativeService altsvc2( 3989 SpdyAltSvcWireFormat::AlternativeService altsvc2(
4032 "p\"=i:d", "h_\\o\"st", 123, 42, SpdyAltSvcWireFormat::VersionVector{24}); 3990 "p\"=i:d", "h_\\o\"st", 123, 42, SpdyAltSvcWireFormat::VersionVector{24});
4033 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; 3991 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
4034 altsvc_vector.push_back(altsvc1); 3992 altsvc_vector.push_back(altsvc1);
4035 altsvc_vector.push_back(altsvc2); 3993 altsvc_vector.push_back(altsvc2);
4036 EXPECT_CALL(visitor, 3994 EXPECT_CALL(visitor,
4037 OnAltSvc(kStreamId, StringPiece("o_r|g!n"), altsvc_vector)); 3995 OnAltSvc(kStreamId, StringPiece("o_r|g!n"), altsvc_vector));
4038 3996
4039 SpdyAltSvcIR altsvc_ir(1); 3997 SpdyAltSvcIR altsvc_ir(1);
4040 altsvc_ir.set_origin("o_r|g!n"); 3998 altsvc_ir.set_origin("o_r|g!n");
4041 altsvc_ir.add_altsvc(altsvc1); 3999 altsvc_ir.add_altsvc(altsvc1);
4042 altsvc_ir.add_altsvc(altsvc2); 4000 altsvc_ir.add_altsvc(altsvc2);
4043 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); 4001 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
4044 framer.ProcessInput(frame.data(), frame.size()); 4002 framer.ProcessInput(frame.data(), frame.size());
4045 4003
4046 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4004 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4047 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4005 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4048 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4006 << SpdyFramer::ErrorCodeToString(framer.error_code());
4049 } 4007 }
4050 4008
4051 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) { 4009 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) {
4052 const SpdyStreamId kStreamId = 1; 4010 const SpdyStreamId kStreamId = 1;
4053 4011
4054 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4012 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4055 SpdyFramer framer; 4013 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4056 framer.set_visitor(&visitor); 4014 framer.set_visitor(&visitor);
4057 4015
4058 SpdyAltSvcWireFormat::AlternativeService altsvc1( 4016 SpdyAltSvcWireFormat::AlternativeService altsvc1(
4059 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()); 4017 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector());
4060 SpdyAltSvcWireFormat::AlternativeService altsvc2( 4018 SpdyAltSvcWireFormat::AlternativeService altsvc2(
4061 "p\"=i:d", "h_\\o\"st", 123, 42, SpdyAltSvcWireFormat::VersionVector{24}); 4019 "p\"=i:d", "h_\\o\"st", 123, 42, SpdyAltSvcWireFormat::VersionVector{24});
4062 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; 4020 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
4063 altsvc_vector.push_back(altsvc1); 4021 altsvc_vector.push_back(altsvc1);
4064 altsvc_vector.push_back(altsvc2); 4022 altsvc_vector.push_back(altsvc2);
4065 EXPECT_CALL(visitor, OnAltSvc(kStreamId, StringPiece(""), altsvc_vector)); 4023 EXPECT_CALL(visitor, OnAltSvc(kStreamId, StringPiece(""), altsvc_vector));
4066 4024
4067 SpdyAltSvcIR altsvc_ir(1); 4025 SpdyAltSvcIR altsvc_ir(1);
4068 altsvc_ir.add_altsvc(altsvc1); 4026 altsvc_ir.add_altsvc(altsvc1);
4069 altsvc_ir.add_altsvc(altsvc2); 4027 altsvc_ir.add_altsvc(altsvc2);
4070 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); 4028 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
4071 framer.ProcessInput(frame.data(), frame.size()); 4029 framer.ProcessInput(frame.data(), frame.size());
4072 4030
4073 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4031 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4074 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4032 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4075 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4033 << SpdyFramer::ErrorCodeToString(framer.error_code());
4076 } 4034 }
4077 4035
4078 TEST_P(SpdyFramerTest, OnAltSvcEmptyProtocolId) { 4036 TEST_P(SpdyFramerTest, OnAltSvcEmptyProtocolId) {
4079 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4037 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4080 SpdyFramer framer; 4038 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4081 framer.set_visitor(&visitor); 4039 framer.set_visitor(&visitor);
4082 4040
4083 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); 4041 EXPECT_CALL(visitor, OnError(testing::Eq(&framer)));
4084 4042
4085 SpdyAltSvcIR altsvc_ir(1); 4043 SpdyAltSvcIR altsvc_ir(1);
4086 altsvc_ir.set_origin("o1"); 4044 altsvc_ir.set_origin("o1");
4087 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( 4045 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService(
4088 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); 4046 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()));
4089 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( 4047 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService(
4090 "", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector())); 4048 "", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector()));
4091 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); 4049 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
4092 framer.ProcessInput(frame.data(), frame.size()); 4050 framer.ProcessInput(frame.data(), frame.size());
4093 4051
4094 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4052 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4095 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) 4053 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code())
4096 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4054 << SpdyFramer::ErrorCodeToString(framer.error_code());
4097 } 4055 }
4098 4056
4099 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { 4057 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) {
4100 const SpdyStreamId kStreamId = 1; 4058 const SpdyStreamId kStreamId = 1;
4101 4059
4102 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4060 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4103 SpdyFramer framer; 4061 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4104 framer.set_visitor(&visitor); 4062 framer.set_visitor(&visitor);
4105 4063
4106 SpdyAltSvcWireFormat::AlternativeService altsvc( 4064 SpdyAltSvcWireFormat::AlternativeService altsvc(
4107 "pid", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector()); 4065 "pid", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector());
4108 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; 4066 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
4109 altsvc_vector.push_back(altsvc); 4067 altsvc_vector.push_back(altsvc);
4110 EXPECT_CALL(visitor, OnAltSvc(kStreamId, StringPiece("o1"), altsvc_vector)); 4068 EXPECT_CALL(visitor, OnAltSvc(kStreamId, StringPiece("o1"), altsvc_vector));
4111 4069
4112 SpdyAltSvcIR altsvc_ir(1); 4070 SpdyAltSvcIR altsvc_ir(1);
4113 altsvc_ir.set_origin("o1"); 4071 altsvc_ir.set_origin("o1");
4114 altsvc_ir.add_altsvc(altsvc); 4072 altsvc_ir.add_altsvc(altsvc);
4115 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); 4073 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir));
4116 framer.ProcessInput(frame.data(), frame.size()); 4074 framer.ProcessInput(frame.data(), frame.size());
4117 4075
4118 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4076 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4119 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4077 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4120 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4078 << SpdyFramer::ErrorCodeToString(framer.error_code());
4121 } 4079 }
4122 4080
4123 // Tests handling of ALTSVC frames delivered in small chunks. 4081 // Tests handling of ALTSVC frames delivered in small chunks.
4124 TEST_P(SpdyFramerTest, ReadChunkedAltSvcFrame) { 4082 TEST_P(SpdyFramerTest, ReadChunkedAltSvcFrame) {
4125 SpdyFramer framer; 4083 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4126 SpdyAltSvcIR altsvc_ir(1); 4084 SpdyAltSvcIR altsvc_ir(1);
4127 SpdyAltSvcWireFormat::AlternativeService altsvc1( 4085 SpdyAltSvcWireFormat::AlternativeService altsvc1(
4128 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()); 4086 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector());
4129 SpdyAltSvcWireFormat::AlternativeService altsvc2( 4087 SpdyAltSvcWireFormat::AlternativeService altsvc2(
4130 "p\"=i:d", "h_\\o\"st", 123, 42, SpdyAltSvcWireFormat::VersionVector{24}); 4088 "p\"=i:d", "h_\\o\"st", 123, 42, SpdyAltSvcWireFormat::VersionVector{24});
4131 altsvc_ir.add_altsvc(altsvc1); 4089 altsvc_ir.add_altsvc(altsvc1);
4132 altsvc_ir.add_altsvc(altsvc2); 4090 altsvc_ir.add_altsvc(altsvc2);
4133 4091
4134 SpdySerializedFrame control_frame(framer.SerializeAltSvc(altsvc_ir)); 4092 SpdySerializedFrame control_frame(framer.SerializeAltSvc(altsvc_ir));
4135 TestSpdyVisitor visitor; 4093 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
4136 visitor.use_compression_ = false;
4137 4094
4138 // Read data in small chunks. 4095 // Read data in small chunks.
4139 size_t framed_data = 0; 4096 size_t framed_data = 0;
4140 size_t unframed_data = control_frame.size(); 4097 size_t unframed_data = control_frame.size();
4141 size_t kReadChunkSize = 5; // Read five bytes at a time. 4098 size_t kReadChunkSize = 5; // Read five bytes at a time.
4142 while (unframed_data > 0) { 4099 while (unframed_data > 0) {
4143 size_t to_read = std::min(kReadChunkSize, unframed_data); 4100 size_t to_read = std::min(kReadChunkSize, unframed_data);
4144 visitor.SimulateInFramer( 4101 visitor.SimulateInFramer(
4145 reinterpret_cast<unsigned char*>(control_frame.data() + framed_data), 4102 reinterpret_cast<unsigned char*>(control_frame.data() + framed_data),
4146 to_read); 4103 to_read);
4147 unframed_data -= to_read; 4104 unframed_data -= to_read;
4148 framed_data += to_read; 4105 framed_data += to_read;
4149 } 4106 }
4150 EXPECT_EQ(0, visitor.error_count_); 4107 EXPECT_EQ(0, visitor.error_count_);
4151 EXPECT_EQ(1, visitor.altsvc_count_); 4108 EXPECT_EQ(1, visitor.altsvc_count_);
4152 ASSERT_EQ(2u, visitor.test_altsvc_ir_.altsvc_vector().size()); 4109 ASSERT_EQ(2u, visitor.test_altsvc_ir_.altsvc_vector().size());
4153 EXPECT_TRUE(visitor.test_altsvc_ir_.altsvc_vector()[0] == altsvc1); 4110 EXPECT_TRUE(visitor.test_altsvc_ir_.altsvc_vector()[0] == altsvc1);
4154 EXPECT_TRUE(visitor.test_altsvc_ir_.altsvc_vector()[1] == altsvc2); 4111 EXPECT_TRUE(visitor.test_altsvc_ir_.altsvc_vector()[1] == altsvc2);
4155 } 4112 }
4156 4113
4157 // Tests handling of PRIORITY frames. 4114 // Tests handling of PRIORITY frames.
4158 TEST_P(SpdyFramerTest, ReadPriority) { 4115 TEST_P(SpdyFramerTest, ReadPriority) {
4159 SpdyFramer framer; 4116 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4160 SpdyPriorityIR priority(3, 1, 256, false); 4117 SpdyPriorityIR priority(3, 1, 256, false);
4161 SpdySerializedFrame frame(framer.SerializePriority(priority)); 4118 SpdySerializedFrame frame(framer.SerializePriority(priority));
4162 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4119 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4163 framer.set_visitor(&visitor); 4120 framer.set_visitor(&visitor);
4164 EXPECT_CALL(visitor, OnPriority(3, 1, 256, false)); 4121 EXPECT_CALL(visitor, OnPriority(3, 1, 256, false));
4165 framer.ProcessInput(frame.data(), frame.size()); 4122 framer.ProcessInput(frame.data(), frame.size());
4166 4123
4167 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4124 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4168 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4125 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4169 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4126 << SpdyFramer::ErrorCodeToString(framer.error_code());
4170 // TODO(mlavan): once we actually maintain a priority tree, 4127 // TODO(mlavan): once we actually maintain a priority tree,
4171 // check that state is adjusted correctly. 4128 // check that state is adjusted correctly.
4172 } 4129 }
4173 4130
4174 // Tests handling of PRIORITY frame with incorrect size. 4131 // Tests handling of PRIORITY frame with incorrect size.
4175 TEST_P(SpdyFramerTest, ReadIncorrectlySizedPriority) { 4132 TEST_P(SpdyFramerTest, ReadIncorrectlySizedPriority) {
4176 // PRIORITY frame of size 4, which isn't correct. 4133 // PRIORITY frame of size 4, which isn't correct.
4177 const unsigned char kFrameData[] = { 4134 const unsigned char kFrameData[] = {
4178 0x00, 0x00, 0x04, // Length: 4 4135 0x00, 0x00, 0x04, // Length: 4
4179 0x02, // Type: PRIORITY 4136 0x02, // Type: PRIORITY
4180 0x00, // Flags: none 4137 0x00, // Flags: none
4181 0x00, 0x00, 0x00, 0x03, // Stream: 3 4138 0x00, 0x00, 0x00, 0x03, // Stream: 3
4182 0x00, 0x00, 0x00, 0x01, // Priority (Truncated) 4139 0x00, 0x00, 0x00, 0x01, // Priority (Truncated)
4183 }; 4140 };
4184 4141
4185 TestSpdyVisitor visitor; 4142 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
4186 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); 4143 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData));
4187 4144
4188 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); 4145 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state());
4189 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE, 4146 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE,
4190 visitor.framer_.error_code()) 4147 visitor.framer_.error_code())
4191 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 4148 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
4192 } 4149 }
4193 4150
4194 // Tests handling of PING frame with incorrect size. 4151 // Tests handling of PING frame with incorrect size.
4195 TEST_P(SpdyFramerTest, ReadIncorrectlySizedPing) { 4152 TEST_P(SpdyFramerTest, ReadIncorrectlySizedPing) {
4196 // PING frame of size 4, which isn't correct. 4153 // PING frame of size 4, which isn't correct.
4197 const unsigned char kFrameData[] = { 4154 const unsigned char kFrameData[] = {
4198 0x00, 0x00, 0x04, // Length: 4 4155 0x00, 0x00, 0x04, // Length: 4
4199 0x06, // Type: PING 4156 0x06, // Type: PING
4200 0x00, // Flags: none 4157 0x00, // Flags: none
4201 0x00, 0x00, 0x00, 0x00, // Stream: 0 4158 0x00, 0x00, 0x00, 0x00, // Stream: 0
4202 0x00, 0x00, 0x00, 0x01, // Ping (Truncated) 4159 0x00, 0x00, 0x00, 0x01, // Ping (Truncated)
4203 }; 4160 };
4204 4161
4205 TestSpdyVisitor visitor; 4162 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
4206 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); 4163 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData));
4207 4164
4208 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); 4165 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state());
4209 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE, 4166 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE,
4210 visitor.framer_.error_code()) 4167 visitor.framer_.error_code())
4211 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 4168 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
4212 } 4169 }
4213 4170
4214 // Tests handling of WINDOW_UPDATE frame with incorrect size. 4171 // Tests handling of WINDOW_UPDATE frame with incorrect size.
4215 TEST_P(SpdyFramerTest, ReadIncorrectlySizedWindowUpdate) { 4172 TEST_P(SpdyFramerTest, ReadIncorrectlySizedWindowUpdate) {
4216 // WINDOW_UPDATE frame of size 3, which isn't correct. 4173 // WINDOW_UPDATE frame of size 3, which isn't correct.
4217 const unsigned char kFrameData[] = { 4174 const unsigned char kFrameData[] = {
4218 0x00, 0x00, 0x03, // Length: 3 4175 0x00, 0x00, 0x03, // Length: 3
4219 0x08, // Type: WINDOW_UPDATE 4176 0x08, // Type: WINDOW_UPDATE
4220 0x00, // Flags: none 4177 0x00, // Flags: none
4221 0x00, 0x00, 0x00, 0x03, // Stream: 3 4178 0x00, 0x00, 0x00, 0x03, // Stream: 3
4222 0x00, 0x00, 0x01, // WindowUpdate (Truncated) 4179 0x00, 0x00, 0x01, // WindowUpdate (Truncated)
4223 }; 4180 };
4224 4181
4225 TestSpdyVisitor visitor; 4182 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
4226 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); 4183 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData));
4227 4184
4228 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); 4185 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state());
4229 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE, 4186 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE,
4230 visitor.framer_.error_code()) 4187 visitor.framer_.error_code())
4231 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 4188 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
4232 } 4189 }
4233 4190
4234 // Tests handling of RST_STREAM frame with incorrect size. 4191 // Tests handling of RST_STREAM frame with incorrect size.
4235 TEST_P(SpdyFramerTest, ReadIncorrectlySizedRstStream) { 4192 TEST_P(SpdyFramerTest, ReadIncorrectlySizedRstStream) {
4236 // RST_STREAM frame of size 3, which isn't correct. 4193 // RST_STREAM frame of size 3, which isn't correct.
4237 const unsigned char kFrameData[] = { 4194 const unsigned char kFrameData[] = {
4238 0x00, 0x00, 0x03, // Length: 3 4195 0x00, 0x00, 0x03, // Length: 3
4239 0x03, // Type: RST_STREAM 4196 0x03, // Type: RST_STREAM
4240 0x00, // Flags: none 4197 0x00, // Flags: none
4241 0x00, 0x00, 0x00, 0x03, // Stream: 3 4198 0x00, 0x00, 0x00, 0x03, // Stream: 3
4242 0x00, 0x00, 0x01, // RstStream (Truncated) 4199 0x00, 0x00, 0x01, // RstStream (Truncated)
4243 }; 4200 };
4244 4201
4245 TestSpdyVisitor visitor; 4202 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
4246 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); 4203 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData));
4247 4204
4248 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); 4205 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state());
4249 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE, 4206 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_SIZE,
4250 visitor.framer_.error_code()) 4207 visitor.framer_.error_code())
4251 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); 4208 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code());
4252 } 4209 }
4253 4210
4254 // Test that SpdyFramer processes, by default, all passed input in one call 4211 // Test that SpdyFramer processes, by default, all passed input in one call
4255 // to ProcessInput (i.e. will not be calling set_process_single_input_frame()). 4212 // to ProcessInput (i.e. will not be calling set_process_single_input_frame()).
4256 TEST_P(SpdyFramerTest, ProcessAllInput) { 4213 TEST_P(SpdyFramerTest, ProcessAllInput) {
4257 SpdyFramer framer; 4214 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4258 std::unique_ptr<TestSpdyVisitor> visitor(new TestSpdyVisitor); 4215 std::unique_ptr<TestSpdyVisitor> visitor(
4216 new TestSpdyVisitor(SpdyFramer::DISABLE_COMPRESSION));
4259 framer.set_visitor(visitor.get()); 4217 framer.set_visitor(visitor.get());
4260 4218
4261 // Create two input frames. 4219 // Create two input frames.
4262 SpdyHeadersIR headers(1); 4220 SpdyHeadersIR headers(1);
4263 headers.SetHeader("alpha", "beta"); 4221 headers.SetHeader("alpha", "beta");
4264 headers.SetHeader("gamma", "charlie"); 4222 headers.SetHeader("gamma", "charlie");
4265 headers.SetHeader("cookie", "key1=value1; key2=value2"); 4223 headers.SetHeader("cookie", "key1=value1; key2=value2");
4266 SpdySerializedFrame headers_frame( 4224 SpdySerializedFrame headers_frame(
4267 SpdyFramerPeer::SerializeHeaders(&framer, headers)); 4225 SpdyFramerPeer::SerializeHeaders(&framer, headers));
4268 4226
(...skipping 27 matching lines...) Expand all
4296 EXPECT_EQ(1, visitor->headers_frame_count_); 4254 EXPECT_EQ(1, visitor->headers_frame_count_);
4297 EXPECT_EQ(1, visitor->data_frame_count_); 4255 EXPECT_EQ(1, visitor->data_frame_count_);
4298 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); 4256 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));
4299 } 4257 }
4300 4258
4301 // Test that SpdyFramer stops after processing a full frame if 4259 // Test that SpdyFramer stops after processing a full frame if
4302 // process_single_input_frame is set. Input to ProcessInput has two frames, but 4260 // process_single_input_frame is set. Input to ProcessInput has two frames, but
4303 // only processes the first when we give it the first frame split at any point, 4261 // only processes the first when we give it the first frame split at any point,
4304 // or give it more than one frame in the input buffer. 4262 // or give it more than one frame in the input buffer.
4305 TEST_P(SpdyFramerTest, ProcessAtMostOneFrame) { 4263 TEST_P(SpdyFramerTest, ProcessAtMostOneFrame) {
4306 SpdyFramer framer; 4264 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
4307 framer.set_process_single_input_frame(true); 4265 framer.set_process_single_input_frame(true);
4308 std::unique_ptr<TestSpdyVisitor> visitor; 4266 std::unique_ptr<TestSpdyVisitor> visitor;
4309 4267
4310 // Create two input frames. 4268 // Create two input frames.
4311 const char four_score[] = "Four score and ..."; 4269 const char four_score[] = "Four score and ...";
4312 SpdyDataIR four_score_ir(1, four_score); 4270 SpdyDataIR four_score_ir(1, four_score);
4313 SpdySerializedFrame four_score_frame(framer.SerializeData(four_score_ir)); 4271 SpdySerializedFrame four_score_frame(framer.SerializeData(four_score_ir));
4314 4272
4315 SpdyHeadersIR headers(2); 4273 SpdyHeadersIR headers(2);
4316 headers.SetHeader("alpha", "beta"); 4274 headers.SetHeader("alpha", "beta");
(...skipping 17 matching lines...) Expand all
4334 input_buffer.append(frame1.data(), frame1_size); 4292 input_buffer.append(frame1.data(), frame1_size);
4335 input_buffer.append(frame2.data(), frame2_size); 4293 input_buffer.append(frame2.data(), frame2_size);
4336 4294
4337 const char* buf = input_buffer.data(); 4295 const char* buf = input_buffer.data();
4338 const size_t buf_size = input_buffer.size(); 4296 const size_t buf_size = input_buffer.size();
4339 4297
4340 VLOG(1) << "buf_size = " << buf_size; 4298 VLOG(1) << "buf_size = " << buf_size;
4341 4299
4342 for (size_t first_size = 0; first_size <= buf_size; ++first_size) { 4300 for (size_t first_size = 0; first_size <= buf_size; ++first_size) {
4343 VLOG(1) << "first_size = " << first_size; 4301 VLOG(1) << "first_size = " << first_size;
4344 visitor.reset(new TestSpdyVisitor); 4302 visitor.reset(new TestSpdyVisitor(SpdyFramer::DISABLE_COMPRESSION));
4345 framer.set_visitor(visitor.get()); 4303 framer.set_visitor(visitor.get());
4346 4304
4347 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4305 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4348 4306
4349 size_t processed_first = framer.ProcessInput(buf, first_size); 4307 size_t processed_first = framer.ProcessInput(buf, first_size);
4350 if (first_size < frame1_size) { 4308 if (first_size < frame1_size) {
4351 EXPECT_EQ(first_size, processed_first); 4309 EXPECT_EQ(first_size, processed_first);
4352 4310
4353 if (first_size == 0) { 4311 if (first_size == 0) {
4354 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4312 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
(...skipping 22 matching lines...) Expand all
4377 4335
4378 EXPECT_EQ(1, visitor->data_frame_count_); 4336 EXPECT_EQ(1, visitor->data_frame_count_);
4379 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); 4337 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));
4380 EXPECT_EQ(0, visitor->headers_frame_count_); 4338 EXPECT_EQ(0, visitor->headers_frame_count_);
4381 } 4339 }
4382 } 4340 }
4383 4341
4384 } // namespace test 4342 } // namespace test
4385 4343
4386 } // namespace net 4344 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer_decoder_adapter.cc ('k') | net/spdy/spdy_test_util_common.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698