| 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 // Test for FixRate sender and receiver. | 5 // Test for FixRate sender and receiver. |
| 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/fix_rate_receiver.h" | 9 #include "net/quic/congestion_control/fix_rate_receiver.h" |
| 10 #include "net/quic/congestion_control/fix_rate_sender.h" | 10 #include "net/quic/congestion_control/fix_rate_sender.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 } | 23 } |
| 24 void SetBitrate(QuicBandwidth fix_rate) { | 24 void SetBitrate(QuicBandwidth fix_rate) { |
| 25 FixRateReceiver::configured_rate_ = fix_rate; | 25 FixRateReceiver::configured_rate_ = fix_rate; |
| 26 } | 26 } |
| 27 }; | 27 }; |
| 28 | 28 |
| 29 class FixRateTest : public ::testing::Test { | 29 class FixRateTest : public ::testing::Test { |
| 30 protected: | 30 protected: |
| 31 FixRateTest() | 31 FixRateTest() |
| 32 : rtt_(QuicTime::Delta::FromMilliseconds(30)), | 32 : rtt_(QuicTime::Delta::FromMilliseconds(30)), |
| 33 unused_bandwidth_(QuicBandwidth::Zero()), | |
| 34 sender_(new FixRateSender(&clock_)), | 33 sender_(new FixRateSender(&clock_)), |
| 35 receiver_(new FixRateReceiverPeer()), | 34 receiver_(new FixRateReceiverPeer()), |
| 36 start_(clock_.Now()) { | 35 start_(clock_.Now()) { |
| 37 // Make sure clock does not start at 0. | 36 // Make sure clock does not start at 0. |
| 38 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2)); | 37 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2)); |
| 39 } | 38 } |
| 40 const QuicTime::Delta rtt_; | 39 const QuicTime::Delta rtt_; |
| 41 const QuicBandwidth unused_bandwidth_; | |
| 42 MockClock clock_; | 40 MockClock clock_; |
| 43 SendAlgorithmInterface::SentPacketsMap unused_packet_map_; | 41 SendAlgorithmInterface::SentPacketsMap unused_packet_map_; |
| 44 scoped_ptr<FixRateSender> sender_; | 42 scoped_ptr<FixRateSender> sender_; |
| 45 scoped_ptr<FixRateReceiverPeer> receiver_; | 43 scoped_ptr<FixRateReceiverPeer> receiver_; |
| 46 const QuicTime start_; | 44 const QuicTime start_; |
| 47 }; | 45 }; |
| 48 | 46 |
| 49 TEST_F(FixRateTest, ReceiverAPI) { | 47 TEST_F(FixRateTest, ReceiverAPI) { |
| 50 QuicCongestionFeedbackFrame feedback; | 48 QuicCongestionFeedbackFrame feedback; |
| 51 QuicTime timestamp(QuicTime::Zero()); | 49 QuicTime timestamp(QuicTime::Zero()); |
| 52 receiver_->SetBitrate(QuicBandwidth::FromKBytesPerSecond(300)); | 50 receiver_->SetBitrate(QuicBandwidth::FromKBytesPerSecond(300)); |
| 53 receiver_->RecordIncomingPacket(1, 1, timestamp, false); | 51 receiver_->RecordIncomingPacket(1, 1, timestamp, false); |
| 54 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | 52 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); |
| 55 EXPECT_EQ(kFixRate, feedback.type); | 53 EXPECT_EQ(kFixRate, feedback.type); |
| 56 EXPECT_EQ(300000u, feedback.fix_rate.bitrate.ToBytesPerSecond()); | 54 EXPECT_EQ(300000u, feedback.fix_rate.bitrate.ToBytesPerSecond()); |
| 57 } | 55 } |
| 58 | 56 |
| 59 TEST_F(FixRateTest, SenderAPI) { | 57 TEST_F(FixRateTest, SenderAPI) { |
| 60 QuicCongestionFeedbackFrame feedback; | 58 QuicCongestionFeedbackFrame feedback; |
| 61 feedback.type = kFixRate; | 59 feedback.type = kFixRate; |
| 62 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(300); | 60 feedback.fix_rate.bitrate = QuicBandwidth::FromKBytesPerSecond(300); |
| 63 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now(), | 61 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now(), |
| 64 unused_bandwidth_, unused_packet_map_); | 62 unused_packet_map_); |
| 65 EXPECT_EQ(300000, sender_->BandwidthEstimate().ToBytesPerSecond()); | 63 EXPECT_EQ(300000, sender_->BandwidthEstimate().ToBytesPerSecond()); |
| 66 EXPECT_TRUE(sender_->TimeUntilSend( | 64 EXPECT_TRUE(sender_->TimeUntilSend( |
| 67 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); | 65 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 68 sender_->SentPacket(clock_.Now(), 1, kMaxPacketSize, NOT_RETRANSMISSION); | 66 sender_->SentPacket(clock_.Now(), 1, kMaxPacketSize, NOT_RETRANSMISSION); |
| 69 EXPECT_TRUE(sender_->TimeUntilSend( | 67 EXPECT_TRUE(sender_->TimeUntilSend( |
| 70 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); | 68 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 71 sender_->SentPacket(clock_.Now(), 2, kMaxPacketSize, NOT_RETRANSMISSION); | 69 sender_->SentPacket(clock_.Now(), 2, kMaxPacketSize, NOT_RETRANSMISSION); |
| 72 sender_->SentPacket(clock_.Now(), 3, 600, NOT_RETRANSMISSION); | 70 sender_->SentPacket(clock_.Now(), 3, 600, NOT_RETRANSMISSION); |
| 73 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), sender_->TimeUntilSend( | 71 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), sender_->TimeUntilSend( |
| 74 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)); | 72 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)); |
| 75 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2)); | 73 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2)); |
| 76 EXPECT_EQ(QuicTime::Delta::Infinite(), sender_->TimeUntilSend( | 74 EXPECT_EQ(QuicTime::Delta::Infinite(), sender_->TimeUntilSend( |
| 77 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)); | 75 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)); |
| 78 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(8)); | 76 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(8)); |
| 79 sender_->OnIncomingAck(1, kMaxPacketSize, rtt_); | 77 sender_->OnIncomingAck(1, kMaxPacketSize, rtt_); |
| 80 sender_->OnIncomingAck(2, kMaxPacketSize, rtt_); | 78 sender_->OnIncomingAck(2, kMaxPacketSize, rtt_); |
| 81 sender_->OnIncomingAck(3, 600, rtt_); | 79 sender_->OnIncomingAck(3, 600, rtt_); |
| 82 EXPECT_TRUE(sender_->TimeUntilSend( | 80 EXPECT_TRUE(sender_->TimeUntilSend( |
| 83 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); | 81 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 84 } | 82 } |
| 85 | 83 |
| 86 TEST_F(FixRateTest, FixRatePacing) { | 84 TEST_F(FixRateTest, FixRatePacing) { |
| 87 const QuicByteCount packet_size = 1200; | 85 const QuicByteCount packet_size = 1200; |
| 88 const QuicBandwidth bitrate = QuicBandwidth::FromKBytesPerSecond(240); | 86 const QuicBandwidth bitrate = QuicBandwidth::FromKBytesPerSecond(240); |
| 89 const int64 num_packets = 200; | 87 const int64 num_packets = 200; |
| 90 QuicCongestionFeedbackFrame feedback; | 88 QuicCongestionFeedbackFrame feedback; |
| 91 receiver_->SetBitrate(QuicBandwidth::FromKBytesPerSecond(240)); | 89 receiver_->SetBitrate(QuicBandwidth::FromKBytesPerSecond(240)); |
| 92 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); | 90 ASSERT_TRUE(receiver_->GenerateCongestionFeedback(&feedback)); |
| 93 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now(), | 91 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, clock_.Now(), |
| 94 unused_bandwidth_, unused_packet_map_); | 92 unused_packet_map_); |
| 95 QuicTime acc_advance_time(QuicTime::Zero()); | 93 QuicTime acc_advance_time(QuicTime::Zero()); |
| 96 QuicPacketSequenceNumber sequence_number = 0; | 94 QuicPacketSequenceNumber sequence_number = 0; |
| 97 for (int i = 0; i < num_packets; i += 2) { | 95 for (int i = 0; i < num_packets; i += 2) { |
| 98 EXPECT_TRUE(sender_->TimeUntilSend( | 96 EXPECT_TRUE(sender_->TimeUntilSend( |
| 99 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); | 97 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 100 sender_->SentPacket(clock_.Now(), sequence_number++, packet_size, | 98 sender_->SentPacket(clock_.Now(), sequence_number++, packet_size, |
| 101 NOT_RETRANSMISSION); | 99 NOT_RETRANSMISSION); |
| 102 EXPECT_TRUE(sender_->TimeUntilSend( | 100 EXPECT_TRUE(sender_->TimeUntilSend( |
| 103 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); | 101 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA).IsZero()); |
| 104 sender_->SentPacket(clock_.Now(), sequence_number++, packet_size, | 102 sender_->SentPacket(clock_.Now(), sequence_number++, packet_size, |
| 105 NOT_RETRANSMISSION); | 103 NOT_RETRANSMISSION); |
| 106 QuicTime::Delta advance_time = sender_->TimeUntilSend( | 104 QuicTime::Delta advance_time = sender_->TimeUntilSend( |
| 107 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | 105 clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
| 108 clock_.AdvanceTime(advance_time); | 106 clock_.AdvanceTime(advance_time); |
| 109 sender_->OnIncomingAck(sequence_number - 1, packet_size, rtt_); | 107 sender_->OnIncomingAck(sequence_number - 1, packet_size, rtt_); |
| 110 sender_->OnIncomingAck(sequence_number - 2, packet_size, rtt_); | 108 sender_->OnIncomingAck(sequence_number - 2, packet_size, rtt_); |
| 111 acc_advance_time = acc_advance_time.Add(advance_time); | 109 acc_advance_time = acc_advance_time.Add(advance_time); |
| 112 } | 110 } |
| 113 EXPECT_EQ(num_packets * packet_size * 1000000 / bitrate.ToBytesPerSecond(), | 111 EXPECT_EQ(num_packets * packet_size * 1000000 / bitrate.ToBytesPerSecond(), |
| 114 static_cast<uint64>(acc_advance_time.Subtract(start_) | 112 static_cast<uint64>(acc_advance_time.Subtract(start_) |
| 115 .ToMicroseconds())); | 113 .ToMicroseconds())); |
| 116 } | 114 } |
| 117 | 115 |
| 118 } // namespace test | 116 } // namespace test |
| 119 } // namespace net | 117 } // namespace net |
| OLD | NEW |