| 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 |