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 <algorithm> | 5 #include <algorithm> |
6 #include <iostream> | 6 #include <iostream> |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 bool fin) override { | 82 bool fin) override { |
83 LOG(FATAL) << "Unexpected data frame header"; | 83 LOG(FATAL) << "Unexpected data frame header"; |
84 } | 84 } |
85 void OnStreamFrameData(SpdyStreamId stream_id, | 85 void OnStreamFrameData(SpdyStreamId stream_id, |
86 const char* data, | 86 const char* data, |
87 size_t len, | 87 size_t len, |
88 bool fin) override { | 88 bool fin) override { |
89 LOG(FATAL); | 89 LOG(FATAL); |
90 } | 90 } |
91 | 91 |
| 92 void OnStreamPadding(SpdyStreamId stream_id, size_t len) override { |
| 93 LOG(FATAL); |
| 94 } |
| 95 |
92 bool OnControlFrameHeaderData(SpdyStreamId stream_id, | 96 bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
93 const char* header_data, | 97 const char* header_data, |
94 size_t len) override { | 98 size_t len) override { |
95 CHECK(buffer_.get() != NULL); | 99 CHECK(buffer_.get() != NULL); |
96 CHECK_GE(kMaxDecompressedSize, size_ + len); | 100 CHECK_GE(kMaxDecompressedSize, size_ + len); |
97 CHECK(!finished_); | 101 CHECK(!finished_); |
98 if (len != 0) { | 102 if (len != 0) { |
99 memcpy(buffer_.get() + size_, header_data, len); | 103 memcpy(buffer_.get() + size_, header_data, len); |
100 size_ += len; | 104 size_ += len; |
101 } else { | 105 } else { |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 288 |
285 void OnStreamFrameData(SpdyStreamId stream_id, | 289 void OnStreamFrameData(SpdyStreamId stream_id, |
286 const char* data, | 290 const char* data, |
287 size_t len, | 291 size_t len, |
288 bool fin) override { | 292 bool fin) override { |
289 EXPECT_EQ(header_stream_id_, stream_id); | 293 EXPECT_EQ(header_stream_id_, stream_id); |
290 if (len == 0) | 294 if (len == 0) |
291 ++zero_length_data_frame_count_; | 295 ++zero_length_data_frame_count_; |
292 | 296 |
293 data_bytes_ += len; | 297 data_bytes_ += len; |
294 std::cerr << "OnStreamFrameData(" << stream_id << ", \""; | 298 LOG(INFO) << "OnStreamFrameData(" << stream_id << ", \""; |
295 if (len > 0) { | 299 if (len > 0) { |
296 for (size_t i = 0 ; i < len; ++i) { | 300 for (size_t i = 0 ; i < len; ++i) { |
297 std::cerr << std::hex << (0xFF & static_cast<unsigned int>(data[i])) | 301 LOG(INFO) << std::hex << (0xFF & static_cast<unsigned int>(data[i])) |
298 << std::dec; | 302 << std::dec; |
299 } | 303 } |
300 } | 304 } |
301 std::cerr << "\", " << len << ")\n"; | 305 LOG(INFO) << "\", " << len << ")\n"; |
| 306 } |
| 307 |
| 308 void OnStreamPadding(SpdyStreamId stream_id, size_t len) override { |
| 309 EXPECT_EQ(header_stream_id_, stream_id); |
| 310 data_bytes_ += len; |
| 311 LOG(INFO) << "OnStreamPadding(" << stream_id << ", " << len << ")\n"; |
302 } | 312 } |
303 | 313 |
304 bool OnControlFrameHeaderData(SpdyStreamId stream_id, | 314 bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
305 const char* header_data, | 315 const char* header_data, |
306 size_t len) override { | 316 size_t len) override { |
307 ++control_frame_header_data_count_; | 317 ++control_frame_header_data_count_; |
308 CHECK_EQ(header_stream_id_, stream_id); | 318 CHECK_EQ(header_stream_id_, stream_id); |
309 if (len == 0) { | 319 if (len == 0) { |
310 ++zero_length_control_frame_header_data_count_; | 320 ++zero_length_control_frame_header_data_count_; |
311 // Indicates end-of-header-block. | 321 // Indicates end-of-header-block. |
(...skipping 3810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4122 kPaddingLen + strlen(data_payload), | 4132 kPaddingLen + strlen(data_payload), |
4123 false)); | 4133 false)); |
4124 CHECK_EQ(framer.GetDataFrameMinimumSize(), | 4134 CHECK_EQ(framer.GetDataFrameMinimumSize(), |
4125 framer.ProcessInput(frame->data(), | 4135 framer.ProcessInput(frame->data(), |
4126 framer.GetDataFrameMinimumSize())); | 4136 framer.GetDataFrameMinimumSize())); |
4127 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_DATA_FRAME_PADDING_LENGTH); | 4137 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_DATA_FRAME_PADDING_LENGTH); |
4128 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); | 4138 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
4129 bytes_consumed += framer.GetDataFrameMinimumSize(); | 4139 bytes_consumed += framer.GetDataFrameMinimumSize(); |
4130 | 4140 |
4131 // Send the padding length field. | 4141 // Send the padding length field. |
| 4142 EXPECT_CALL(visitor, OnStreamPadding(1, 1)); |
4132 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); | 4143 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); |
4133 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); | 4144 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); |
4134 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); | 4145 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
4135 bytes_consumed += 1; | 4146 bytes_consumed += 1; |
4136 | 4147 |
4137 // Send the first two bytes of the data payload, i.e., "he". | 4148 // Send the first two bytes of the data payload, i.e., "he". |
4138 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false)); | 4149 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false)); |
4139 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2)); | 4150 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2)); |
4140 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); | 4151 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); |
4141 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); | 4152 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
4142 bytes_consumed += 2; | 4153 bytes_consumed += 2; |
4143 | 4154 |
4144 // Send the rest three bytes of the data payload, i.e., "llo". | 4155 // Send the rest three bytes of the data payload, i.e., "llo". |
4145 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3, false)); | 4156 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3, false)); |
4146 CHECK_EQ(3u, framer.ProcessInput(frame->data() + bytes_consumed, 3)); | 4157 CHECK_EQ(3u, framer.ProcessInput(frame->data() + bytes_consumed, 3)); |
4147 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); | 4158 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); |
4148 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); | 4159 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
4149 bytes_consumed += 3; | 4160 bytes_consumed += 3; |
4150 | 4161 |
4151 // Send the first 100 bytes of the padding payload. | 4162 // Send the first 100 bytes of the padding payload. |
4152 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 100, false)); | 4163 EXPECT_CALL(visitor, OnStreamPadding(1, 100)); |
4153 CHECK_EQ(100u, framer.ProcessInput(frame->data() + bytes_consumed, 100)); | 4164 CHECK_EQ(100u, framer.ProcessInput(frame->data() + bytes_consumed, 100)); |
4154 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); | 4165 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); |
4155 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); | 4166 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
4156 bytes_consumed += 100; | 4167 bytes_consumed += 100; |
4157 | 4168 |
4158 // Send rest of the padding payload. | 4169 // Send rest of the padding payload. |
4159 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 18, false)); | 4170 EXPECT_CALL(visitor, OnStreamPadding(1, 18)); |
4160 CHECK_EQ(18u, framer.ProcessInput(frame->data() + bytes_consumed, 18)); | 4171 CHECK_EQ(18u, framer.ProcessInput(frame->data() + bytes_consumed, 18)); |
4161 CHECK_EQ(framer.state(), SpdyFramer::SPDY_RESET); | 4172 CHECK_EQ(framer.state(), SpdyFramer::SPDY_RESET); |
4162 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); | 4173 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
4163 } | 4174 } |
4164 | 4175 |
4165 TEST_P(SpdyFramerTest, ReadWindowUpdate) { | 4176 TEST_P(SpdyFramerTest, ReadWindowUpdate) { |
4166 SpdyFramer framer(spdy_version_); | 4177 SpdyFramer framer(spdy_version_); |
4167 scoped_ptr<SpdyFrame> control_frame( | 4178 scoped_ptr<SpdyFrame> control_frame( |
4168 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); | 4179 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); |
4169 TestSpdyVisitor visitor(spdy_version_); | 4180 TestSpdyVisitor visitor(spdy_version_); |
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4927 | 4938 |
4928 SpdyDataIR data_ir(1, StringPiece("hello", 5)); | 4939 SpdyDataIR data_ir(1, StringPiece("hello", 5)); |
4929 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 4940 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
4930 SetFrameFlags(frame.get(), flags, spdy_version_); | 4941 SetFrameFlags(frame.get(), flags, spdy_version_); |
4931 | 4942 |
4932 if (flags & ~valid_data_flags) { | 4943 if (flags & ~valid_data_flags) { |
4933 EXPECT_CALL(visitor, OnError(_)); | 4944 EXPECT_CALL(visitor, OnError(_)); |
4934 } else { | 4945 } else { |
4935 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); | 4946 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); |
4936 if (flags & DATA_FLAG_PADDED) { | 4947 if (flags & DATA_FLAG_PADDED) { |
4937 // Expect Error since we don't set padded in payload. | 4948 // The first byte of payload is parsed as padding length. |
| 4949 EXPECT_CALL(visitor, OnStreamPadding(_, 1)); |
| 4950 // Expect Error since the frame ends prematurely. |
4938 EXPECT_CALL(visitor, OnError(_)); | 4951 EXPECT_CALL(visitor, OnError(_)); |
4939 } else { | 4952 } else { |
4940 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); | 4953 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); |
4941 if (flags & DATA_FLAG_FIN) { | 4954 if (flags & DATA_FLAG_FIN) { |
4942 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); | 4955 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); |
4943 } | 4956 } |
4944 } | 4957 } |
4945 } | 4958 } |
4946 | 4959 |
4947 framer.ProcessInput(frame->data(), frame->size()); | 4960 framer.ProcessInput(frame->data(), frame->size()); |
4948 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) { | 4961 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) { |
4949 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 4962 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
4950 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, | 4963 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) |
4951 framer.error_code()) | 4964 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4952 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
4953 } else { | 4965 } else { |
4954 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4966 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
4955 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4967 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
4956 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4968 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4957 } | 4969 } |
4958 } while (++flags != 0); | 4970 } while (++flags != 0); |
4959 } | 4971 } |
4960 | 4972 |
4961 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { | 4973 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
4962 if (!IsSpdy2() && !IsSpdy3()) { | 4974 if (!IsSpdy2() && !IsSpdy3()) { |
(...skipping 986 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5949 TestSpdyVisitor visitor(spdy_version_); | 5961 TestSpdyVisitor visitor(spdy_version_); |
5950 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); | 5962 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
5951 | 5963 |
5952 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); | 5964 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); |
5953 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 5965 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
5954 visitor.framer_.error_code()) | 5966 visitor.framer_.error_code()) |
5955 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); | 5967 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); |
5956 } | 5968 } |
5957 | 5969 |
5958 } // namespace net | 5970 } // namespace net |
OLD | NEW |