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

Side by Side Diff: net/quic/quic_headers_stream_test.cc

Issue 862133002: Update from https://crrev.com/312398 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/quic/quic_headers_stream.h" 5 #include "net/quic/quic_headers_stream.h"
6 6
7 #include "net/quic/quic_utils.h" 7 #include "net/quic/quic_utils.h"
8 #include "net/quic/spdy_utils.h" 8 #include "net/quic/spdy_utils.h"
9 #include "net/quic/test_tools/quic_connection_peer.h" 9 #include "net/quic/test_tools/quic_connection_peer.h"
10 #include "net/quic/test_tools/quic_session_peer.h" 10 #include "net/quic/test_tools/quic_session_peer.h"
11 #include "net/quic/test_tools/quic_test_utils.h" 11 #include "net/quic/test_tools/quic_test_utils.h"
12 #include "net/quic/test_tools/reliable_quic_stream_peer.h" 12 #include "net/quic/test_tools/reliable_quic_stream_peer.h"
13 #include "net/spdy/spdy_protocol.h" 13 #include "net/spdy/spdy_protocol.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 15
16 using base::StringPiece; 16 using base::StringPiece;
17 using std::ostream;
17 using std::string; 18 using std::string;
19 using std::vector;
18 using testing::Invoke; 20 using testing::Invoke;
19 using testing::StrictMock; 21 using testing::StrictMock;
20 using testing::WithArgs; 22 using testing::WithArgs;
21 using testing::_; 23 using testing::_;
22 24
23 namespace net { 25 namespace net {
24 namespace test { 26 namespace test {
25 namespace { 27 namespace {
26 28
27 class MockVisitor : public SpdyFramerVisitorInterface { 29 class MockVisitor : public SpdyFramerVisitorInterface {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end)); 67 MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end));
66 MOCK_METHOD6(OnAltSvc, void(SpdyStreamId stream_id, 68 MOCK_METHOD6(OnAltSvc, void(SpdyStreamId stream_id,
67 uint32 max_age, 69 uint32 max_age,
68 uint16 port, 70 uint16 port,
69 StringPiece protocol_id, 71 StringPiece protocol_id,
70 StringPiece host, 72 StringPiece host,
71 StringPiece origin)); 73 StringPiece origin));
72 MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type)); 74 MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type));
73 }; 75 };
74 76
75 class QuicHeadersStreamTest : public ::testing::TestWithParam<bool> { 77 // Run all tests with each version, and client or server
76 public: 78 struct TestParams {
77 static QuicVersionVector GetVersions() { 79 TestParams(QuicVersion version, bool is_server)
78 QuicVersionVector versions; 80 : version(version), is_server(is_server) {}
79 versions.push_back(QuicVersionMax()); 81
80 return versions; 82 friend ostream& operator<<(ostream& os, const TestParams& p) {
83 os << "{ version: " << QuicVersionToString(p.version);
84 os << ", is_server: " << p.is_server << " }";
85 return os;
81 } 86 }
82 87
88 QuicVersion version;
89 bool is_server;
90 };
91
92 // Constructs various test permutations.
93 vector<TestParams> GetTestParams() {
94 vector<TestParams> params;
95 QuicVersionVector all_supported_versions = QuicSupportedVersions();
96 for (const QuicVersion version : all_supported_versions) {
97 params.push_back(TestParams(version, false));
98 params.push_back(TestParams(version, true));
99 }
100 return params;
101 }
102
103 class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> {
104 public:
83 QuicHeadersStreamTest() 105 QuicHeadersStreamTest()
84 : connection_(new StrictMock<MockConnection>(is_server(), GetVersions())), 106 : connection_(new StrictMock<MockConnection>(is_server(), GetVersion())),
85 session_(connection_), 107 session_(connection_),
86 headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)), 108 headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)),
87 body_("hello world"), 109 body_("hello world"),
88 framer_(SPDY3) { 110 framer_(version() > QUIC_VERSION_23 ? SPDY4 : SPDY3) {
89 headers_[":version"] = "HTTP/1.1"; 111 headers_[":version"] = "HTTP/1.1";
90 headers_[":status"] = "200 Ok"; 112 headers_[":status"] = "200 Ok";
91 headers_["content-length"] = "11"; 113 headers_["content-length"] = "11";
92 framer_.set_visitor(&visitor_); 114 framer_.set_visitor(&visitor_);
93 EXPECT_EQ(QuicVersionMax(), session_.connection()->version()); 115 EXPECT_EQ(version(), session_.connection()->version());
94 EXPECT_TRUE(headers_stream_ != nullptr); 116 EXPECT_TRUE(headers_stream_ != nullptr);
117 VLOG(1) << GetParam();
95 } 118 }
96 119
97 QuicConsumedData SaveIov(const IOVector& data) { 120 QuicConsumedData SaveIov(const IOVector& data) {
98 const iovec* iov = data.iovec(); 121 const iovec* iov = data.iovec();
99 int count = data.Capacity(); 122 int count = data.Capacity();
100 for (int i = 0 ; i < count; ++i) { 123 for (int i = 0 ; i < count; ++i) {
101 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len); 124 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len);
102 } 125 }
103 return QuicConsumedData(saved_data_.length(), false); 126 return QuicConsumedData(saved_data_.length(), false);
104 } 127 }
(...skipping 18 matching lines...) Expand all
123 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); 146 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY);
124 } 147 }
125 148
126 void WriteHeadersAndCheckData(QuicStreamId stream_id, 149 void WriteHeadersAndCheckData(QuicStreamId stream_id,
127 bool fin, 150 bool fin,
128 QuicPriority priority, 151 QuicPriority priority,
129 SpdyFrameType type) { 152 SpdyFrameType type) {
130 // Write the headers and capture the outgoing data 153 // Write the headers and capture the outgoing data
131 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, _, nullptr)) 154 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, _, nullptr))
132 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); 155 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov)));
133 headers_stream_->WriteHeaders(stream_id, headers_, fin, nullptr); 156 headers_stream_->WriteHeaders(stream_id, headers_, fin, priority, nullptr);
134 157
135 // Parse the outgoing data and check that it matches was was written. 158 // Parse the outgoing data and check that it matches was was written.
136 if (type == SYN_STREAM) { 159 if (type == SYN_STREAM) {
137 EXPECT_CALL(visitor_, OnSynStream(stream_id, kNoAssociatedStream, 0, 160 if (version() > QUIC_VERSION_23) {
138 // priority, 161 EXPECT_CALL(visitor_, OnHeaders(stream_id, kHasPriority, priority, fin,
139 fin, kNotUnidirectional)); 162 kFrameComplete));
163 } else {
164 EXPECT_CALL(visitor_,
165 OnSynStream(stream_id, kNoAssociatedStream,
166 /*priority=*/0, fin, kNotUnidirectional));
167 }
140 } else { 168 } else {
141 EXPECT_CALL(visitor_, OnSynReply(stream_id, fin)); 169 if (version() > QUIC_VERSION_23) {
170 EXPECT_CALL(visitor_, OnHeaders(stream_id, !kHasPriority,
171 /*priority=*/0, fin, kFrameComplete));
172 } else {
173 EXPECT_CALL(visitor_, OnSynReply(stream_id, fin));
174 }
142 } 175 }
143 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) 176 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _))
144 .WillRepeatedly(WithArgs<1, 2>( 177 .WillRepeatedly(WithArgs<1, 2>(
145 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); 178 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData)));
146 if (fin) { 179 if (fin) {
147 EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, nullptr, 0, true)); 180 EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, nullptr, 0, true));
148 } 181 }
149 framer_.ProcessInput(saved_data_.data(), saved_data_.length()); 182 framer_.ProcessInput(saved_data_.data(), saved_data_.length());
150 EXPECT_FALSE(framer_.HasError()) << framer_.error_code(); 183 EXPECT_FALSE(framer_.HasError())
184 << SpdyFramer::ErrorCodeToString(framer_.error_code());
151 185
152 CheckHeaders(); 186 CheckHeaders();
153 saved_data_.clear(); 187 saved_data_.clear();
154 } 188 }
155 189
156 void CheckHeaders() { 190 void CheckHeaders() {
157 SpdyHeaderBlock headers; 191 SpdyHeaderBlock headers;
158 EXPECT_EQ(saved_header_data_.length(), 192 EXPECT_EQ(saved_header_data_.length(),
159 framer_.ParseHeaderBlockInBuffer(saved_header_data_.data(), 193 framer_.ParseHeaderBlockInBuffer(saved_header_data_.data(),
160 saved_header_data_.length(), 194 saved_header_data_.length(),
161 &headers)); 195 &headers));
162 EXPECT_EQ(headers_, headers); 196 EXPECT_EQ(headers_, headers);
163 saved_header_data_.clear(); 197 saved_header_data_.clear();
164 } 198 }
165 199
166 bool is_server() { 200 bool is_server() { return GetParam().is_server; }
167 return GetParam(); 201
202 QuicVersion version() { return GetParam().version; }
203
204 QuicVersionVector GetVersion() {
205 QuicVersionVector versions;
206 versions.push_back(version());
207 return versions;
168 } 208 }
169 209
170 void CloseConnection() { 210 void CloseConnection() {
171 QuicConnectionPeer::CloseConnection(connection_); 211 QuicConnectionPeer::CloseConnection(connection_);
172 } 212 }
173 213
214 static const bool kFrameComplete = true;
215 static const bool kHasPriority = true;
174 static const bool kNotUnidirectional = false; 216 static const bool kNotUnidirectional = false;
175 static const bool kNoAssociatedStream = false; 217 static const bool kNoAssociatedStream = false;
176 218
177 StrictMock<MockConnection>* connection_; 219 StrictMock<MockConnection>* connection_;
178 StrictMock<MockSession> session_; 220 StrictMock<MockSession> session_;
179 QuicHeadersStream* headers_stream_; 221 QuicHeadersStream* headers_stream_;
180 SpdyHeaderBlock headers_; 222 SpdyHeaderBlock headers_;
181 string body_; 223 string body_;
182 string saved_data_; 224 string saved_data_;
183 string saved_header_data_; 225 string saved_header_data_;
184 SpdyFramer framer_; 226 SpdyFramer framer_;
185 StrictMock<MockVisitor> visitor_; 227 StrictMock<MockVisitor> visitor_;
186 }; 228 };
187 229
188 INSTANTIATE_TEST_CASE_P(Tests, QuicHeadersStreamTest, testing::Bool()); 230 INSTANTIATE_TEST_CASE_P(Tests,
231 QuicHeadersStreamTest,
232 ::testing::ValuesIn(GetTestParams()));
189 233
190 TEST_P(QuicHeadersStreamTest, StreamId) { 234 TEST_P(QuicHeadersStreamTest, StreamId) {
191 EXPECT_EQ(3u, headers_stream_->id()); 235 EXPECT_EQ(3u, headers_stream_->id());
192 } 236 }
193 237
194 TEST_P(QuicHeadersStreamTest, EffectivePriority) { 238 TEST_P(QuicHeadersStreamTest, EffectivePriority) {
195 EXPECT_EQ(0u, headers_stream_->EffectivePriority()); 239 EXPECT_EQ(0u, headers_stream_->EffectivePriority());
196 } 240 }
197 241
198 TEST_P(QuicHeadersStreamTest, WriteHeaders) { 242 TEST_P(QuicHeadersStreamTest, WriteHeaders) {
199 for (QuicStreamId stream_id = kClientDataStreamId1; 243 for (QuicStreamId stream_id = kClientDataStreamId1;
200 stream_id < kClientDataStreamId3; stream_id += 2) { 244 stream_id < kClientDataStreamId3; stream_id += 2) {
201 for (int count = 0; count < 2; ++count) { 245 for (int count = 0; count < 2; ++count) {
202 bool fin = (count == 0); 246 bool fin = (count == 0);
203 if (is_server()) { 247 if (is_server()) {
204 WriteHeadersAndExpectSynReply(stream_id, fin); 248 WriteHeadersAndExpectSynReply(stream_id, fin);
205 } else { 249 } else {
206 for (QuicPriority priority = 0; priority < 7; ++priority) { 250 for (QuicPriority priority = 0; priority < 7; ++priority) {
207 WriteHeadersAndExpectSynStream(stream_id, fin, priority); 251 // TODO(rch): implement priorities correctly.
252 WriteHeadersAndExpectSynStream(stream_id, fin, 0);
208 } 253 }
209 } 254 }
210 } 255 }
211 } 256 }
212 } 257 }
213 258
214 TEST_P(QuicHeadersStreamTest, ProcessRawData) { 259 TEST_P(QuicHeadersStreamTest, ProcessRawData) {
215 for (QuicStreamId stream_id = kClientDataStreamId1; 260 for (QuicStreamId stream_id = kClientDataStreamId1;
216 stream_id < kClientDataStreamId3; stream_id += 2) { 261 stream_id < kClientDataStreamId3; stream_id += 2) {
217 for (int count = 0; count < 2; ++count) { 262 for (int count = 0; count < 2; ++count) {
218 bool fin = (count == 0); 263 bool fin = (count == 0);
219 for (QuicPriority priority = 0; priority < 7; ++priority) { 264 for (QuicPriority priority = 0; priority < 7; ++priority) {
220 // Replace with "WriteHeadersAndSaveData" 265 // Replace with "WriteHeadersAndSaveData"
221 scoped_ptr<SpdySerializedFrame> frame; 266 scoped_ptr<SpdySerializedFrame> frame;
222 if (is_server()) { 267 if (is_server()) {
223 SpdySynStreamIR syn_stream(stream_id); 268 if (version() > QUIC_VERSION_23) {
224 syn_stream.set_name_value_block(headers_); 269 SpdyHeadersIR headers_frame(stream_id);
225 syn_stream.set_fin(fin); 270 headers_frame.set_name_value_block(headers_);
226 frame.reset(framer_.SerializeSynStream(syn_stream)); 271 headers_frame.set_fin(fin);
272 headers_frame.set_has_priority(true);
273 frame.reset(framer_.SerializeFrame(headers_frame));
274 } else {
275 SpdySynStreamIR syn_stream(stream_id);
276 syn_stream.set_name_value_block(headers_);
277 syn_stream.set_fin(fin);
278 frame.reset(framer_.SerializeSynStream(syn_stream));
279 }
227 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); 280 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
228 } else { 281 } else {
229 SpdySynReplyIR syn_reply(stream_id); 282 if (version() > QUIC_VERSION_23) {
230 syn_reply.set_name_value_block(headers_); 283 SpdyHeadersIR headers_frame(stream_id);
231 syn_reply.set_fin(fin); 284 headers_frame.set_name_value_block(headers_);
232 frame.reset(framer_.SerializeSynReply(syn_reply)); 285 headers_frame.set_fin(fin);
286 frame.reset(framer_.SerializeFrame(headers_frame));
287 } else {
288 SpdySynReplyIR syn_reply(stream_id);
289 syn_reply.set_name_value_block(headers_);
290 syn_reply.set_fin(fin);
291 frame.reset(framer_.SerializeSynReply(syn_reply));
292 }
233 } 293 }
234 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) 294 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _))
235 .WillRepeatedly(WithArgs<1>( 295 .WillRepeatedly(WithArgs<1>(
236 Invoke(this, 296 Invoke(this,
237 &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); 297 &QuicHeadersStreamTest::SaveHeaderDataStringPiece)));
238 EXPECT_CALL(session_, 298 EXPECT_CALL(session_,
239 OnStreamHeadersComplete(stream_id, fin, frame->size())); 299 OnStreamHeadersComplete(stream_id, fin, frame->size()));
240 headers_stream_->ProcessRawData(frame->data(), frame->size()); 300 headers_stream_->ProcessRawData(frame->data(), frame->size());
241
242 CheckHeaders(); 301 CheckHeaders();
243 } 302 }
244 } 303 }
304 }
305 }
306
307 TEST_P(QuicHeadersStreamTest, ProcessLargeRawData) {
308 // We want to create a frame that is more than the SPDY Framer's max control
309 // frame size, which is 16K, but less than the HPACK decoders max decode
310 // buffer size, which is 32K.
311 headers_["key0"] = string(1 << 13, '.');
312 headers_["key1"] = string(1 << 13, '.');
313 headers_["key2"] = string(1 << 13, '.');
314 for (QuicStreamId stream_id = kClientDataStreamId1;
315 stream_id < kClientDataStreamId3; stream_id += 2) {
316 for (int count = 0; count < 2; ++count) {
317 bool fin = (count == 0);
318 for (QuicPriority priority = 0; priority < 7; ++priority) {
319 // Replace with "WriteHeadersAndSaveData"
320 scoped_ptr<SpdySerializedFrame> frame;
321 if (is_server()) {
322 if (version() > QUIC_VERSION_23) {
323 SpdyHeadersIR headers_frame(stream_id);
324 headers_frame.set_name_value_block(headers_);
325 headers_frame.set_fin(fin);
326 headers_frame.set_has_priority(true);
327 frame.reset(framer_.SerializeFrame(headers_frame));
328 } else {
329 SpdySynStreamIR syn_stream(stream_id);
330 syn_stream.set_name_value_block(headers_);
331 syn_stream.set_fin(fin);
332 frame.reset(framer_.SerializeSynStream(syn_stream));
333 }
334 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
335 } else {
336 if (version() > QUIC_VERSION_23) {
337 SpdyHeadersIR headers_frame(stream_id);
338 headers_frame.set_name_value_block(headers_);
339 headers_frame.set_fin(fin);
340 frame.reset(framer_.SerializeFrame(headers_frame));
341 } else {
342 SpdySynReplyIR syn_reply(stream_id);
343 syn_reply.set_name_value_block(headers_);
344 syn_reply.set_fin(fin);
345 frame.reset(framer_.SerializeSynReply(syn_reply));
346 }
347 }
348 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _))
349 .WillRepeatedly(WithArgs<1>(Invoke(
350 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece)));
351 EXPECT_CALL(session_,
352 OnStreamHeadersComplete(stream_id, fin, frame->size()));
353 headers_stream_->ProcessRawData(frame->data(), frame->size());
354 CheckHeaders();
355 }
356 }
245 } 357 }
246 } 358 }
247 359
248 TEST_P(QuicHeadersStreamTest, ProcessBadData) { 360 TEST_P(QuicHeadersStreamTest, ProcessBadData) {
249 const char kBadData[] = "blah blah blah"; 361 const char kBadData[] = "blah blah blah";
250 EXPECT_CALL(*connection_, 362 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails(
251 SendConnectionCloseWithDetails( 363 QUIC_INVALID_HEADERS_STREAM_DATA, _))
252 QUIC_INVALID_HEADERS_STREAM_DATA, 364 .Times(::testing::AnyNumber());
253 "SPDY framing error: SPDY_INVALID_DATA_FRAME_FLAGS"));
254 headers_stream_->ProcessRawData(kBadData, strlen(kBadData)); 365 headers_stream_->ProcessRawData(kBadData, strlen(kBadData));
255 } 366 }
256 367
257 TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) { 368 TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) {
258 SpdyDataIR data(2, ""); 369 SpdyDataIR data(2, "");
259 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); 370 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
260 EXPECT_CALL(*connection_, 371 EXPECT_CALL(*connection_,
261 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, 372 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
262 "SPDY DATA frame received.")) 373 "SPDY DATA frame received."))
263 .WillOnce(InvokeWithoutArgs(this, 374 .WillOnce(InvokeWithoutArgs(this,
264 &QuicHeadersStreamTest::CloseConnection)); 375 &QuicHeadersStreamTest::CloseConnection));
265 headers_stream_->ProcessRawData(frame->data(), frame->size()); 376 headers_stream_->ProcessRawData(frame->data(), frame->size());
266 } 377 }
267 378
268 TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) { 379 TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) {
269 SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR, ""); 380 SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR, "");
270 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); 381 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
271 EXPECT_CALL(*connection_, 382 EXPECT_CALL(*connection_,
272 SendConnectionCloseWithDetails( 383 SendConnectionCloseWithDetails(
273 QUIC_INVALID_HEADERS_STREAM_DATA, 384 QUIC_INVALID_HEADERS_STREAM_DATA,
274 "SPDY RST_STREAM frame received.")) 385 "SPDY RST_STREAM frame received."))
275 .WillOnce(InvokeWithoutArgs(this, 386 .WillOnce(InvokeWithoutArgs(this,
276 &QuicHeadersStreamTest::CloseConnection)); 387 &QuicHeadersStreamTest::CloseConnection));
277 headers_stream_->ProcessRawData(frame->data(), frame->size()); 388 headers_stream_->ProcessRawData(frame->data(), frame->size());
278 } 389 }
279 390
280 TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) { 391 TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) {
281 SpdySettingsIR data; 392 SpdySettingsIR data;
282 data.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, true, true, 0); 393 if (version() > QUIC_VERSION_23) {
394 data.AddSetting(SETTINGS_HEADER_TABLE_SIZE, true, true, 0);
395 } else {
396 data.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, true, true, 0);
397 }
283 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); 398 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
284 EXPECT_CALL(*connection_, 399 EXPECT_CALL(*connection_,
285 SendConnectionCloseWithDetails( 400 SendConnectionCloseWithDetails(
286 QUIC_INVALID_HEADERS_STREAM_DATA, 401 QUIC_INVALID_HEADERS_STREAM_DATA,
287 "SPDY SETTINGS frame received.")) 402 "SPDY SETTINGS frame received."))
288 .WillOnce(InvokeWithoutArgs(this, 403 .WillOnce(InvokeWithoutArgs(this,
289 &QuicHeadersStreamTest::CloseConnection)); 404 &QuicHeadersStreamTest::CloseConnection));
290 headers_stream_->ProcessRawData(frame->data(), frame->size()); 405 headers_stream_->ProcessRawData(frame->data(), frame->size());
291 } 406 }
292 407
(...skipping 13 matching lines...) Expand all
306 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); 421 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
307 EXPECT_CALL(*connection_, 422 EXPECT_CALL(*connection_,
308 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, 423 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
309 "SPDY GOAWAY frame received.")) 424 "SPDY GOAWAY frame received."))
310 .WillOnce(InvokeWithoutArgs(this, 425 .WillOnce(InvokeWithoutArgs(this,
311 &QuicHeadersStreamTest::CloseConnection)); 426 &QuicHeadersStreamTest::CloseConnection));
312 headers_stream_->ProcessRawData(frame->data(), frame->size()); 427 headers_stream_->ProcessRawData(frame->data(), frame->size());
313 } 428 }
314 429
315 TEST_P(QuicHeadersStreamTest, ProcessSpdyHeadersFrame) { 430 TEST_P(QuicHeadersStreamTest, ProcessSpdyHeadersFrame) {
431 if (version() > QUIC_VERSION_23) {
432 // HEADERS frames are an error when using SPDY/3, but
433 // when using SPDY/4 they're the "normal" way of sending headers
434 // so we test their handling in the ProcessRawData test.
435 return;
436 }
316 SpdyHeadersIR data(1); 437 SpdyHeadersIR data(1);
317 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); 438 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
318 EXPECT_CALL(*connection_, 439 EXPECT_CALL(*connection_,
319 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, 440 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
320 "SPDY HEADERS frame received.")) 441 "SPDY HEADERS frame received."))
321 .WillOnce(InvokeWithoutArgs(this, 442 .WillOnce(InvokeWithoutArgs(this,
322 &QuicHeadersStreamTest::CloseConnection)); 443 &QuicHeadersStreamTest::CloseConnection));
323 headers_stream_->ProcessRawData(frame->data(), frame->size()); 444 headers_stream_->ProcessRawData(frame->data(), frame->size());
324 } 445 }
325 446
(...skipping 11 matching lines...) Expand all
337 458
338 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { 459 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) {
339 EXPECT_TRUE(headers_stream_->flow_controller()->IsEnabled()); 460 EXPECT_TRUE(headers_stream_->flow_controller()->IsEnabled());
340 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( 461 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl(
341 headers_stream_)); 462 headers_stream_));
342 } 463 }
343 464
344 } // namespace 465 } // namespace
345 } // namespace test 466 } // namespace test
346 } // namespace net 467 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698