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