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

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

Issue 959743002: Account for HTTP/2 padding in receive windows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: One more mock implementation. Created 5 years, 9 months 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.cc ('k') | net/spdy/spdy_session.h » ('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 <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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698