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/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include <ostream> | 7 #include <ostream> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 TestPacketWriter* writer, | 428 TestPacketWriter* writer, |
429 Perspective perspective, | 429 Perspective perspective, |
430 QuicVersion version) | 430 QuicVersion version) |
431 : QuicConnection(connection_id, | 431 : QuicConnection(connection_id, |
432 address, | 432 address, |
433 helper, | 433 helper, |
434 writer, | 434 writer, |
435 /* owns_writer= */ false, | 435 /* owns_writer= */ false, |
436 perspective, | 436 perspective, |
437 SupportedVersions(version)) { | 437 SupportedVersions(version)) { |
438 // Disable tail loss probes for most tests. | |
439 QuicSentPacketManagerPeer::SetMaxTailLossProbes( | |
440 QuicConnectionPeer::GetSentPacketManager(this), 0); | |
441 writer->set_perspective(perspective); | 438 writer->set_perspective(perspective); |
442 } | 439 } |
443 | 440 |
444 void SendAck() { QuicConnectionPeer::SendAck(this); } | 441 void SendAck() { QuicConnectionPeer::SendAck(this); } |
445 | 442 |
446 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { | 443 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { |
447 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); | 444 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); |
448 } | 445 } |
449 | 446 |
450 void SetLossAlgorithm(LossDetectionInterface* loss_algorithm) { | 447 void SetLossAlgorithm(LossDetectionInterface* loss_algorithm) { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 TestConnectionHelper::TestAlarm* GetTimeoutAlarm() { | 570 TestConnectionHelper::TestAlarm* GetTimeoutAlarm() { |
574 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( | 571 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
575 QuicConnectionPeer::GetTimeoutAlarm(this)); | 572 QuicConnectionPeer::GetTimeoutAlarm(this)); |
576 } | 573 } |
577 | 574 |
578 TestConnectionHelper::TestAlarm* GetMtuDiscoveryAlarm() { | 575 TestConnectionHelper::TestAlarm* GetMtuDiscoveryAlarm() { |
579 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( | 576 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
580 QuicConnectionPeer::GetMtuDiscoveryAlarm(this)); | 577 QuicConnectionPeer::GetMtuDiscoveryAlarm(this)); |
581 } | 578 } |
582 | 579 |
| 580 void DisableTailLossProbe() { |
| 581 QuicSentPacketManagerPeer::SetMaxTailLossProbes( |
| 582 QuicConnectionPeer::GetSentPacketManager(this), 0); |
| 583 } |
| 584 |
583 using QuicConnection::SelectMutualVersion; | 585 using QuicConnection::SelectMutualVersion; |
584 using QuicConnection::set_defer_send_in_response_to_packets; | 586 using QuicConnection::set_defer_send_in_response_to_packets; |
585 | 587 |
586 private: | 588 private: |
587 TestPacketWriter* writer() { | 589 TestPacketWriter* writer() { |
588 return static_cast<TestPacketWriter*>(QuicConnection::writer()); | 590 return static_cast<TestPacketWriter*>(QuicConnection::writer()); |
589 } | 591 } |
590 | 592 |
591 DISALLOW_COPY_AND_ASSIGN(TestConnection); | 593 DISALLOW_COPY_AND_ASSIGN(TestConnection); |
592 }; | 594 }; |
(...skipping 1444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2037 // Fire the RTO and verify that the RST_STREAM is resent, not stream data. | 2039 // Fire the RTO and verify that the RST_STREAM is resent, not stream data. |
2038 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2040 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
2039 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2041 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2040 connection_.GetRetransmissionAlarm()->Fire(); | 2042 connection_.GetRetransmissionAlarm()->Fire(); |
2041 EXPECT_EQ(1u, writer_->frame_count()); | 2043 EXPECT_EQ(1u, writer_->frame_count()); |
2042 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); | 2044 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
2043 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); | 2045 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); |
2044 } | 2046 } |
2045 | 2047 |
2046 TEST_P(QuicConnectionTest, RetransmitForQuicRstStreamNoErrorOnRTO) { | 2048 TEST_P(QuicConnectionTest, RetransmitForQuicRstStreamNoErrorOnRTO) { |
| 2049 connection_.DisableTailLossProbe(); |
| 2050 |
2047 QuicStreamId stream_id = 2; | 2051 QuicStreamId stream_id = 2; |
2048 QuicPacketNumber last_packet; | 2052 QuicPacketNumber last_packet; |
2049 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); | 2053 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); |
2050 | 2054 |
2051 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2055 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
2052 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); | 2056 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
2053 | 2057 |
2054 // Fire the RTO and verify that the RST_STREAM is resent, the stream data | 2058 // Fire the RTO and verify that the RST_STREAM is resent, the stream data |
2055 // is only sent on QUIC_VERSION_29 or later versions. | 2059 // is only sent on QUIC_VERSION_29 or later versions. |
2056 if (version() > QUIC_VERSION_28) { | 2060 if (version() > QUIC_VERSION_28) { |
2057 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2061 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
2058 .Times(AtLeast(2)); | 2062 .Times(AtLeast(2)); |
2059 } else { | 2063 } else { |
2060 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2064 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
2061 } | 2065 } |
2062 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2066 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2063 connection_.GetRetransmissionAlarm()->Fire(); | 2067 connection_.GetRetransmissionAlarm()->Fire(); |
2064 EXPECT_EQ(1u, writer_->frame_count()); | 2068 EXPECT_EQ(1u, writer_->frame_count()); |
2065 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); | 2069 ASSERT_EQ(1u, writer_->rst_stream_frames().size()); |
2066 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); | 2070 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); |
2067 } | 2071 } |
2068 | 2072 |
2069 TEST_P(QuicConnectionTest, DoNotSendPendingRetransmissionForResetStream) { | 2073 TEST_P(QuicConnectionTest, DoNotSendPendingRetransmissionForResetStream) { |
2070 QuicStreamId stream_id = 2; | 2074 QuicStreamId stream_id = 2; |
2071 QuicPacketNumber last_packet; | 2075 QuicPacketNumber last_packet; |
2072 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); | 2076 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); |
2073 SendStreamDataToPeer(stream_id, "foos", 3, !kFin, &last_packet); | 2077 SendStreamDataToPeer(stream_id, "foos", 3, !kFin, &last_packet); |
2074 BlockOnNextWrite(); | 2078 BlockOnNextWrite(); |
2075 connection_.SendStreamDataWithString(stream_id, "fooos", 7, !kFin, nullptr); | 2079 connection_.SendStreamDataWithString(stream_id, "fooos", 7, !kFin, nullptr); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2194 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); | 2198 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); |
2195 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _)) | 2199 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _)) |
2196 .WillOnce(SetArgPointee<3>(lost_packets)); | 2200 .WillOnce(SetArgPointee<3>(lost_packets)); |
2197 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 2201 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
2198 EXPECT_CALL(*send_algorithm_, | 2202 EXPECT_CALL(*send_algorithm_, |
2199 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)); | 2203 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)); |
2200 ProcessAckPacket(&frame); | 2204 ProcessAckPacket(&frame); |
2201 } | 2205 } |
2202 | 2206 |
2203 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { | 2207 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { |
| 2208 connection_.DisableTailLossProbe(); |
| 2209 |
2204 for (int i = 0; i < 10; ++i) { | 2210 for (int i = 0; i < 10; ++i) { |
2205 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2211 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
2206 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, nullptr); | 2212 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, nullptr); |
2207 } | 2213 } |
2208 | 2214 |
2209 // Block the writer and ensure they're queued. | 2215 // Block the writer and ensure they're queued. |
2210 BlockOnNextWrite(); | 2216 BlockOnNextWrite(); |
2211 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2217 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2212 // Only one packet should be retransmitted. | 2218 // Only one packet should be retransmitted. |
2213 connection_.GetRetransmissionAlarm()->Fire(); | 2219 connection_.GetRetransmissionAlarm()->Fire(); |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2427 // so send algorithm's OnRetransmissionTimeout is not called. | 2433 // so send algorithm's OnRetransmissionTimeout is not called. |
2428 clock_.AdvanceTime(retransmission_time.Subtract(clock_.Now())); | 2434 clock_.AdvanceTime(retransmission_time.Subtract(clock_.Now())); |
2429 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); | 2435 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); |
2430 connection_.GetRetransmissionAlarm()->Fire(); | 2436 connection_.GetRetransmissionAlarm()->Fire(); |
2431 EXPECT_EQ(2u, writer_->header().packet_number); | 2437 EXPECT_EQ(2u, writer_->header().packet_number); |
2432 // We do not raise the high water mark yet. | 2438 // We do not raise the high water mark yet. |
2433 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2439 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
2434 } | 2440 } |
2435 | 2441 |
2436 TEST_P(QuicConnectionTest, RTO) { | 2442 TEST_P(QuicConnectionTest, RTO) { |
| 2443 connection_.DisableTailLossProbe(); |
| 2444 |
2437 QuicTime default_retransmission_time = | 2445 QuicTime default_retransmission_time = |
2438 clock_.ApproximateNow().Add(DefaultRetransmissionTime()); | 2446 clock_.ApproximateNow().Add(DefaultRetransmissionTime()); |
2439 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2447 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); |
2440 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2448 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
2441 | 2449 |
2442 EXPECT_EQ(1u, writer_->header().packet_number); | 2450 EXPECT_EQ(1u, writer_->header().packet_number); |
2443 EXPECT_EQ(default_retransmission_time, | 2451 EXPECT_EQ(default_retransmission_time, |
2444 connection_.GetRetransmissionAlarm()->deadline()); | 2452 connection_.GetRetransmissionAlarm()->deadline()); |
2445 // Simulate the retransmission alarm firing. | 2453 // Simulate the retransmission alarm firing. |
2446 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2454 clock_.AdvanceTime(DefaultRetransmissionTime()); |
2447 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); | 2455 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); |
2448 connection_.GetRetransmissionAlarm()->Fire(); | 2456 connection_.GetRetransmissionAlarm()->Fire(); |
2449 EXPECT_EQ(2u, writer_->header().packet_number); | 2457 EXPECT_EQ(2u, writer_->header().packet_number); |
2450 // We do not raise the high water mark yet. | 2458 // We do not raise the high water mark yet. |
2451 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2459 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
2452 } | 2460 } |
2453 | 2461 |
2454 TEST_P(QuicConnectionTest, RTOWithSameEncryptionLevel) { | 2462 TEST_P(QuicConnectionTest, RTOWithSameEncryptionLevel) { |
| 2463 connection_.DisableTailLossProbe(); |
| 2464 |
2455 QuicTime default_retransmission_time = | 2465 QuicTime default_retransmission_time = |
2456 clock_.ApproximateNow().Add(DefaultRetransmissionTime()); | 2466 clock_.ApproximateNow().Add(DefaultRetransmissionTime()); |
2457 use_tagging_decrypter(); | 2467 use_tagging_decrypter(); |
2458 | 2468 |
2459 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at | 2469 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at |
2460 // the end of the packet. We can test this to check which encrypter was used. | 2470 // the end of the packet. We can test this to check which encrypter was used. |
2461 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); | 2471 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); |
2462 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2472 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); |
2463 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet()); | 2473 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet()); |
2464 | 2474 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2669 ENCRYPTION_INITIAL); | 2679 ENCRYPTION_INITIAL); |
2670 | 2680 |
2671 // Finally, process a third packet and note that we do not reprocess the | 2681 // Finally, process a third packet and note that we do not reprocess the |
2672 // buffered packet. | 2682 // buffered packet. |
2673 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 2683 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
2674 ProcessDataPacketAtLevel(kDefaultPathId, 102, kEntropyFlag, !kHasStopWaiting, | 2684 ProcessDataPacketAtLevel(kDefaultPathId, 102, kEntropyFlag, !kHasStopWaiting, |
2675 ENCRYPTION_INITIAL); | 2685 ENCRYPTION_INITIAL); |
2676 } | 2686 } |
2677 | 2687 |
2678 TEST_P(QuicConnectionTest, TestRetransmitOrder) { | 2688 TEST_P(QuicConnectionTest, TestRetransmitOrder) { |
| 2689 connection_.DisableTailLossProbe(); |
| 2690 |
2679 QuicByteCount first_packet_size; | 2691 QuicByteCount first_packet_size; |
2680 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2692 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
2681 .WillOnce(DoAll(SaveArg<3>(&first_packet_size), Return(true))); | 2693 .WillOnce(DoAll(SaveArg<3>(&first_packet_size), Return(true))); |
2682 | 2694 |
2683 connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, nullptr); | 2695 connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, nullptr); |
2684 QuicByteCount second_packet_size; | 2696 QuicByteCount second_packet_size; |
2685 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2697 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
2686 .WillOnce(DoAll(SaveArg<3>(&second_packet_size), Return(true))); | 2698 .WillOnce(DoAll(SaveArg<3>(&second_packet_size), Return(true))); |
2687 connection_.SendStreamDataWithString(3, "second_packet", 12, !kFin, nullptr); | 2699 connection_.SendStreamDataWithString(3, "second_packet", 12, !kFin, nullptr); |
2688 EXPECT_NE(first_packet_size, second_packet_size); | 2700 EXPECT_NE(first_packet_size, second_packet_size); |
(...skipping 23 matching lines...) Expand all Loading... |
2712 // Make sure that RTO is not started when the packet is queued. | 2724 // Make sure that RTO is not started when the packet is queued. |
2713 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2725 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
2714 | 2726 |
2715 // Test that RTO is started once we write to the socket. | 2727 // Test that RTO is started once we write to the socket. |
2716 writer_->SetWritable(); | 2728 writer_->SetWritable(); |
2717 connection_.OnCanWrite(); | 2729 connection_.OnCanWrite(); |
2718 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2730 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
2719 } | 2731 } |
2720 | 2732 |
2721 TEST_P(QuicConnectionTest, DelayRTOWithAckReceipt) { | 2733 TEST_P(QuicConnectionTest, DelayRTOWithAckReceipt) { |
| 2734 connection_.DisableTailLossProbe(); |
| 2735 |
2722 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2736 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2723 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 2737 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
2724 connection_.SendStreamDataWithString(2, "foo", 0, !kFin, nullptr); | 2738 connection_.SendStreamDataWithString(2, "foo", 0, !kFin, nullptr); |
2725 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, nullptr); | 2739 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, nullptr); |
2726 QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm(); | 2740 QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm(); |
2727 EXPECT_TRUE(retransmission_alarm->IsSet()); | 2741 EXPECT_TRUE(retransmission_alarm->IsSet()); |
2728 EXPECT_EQ(clock_.Now().Add(DefaultRetransmissionTime()), | 2742 EXPECT_EQ(clock_.Now().Add(DefaultRetransmissionTime()), |
2729 retransmission_alarm->deadline()); | 2743 retransmission_alarm->deadline()); |
2730 | 2744 |
2731 // Advance the time right before the RTO, then receive an ack for the first | 2745 // Advance the time right before the RTO, then receive an ack for the first |
(...skipping 18 matching lines...) Expand all Loading... |
2750 // The new retransmitted packet number should set the RTO to a larger value | 2764 // The new retransmitted packet number should set the RTO to a larger value |
2751 // than previously. | 2765 // than previously. |
2752 EXPECT_TRUE(retransmission_alarm->IsSet()); | 2766 EXPECT_TRUE(retransmission_alarm->IsSet()); |
2753 QuicTime next_rto_time = retransmission_alarm->deadline(); | 2767 QuicTime next_rto_time = retransmission_alarm->deadline(); |
2754 QuicTime expected_rto_time = | 2768 QuicTime expected_rto_time = |
2755 connection_.sent_packet_manager().GetRetransmissionTime(); | 2769 connection_.sent_packet_manager().GetRetransmissionTime(); |
2756 EXPECT_EQ(next_rto_time, expected_rto_time); | 2770 EXPECT_EQ(next_rto_time, expected_rto_time); |
2757 } | 2771 } |
2758 | 2772 |
2759 TEST_P(QuicConnectionTest, TestQueued) { | 2773 TEST_P(QuicConnectionTest, TestQueued) { |
| 2774 connection_.DisableTailLossProbe(); |
| 2775 |
2760 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2776 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2761 BlockOnNextWrite(); | 2777 BlockOnNextWrite(); |
2762 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2778 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); |
2763 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2779 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
2764 | 2780 |
2765 // Unblock the writes and actually send. | 2781 // Unblock the writes and actually send. |
2766 writer_->SetWritable(); | 2782 writer_->SetWritable(); |
2767 connection_.OnCanWrite(); | 2783 connection_.OnCanWrite(); |
2768 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2784 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2769 } | 2785 } |
(...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4184 EXPECT_CALL(visitor_, | 4200 EXPECT_CALL(visitor_, |
4185 OnConnectionClosed(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, | 4201 OnConnectionClosed(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, |
4186 ConnectionCloseSource::FROM_SELF)); | 4202 ConnectionCloseSource::FROM_SELF)); |
4187 scoped_ptr<QuicEncryptedPacket> encrypted( | 4203 scoped_ptr<QuicEncryptedPacket> encrypted( |
4188 framer_.BuildVersionNegotiationPacket(connection_id_, | 4204 framer_.BuildVersionNegotiationPacket(connection_id_, |
4189 QuicSupportedVersions())); | 4205 QuicSupportedVersions())); |
4190 connection_.ProcessUdpPacket(kSelfAddress, kPeerAddress, *encrypted); | 4206 connection_.ProcessUdpPacket(kSelfAddress, kPeerAddress, *encrypted); |
4191 } | 4207 } |
4192 | 4208 |
4193 TEST_P(QuicConnectionTest, CheckSendStats) { | 4209 TEST_P(QuicConnectionTest, CheckSendStats) { |
| 4210 connection_.DisableTailLossProbe(); |
| 4211 |
4194 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 4212 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
4195 connection_.SendStreamDataWithString(3, "first", 0, !kFin, nullptr); | 4213 connection_.SendStreamDataWithString(3, "first", 0, !kFin, nullptr); |
4196 size_t first_packet_size = writer_->last_packet_size(); | 4214 size_t first_packet_size = writer_->last_packet_size(); |
4197 | 4215 |
4198 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 4216 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
4199 connection_.SendStreamDataWithString(5, "second", 0, !kFin, nullptr); | 4217 connection_.SendStreamDataWithString(5, "second", 0, !kFin, nullptr); |
4200 size_t second_packet_size = writer_->last_packet_size(); | 4218 size_t second_packet_size = writer_->last_packet_size(); |
4201 | 4219 |
4202 // 2 retransmissions due to rto, 1 due to explicit nack. | 4220 // 2 retransmissions due to rto, 1 due to explicit nack. |
4203 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 4221 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4396 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _)); | 4414 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _)); |
4397 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 4415 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
4398 QuicAckFrame second_ack_frame = InitAckFrame(5); | 4416 QuicAckFrame second_ack_frame = InitAckFrame(5); |
4399 ProcessAckPacket(&second_ack_frame); | 4417 ProcessAckPacket(&second_ack_frame); |
4400 } | 4418 } |
4401 | 4419 |
4402 // AckNotifierCallback is triggered by the ack of a packet that timed | 4420 // AckNotifierCallback is triggered by the ack of a packet that timed |
4403 // out and was retransmitted, even though the retransmission has a | 4421 // out and was retransmitted, even though the retransmission has a |
4404 // different packet number. | 4422 // different packet number. |
4405 TEST_P(QuicConnectionTest, AckNotifierCallbackForAckAfterRTO) { | 4423 TEST_P(QuicConnectionTest, AckNotifierCallbackForAckAfterRTO) { |
| 4424 connection_.DisableTailLossProbe(); |
| 4425 |
4406 // Create a listener which we expect to be called. | 4426 // Create a listener which we expect to be called. |
4407 scoped_refptr<MockAckListener> listener(new StrictMock<MockAckListener>); | 4427 scoped_refptr<MockAckListener> listener(new StrictMock<MockAckListener>); |
4408 | 4428 |
4409 QuicTime default_retransmission_time = | 4429 QuicTime default_retransmission_time = |
4410 clock_.ApproximateNow().Add(DefaultRetransmissionTime()); | 4430 clock_.ApproximateNow().Add(DefaultRetransmissionTime()); |
4411 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, listener.get()); | 4431 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, listener.get()); |
4412 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 4432 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
4413 | 4433 |
4414 EXPECT_EQ(1u, writer_->header().packet_number); | 4434 EXPECT_EQ(1u, writer_->header().packet_number); |
4415 EXPECT_EQ(default_retransmission_time, | 4435 EXPECT_EQ(default_retransmission_time, |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4644 EXPECT_FALSE(connection_.connected()); | 4664 EXPECT_FALSE(connection_.connected()); |
4645 } | 4665 } |
4646 | 4666 |
4647 TEST_P(QuicConnectionTest, OnPathDegrading) { | 4667 TEST_P(QuicConnectionTest, OnPathDegrading) { |
4648 QuicByteCount packet_size; | 4668 QuicByteCount packet_size; |
4649 const size_t kMinTimeoutsBeforePathDegrading = 2; | 4669 const size_t kMinTimeoutsBeforePathDegrading = 2; |
4650 | 4670 |
4651 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 4671 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
4652 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true))); | 4672 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true))); |
4653 connection_.SendStreamDataWithString(3, "packet", 0, !kFin, nullptr); | 4673 connection_.SendStreamDataWithString(3, "packet", 0, !kFin, nullptr); |
4654 for (size_t i = 1; i < kMinTimeoutsBeforePathDegrading; ++i) { | 4674 size_t num_timeouts = |
| 4675 kMinTimeoutsBeforePathDegrading + |
| 4676 QuicSentPacketManagerPeer::GetMaxTailLossProbes( |
| 4677 QuicConnectionPeer::GetSentPacketManager(&connection_)); |
| 4678 for (size_t i = 1; i < num_timeouts; ++i) { |
4655 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10 * i)); | 4679 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10 * i)); |
4656 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, packet_size, _)); | 4680 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, packet_size, _)); |
4657 connection_.GetRetransmissionAlarm()->Fire(); | 4681 connection_.GetRetransmissionAlarm()->Fire(); |
4658 } | 4682 } |
4659 // Next RTO should cause OnPathDegrading to be called before the | 4683 // Next RTO should cause OnPathDegrading to be called before the |
4660 // retransmission is sent out. | 4684 // retransmission is sent out. |
4661 clock_.AdvanceTime( | 4685 clock_.AdvanceTime( |
4662 QuicTime::Delta::FromSeconds(kMinTimeoutsBeforePathDegrading * 10)); | 4686 QuicTime::Delta::FromSeconds(kMinTimeoutsBeforePathDegrading * 10)); |
4663 { | 4687 { |
4664 InSequence s; | 4688 InSequence s; |
4665 EXPECT_CALL(visitor_, OnPathDegrading()); | 4689 EXPECT_CALL(visitor_, OnPathDegrading()); |
4666 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, packet_size, _)); | 4690 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, packet_size, _)); |
4667 } | 4691 } |
4668 connection_.GetRetransmissionAlarm()->Fire(); | 4692 connection_.GetRetransmissionAlarm()->Fire(); |
4669 } | 4693 } |
4670 | 4694 |
4671 TEST_P(QuicConnectionTest, MultipleCallsToSendConnectionCloseWithDetails) { | 4695 TEST_P(QuicConnectionTest, MultipleCallsToSendConnectionCloseWithDetails) { |
4672 // Verifies that multiple calls to SendConnectionCloseWithDetails do not | 4696 // Verifies that multiple calls to SendConnectionCloseWithDetails do not |
4673 // result in multiple attempts to close the connection - it will be marked as | 4697 // result in multiple attempts to close the connection - it will be marked as |
4674 // disconnected after the first call. | 4698 // disconnected after the first call. |
4675 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); | 4699 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); |
4676 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); | 4700 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); |
4677 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); | 4701 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); |
4678 } | 4702 } |
4679 | 4703 |
4680 } // namespace | 4704 } // namespace |
4681 } // namespace test | 4705 } // namespace test |
4682 } // namespace net | 4706 } // namespace net |
OLD | NEW |