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 |