OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/core/quic_session.h" | 5 #include "net/quic/core/quic_session.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 EXPECT_CALL(*stream2, OnCanWrite()) | 485 EXPECT_CALL(*stream2, OnCanWrite()) |
486 .WillOnce(DoAll(testing::IgnoreResult(Invoke(CreateFunctor( | 486 .WillOnce(DoAll(testing::IgnoreResult(Invoke(CreateFunctor( |
487 &TestSession::SendLargeFakeData, | 487 &TestSession::SendLargeFakeData, |
488 base::Unretained(&session_), stream2, 6000))), | 488 base::Unretained(&session_), stream2, 6000))), |
489 Invoke(&stream2_blocker, | 489 Invoke(&stream2_blocker, |
490 &StreamBlocker::MarkConnectionLevelWriteBlocked))); | 490 &StreamBlocker::MarkConnectionLevelWriteBlocked))); |
491 session_.OnCanWrite(); | 491 session_.OnCanWrite(); |
492 } | 492 } |
493 | 493 |
494 TEST_P(QuicSessionTestServer, OnCanWriteBundlesStreams) { | 494 TEST_P(QuicSessionTestServer, OnCanWriteBundlesStreams) { |
| 495 FLAGS_quic_enable_app_limited_check = true; |
| 496 |
495 // Encryption needs to be established before data can be sent. | 497 // Encryption needs to be established before data can be sent. |
496 CryptoHandshakeMessage msg; | 498 CryptoHandshakeMessage msg; |
497 session_.GetCryptoStream()->OnHandshakeMessage(msg); | 499 session_.GetCryptoStream()->OnHandshakeMessage(msg); |
498 | 500 |
499 // Drive congestion control manually. | 501 // Drive congestion control manually. |
500 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; | 502 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; |
501 QuicConnectionPeer::SetSendAlgorithm(session_.connection(), kDefaultPathId, | 503 QuicConnectionPeer::SetSendAlgorithm(session_.connection(), kDefaultPathId, |
502 send_algorithm); | 504 send_algorithm); |
503 | 505 |
504 TestStream* stream2 = session_.CreateOutgoingDynamicStream(kDefaultPriority); | 506 TestStream* stream2 = session_.CreateOutgoingDynamicStream(kDefaultPriority); |
(...skipping 21 matching lines...) Expand all Loading... |
526 Invoke(CreateFunctor(&TestSession::SendStreamData, | 528 Invoke(CreateFunctor(&TestSession::SendStreamData, |
527 base::Unretained(&session_), stream6)))); | 529 base::Unretained(&session_), stream6)))); |
528 | 530 |
529 // Expect that we only send one packet, the writes from different streams | 531 // Expect that we only send one packet, the writes from different streams |
530 // should be bundled together. | 532 // should be bundled together. |
531 MockPacketWriter* writer = static_cast<MockPacketWriter*>( | 533 MockPacketWriter* writer = static_cast<MockPacketWriter*>( |
532 QuicConnectionPeer::GetWriter(session_.connection())); | 534 QuicConnectionPeer::GetWriter(session_.connection())); |
533 EXPECT_CALL(*writer, WritePacket(_, _, _, _, _)) | 535 EXPECT_CALL(*writer, WritePacket(_, _, _, _, _)) |
534 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 536 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
535 EXPECT_CALL(*send_algorithm, OnPacketSent(_, _, _, _, _)); | 537 EXPECT_CALL(*send_algorithm, OnPacketSent(_, _, _, _, _)); |
| 538 EXPECT_CALL(*send_algorithm, OnApplicationLimited(_)); |
536 session_.OnCanWrite(); | 539 session_.OnCanWrite(); |
537 EXPECT_FALSE(session_.WillingAndAbleToWrite()); | 540 EXPECT_FALSE(session_.WillingAndAbleToWrite()); |
538 } | 541 } |
539 | 542 |
540 TEST_P(QuicSessionTestServer, OnCanWriteCongestionControlBlocks) { | 543 TEST_P(QuicSessionTestServer, OnCanWriteCongestionControlBlocks) { |
| 544 FLAGS_quic_enable_app_limited_check = true; |
| 545 |
541 InSequence s; | 546 InSequence s; |
542 | 547 |
543 // Drive congestion control manually. | 548 // Drive congestion control manually. |
544 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; | 549 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; |
545 QuicConnectionPeer::SetSendAlgorithm(session_.connection(), kDefaultPathId, | 550 QuicConnectionPeer::SetSendAlgorithm(session_.connection(), kDefaultPathId, |
546 send_algorithm); | 551 send_algorithm); |
547 | 552 |
548 TestStream* stream2 = session_.CreateOutgoingDynamicStream(kDefaultPriority); | 553 TestStream* stream2 = session_.CreateOutgoingDynamicStream(kDefaultPriority); |
549 TestStream* stream4 = session_.CreateOutgoingDynamicStream(kDefaultPriority); | 554 TestStream* stream4 = session_.CreateOutgoingDynamicStream(kDefaultPriority); |
550 TestStream* stream6 = session_.CreateOutgoingDynamicStream(kDefaultPriority); | 555 TestStream* stream6 = session_.CreateOutgoingDynamicStream(kDefaultPriority); |
(...skipping 20 matching lines...) Expand all Loading... |
571 EXPECT_CALL(*send_algorithm, TimeUntilSend(_, _)) | 576 EXPECT_CALL(*send_algorithm, TimeUntilSend(_, _)) |
572 .WillOnce(Return(QuicTime::Delta::Infinite())); | 577 .WillOnce(Return(QuicTime::Delta::Infinite())); |
573 session_.OnCanWrite(); | 578 session_.OnCanWrite(); |
574 EXPECT_TRUE(session_.WillingAndAbleToWrite()); | 579 EXPECT_TRUE(session_.WillingAndAbleToWrite()); |
575 | 580 |
576 // stream4->OnCanWrite is called once the connection stops being | 581 // stream4->OnCanWrite is called once the connection stops being |
577 // congestion-control blocked. | 582 // congestion-control blocked. |
578 EXPECT_CALL(*send_algorithm, TimeUntilSend(_, _)) | 583 EXPECT_CALL(*send_algorithm, TimeUntilSend(_, _)) |
579 .WillOnce(Return(QuicTime::Delta::Zero())); | 584 .WillOnce(Return(QuicTime::Delta::Zero())); |
580 EXPECT_CALL(*stream4, OnCanWrite()); | 585 EXPECT_CALL(*stream4, OnCanWrite()); |
| 586 EXPECT_CALL(*send_algorithm, OnApplicationLimited(_)); |
581 session_.OnCanWrite(); | 587 session_.OnCanWrite(); |
582 EXPECT_FALSE(session_.WillingAndAbleToWrite()); | 588 EXPECT_FALSE(session_.WillingAndAbleToWrite()); |
583 } | 589 } |
584 | 590 |
| 591 TEST_P(QuicSessionTestServer, OnCanWriteWriterBlocks) { |
| 592 FLAGS_quic_enable_app_limited_check = true; |
| 593 |
| 594 // Drive congestion control manually in order to ensure that |
| 595 // application-limited signaling is handled correctly. |
| 596 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; |
| 597 QuicConnectionPeer::SetSendAlgorithm(session_.connection(), kDefaultPathId, |
| 598 send_algorithm); |
| 599 EXPECT_CALL(*send_algorithm, TimeUntilSend(_, _)) |
| 600 .WillRepeatedly(Return(QuicTime::Delta::Zero())); |
| 601 |
| 602 // Drive packet writer manually. |
| 603 MockPacketWriter* writer = static_cast<MockPacketWriter*>( |
| 604 QuicConnectionPeer::GetWriter(session_.connection())); |
| 605 EXPECT_CALL(*writer, IsWriteBlocked()).WillRepeatedly(Return(true)); |
| 606 EXPECT_CALL(*writer, IsWriteBlockedDataBuffered()) |
| 607 .WillRepeatedly(Return(true)); |
| 608 EXPECT_CALL(*writer, WritePacket(_, _, _, _, _)).Times(0); |
| 609 |
| 610 TestStream* stream2 = session_.CreateOutgoingDynamicStream(kDefaultPriority); |
| 611 |
| 612 session_.MarkConnectionLevelWriteBlocked(stream2->id()); |
| 613 |
| 614 EXPECT_CALL(*stream2, OnCanWrite()).Times(0); |
| 615 EXPECT_CALL(*send_algorithm, OnApplicationLimited(_)).Times(0); |
| 616 |
| 617 session_.OnCanWrite(); |
| 618 EXPECT_TRUE(session_.WillingAndAbleToWrite()); |
| 619 } |
| 620 |
585 TEST_P(QuicSessionTestServer, BufferedHandshake) { | 621 TEST_P(QuicSessionTestServer, BufferedHandshake) { |
586 EXPECT_FALSE(session_.HasPendingHandshake()); // Default value. | 622 EXPECT_FALSE(session_.HasPendingHandshake()); // Default value. |
587 | 623 |
588 // Test that blocking other streams does not change our status. | 624 // Test that blocking other streams does not change our status. |
589 TestStream* stream2 = session_.CreateOutgoingDynamicStream(kDefaultPriority); | 625 TestStream* stream2 = session_.CreateOutgoingDynamicStream(kDefaultPriority); |
590 StreamBlocker stream2_blocker(&session_, stream2->id()); | 626 StreamBlocker stream2_blocker(&session_, stream2->id()); |
591 stream2_blocker.MarkConnectionLevelWriteBlocked(); | 627 stream2_blocker.MarkConnectionLevelWriteBlocked(); |
592 EXPECT_FALSE(session_.HasPendingHandshake()); | 628 EXPECT_FALSE(session_.HasPendingHandshake()); |
593 | 629 |
594 TestStream* stream3 = session_.CreateOutgoingDynamicStream(kDefaultPriority); | 630 TestStream* stream3 = session_.CreateOutgoingDynamicStream(kDefaultPriority); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 CloseStream(stream6->id()); | 673 CloseStream(stream6->id()); |
638 | 674 |
639 InSequence s; | 675 InSequence s; |
640 EXPECT_CALL(*stream2, OnCanWrite()); | 676 EXPECT_CALL(*stream2, OnCanWrite()); |
641 EXPECT_CALL(*stream4, OnCanWrite()); | 677 EXPECT_CALL(*stream4, OnCanWrite()); |
642 session_.OnCanWrite(); | 678 session_.OnCanWrite(); |
643 EXPECT_FALSE(session_.WillingAndAbleToWrite()); | 679 EXPECT_FALSE(session_.WillingAndAbleToWrite()); |
644 } | 680 } |
645 | 681 |
646 TEST_P(QuicSessionTestServer, OnCanWriteLimitsNumWritesIfFlowControlBlocked) { | 682 TEST_P(QuicSessionTestServer, OnCanWriteLimitsNumWritesIfFlowControlBlocked) { |
| 683 FLAGS_quic_enable_app_limited_check = true; |
| 684 |
| 685 // Drive congestion control manually in order to ensure that |
| 686 // application-limited signaling is handled correctly. |
| 687 MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>; |
| 688 QuicConnectionPeer::SetSendAlgorithm(session_.connection(), kDefaultPathId, |
| 689 send_algorithm); |
| 690 EXPECT_CALL(*send_algorithm, TimeUntilSend(_, _)) |
| 691 .WillRepeatedly(Return(QuicTime::Delta::Zero())); |
| 692 |
647 // Ensure connection level flow control blockage. | 693 // Ensure connection level flow control blockage. |
648 QuicFlowControllerPeer::SetSendWindowOffset(session_.flow_controller(), 0); | 694 QuicFlowControllerPeer::SetSendWindowOffset(session_.flow_controller(), 0); |
649 EXPECT_TRUE(session_.flow_controller()->IsBlocked()); | 695 EXPECT_TRUE(session_.flow_controller()->IsBlocked()); |
650 EXPECT_TRUE(session_.IsConnectionFlowControlBlocked()); | 696 EXPECT_TRUE(session_.IsConnectionFlowControlBlocked()); |
651 EXPECT_FALSE(session_.IsStreamFlowControlBlocked()); | 697 EXPECT_FALSE(session_.IsStreamFlowControlBlocked()); |
652 | 698 |
653 // Mark the crypto and headers streams as write blocked, we expect them to be | 699 // Mark the crypto and headers streams as write blocked, we expect them to be |
654 // allowed to write later. | 700 // allowed to write later. |
655 session_.MarkConnectionLevelWriteBlocked(kCryptoStreamId); | 701 session_.MarkConnectionLevelWriteBlocked(kCryptoStreamId); |
656 session_.MarkConnectionLevelWriteBlocked(kHeadersStreamId); | 702 session_.MarkConnectionLevelWriteBlocked(kHeadersStreamId); |
657 | 703 |
658 // Create a data stream, and although it is write blocked we never expect it | 704 // Create a data stream, and although it is write blocked we never expect it |
659 // to be allowed to write as we are connection level flow control blocked. | 705 // to be allowed to write as we are connection level flow control blocked. |
660 TestStream* stream = session_.CreateOutgoingDynamicStream(kDefaultPriority); | 706 TestStream* stream = session_.CreateOutgoingDynamicStream(kDefaultPriority); |
661 session_.MarkConnectionLevelWriteBlocked(stream->id()); | 707 session_.MarkConnectionLevelWriteBlocked(stream->id()); |
662 EXPECT_CALL(*stream, OnCanWrite()).Times(0); | 708 EXPECT_CALL(*stream, OnCanWrite()).Times(0); |
663 | 709 |
664 // The crypto and headers streams should be called even though we are | 710 // The crypto and headers streams should be called even though we are |
665 // connection flow control blocked. | 711 // connection flow control blocked. |
666 TestCryptoStream* crypto_stream = session_.GetCryptoStream(); | 712 TestCryptoStream* crypto_stream = session_.GetCryptoStream(); |
667 EXPECT_CALL(*crypto_stream, OnCanWrite()); | 713 EXPECT_CALL(*crypto_stream, OnCanWrite()); |
668 TestHeadersStream* headers_stream = new TestHeadersStream(&session_); | 714 TestHeadersStream* headers_stream = new TestHeadersStream(&session_); |
669 QuicSpdySessionPeer::SetHeadersStream(&session_, headers_stream); | 715 QuicSpdySessionPeer::SetHeadersStream(&session_, headers_stream); |
670 EXPECT_CALL(*headers_stream, OnCanWrite()); | 716 EXPECT_CALL(*headers_stream, OnCanWrite()); |
671 | 717 |
| 718 // After the crypto and header streams perform a write, the connection will be |
| 719 // blocked by the flow control, hence it should become application-limited. |
| 720 EXPECT_CALL(*send_algorithm, OnApplicationLimited(_)); |
| 721 |
672 session_.OnCanWrite(); | 722 session_.OnCanWrite(); |
673 EXPECT_FALSE(session_.WillingAndAbleToWrite()); | 723 EXPECT_FALSE(session_.WillingAndAbleToWrite()); |
674 } | 724 } |
675 | 725 |
676 TEST_P(QuicSessionTestServer, SendGoAway) { | 726 TEST_P(QuicSessionTestServer, SendGoAway) { |
677 MockPacketWriter* writer = static_cast<MockPacketWriter*>( | 727 MockPacketWriter* writer = static_cast<MockPacketWriter*>( |
678 QuicConnectionPeer::GetWriter(session_.connection())); | 728 QuicConnectionPeer::GetWriter(session_.connection())); |
679 EXPECT_CALL(*writer, WritePacket(_, _, _, _, _)) | 729 EXPECT_CALL(*writer, WritePacket(_, _, _, _, _)) |
680 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 730 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
681 EXPECT_CALL(*connection_, SendGoAway(_, _, _)) | 731 EXPECT_CALL(*connection_, SendGoAway(_, _, _)) |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1203 if (version() <= QUIC_VERSION_35) { | 1253 if (version() <= QUIC_VERSION_35) { |
1204 EXPECT_FALSE(session_.force_hol_blocking()); | 1254 EXPECT_FALSE(session_.force_hol_blocking()); |
1205 } else { | 1255 } else { |
1206 EXPECT_TRUE(session_.force_hol_blocking()); | 1256 EXPECT_TRUE(session_.force_hol_blocking()); |
1207 } | 1257 } |
1208 } | 1258 } |
1209 | 1259 |
1210 } // namespace | 1260 } // namespace |
1211 } // namespace test | 1261 } // namespace test |
1212 } // namespace net | 1262 } // namespace net |
OLD | NEW |