OLD | NEW |
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_spdy_session_peer.h" | 10 #include "net/quic/test_tools/quic_spdy_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_alt_svc_wire_format.h" | 13 #include "net/spdy/spdy_alt_svc_wire_format.h" |
14 #include "net/spdy/spdy_protocol.h" | 14 #include "net/spdy/spdy_protocol.h" |
15 #include "net/spdy/spdy_test_utils.h" | 15 #include "net/spdy/spdy_test_utils.h" |
16 #include "net/test/gtest_util.h" | 16 #include "net/test/gtest_util.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
18 | 18 |
19 using base::StringPiece; | 19 using base::StringPiece; |
20 using std::ostream; | 20 using std::ostream; |
21 using std::string; | 21 using std::string; |
22 using std::vector; | 22 using std::vector; |
23 using testing::ElementsAre; | 23 using testing::ElementsAre; |
24 using testing::InSequence; | 24 using testing::InSequence; |
25 using testing::Invoke; | 25 using testing::Invoke; |
| 26 using testing::Return; |
26 using testing::StrictMock; | 27 using testing::StrictMock; |
27 using testing::WithArgs; | 28 using testing::WithArgs; |
28 using testing::_; | 29 using testing::_; |
29 | 30 |
30 namespace net { | 31 namespace net { |
31 namespace test { | 32 namespace test { |
32 namespace { | 33 namespace { |
33 | 34 |
34 // TODO(ckrasic): this workaround is due to absence of std::initializer_list | 35 // TODO(ckrasic): this workaround is due to absence of std::initializer_list |
35 const bool kFins[] = {false, true}; | 36 const bool kFins[] = {false, true}; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 | 156 |
156 bool SaveHeaderData(const char* data, int len) { | 157 bool SaveHeaderData(const char* data, int len) { |
157 saved_header_data_.append(data, len); | 158 saved_header_data_.append(data, len); |
158 return true; | 159 return true; |
159 } | 160 } |
160 | 161 |
161 void SaveHeaderDataStringPiece(StringPiece data) { | 162 void SaveHeaderDataStringPiece(StringPiece data) { |
162 saved_header_data_.append(data.data(), data.length()); | 163 saved_header_data_.append(data.data(), data.length()); |
163 } | 164 } |
164 | 165 |
| 166 void SavePromiseHeaderList(QuicStreamId /* stream_id */, |
| 167 QuicStreamId /* promised_stream_id */, |
| 168 size_t size, |
| 169 const QuicHeaderList& header_list) { |
| 170 SaveToHandler(size, header_list); |
| 171 } |
| 172 |
| 173 void SaveHeaderList(QuicStreamId /* stream_id */, |
| 174 bool /* fin */, |
| 175 size_t size, |
| 176 const QuicHeaderList& header_list) { |
| 177 SaveToHandler(size, header_list); |
| 178 } |
| 179 |
| 180 void SaveToHandler(size_t size, const QuicHeaderList& header_list) { |
| 181 headers_handler_.reset(new TestHeadersHandler); |
| 182 headers_handler_->OnHeaderBlockStart(); |
| 183 for (const auto& p : header_list) { |
| 184 headers_handler_->OnHeader(p.first, p.second); |
| 185 } |
| 186 headers_handler_->OnHeaderBlockEnd(size); |
| 187 } |
| 188 |
165 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, | 189 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, |
166 bool fin, | 190 bool fin, |
167 SpdyPriority priority) { | 191 SpdyPriority priority) { |
168 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); | 192 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); |
169 } | 193 } |
170 | 194 |
171 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { | 195 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { |
172 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); | 196 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); |
173 } | 197 } |
174 | 198 |
(...skipping 12 matching lines...) Expand all Loading... |
187 OnHeaders(stream_id, kHasPriority, priority, | 211 OnHeaders(stream_id, kHasPriority, priority, |
188 /*parent_stream_id=*/0, | 212 /*parent_stream_id=*/0, |
189 /*exclusive=*/false, fin, kFrameComplete)); | 213 /*exclusive=*/false, fin, kFrameComplete)); |
190 } else { | 214 } else { |
191 EXPECT_CALL(visitor_, | 215 EXPECT_CALL(visitor_, |
192 OnHeaders(stream_id, !kHasPriority, | 216 OnHeaders(stream_id, !kHasPriority, |
193 /*priority=*/0, | 217 /*priority=*/0, |
194 /*parent_stream_id=*/0, | 218 /*parent_stream_id=*/0, |
195 /*exclusive=*/false, fin, kFrameComplete)); | 219 /*exclusive=*/false, fin, kFrameComplete)); |
196 } | 220 } |
197 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 221 headers_handler_.reset(new TestHeadersHandler); |
198 .WillRepeatedly(WithArgs<1, 2>( | 222 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) |
199 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 223 .WillOnce(Return(headers_handler_.get())); |
| 224 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); |
200 if (fin) { | 225 if (fin) { |
201 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); | 226 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); |
202 } | 227 } |
203 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 228 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
204 EXPECT_FALSE(framer_->HasError()) | 229 EXPECT_FALSE(framer_->HasError()) |
205 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 230 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
206 | 231 |
207 CheckHeaders(); | 232 CheckHeaders(); |
208 saved_data_.clear(); | 233 saved_data_.clear(); |
209 } | 234 } |
210 | 235 |
211 void CheckHeaders() { | 236 void CheckHeaders() { |
212 SpdyHeaderBlock headers; | 237 EXPECT_EQ(headers_, headers_handler_->decoded_block()); |
213 EXPECT_TRUE(framer_->ParseHeaderBlockInBuffer( | 238 headers_handler_.reset(); |
214 saved_header_data_.data(), saved_header_data_.length(), &headers)); | |
215 EXPECT_EQ(headers_, headers); | |
216 saved_header_data_.clear(); | |
217 } | 239 } |
218 | 240 |
219 Perspective perspective() { return GetParam().perspective; } | 241 Perspective perspective() { return GetParam().perspective; } |
220 | 242 |
221 QuicVersion version() { return GetParam().version; } | 243 QuicVersion version() { return GetParam().version; } |
222 | 244 |
223 QuicVersionVector GetVersion() { | 245 QuicVersionVector GetVersion() { |
224 QuicVersionVector versions; | 246 QuicVersionVector versions; |
225 versions.push_back(version()); | 247 versions.push_back(version()); |
226 return versions; | 248 return versions; |
227 } | 249 } |
228 | 250 |
229 void TearDownLocalConnectionState() { | 251 void TearDownLocalConnectionState() { |
230 QuicConnectionPeer::TearDownLocalConnectionState(connection_); | 252 QuicConnectionPeer::TearDownLocalConnectionState(connection_); |
231 } | 253 } |
232 | 254 |
233 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } | 255 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } |
234 | 256 |
235 static const bool kFrameComplete = true; | 257 static const bool kFrameComplete = true; |
236 static const bool kHasPriority = true; | 258 static const bool kHasPriority = true; |
237 | 259 |
238 MockConnectionHelper helper_; | 260 MockConnectionHelper helper_; |
239 MockAlarmFactory alarm_factory_; | 261 MockAlarmFactory alarm_factory_; |
240 StrictMock<MockConnection>* connection_; | 262 StrictMock<MockConnection>* connection_; |
241 StrictMock<MockQuicSpdySession> session_; | 263 StrictMock<MockQuicSpdySession> session_; |
242 QuicHeadersStream* headers_stream_; | 264 QuicHeadersStream* headers_stream_; |
243 SpdyHeaderBlock headers_; | 265 SpdyHeaderBlock headers_; |
| 266 std::unique_ptr<TestHeadersHandler> headers_handler_; |
244 string body_; | 267 string body_; |
245 string saved_data_; | 268 string saved_data_; |
246 string saved_header_data_; | 269 string saved_header_data_; |
247 std::unique_ptr<SpdyFramer> framer_; | 270 std::unique_ptr<SpdyFramer> framer_; |
248 StrictMock<MockVisitor> visitor_; | 271 StrictMock<MockVisitor> visitor_; |
249 QuicStreamFrame stream_frame_; | 272 QuicStreamFrame stream_frame_; |
250 QuicStreamId next_promised_stream_id_; | 273 QuicStreamId next_promised_stream_id_; |
251 }; | 274 }; |
252 | 275 |
253 INSTANTIATE_TEST_CASE_P(Tests, | 276 INSTANTIATE_TEST_CASE_P(Tests, |
(...skipping 27 matching lines...) Expand all Loading... |
281 if (perspective() == Perspective::IS_SERVER) { | 304 if (perspective() == Perspective::IS_SERVER) { |
282 // Write the headers and capture the outgoing data | 305 // Write the headers and capture the outgoing data |
283 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, nullptr)) | 306 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, nullptr)) |
284 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 307 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
285 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, | 308 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, |
286 nullptr); | 309 nullptr); |
287 | 310 |
288 // Parse the outgoing data and check that it matches was was written. | 311 // Parse the outgoing data and check that it matches was was written. |
289 EXPECT_CALL(visitor_, | 312 EXPECT_CALL(visitor_, |
290 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); | 313 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); |
291 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 314 headers_handler_.reset(new TestHeadersHandler); |
292 .WillRepeatedly(WithArgs<1, 2>( | 315 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) |
293 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 316 .WillOnce(Return(headers_handler_.get())); |
| 317 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); |
294 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 318 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
295 EXPECT_FALSE(framer_->HasError()) | 319 EXPECT_FALSE(framer_->HasError()) |
296 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 320 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
297 CheckHeaders(); | 321 CheckHeaders(); |
298 saved_data_.clear(); | 322 saved_data_.clear(); |
299 } else { | 323 } else { |
300 EXPECT_DFATAL(headers_stream_->WritePushPromise( | 324 EXPECT_DFATAL(headers_stream_->WritePushPromise( |
301 stream_id, promised_stream_id, headers_, nullptr), | 325 stream_id, promised_stream_id, headers_, nullptr), |
302 "Client shouldn't send PUSH_PROMISE"); | 326 "Client shouldn't send PUSH_PROMISE"); |
303 } | 327 } |
(...skipping 13 matching lines...) Expand all Loading... |
317 headers_frame.set_fin(fin); | 341 headers_frame.set_fin(fin); |
318 headers_frame.set_has_priority(true); | 342 headers_frame.set_has_priority(true); |
319 frame = framer_->SerializeFrame(headers_frame); | 343 frame = framer_->SerializeFrame(headers_frame); |
320 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 344 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
321 } else { | 345 } else { |
322 SpdyHeadersIR headers_frame(stream_id); | 346 SpdyHeadersIR headers_frame(stream_id); |
323 headers_frame.set_header_block(headers_); | 347 headers_frame.set_header_block(headers_); |
324 headers_frame.set_fin(fin); | 348 headers_frame.set_fin(fin); |
325 frame = framer_->SerializeFrame(headers_frame); | 349 frame = framer_->SerializeFrame(headers_frame); |
326 } | 350 } |
327 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
328 .WillRepeatedly(WithArgs<1>(Invoke( | |
329 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
330 EXPECT_CALL(session_, | 351 EXPECT_CALL(session_, |
331 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 352 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 353 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
332 stream_frame_.frame_buffer = frame.data(); | 354 stream_frame_.frame_buffer = frame.data(); |
333 stream_frame_.frame_length = frame.size(); | 355 stream_frame_.frame_length = frame.size(); |
334 headers_stream_->OnStreamFrame(stream_frame_); | 356 headers_stream_->OnStreamFrame(stream_frame_); |
335 stream_frame_.offset += frame.size(); | 357 stream_frame_.offset += frame.size(); |
336 CheckHeaders(); | 358 CheckHeaders(); |
337 } | 359 } |
338 } | 360 } |
339 } | 361 } |
340 } | 362 } |
341 | 363 |
342 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { | 364 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { |
343 if (perspective() == Perspective::IS_SERVER) | 365 if (perspective() == Perspective::IS_SERVER) |
344 return; | 366 return; |
345 for (QuicStreamId stream_id = kClientDataStreamId1; | 367 for (QuicStreamId stream_id = kClientDataStreamId1; |
346 stream_id < kClientDataStreamId3; stream_id += 2) { | 368 stream_id < kClientDataStreamId3; stream_id += 2) { |
347 QuicStreamId promised_stream_id = NextPromisedStreamId(); | 369 QuicStreamId promised_stream_id = NextPromisedStreamId(); |
348 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); | 370 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); |
349 push_promise.set_header_block(headers_); | 371 push_promise.set_header_block(headers_); |
350 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); | 372 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); |
351 if (perspective() == Perspective::IS_SERVER) { | 373 if (perspective() == Perspective::IS_SERVER) { |
352 EXPECT_CALL(*connection_, | 374 EXPECT_CALL(*connection_, |
353 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, | 375 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, |
354 "PUSH_PROMISE not supported.", _)) | 376 "PUSH_PROMISE not supported.", _)) |
355 .WillRepeatedly(InvokeWithoutArgs( | 377 .WillRepeatedly(InvokeWithoutArgs( |
356 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); | 378 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); |
357 } else { | 379 } else { |
358 EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) | 380 EXPECT_CALL(session_, OnPromiseHeaderList(stream_id, promised_stream_id, |
359 .WillRepeatedly(WithArgs<1>( | 381 frame.size(), _)) |
360 Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | 382 .WillOnce( |
361 EXPECT_CALL(session_, OnPromiseHeadersComplete( | 383 Invoke(this, &QuicHeadersStreamTest::SavePromiseHeaderList)); |
362 stream_id, promised_stream_id, frame.size())); | |
363 } | 384 } |
364 stream_frame_.frame_buffer = frame.data(); | 385 stream_frame_.frame_buffer = frame.data(); |
365 stream_frame_.frame_length = frame.size(); | 386 stream_frame_.frame_length = frame.size(); |
366 headers_stream_->OnStreamFrame(stream_frame_); | 387 headers_stream_->OnStreamFrame(stream_frame_); |
367 if (perspective() == Perspective::IS_CLIENT) { | 388 if (perspective() == Perspective::IS_CLIENT) { |
368 stream_frame_.offset += frame.size(); | 389 stream_frame_.offset += frame.size(); |
369 CheckHeaders(); | 390 CheckHeaders(); |
370 } | 391 } |
371 } | 392 } |
372 } | 393 } |
(...skipping 15 matching lines...) Expand all Loading... |
388 headers_frame.set_fin(fin); | 409 headers_frame.set_fin(fin); |
389 headers_frame.set_has_priority(true); | 410 headers_frame.set_has_priority(true); |
390 frame = framer_->SerializeFrame(headers_frame); | 411 frame = framer_->SerializeFrame(headers_frame); |
391 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 412 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
392 } else { | 413 } else { |
393 SpdyHeadersIR headers_frame(stream_id); | 414 SpdyHeadersIR headers_frame(stream_id); |
394 headers_frame.set_header_block(headers_); | 415 headers_frame.set_header_block(headers_); |
395 headers_frame.set_fin(fin); | 416 headers_frame.set_fin(fin); |
396 frame = framer_->SerializeFrame(headers_frame); | 417 frame = framer_->SerializeFrame(headers_frame); |
397 } | 418 } |
398 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)); | 419 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
399 EXPECT_CALL(session_, | 420 .Times(1); |
400 OnStreamHeadersComplete(stream_id, fin, frame.size())); | |
401 stream_frame_.frame_buffer = frame.data(); | 421 stream_frame_.frame_buffer = frame.data(); |
402 stream_frame_.frame_length = frame.size(); | 422 stream_frame_.frame_length = frame.size(); |
403 headers_stream_->OnStreamFrame(stream_frame_); | 423 headers_stream_->OnStreamFrame(stream_frame_); |
404 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 424 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
405 stream_frame_.offset += frame.size(); | 425 stream_frame_.offset += frame.size(); |
406 } | 426 } |
407 } | 427 } |
408 | 428 |
409 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { | 429 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { |
410 if (!FLAGS_quic_measure_headers_hol_blocking_time) { | 430 if (!FLAGS_quic_measure_headers_hol_blocking_time) { |
(...skipping 21 matching lines...) Expand all Loading... |
432 headers_frame.set_fin(fin); | 452 headers_frame.set_fin(fin); |
433 frames[stream_num] = framer_->SerializeFrame(headers_frame); | 453 frames[stream_num] = framer_->SerializeFrame(headers_frame); |
434 } | 454 } |
435 stream_frames[stream_num].stream_id = stream_frame_.stream_id; | 455 stream_frames[stream_num].stream_id = stream_frame_.stream_id; |
436 stream_frames[stream_num].offset = stream_frame_.offset; | 456 stream_frames[stream_num].offset = stream_frame_.offset; |
437 stream_frames[stream_num].frame_buffer = frames[stream_num].data(); | 457 stream_frames[stream_num].frame_buffer = frames[stream_num].data(); |
438 stream_frames[stream_num].frame_length = frames[stream_num].size(); | 458 stream_frames[stream_num].frame_length = frames[stream_num].size(); |
439 DVLOG(1) << "make frame for stream " << stream_num << " offset " | 459 DVLOG(1) << "make frame for stream " << stream_num << " offset " |
440 << stream_frames[stream_num].offset; | 460 << stream_frames[stream_num].offset; |
441 stream_frame_.offset += frames[stream_num].size(); | 461 stream_frame_.offset += frames[stream_num].size(); |
442 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)).Times(1); | 462 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, _, _)).Times(1); |
443 EXPECT_CALL(session_, OnStreamHeadersComplete(stream_id, fin, _)) | |
444 .Times(1); | |
445 } | 463 } |
446 } | 464 } |
447 | 465 |
448 // Actually writing the frames in reverse order will cause HOL blocking. | 466 // Actually writing the frames in reverse order will cause HOL blocking. |
449 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); | 467 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); |
450 | 468 |
451 for (int stream_num = 9; stream_num >= 0; --stream_num) { | 469 for (int stream_num = 9; stream_num >= 0; --stream_num) { |
452 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " | 470 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " |
453 << stream_frames[stream_num].offset; | 471 << stream_frames[stream_num].offset; |
454 headers_stream_->OnStreamFrame(stream_frames[stream_num]); | 472 headers_stream_->OnStreamFrame(stream_frames[stream_num]); |
(...skipping 20 matching lines...) Expand all Loading... |
475 headers_frame.set_fin(fin); | 493 headers_frame.set_fin(fin); |
476 headers_frame.set_has_priority(true); | 494 headers_frame.set_has_priority(true); |
477 frame = framer_->SerializeFrame(headers_frame); | 495 frame = framer_->SerializeFrame(headers_frame); |
478 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 496 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
479 } else { | 497 } else { |
480 SpdyHeadersIR headers_frame(stream_id); | 498 SpdyHeadersIR headers_frame(stream_id); |
481 headers_frame.set_header_block(headers_); | 499 headers_frame.set_header_block(headers_); |
482 headers_frame.set_fin(fin); | 500 headers_frame.set_fin(fin); |
483 frame = framer_->SerializeFrame(headers_frame); | 501 frame = framer_->SerializeFrame(headers_frame); |
484 } | 502 } |
485 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
486 .WillRepeatedly(WithArgs<1>(Invoke( | |
487 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
488 EXPECT_CALL(session_, | 503 EXPECT_CALL(session_, |
489 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 504 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 505 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
490 stream_frame_.frame_buffer = frame.data(); | 506 stream_frame_.frame_buffer = frame.data(); |
491 stream_frame_.frame_length = frame.size(); | 507 stream_frame_.frame_length = frame.size(); |
492 headers_stream_->OnStreamFrame(stream_frame_); | 508 headers_stream_->OnStreamFrame(stream_frame_); |
493 stream_frame_.offset += frame.size(); | 509 stream_frame_.offset += frame.size(); |
494 CheckHeaders(); | 510 CheckHeaders(); |
495 } | 511 } |
496 } | 512 } |
497 } | 513 } |
498 } | 514 } |
499 | 515 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 } | 599 } |
584 | 600 |
585 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { | 601 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { |
586 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( | 602 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( |
587 headers_stream_)); | 603 headers_stream_)); |
588 } | 604 } |
589 | 605 |
590 } // namespace | 606 } // namespace |
591 } // namespace test | 607 } // namespace test |
592 } // namespace net | 608 } // namespace net |
OLD | NEW |