| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/spdy_framer.h" | 5 #include "net/spdy/spdy_framer.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 } | 311 } |
| 312 | 312 |
| 313 void OnStreamFrameData(SpdyStreamId stream_id, | 313 void OnStreamFrameData(SpdyStreamId stream_id, |
| 314 const char* data, | 314 const char* data, |
| 315 size_t len, | 315 size_t len, |
| 316 bool fin) override { | 316 bool fin) override { |
| 317 VLOG(1) << "OnStreamFrameData(" << stream_id << ", data, " << len << ", " | 317 VLOG(1) << "OnStreamFrameData(" << stream_id << ", data, " << len << ", " |
| 318 << fin << ") data:\n" | 318 << fin << ") data:\n" |
| 319 << base::HexEncode(data, len); | 319 << base::HexEncode(data, len); |
| 320 EXPECT_EQ(header_stream_id_, stream_id); | 320 EXPECT_EQ(header_stream_id_, stream_id); |
| 321 if (!FLAGS_spdy_on_stream_end) { | |
| 322 if (len == 0) { | |
| 323 ++end_of_stream_count_; | |
| 324 } | |
| 325 } | |
| 326 | |
| 327 data_bytes_ += len; | 321 data_bytes_ += len; |
| 328 } | 322 } |
| 329 | 323 |
| 330 void OnStreamEnd(SpdyStreamId stream_id) override { | 324 void OnStreamEnd(SpdyStreamId stream_id) override { |
| 331 VLOG(1) << "OnStreamEnd(" << stream_id << ")"; | 325 VLOG(1) << "OnStreamEnd(" << stream_id << ")"; |
| 332 EXPECT_EQ(header_stream_id_, stream_id); | 326 EXPECT_EQ(header_stream_id_, stream_id); |
| 333 ++end_of_stream_count_; | 327 ++end_of_stream_count_; |
| 334 } | 328 } |
| 335 | 329 |
| 336 void OnStreamPadding(SpdyStreamId stream_id, size_t len) override { | 330 void OnStreamPadding(SpdyStreamId stream_id, size_t len) override { |
| (...skipping 4254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4591 EXPECT_CALL(visitor, OnError(_)); | 4585 EXPECT_CALL(visitor, OnError(_)); |
| 4592 framer.ProcessInput("HTTP/1.0", 8); | 4586 framer.ProcessInput("HTTP/1.0", 8); |
| 4593 EXPECT_TRUE(framer.probable_http_response()); | 4587 EXPECT_TRUE(framer.probable_http_response()); |
| 4594 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 4588 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
| 4595 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) | 4589 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) |
| 4596 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4590 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4597 } | 4591 } |
| 4598 } | 4592 } |
| 4599 | 4593 |
| 4600 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) { | 4594 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) { |
| 4601 FLAGS_spdy_on_stream_end = true; | |
| 4602 | |
| 4603 if (!IsSpdy3()) { | 4595 if (!IsSpdy3()) { |
| 4604 return; | 4596 return; |
| 4605 } | 4597 } |
| 4606 | 4598 |
| 4607 uint8_t flags = 0; | 4599 uint8_t flags = 0; |
| 4608 do { | 4600 do { |
| 4609 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4601 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 4610 | 4602 |
| 4611 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4603 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 4612 SpdyFramer framer(spdy_version_); | 4604 SpdyFramer framer(spdy_version_); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 4632 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) | 4624 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) |
| 4633 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4625 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4634 } else { | 4626 } else { |
| 4635 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4627 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 4636 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4628 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 4637 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4629 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4638 } | 4630 } |
| 4639 } while (++flags != 0); | 4631 } while (++flags != 0); |
| 4640 } | 4632 } |
| 4641 | 4633 |
| 4642 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3disabled) { | |
| 4643 FLAGS_spdy_on_stream_end = false; | |
| 4644 | |
| 4645 if (!IsSpdy3()) { | |
| 4646 return; | |
| 4647 } | |
| 4648 | |
| 4649 uint8_t flags = 0; | |
| 4650 do { | |
| 4651 SCOPED_TRACE(testing::Message() << "Flags " << flags); | |
| 4652 | |
| 4653 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | |
| 4654 SpdyFramer framer(spdy_version_); | |
| 4655 framer.set_visitor(&visitor); | |
| 4656 | |
| 4657 SpdyDataIR data_ir(1, "hello"); | |
| 4658 SpdySerializedFrame frame(framer.SerializeData(data_ir)); | |
| 4659 SetFrameFlags(&frame, flags, spdy_version_); | |
| 4660 | |
| 4661 if (flags & ~DATA_FLAG_FIN) { | |
| 4662 EXPECT_CALL(visitor, OnError(_)); | |
| 4663 } else { | |
| 4664 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); | |
| 4665 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); | |
| 4666 if (flags & DATA_FLAG_FIN) { | |
| 4667 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); | |
| 4668 } | |
| 4669 } | |
| 4670 | |
| 4671 framer.ProcessInput(frame.data(), frame.size()); | |
| 4672 if (flags & ~DATA_FLAG_FIN) { | |
| 4673 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | |
| 4674 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, | |
| 4675 framer.error_code()) | |
| 4676 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4677 } else { | |
| 4678 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | |
| 4679 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | |
| 4680 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4681 } | |
| 4682 } while (++flags != 0); | |
| 4683 } | |
| 4684 | |
| 4685 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { | 4634 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { |
| 4686 FLAGS_spdy_on_stream_end = true; | |
| 4687 | |
| 4688 if (!IsHttp2()) { | 4635 if (!IsHttp2()) { |
| 4689 return; | 4636 return; |
| 4690 } | 4637 } |
| 4691 | 4638 |
| 4692 uint8_t valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_PADDED; | 4639 uint8_t valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_PADDED; |
| 4693 | 4640 |
| 4694 uint8_t flags = 0; | 4641 uint8_t flags = 0; |
| 4695 do { | 4642 do { |
| 4696 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4643 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 4697 | 4644 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4730 EXPECT_EQ(SpdyFramer::SPDY_INVALID_PADDING, framer.error_code()) | 4677 EXPECT_EQ(SpdyFramer::SPDY_INVALID_PADDING, framer.error_code()) |
| 4731 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4678 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4732 } else { | 4679 } else { |
| 4733 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4680 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 4734 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4681 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 4735 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4682 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4736 } | 4683 } |
| 4737 } while (++flags != 0); | 4684 } while (++flags != 0); |
| 4738 } | 4685 } |
| 4739 | 4686 |
| 4740 TEST_P(SpdyFramerTest, DataFrameFlagsV4disabled) { | |
| 4741 FLAGS_spdy_on_stream_end = false; | |
| 4742 | |
| 4743 if (!IsHttp2()) { | |
| 4744 return; | |
| 4745 } | |
| 4746 | |
| 4747 uint8_t valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_PADDED; | |
| 4748 | |
| 4749 uint8_t flags = 0; | |
| 4750 do { | |
| 4751 SCOPED_TRACE(testing::Message() << "Flags " << flags); | |
| 4752 | |
| 4753 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | |
| 4754 SpdyFramer framer(spdy_version_); | |
| 4755 framer.set_visitor(&visitor); | |
| 4756 | |
| 4757 SpdyDataIR data_ir(1, "hello"); | |
| 4758 SpdySerializedFrame frame(framer.SerializeData(data_ir)); | |
| 4759 SetFrameFlags(&frame, flags, spdy_version_); | |
| 4760 | |
| 4761 if (flags & ~valid_data_flags) { | |
| 4762 EXPECT_CALL(visitor, OnError(_)); | |
| 4763 } else { | |
| 4764 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); | |
| 4765 if (flags & DATA_FLAG_PADDED) { | |
| 4766 // The first byte of payload is parsed as padding length. | |
| 4767 EXPECT_CALL(visitor, OnStreamPadding(_, 1)); | |
| 4768 // Expect Error since the frame ends prematurely. | |
| 4769 EXPECT_CALL(visitor, OnError(_)); | |
| 4770 } else { | |
| 4771 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); | |
| 4772 if (flags & DATA_FLAG_FIN) { | |
| 4773 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); | |
| 4774 } | |
| 4775 } | |
| 4776 } | |
| 4777 | |
| 4778 framer.ProcessInput(frame.data(), frame.size()); | |
| 4779 if (flags & ~valid_data_flags) { | |
| 4780 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | |
| 4781 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) | |
| 4782 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4783 } else if (flags & DATA_FLAG_PADDED) { | |
| 4784 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | |
| 4785 EXPECT_EQ(SpdyFramer::SPDY_INVALID_PADDING, framer.error_code()) | |
| 4786 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4787 } else { | |
| 4788 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | |
| 4789 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | |
| 4790 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4791 } | |
| 4792 } while (++flags != 0); | |
| 4793 } | |
| 4794 | |
| 4795 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { | 4687 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
| 4796 FLAGS_spdy_on_stream_end = true; | |
| 4797 | |
| 4798 if (!IsSpdy3()) { | 4688 if (!IsSpdy3()) { |
| 4799 return; | 4689 return; |
| 4800 } | 4690 } |
| 4801 | 4691 |
| 4802 uint8_t flags = 0; | 4692 uint8_t flags = 0; |
| 4803 do { | 4693 do { |
| 4804 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4694 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 4805 | 4695 |
| 4806 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4696 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 4807 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | 4697 testing::StrictMock<test::MockDebugVisitor> debug_visitor; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4841 framer.error_code()) | 4731 framer.error_code()) |
| 4842 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4732 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4843 } else { | 4733 } else { |
| 4844 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4734 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 4845 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4735 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 4846 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4736 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4847 } | 4737 } |
| 4848 } while (++flags != 0); | 4738 } while (++flags != 0); |
| 4849 } | 4739 } |
| 4850 | 4740 |
| 4851 TEST_P(SpdyFramerTest, SynStreamFrameFlagsDisabled) { | |
| 4852 FLAGS_spdy_on_stream_end = false; | |
| 4853 | |
| 4854 if (!IsSpdy3()) { | |
| 4855 return; | |
| 4856 } | |
| 4857 | |
| 4858 uint8_t flags = 0; | |
| 4859 do { | |
| 4860 SCOPED_TRACE(testing::Message() << "Flags " << flags); | |
| 4861 | |
| 4862 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | |
| 4863 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | |
| 4864 SpdyFramer framer(spdy_version_); | |
| 4865 framer.set_visitor(&visitor); | |
| 4866 framer.set_debug_visitor(&debug_visitor); | |
| 4867 | |
| 4868 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _)); | |
| 4869 | |
| 4870 SpdySynStreamIR syn_stream(8); | |
| 4871 syn_stream.set_associated_to_stream_id(3); | |
| 4872 syn_stream.set_priority(1); | |
| 4873 syn_stream.SetHeader("foo", "bar"); | |
| 4874 SpdySerializedFrame frame(framer.SerializeSynStream(syn_stream)); | |
| 4875 SetFrameFlags(&frame, flags, spdy_version_); | |
| 4876 | |
| 4877 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { | |
| 4878 EXPECT_CALL(visitor, OnError(_)); | |
| 4879 } else { | |
| 4880 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _)); | |
| 4881 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN, | |
| 4882 flags & CONTROL_FLAG_UNIDIRECTIONAL)); | |
| 4883 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _)) | |
| 4884 .WillRepeatedly(testing::Return(true)); | |
| 4885 if (flags & DATA_FLAG_FIN) { | |
| 4886 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); | |
| 4887 } else { | |
| 4888 // Do not close the stream if we are expecting a CONTINUATION frame. | |
| 4889 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)).Times(0); | |
| 4890 } | |
| 4891 } | |
| 4892 | |
| 4893 framer.ProcessInput(frame.data(), frame.size()); | |
| 4894 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { | |
| 4895 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | |
| 4896 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | |
| 4897 framer.error_code()) | |
| 4898 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4899 } else { | |
| 4900 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | |
| 4901 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | |
| 4902 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4903 } | |
| 4904 } while (++flags != 0); | |
| 4905 } | |
| 4906 | |
| 4907 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { | 4741 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { |
| 4908 FLAGS_spdy_on_stream_end = true; | |
| 4909 | |
| 4910 if (!IsSpdy3()) { | 4742 if (!IsSpdy3()) { |
| 4911 return; | 4743 return; |
| 4912 } | 4744 } |
| 4913 | 4745 |
| 4914 uint8_t flags = 0; | 4746 uint8_t flags = 0; |
| 4915 do { | 4747 do { |
| 4916 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4748 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 4917 | 4749 |
| 4918 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4750 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 4919 SpdyFramer framer(spdy_version_); | 4751 SpdyFramer framer(spdy_version_); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 4942 framer.error_code()) | 4774 framer.error_code()) |
| 4943 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4775 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4944 } else { | 4776 } else { |
| 4945 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4777 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 4946 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4778 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 4947 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4779 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4948 } | 4780 } |
| 4949 } while (++flags != 0); | 4781 } while (++flags != 0); |
| 4950 } | 4782 } |
| 4951 | 4783 |
| 4952 TEST_P(SpdyFramerTest, SynReplyFrameFlagsDisabled) { | |
| 4953 FLAGS_spdy_on_stream_end = false; | |
| 4954 | |
| 4955 if (!IsSpdy3()) { | |
| 4956 return; | |
| 4957 } | |
| 4958 | |
| 4959 uint8_t flags = 0; | |
| 4960 do { | |
| 4961 SCOPED_TRACE(testing::Message() << "Flags " << flags); | |
| 4962 | |
| 4963 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | |
| 4964 SpdyFramer framer(spdy_version_); | |
| 4965 framer.set_visitor(&visitor); | |
| 4966 | |
| 4967 SpdySynReplyIR syn_reply(37); | |
| 4968 syn_reply.SetHeader("foo", "bar"); | |
| 4969 SpdySerializedFrame frame(framer.SerializeSynReply(syn_reply)); | |
| 4970 SetFrameFlags(&frame, flags, spdy_version_); | |
| 4971 | |
| 4972 if (flags & ~CONTROL_FLAG_FIN) { | |
| 4973 EXPECT_CALL(visitor, OnError(_)); | |
| 4974 } else { | |
| 4975 EXPECT_CALL(visitor, OnSynReply(37, flags & CONTROL_FLAG_FIN)); | |
| 4976 EXPECT_CALL(visitor, OnControlFrameHeaderData(37, _, _)) | |
| 4977 .WillRepeatedly(testing::Return(true)); | |
| 4978 if (flags & DATA_FLAG_FIN) { | |
| 4979 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); | |
| 4980 } | |
| 4981 } | |
| 4982 | |
| 4983 framer.ProcessInput(frame.data(), frame.size()); | |
| 4984 if (flags & ~CONTROL_FLAG_FIN) { | |
| 4985 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | |
| 4986 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | |
| 4987 framer.error_code()) | |
| 4988 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4989 } else { | |
| 4990 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | |
| 4991 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | |
| 4992 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 4993 } | |
| 4994 } while (++flags != 0); | |
| 4995 } | |
| 4996 | |
| 4997 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { | 4784 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { |
| 4998 uint8_t flags = 0; | 4785 uint8_t flags = 0; |
| 4999 do { | 4786 do { |
| 5000 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4787 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 5001 | 4788 |
| 5002 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4789 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 5003 SpdyFramer framer(spdy_version_); | 4790 SpdyFramer framer(spdy_version_); |
| 5004 framer.set_visitor(&visitor); | 4791 framer.set_visitor(&visitor); |
| 5005 | 4792 |
| 5006 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL); | 4793 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5119 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK)); | 4906 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK)); |
| 5120 | 4907 |
| 5121 framer.ProcessInput(frame.data(), frame.size()); | 4908 framer.ProcessInput(frame.data(), frame.size()); |
| 5122 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4909 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 5123 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4910 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 5124 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4911 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 5125 } while (++flags != 0); | 4912 } while (++flags != 0); |
| 5126 } | 4913 } |
| 5127 | 4914 |
| 5128 TEST_P(SpdyFramerTest, HeadersFrameFlags) { | 4915 TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
| 5129 FLAGS_spdy_on_stream_end = true; | |
| 5130 | |
| 5131 uint8_t flags = 0; | 4916 uint8_t flags = 0; |
| 5132 do { | 4917 do { |
| 5133 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4918 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 5134 | 4919 |
| 5135 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4920 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 5136 SpdyFramer framer(spdy_version_); | 4921 SpdyFramer framer(spdy_version_); |
| 5137 framer.set_visitor(&visitor); | 4922 framer.set_visitor(&visitor); |
| 5138 | 4923 |
| 5139 SpdyHeadersIR headers_ir(57); | 4924 SpdyHeadersIR headers_ir(57); |
| 5140 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) { | 4925 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5179 EXPECT_CALL(visitor, OnStreamEnd(_)).Times(0); | 4964 EXPECT_CALL(visitor, OnStreamEnd(_)).Times(0); |
| 5180 } | 4965 } |
| 5181 | 4966 |
| 5182 framer.ProcessInput(frame.data(), frame.size()); | 4967 framer.ProcessInput(frame.data(), frame.size()); |
| 5183 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4968 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 5184 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4969 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 5185 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4970 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 5186 } while (++flags != 0); | 4971 } while (++flags != 0); |
| 5187 } | 4972 } |
| 5188 | 4973 |
| 5189 TEST_P(SpdyFramerTest, HeadersFrameFlagsDisabled) { | |
| 5190 FLAGS_spdy_on_stream_end = false; | |
| 5191 | |
| 5192 uint8_t flags = 0; | |
| 5193 do { | |
| 5194 SCOPED_TRACE(testing::Message() << "Flags " << flags); | |
| 5195 | |
| 5196 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | |
| 5197 SpdyFramer framer(spdy_version_); | |
| 5198 framer.set_visitor(&visitor); | |
| 5199 | |
| 5200 SpdyHeadersIR headers_ir(57); | |
| 5201 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) { | |
| 5202 headers_ir.set_priority(3); | |
| 5203 headers_ir.set_has_priority(true); | |
| 5204 headers_ir.set_parent_stream_id(5); | |
| 5205 headers_ir.set_exclusive(true); | |
| 5206 } | |
| 5207 headers_ir.SetHeader("foo", "bar"); | |
| 5208 SpdySerializedFrame frame(framer.SerializeHeaders(headers_ir)); | |
| 5209 uint8_t set_flags = flags; | |
| 5210 if (IsHttp2()) { | |
| 5211 // TODO(jgraettinger): Add padding to SpdyHeadersIR, | |
| 5212 // and implement framing. | |
| 5213 set_flags &= ~HEADERS_FLAG_PADDED; | |
| 5214 } | |
| 5215 SetFrameFlags(&frame, set_flags, spdy_version_); | |
| 5216 | |
| 5217 // Expected callback values | |
| 5218 SpdyStreamId stream_id = 57; | |
| 5219 bool has_priority = false; | |
| 5220 SpdyPriority priority = 0; | |
| 5221 SpdyStreamId parent_stream_id = 0; | |
| 5222 bool exclusive = false; | |
| 5223 bool fin = flags & CONTROL_FLAG_FIN; | |
| 5224 bool end = IsSpdy3() || (flags & HEADERS_FLAG_END_HEADERS); | |
| 5225 if (IsHttp2() && flags & HEADERS_FLAG_PRIORITY) { | |
| 5226 has_priority = true; | |
| 5227 priority = 3; | |
| 5228 parent_stream_id = 5; | |
| 5229 exclusive = true; | |
| 5230 } | |
| 5231 EXPECT_CALL(visitor, OnHeaders(stream_id, has_priority, priority, | |
| 5232 parent_stream_id, exclusive, fin, end)); | |
| 5233 EXPECT_CALL(visitor, OnControlFrameHeaderData(57, _, _)) | |
| 5234 .WillRepeatedly(testing::Return(true)); | |
| 5235 if (flags & DATA_FLAG_FIN && | |
| 5236 (IsSpdy3() || flags & HEADERS_FLAG_END_HEADERS)) { | |
| 5237 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); | |
| 5238 } else { | |
| 5239 // Do not close the stream if we are expecting a CONTINUATION frame. | |
| 5240 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)).Times(0); | |
| 5241 } | |
| 5242 framer.ProcessInput(frame.data(), frame.size()); | |
| 5243 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | |
| 5244 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | |
| 5245 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
| 5246 } while (++flags != 0); | |
| 5247 } | |
| 5248 | |
| 5249 TEST_P(SpdyFramerTest, PingFrameFlags) { | 4974 TEST_P(SpdyFramerTest, PingFrameFlags) { |
| 5250 uint8_t flags = 0; | 4975 uint8_t flags = 0; |
| 5251 do { | 4976 do { |
| 5252 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4977 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 5253 | 4978 |
| 5254 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4979 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 5255 SpdyFramer framer(spdy_version_); | 4980 SpdyFramer framer(spdy_version_); |
| 5256 framer.set_visitor(&visitor); | 4981 framer.set_visitor(&visitor); |
| 5257 | 4982 |
| 5258 SpdySerializedFrame frame(framer.SerializePing(SpdyPingIR(42))); | 4983 SpdySerializedFrame frame(framer.SerializePing(SpdyPingIR(42))); |
| (...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6000 | 5725 |
| 6001 EXPECT_EQ(1, visitor->data_frame_count_); | 5726 EXPECT_EQ(1, visitor->data_frame_count_); |
| 6002 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); | 5727 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); |
| 6003 EXPECT_EQ(0, visitor->headers_frame_count_); | 5728 EXPECT_EQ(0, visitor->headers_frame_count_); |
| 6004 } | 5729 } |
| 6005 } | 5730 } |
| 6006 | 5731 |
| 6007 } // namespace test | 5732 } // namespace test |
| 6008 | 5733 |
| 6009 } // namespace net | 5734 } // namespace net |
| OLD | NEW |