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/core/quic_headers_stream.h" | 5 #include "net/quic/core/quic_headers_stream.h" |
6 | 6 |
7 #include <cstdint> | 7 #include <cstdint> |
8 #include <ostream> | 8 #include <ostream> |
9 #include <string> | 9 #include <string> |
10 #include <tuple> | 10 #include <tuple> |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 next_promised_stream_id_(2) { | 217 next_promised_stream_id_(2) { |
218 headers_[":version"] = "HTTP/1.1"; | 218 headers_[":version"] = "HTTP/1.1"; |
219 headers_[":status"] = "200 Ok"; | 219 headers_[":status"] = "200 Ok"; |
220 headers_["content-length"] = "11"; | 220 headers_["content-length"] = "11"; |
221 framer_ = std::unique_ptr<SpdyFramer>( | 221 framer_ = std::unique_ptr<SpdyFramer>( |
222 new SpdyFramer(SpdyFramer::ENABLE_COMPRESSION)); | 222 new SpdyFramer(SpdyFramer::ENABLE_COMPRESSION)); |
223 framer_->set_visitor(&visitor_); | 223 framer_->set_visitor(&visitor_); |
224 EXPECT_EQ(version(), session_.connection()->version()); | 224 EXPECT_EQ(version(), session_.connection()->version()); |
225 EXPECT_TRUE(headers_stream_ != nullptr); | 225 EXPECT_TRUE(headers_stream_ != nullptr); |
226 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 226 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
| 227 client_id_1_ = |
| 228 QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, 0); |
| 229 client_id_2_ = |
| 230 QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, 1); |
| 231 client_id_3_ = |
| 232 QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, 2); |
| 233 next_stream_id_ = QuicSpdySessionPeer::NextStreamId(session_); |
| 234 } |
| 235 |
| 236 QuicStreamId GetNthClientInitiatedId(int n) { |
| 237 return QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, n); |
227 } | 238 } |
228 | 239 |
229 QuicConsumedData SaveIov(const QuicIOVector& data) { | 240 QuicConsumedData SaveIov(const QuicIOVector& data) { |
230 const iovec* iov = data.iov; | 241 const iovec* iov = data.iov; |
231 int count = data.iov_count; | 242 int count = data.iov_count; |
232 int consumed = 0; | 243 int consumed = 0; |
233 for (int i = 0; i < count; ++i) { | 244 for (int i = 0; i < count; ++i) { |
234 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len); | 245 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len); |
235 consumed += iov[i].iov_len; | 246 consumed += iov[i].iov_len; |
236 } | 247 } |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 QuicVersionVector GetVersion() { | 365 QuicVersionVector GetVersion() { |
355 QuicVersionVector versions; | 366 QuicVersionVector versions; |
356 versions.push_back(version()); | 367 versions.push_back(version()); |
357 return versions; | 368 return versions; |
358 } | 369 } |
359 | 370 |
360 void TearDownLocalConnectionState() { | 371 void TearDownLocalConnectionState() { |
361 QuicConnectionPeer::TearDownLocalConnectionState(connection_); | 372 QuicConnectionPeer::TearDownLocalConnectionState(connection_); |
362 } | 373 } |
363 | 374 |
364 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } | 375 QuicStreamId NextPromisedStreamId() { |
| 376 return next_promised_stream_id_ += next_stream_id_; |
| 377 } |
365 | 378 |
366 static const bool kFrameComplete = true; | 379 static const bool kFrameComplete = true; |
367 static const bool kHasPriority = true; | 380 static const bool kHasPriority = true; |
368 | 381 |
369 const TestParams test_params_; | 382 const TestParams test_params_; |
370 MockQuicConnectionHelper helper_; | 383 MockQuicConnectionHelper helper_; |
371 MockAlarmFactory alarm_factory_; | 384 MockAlarmFactory alarm_factory_; |
372 StrictMock<MockQuicConnection>* connection_; | 385 StrictMock<MockQuicConnection>* connection_; |
373 StrictMock<MockQuicSpdySession> session_; | 386 StrictMock<MockQuicSpdySession> session_; |
374 QuicHeadersStream* headers_stream_; | 387 QuicHeadersStream* headers_stream_; |
375 SpdyHeaderBlock headers_; | 388 SpdyHeaderBlock headers_; |
376 std::unique_ptr<TestHeadersHandler> headers_handler_; | 389 std::unique_ptr<TestHeadersHandler> headers_handler_; |
377 string body_; | 390 string body_; |
378 string saved_data_; | 391 string saved_data_; |
379 string saved_header_data_; | 392 string saved_header_data_; |
380 string saved_payloads_; | 393 string saved_payloads_; |
381 std::unique_ptr<SpdyFramer> framer_; | 394 std::unique_ptr<SpdyFramer> framer_; |
382 StrictMock<MockVisitor> visitor_; | 395 StrictMock<MockVisitor> visitor_; |
383 QuicStreamFrame stream_frame_; | 396 QuicStreamFrame stream_frame_; |
384 QuicStreamId next_promised_stream_id_; | 397 QuicStreamId next_promised_stream_id_; |
| 398 QuicStreamId client_id_1_; |
| 399 QuicStreamId client_id_2_; |
| 400 QuicStreamId client_id_3_; |
| 401 QuicStreamId next_stream_id_; |
385 }; | 402 }; |
386 | 403 |
387 // Run all tests with each version, perspective (client or server), | 404 // Run all tests with each version, perspective (client or server), |
388 // HTTP/2 and HPACK decoder. | 405 // HTTP/2 and HPACK decoder. |
389 INSTANTIATE_TEST_CASE_P( | 406 INSTANTIATE_TEST_CASE_P( |
390 Tests, | 407 Tests, |
391 QuicHeadersStreamTest, | 408 QuicHeadersStreamTest, |
392 ::testing::Combine(::testing::ValuesIn(AllSupportedVersions()), | 409 ::testing::Combine(::testing::ValuesIn(AllSupportedVersions()), |
393 ::testing::Values(Perspective::IS_CLIENT, | 410 ::testing::Values(Perspective::IS_CLIENT, |
394 Perspective::IS_SERVER), | 411 Perspective::IS_SERVER), |
395 ::testing::Values(HTTP2_DECODER_SPDY, | 412 ::testing::Values(HTTP2_DECODER_SPDY, |
396 HTTP2_DECODER_NEW), | 413 HTTP2_DECODER_NEW), |
397 ::testing::Values(HPACK_DECODER_SPDY, HPACK_DECODER3))); | 414 ::testing::Values(HPACK_DECODER_SPDY, HPACK_DECODER3))); |
398 | 415 |
399 TEST_P(QuicHeadersStreamTest, StreamId) { | 416 TEST_P(QuicHeadersStreamTest, StreamId) { |
400 EXPECT_EQ(3u, headers_stream_->id()); | 417 EXPECT_EQ(3u, headers_stream_->id()); |
401 } | 418 } |
402 | 419 |
403 TEST_P(QuicHeadersStreamTest, WriteHeaders) { | 420 TEST_P(QuicHeadersStreamTest, WriteHeaders) { |
404 for (QuicStreamId stream_id = kClientDataStreamId1; | 421 for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_; |
405 stream_id < kClientDataStreamId3; stream_id += 2) { | 422 stream_id += next_stream_id_) { |
406 for (bool fin : kFins) { | 423 for (bool fin : kFins) { |
407 if (perspective() == Perspective::IS_SERVER) { | 424 if (perspective() == Perspective::IS_SERVER) { |
408 WriteAndExpectResponseHeaders(stream_id, fin); | 425 WriteAndExpectResponseHeaders(stream_id, fin); |
409 } else { | 426 } else { |
410 for (SpdyPriority priority = 0; priority < 7; ++priority) { | 427 for (SpdyPriority priority = 0; priority < 7; ++priority) { |
411 // TODO(rch): implement priorities correctly. | 428 // TODO(rch): implement priorities correctly. |
412 WriteAndExpectRequestHeaders(stream_id, fin, 0); | 429 WriteAndExpectRequestHeaders(stream_id, fin, 0); |
413 } | 430 } |
414 } | 431 } |
415 } | 432 } |
416 } | 433 } |
417 } | 434 } |
418 | 435 |
419 TEST_P(QuicHeadersStreamTest, WritePushPromises) { | 436 TEST_P(QuicHeadersStreamTest, WritePushPromises) { |
420 for (QuicStreamId stream_id = kClientDataStreamId1; | 437 for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_; |
421 stream_id < kClientDataStreamId3; stream_id += 2) { | 438 stream_id += next_stream_id_) { |
422 QuicStreamId promised_stream_id = NextPromisedStreamId(); | 439 QuicStreamId promised_stream_id = NextPromisedStreamId(); |
423 if (perspective() == Perspective::IS_SERVER) { | 440 if (perspective() == Perspective::IS_SERVER) { |
424 // Write the headers and capture the outgoing data | 441 // Write the headers and capture the outgoing data |
425 EXPECT_CALL(session_, WritevData(headers_stream_, kHeadersStreamId, _, _, | 442 EXPECT_CALL(session_, WritevData(headers_stream_, kHeadersStreamId, _, _, |
426 NO_FIN, _)) | 443 NO_FIN, _)) |
427 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 444 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
428 session_.WritePushPromise(stream_id, promised_stream_id, | 445 session_.WritePushPromise(stream_id, promised_stream_id, |
429 headers_.Clone()); | 446 headers_.Clone()); |
430 | 447 |
431 // Parse the outgoing data and check that it matches was was written. | 448 // Parse the outgoing data and check that it matches was was written. |
(...skipping 10 matching lines...) Expand all Loading... |
442 saved_data_.clear(); | 459 saved_data_.clear(); |
443 } else { | 460 } else { |
444 EXPECT_QUIC_BUG(session_.WritePushPromise(stream_id, promised_stream_id, | 461 EXPECT_QUIC_BUG(session_.WritePushPromise(stream_id, promised_stream_id, |
445 headers_.Clone()), | 462 headers_.Clone()), |
446 "Client shouldn't send PUSH_PROMISE"); | 463 "Client shouldn't send PUSH_PROMISE"); |
447 } | 464 } |
448 } | 465 } |
449 } | 466 } |
450 | 467 |
451 TEST_P(QuicHeadersStreamTest, ProcessRawData) { | 468 TEST_P(QuicHeadersStreamTest, ProcessRawData) { |
452 for (QuicStreamId stream_id = kClientDataStreamId1; | 469 for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_; |
453 stream_id < kClientDataStreamId3; stream_id += 2) { | 470 stream_id += next_stream_id_) { |
454 for (bool fin : {false, true}) { | 471 for (bool fin : {false, true}) { |
455 for (SpdyPriority priority = 0; priority < 7; ++priority) { | 472 for (SpdyPriority priority = 0; priority < 7; ++priority) { |
456 // Replace with "WriteHeadersAndSaveData" | 473 // Replace with "WriteHeadersAndSaveData" |
457 SpdySerializedFrame frame; | 474 SpdySerializedFrame frame; |
458 if (perspective() == Perspective::IS_SERVER) { | 475 if (perspective() == Perspective::IS_SERVER) { |
459 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); | 476 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); |
460 headers_frame.set_fin(fin); | 477 headers_frame.set_fin(fin); |
461 headers_frame.set_has_priority(true); | 478 headers_frame.set_has_priority(true); |
462 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); | 479 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); |
463 frame = framer_->SerializeFrame(headers_frame); | 480 frame = framer_->SerializeFrame(headers_frame); |
(...skipping 12 matching lines...) Expand all Loading... |
476 stream_frame_.offset += frame.size(); | 493 stream_frame_.offset += frame.size(); |
477 CheckHeaders(); | 494 CheckHeaders(); |
478 } | 495 } |
479 } | 496 } |
480 } | 497 } |
481 } | 498 } |
482 | 499 |
483 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { | 500 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { |
484 if (perspective() == Perspective::IS_SERVER) | 501 if (perspective() == Perspective::IS_SERVER) |
485 return; | 502 return; |
486 for (QuicStreamId stream_id = kClientDataStreamId1; | 503 for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_; |
487 stream_id < kClientDataStreamId3; stream_id += 2) { | 504 stream_id += next_stream_id_) { |
488 QuicStreamId promised_stream_id = NextPromisedStreamId(); | 505 QuicStreamId promised_stream_id = NextPromisedStreamId(); |
489 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id, | 506 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id, |
490 headers_.Clone()); | 507 headers_.Clone()); |
491 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); | 508 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); |
492 if (perspective() == Perspective::IS_SERVER) { | 509 if (perspective() == Perspective::IS_SERVER) { |
493 EXPECT_CALL(*connection_, | 510 EXPECT_CALL(*connection_, |
494 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, | 511 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, |
495 "PUSH_PROMISE not supported.", _)) | 512 "PUSH_PROMISE not supported.", _)) |
496 .WillRepeatedly(InvokeWithoutArgs( | 513 .WillRepeatedly(InvokeWithoutArgs( |
497 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); | 514 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 headers_stream_->OnStreamFrame(stream_frame_); | 547 headers_stream_->OnStreamFrame(stream_frame_); |
531 EXPECT_EQ(session_.server_push_enabled(), | 548 EXPECT_EQ(session_.server_push_enabled(), |
532 perspective() == Perspective::IS_CLIENT); | 549 perspective() == Perspective::IS_CLIENT); |
533 } | 550 } |
534 | 551 |
535 TEST_P(QuicHeadersStreamTest, EmptyHeaderHOLBlockedTime) { | 552 TEST_P(QuicHeadersStreamTest, EmptyHeaderHOLBlockedTime) { |
536 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(0); | 553 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(0); |
537 InSequence seq; | 554 InSequence seq; |
538 bool fin = true; | 555 bool fin = true; |
539 for (int stream_num = 0; stream_num < 10; stream_num++) { | 556 for (int stream_num = 0; stream_num < 10; stream_num++) { |
540 QuicStreamId stream_id = QuicClientDataStreamId(stream_num); | 557 QuicStreamId stream_id = GetNthClientInitiatedId(stream_num); |
541 // Replace with "WriteHeadersAndSaveData" | 558 // Replace with "WriteHeadersAndSaveData" |
542 SpdySerializedFrame frame; | 559 SpdySerializedFrame frame; |
543 if (perspective() == Perspective::IS_SERVER) { | 560 if (perspective() == Perspective::IS_SERVER) { |
544 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); | 561 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); |
545 headers_frame.set_fin(fin); | 562 headers_frame.set_fin(fin); |
546 headers_frame.set_has_priority(true); | 563 headers_frame.set_has_priority(true); |
547 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); | 564 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); |
548 frame = framer_->SerializeFrame(headers_frame); | 565 frame = framer_->SerializeFrame(headers_frame); |
549 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 566 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
550 } else { | 567 } else { |
(...skipping 13 matching lines...) Expand all Loading... |
564 | 581 |
565 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { | 582 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { |
566 QuicStreamId stream_id; | 583 QuicStreamId stream_id; |
567 bool fin = true; | 584 bool fin = true; |
568 QuicStreamFrame stream_frames[10]; | 585 QuicStreamFrame stream_frames[10]; |
569 SpdySerializedFrame frames[10]; | 586 SpdySerializedFrame frames[10]; |
570 // First create all the frames in order | 587 // First create all the frames in order |
571 { | 588 { |
572 InSequence seq; | 589 InSequence seq; |
573 for (int stream_num = 0; stream_num < 10; ++stream_num) { | 590 for (int stream_num = 0; stream_num < 10; ++stream_num) { |
574 stream_id = QuicClientDataStreamId(stream_num); | 591 stream_id = GetNthClientInitiatedId(stream_num); |
575 if (perspective() == Perspective::IS_SERVER) { | 592 if (perspective() == Perspective::IS_SERVER) { |
576 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); | 593 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); |
577 headers_frame.set_fin(fin); | 594 headers_frame.set_fin(fin); |
578 headers_frame.set_has_priority(true); | 595 headers_frame.set_has_priority(true); |
579 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); | 596 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); |
580 frames[stream_num] = framer_->SerializeFrame(headers_frame); | 597 frames[stream_num] = framer_->SerializeFrame(headers_frame); |
581 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)).Times(1); | 598 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)).Times(1); |
582 } else { | 599 } else { |
583 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); | 600 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); |
584 headers_frame.set_fin(fin); | 601 headers_frame.set_fin(fin); |
(...skipping 22 matching lines...) Expand all Loading... |
607 } | 624 } |
608 | 625 |
609 TEST_P(QuicHeadersStreamTest, ProcessLargeRawData) { | 626 TEST_P(QuicHeadersStreamTest, ProcessLargeRawData) { |
610 QuicSpdySessionPeer::SetMaxUncompressedHeaderBytes(&session_, 256 * 1024); | 627 QuicSpdySessionPeer::SetMaxUncompressedHeaderBytes(&session_, 256 * 1024); |
611 // We want to create a frame that is more than the SPDY Framer's max control | 628 // We want to create a frame that is more than the SPDY Framer's max control |
612 // frame size, which is 16K, but less than the HPACK decoders max decode | 629 // frame size, which is 16K, but less than the HPACK decoders max decode |
613 // buffer size, which is 32K. | 630 // buffer size, which is 32K. |
614 headers_["key0"] = string(1 << 13, '.'); | 631 headers_["key0"] = string(1 << 13, '.'); |
615 headers_["key1"] = string(1 << 13, '.'); | 632 headers_["key1"] = string(1 << 13, '.'); |
616 headers_["key2"] = string(1 << 13, '.'); | 633 headers_["key2"] = string(1 << 13, '.'); |
617 for (QuicStreamId stream_id = kClientDataStreamId1; | 634 for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_; |
618 stream_id < kClientDataStreamId3; stream_id += 2) { | 635 stream_id += next_stream_id_) { |
619 for (bool fin : {false, true}) { | 636 for (bool fin : {false, true}) { |
620 for (SpdyPriority priority = 0; priority < 7; ++priority) { | 637 for (SpdyPriority priority = 0; priority < 7; ++priority) { |
621 // Replace with "WriteHeadersAndSaveData" | 638 // Replace with "WriteHeadersAndSaveData" |
622 SpdySerializedFrame frame; | 639 SpdySerializedFrame frame; |
623 if (perspective() == Perspective::IS_SERVER) { | 640 if (perspective() == Perspective::IS_SERVER) { |
624 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); | 641 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); |
625 headers_frame.set_fin(fin); | 642 headers_frame.set_fin(fin); |
626 headers_frame.set_has_priority(true); | 643 headers_frame.set_has_priority(true); |
627 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); | 644 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); |
628 frame = framer_->SerializeFrame(headers_frame); | 645 frame = framer_->SerializeFrame(headers_frame); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
838 } | 855 } |
839 } | 856 } |
840 QuicSpdySessionPeer::SetHpackDecoderDebugVisitor( | 857 QuicSpdySessionPeer::SetHpackDecoderDebugVisitor( |
841 &session_, std::move(hpack_decoder_visitor)); | 858 &session_, std::move(hpack_decoder_visitor)); |
842 | 859 |
843 // Create some headers we expect to generate entries in HPACK's | 860 // Create some headers we expect to generate entries in HPACK's |
844 // dynamic table, in addition to content-length. | 861 // dynamic table, in addition to content-length. |
845 headers_["key0"] = string(1 << 1, '.'); | 862 headers_["key0"] = string(1 << 1, '.'); |
846 headers_["key1"] = string(1 << 2, '.'); | 863 headers_["key1"] = string(1 << 2, '.'); |
847 headers_["key2"] = string(1 << 3, '.'); | 864 headers_["key2"] = string(1 << 3, '.'); |
848 for (QuicStreamId stream_id = kClientDataStreamId1; | 865 for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_; |
849 stream_id < kClientDataStreamId3; stream_id += 2) { | 866 stream_id += next_stream_id_) { |
850 for (bool fin : {false, true}) { | 867 for (bool fin : {false, true}) { |
851 for (SpdyPriority priority = 0; priority < 7; ++priority) { | 868 for (SpdyPriority priority = 0; priority < 7; ++priority) { |
852 // Replace with "WriteHeadersAndSaveData" | 869 // Replace with "WriteHeadersAndSaveData" |
853 SpdySerializedFrame frame; | 870 SpdySerializedFrame frame; |
854 if (perspective() == Perspective::IS_SERVER) { | 871 if (perspective() == Perspective::IS_SERVER) { |
855 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); | 872 SpdyHeadersIR headers_frame(stream_id, headers_.Clone()); |
856 headers_frame.set_fin(fin); | 873 headers_frame.set_fin(fin); |
857 headers_frame.set_has_priority(true); | 874 headers_frame.set_has_priority(true); |
858 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); | 875 headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0)); |
859 frame = framer_->SerializeFrame(headers_frame); | 876 frame = framer_->SerializeFrame(headers_frame); |
(...skipping 29 matching lines...) Expand all Loading... |
889 } else { | 906 } else { |
890 InSequence seq; | 907 InSequence seq; |
891 for (int i = 1; i < 28; i++) { | 908 for (int i = 1; i < 28; i++) { |
892 EXPECT_CALL(*hpack_encoder_visitor, | 909 EXPECT_CALL(*hpack_encoder_visitor, |
893 OnUseEntry(QuicTime::Delta::FromMilliseconds(i))); | 910 OnUseEntry(QuicTime::Delta::FromMilliseconds(i))); |
894 } | 911 } |
895 } | 912 } |
896 QuicSpdySessionPeer::SetHpackEncoderDebugVisitor( | 913 QuicSpdySessionPeer::SetHpackEncoderDebugVisitor( |
897 &session_, std::move(hpack_encoder_visitor)); | 914 &session_, std::move(hpack_encoder_visitor)); |
898 | 915 |
899 for (QuicStreamId stream_id = kClientDataStreamId1; | 916 for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_; |
900 stream_id < kClientDataStreamId3; stream_id += 2) { | 917 stream_id += next_stream_id_) { |
901 for (bool fin : {false, true}) { | 918 for (bool fin : {false, true}) { |
902 if (perspective() == Perspective::IS_SERVER) { | 919 if (perspective() == Perspective::IS_SERVER) { |
903 WriteAndExpectResponseHeaders(stream_id, fin); | 920 WriteAndExpectResponseHeaders(stream_id, fin); |
904 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 921 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
905 } else { | 922 } else { |
906 for (SpdyPriority priority = 0; priority < 7; ++priority) { | 923 for (SpdyPriority priority = 0; priority < 7; ++priority) { |
907 // TODO(rch): implement priorities correctly. | 924 // TODO(rch): implement priorities correctly. |
908 WriteAndExpectRequestHeaders(stream_id, fin, 0); | 925 WriteAndExpectRequestHeaders(stream_id, fin, 0); |
909 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 926 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
910 } | 927 } |
911 } | 928 } |
912 } | 929 } |
913 } | 930 } |
914 } | 931 } |
915 | 932 |
916 TEST_P(QuicHeadersStreamTest, WritevStreamData) { | 933 TEST_P(QuicHeadersStreamTest, WritevStreamData) { |
917 QuicStreamId id = kClientDataStreamId1; | 934 QuicStreamId id = client_id_1_; |
918 QuicStreamOffset offset = 0; | 935 QuicStreamOffset offset = 0; |
919 struct iovec iov; | 936 struct iovec iov; |
920 | 937 |
921 // This test will issue a write that will require fragmenting into | 938 // This test will issue a write that will require fragmenting into |
922 // multiple HTTP/2 DATA frames. | 939 // multiple HTTP/2 DATA frames. |
923 const int kMinDataFrames = 4; | 940 const int kMinDataFrames = 4; |
924 const size_t data_len = kSpdyInitialFrameSizeLimit * kMinDataFrames + 1024; | 941 const size_t data_len = kSpdyInitialFrameSizeLimit * kMinDataFrames + 1024; |
925 // Set headers stream send window large enough for data written below. | 942 // Set headers stream send window large enough for data written below. |
926 headers_stream_->flow_controller()->UpdateSendWindowOffset(data_len * 2 * 4); | 943 headers_stream_->flow_controller()->UpdateSendWindowOffset(data_len * 2 * 4); |
927 string data(data_len, 'a'); | 944 string data(data_len, 'a'); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 TEST_P(QuicHeadersStreamTest, WritevStreamDataFinOnly) { | 986 TEST_P(QuicHeadersStreamTest, WritevStreamDataFinOnly) { |
970 struct iovec iov; | 987 struct iovec iov; |
971 string data; | 988 string data; |
972 | 989 |
973 EXPECT_CALL(session_, | 990 EXPECT_CALL(session_, |
974 WritevData(headers_stream_, kHeadersStreamId, _, _, NO_FIN, _)) | 991 WritevData(headers_stream_, kHeadersStreamId, _, _, NO_FIN, _)) |
975 .WillOnce(WithArgs<2, 5>( | 992 .WillOnce(WithArgs<2, 5>( |
976 Invoke(this, &QuicHeadersStreamTest::SaveIovAndNotifyAckListener))); | 993 Invoke(this, &QuicHeadersStreamTest::SaveIovAndNotifyAckListener))); |
977 | 994 |
978 QuicConsumedData consumed_data = session_.WritevStreamData( | 995 QuicConsumedData consumed_data = session_.WritevStreamData( |
979 kClientDataStreamId1, MakeIOVector(data, &iov), 0, true, nullptr); | 996 client_id_1_, MakeIOVector(data, &iov), 0, true, nullptr); |
980 | 997 |
981 EXPECT_EQ(consumed_data.bytes_consumed, 0u); | 998 EXPECT_EQ(consumed_data.bytes_consumed, 0u); |
982 EXPECT_EQ(consumed_data.fin_consumed, true); | 999 EXPECT_EQ(consumed_data.fin_consumed, true); |
983 } | 1000 } |
984 | 1001 |
985 TEST_P(QuicHeadersStreamTest, WritevStreamDataSendBlocked) { | 1002 TEST_P(QuicHeadersStreamTest, WritevStreamDataSendBlocked) { |
986 QuicStreamId id = kClientDataStreamId1; | 1003 QuicStreamId id = client_id_1_; |
987 QuicStreamOffset offset = 0; | 1004 QuicStreamOffset offset = 0; |
988 struct iovec iov; | 1005 struct iovec iov; |
989 | 1006 |
990 // This test will issue a write that will require fragmenting into | 1007 // This test will issue a write that will require fragmenting into |
991 // multiple HTTP/2 DATA frames. It will ensure that only 1 frame | 1008 // multiple HTTP/2 DATA frames. It will ensure that only 1 frame |
992 // will go out in the case that the underlying session becomes write | 1009 // will go out in the case that the underlying session becomes write |
993 // blocked. Buffering is required to preserve framing, but the | 1010 // blocked. Buffering is required to preserve framing, but the |
994 // amount of buffering is limited to one HTTP/2 data frame. | 1011 // amount of buffering is limited to one HTTP/2 data frame. |
995 const int kMinDataFrames = 4; | 1012 const int kMinDataFrames = 4; |
996 const size_t data_len = kSpdyInitialFrameSizeLimit * kMinDataFrames + 1024; | 1013 const size_t data_len = kSpdyInitialFrameSizeLimit * kMinDataFrames + 1024; |
(...skipping 23 matching lines...) Expand all Loading... |
1020 consumed_data = session_.WritevStreamData(id, MakeIOVector(data, &iov), | 1037 consumed_data = session_.WritevStreamData(id, MakeIOVector(data, &iov), |
1021 offset, fin, nullptr); | 1038 offset, fin, nullptr); |
1022 | 1039 |
1023 EXPECT_EQ(consumed_data.bytes_consumed, 0u); | 1040 EXPECT_EQ(consumed_data.bytes_consumed, 0u); |
1024 EXPECT_EQ(consumed_data.fin_consumed, false); | 1041 EXPECT_EQ(consumed_data.fin_consumed, false); |
1025 } | 1042 } |
1026 | 1043 |
1027 } // namespace | 1044 } // namespace |
1028 } // namespace test | 1045 } // namespace test |
1029 } // namespace net | 1046 } // namespace net |
OLD | NEW |