| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 // Test of the full congestion control chain. | 5 // Test of the full congestion control chain. |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "net/quic/congestion_control/quic_congestion_manager.h" | 9 #include "net/quic/congestion_control/quic_congestion_manager.h" |
| 10 #include "net/quic/quic_protocol.h" | 10 #include "net/quic/quic_protocol.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 TEST_F(QuicCongestionControlTest, FixedRateSenderAPI) { | 43 TEST_F(QuicCongestionControlTest, FixedRateSenderAPI) { |
| 44 SetUpCongestionType(kFixRate); | 44 SetUpCongestionType(kFixRate); |
| 45 QuicCongestionFeedbackFrame congestion_feedback; | 45 QuicCongestionFeedbackFrame congestion_feedback; |
| 46 congestion_feedback.type = kFixRate; | 46 congestion_feedback.type = kFixRate; |
| 47 congestion_feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(30); | 47 congestion_feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(30); |
| 48 manager_->OnIncomingQuicCongestionFeedbackFrame(congestion_feedback, | 48 manager_->OnIncomingQuicCongestionFeedbackFrame(congestion_feedback, |
| 49 clock_.Now()); | 49 clock_.Now()); |
| 50 EXPECT_TRUE(manager_->TimeUntilSend(clock_.Now(), | 50 EXPECT_TRUE(manager_->TimeUntilSend(clock_.Now(), |
| 51 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); | 51 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); |
| 52 manager_->SentPacket(1, clock_.Now(), kMaxPacketSize, NOT_RETRANSMISSION); | 52 manager_->SentPacket(1, clock_.Now(), kMaxPacketSize, NOT_RETRANSMISSION, |
| 53 HAS_RETRANSMITTABLE_DATA); |
| 53 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(40), | 54 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(40), |
| 54 manager_->TimeUntilSend(clock_.Now(), | 55 manager_->TimeUntilSend(clock_.Now(), |
| 55 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE)); | 56 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE)); |
| 56 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(35)); | 57 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(35)); |
| 57 EXPECT_EQ(QuicTime::Delta::Infinite(), | 58 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 58 manager_->TimeUntilSend(clock_.Now(), | 59 manager_->TimeUntilSend(clock_.Now(), |
| 59 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE)); | 60 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE)); |
| 60 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); | 61 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); |
| 61 EXPECT_EQ(QuicTime::Delta::Infinite(), | 62 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 62 manager_->TimeUntilSend(clock_.Now(), | 63 manager_->TimeUntilSend(clock_.Now(), |
| 63 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE)); | 64 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE)); |
| 64 } | 65 } |
| 65 | 66 |
| 66 TEST_F(QuicCongestionControlTest, FixedRatePacing) { | 67 TEST_F(QuicCongestionControlTest, FixedRatePacing) { |
| 67 SetUpCongestionType(kFixRate); | 68 SetUpCongestionType(kFixRate); |
| 68 QuicAckFrame ack; | 69 QuicAckFrame ack; |
| 69 ack.received_info.largest_observed = 0; | 70 ack.received_info.largest_observed = 0; |
| 70 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 71 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 71 | 72 |
| 72 QuicCongestionFeedbackFrame feedback; | 73 QuicCongestionFeedbackFrame feedback; |
| 73 feedback.type = kFixRate; | 74 feedback.type = kFixRate; |
| 74 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(100); | 75 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(100); |
| 75 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | 76 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); |
| 76 | 77 |
| 77 QuicTime acc_advance_time(QuicTime::Zero()); | 78 QuicTime acc_advance_time(QuicTime::Zero()); |
| 78 for (QuicPacketSequenceNumber i = 1; i <= 100; ++i) { | 79 for (QuicPacketSequenceNumber i = 1; i <= 100; ++i) { |
| 79 EXPECT_TRUE(manager_->TimeUntilSend(clock_.Now(), | 80 EXPECT_TRUE(manager_->TimeUntilSend(clock_.Now(), |
| 80 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); | 81 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); |
| 81 manager_->SentPacket(i, clock_.Now(), kMaxPacketSize, NOT_RETRANSMISSION); | 82 manager_->SentPacket(i, clock_.Now(), kMaxPacketSize, NOT_RETRANSMISSION, |
| 83 HAS_RETRANSMITTABLE_DATA); |
| 82 QuicTime::Delta advance_time = manager_->TimeUntilSend(clock_.Now(), | 84 QuicTime::Delta advance_time = manager_->TimeUntilSend(clock_.Now(), |
| 83 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE); | 85 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE); |
| 84 clock_.AdvanceTime(advance_time); | 86 clock_.AdvanceTime(advance_time); |
| 85 acc_advance_time = acc_advance_time.Add(advance_time); | 87 acc_advance_time = acc_advance_time.Add(advance_time); |
| 86 // Ack the packet we sent. | 88 // Ack the packet we sent. |
| 87 ack.received_info.largest_observed = max( | 89 ack.received_info.largest_observed = max( |
| 88 i, ack.received_info.largest_observed); | 90 i, ack.received_info.largest_observed); |
| 89 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 91 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 90 } | 92 } |
| 91 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(1200), | 93 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(1200), |
| 92 acc_advance_time.Subtract(start_)); | 94 acc_advance_time.Subtract(start_)); |
| 93 } | 95 } |
| 94 | 96 |
| 95 TEST_F(QuicCongestionControlTest, Pacing) { | 97 TEST_F(QuicCongestionControlTest, Pacing) { |
| 96 SetUpCongestionType(kFixRate); | 98 SetUpCongestionType(kFixRate); |
| 97 QuicAckFrame ack; | 99 QuicAckFrame ack; |
| 98 ack.received_info.largest_observed = 0; | 100 ack.received_info.largest_observed = 0; |
| 99 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 101 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 100 | 102 |
| 101 QuicCongestionFeedbackFrame feedback; | 103 QuicCongestionFeedbackFrame feedback; |
| 102 feedback.type = kFixRate; | 104 feedback.type = kFixRate; |
| 103 // Test a high bitrate (8Mbit/s) to trigger pacing. | 105 // Test a high bitrate (8Mbit/s) to trigger pacing. |
| 104 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(1000); | 106 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(1000); |
| 105 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); | 107 manager_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now()); |
| 106 | 108 |
| 107 QuicTime acc_advance_time(QuicTime::Zero()); | 109 QuicTime acc_advance_time(QuicTime::Zero()); |
| 108 for (QuicPacketSequenceNumber i = 1; i <= 100;) { | 110 for (QuicPacketSequenceNumber i = 1; i <= 100;) { |
| 109 EXPECT_TRUE(manager_->TimeUntilSend(clock_.Now(), | 111 EXPECT_TRUE(manager_->TimeUntilSend(clock_.Now(), |
| 110 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); | 112 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); |
| 111 manager_->SentPacket(i++, clock_.Now(), kMaxPacketSize, NOT_RETRANSMISSION); | 113 manager_->SentPacket(i++, clock_.Now(), kMaxPacketSize, NOT_RETRANSMISSION, |
| 114 HAS_RETRANSMITTABLE_DATA); |
| 112 EXPECT_TRUE(manager_->TimeUntilSend(clock_.Now(), | 115 EXPECT_TRUE(manager_->TimeUntilSend(clock_.Now(), |
| 113 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); | 116 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()); |
| 114 manager_->SentPacket(i++, clock_.Now(), kMaxPacketSize, NOT_RETRANSMISSION); | 117 manager_->SentPacket(i++, clock_.Now(), kMaxPacketSize, NOT_RETRANSMISSION, |
| 118 HAS_RETRANSMITTABLE_DATA); |
| 115 QuicTime::Delta advance_time = manager_->TimeUntilSend(clock_.Now(), | 119 QuicTime::Delta advance_time = manager_->TimeUntilSend(clock_.Now(), |
| 116 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE); | 120 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE); |
| 117 clock_.AdvanceTime(advance_time); | 121 clock_.AdvanceTime(advance_time); |
| 118 acc_advance_time = acc_advance_time.Add(advance_time); | 122 acc_advance_time = acc_advance_time.Add(advance_time); |
| 119 // Ack the packets we sent. | 123 // Ack the packets we sent. |
| 120 ack.received_info.largest_observed = max( | 124 ack.received_info.largest_observed = max( |
| 121 i - 2, ack.received_info.largest_observed); | 125 i - 2, ack.received_info.largest_observed); |
| 122 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 126 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 123 ack.received_info.largest_observed = max( | 127 ack.received_info.largest_observed = max( |
| 124 i - 1, ack.received_info.largest_observed); | 128 i - 1, ack.received_info.largest_observed); |
| 125 manager_->OnIncomingAckFrame(ack, clock_.Now()); | 129 manager_->OnIncomingAckFrame(ack, clock_.Now()); |
| 126 } | 130 } |
| 127 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(120), | 131 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(120), |
| 128 acc_advance_time.Subtract(start_)); | 132 acc_advance_time.Subtract(start_)); |
| 129 } | 133 } |
| 130 | 134 |
| 131 // TODO(pwestin): add TCP tests. | 135 // TODO(pwestin): add TCP tests. |
| 132 | 136 |
| 133 // TODO(pwestin): add InterArrival tests. | 137 // TODO(pwestin): add InterArrival tests. |
| 134 | 138 |
| 135 } // namespace test | 139 } // namespace test |
| 136 } // namespace net | 140 } // namespace net |
| OLD | NEW |