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 #include "net/quic/congestion_control/pacing_sender.h" | 5 #include "net/quic/congestion_control/pacing_sender.h" |
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/quic_protocol.h" | 9 #include "net/quic/quic_protocol.h" |
10 #include "net/quic/test_tools/mock_clock.h" | 10 #include "net/quic/test_tools/mock_clock.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 QuicTime::Delta::FromMilliseconds(1))) { | 28 QuicTime::Delta::FromMilliseconds(1))) { |
29 // Pick arbitrary time. | 29 // Pick arbitrary time. |
30 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9)); | 30 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9)); |
31 } | 31 } |
32 | 32 |
33 virtual ~PacingSenderTest() {} | 33 virtual ~PacingSenderTest() {} |
34 | 34 |
35 void CheckPacketIsSentImmediately() { | 35 void CheckPacketIsSentImmediately() { |
36 // In order for the packet to be sendable, the underlying sender must | 36 // In order for the packet to be sendable, the underlying sender must |
37 // permit it to be sent immediately. | 37 // permit it to be sent immediately. |
38 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 38 EXPECT_CALL(*mock_sender_, |
39 HAS_RETRANSMITTABLE_DATA)) | 39 TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)) |
40 .WillOnce(Return(zero_time_)); | 40 .WillOnce(Return(zero_time_)); |
41 // Verify that the packet can be sent immediately. | 41 // Verify that the packet can be sent immediately. |
42 EXPECT_EQ(zero_time_, | 42 EXPECT_EQ( |
43 pacing_sender_->TimeUntilSend(clock_.Now(), | 43 zero_time_, |
44 HAS_RETRANSMITTABLE_DATA)); | 44 pacing_sender_->TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); |
45 | 45 |
46 // Actually send the packet. | 46 // Actually send the packet. |
47 EXPECT_CALL(*mock_sender_, | 47 EXPECT_CALL(*mock_sender_, |
48 OnPacketSent(clock_.Now(), sequence_number_, kMaxPacketSize, | 48 OnPacketSent(clock_.Now(), |
| 49 sequence_number_, |
| 50 kMaxPacketSize, |
49 HAS_RETRANSMITTABLE_DATA)); | 51 HAS_RETRANSMITTABLE_DATA)); |
50 pacing_sender_->OnPacketSent(clock_.Now(), sequence_number_++, | 52 pacing_sender_->OnPacketSent(clock_.Now(), |
| 53 sequence_number_++, |
51 kMaxPacketSize, | 54 kMaxPacketSize, |
52 HAS_RETRANSMITTABLE_DATA); | 55 HAS_RETRANSMITTABLE_DATA); |
53 } | 56 } |
54 | 57 |
55 void CheckAckIsSentImmediately() { | 58 void CheckAckIsSentImmediately() { |
56 // In order for the ack to be sendable, the underlying sender must | 59 // In order for the ack to be sendable, the underlying sender must |
57 // permit it to be sent immediately. | 60 // permit it to be sent immediately. |
58 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 61 EXPECT_CALL(*mock_sender_, |
59 NO_RETRANSMITTABLE_DATA)) | 62 TimeUntilSend(clock_.Now(), NO_RETRANSMITTABLE_DATA)) |
60 .WillOnce(Return(zero_time_)); | 63 .WillOnce(Return(zero_time_)); |
61 // Verify that the ACK can be sent immediately. | 64 // Verify that the ACK can be sent immediately. |
62 EXPECT_EQ(zero_time_, | 65 EXPECT_EQ( |
63 pacing_sender_->TimeUntilSend(clock_.Now(), | 66 zero_time_, |
64 NO_RETRANSMITTABLE_DATA)); | 67 pacing_sender_->TimeUntilSend(clock_.Now(), NO_RETRANSMITTABLE_DATA)); |
65 | 68 |
66 // Actually send the packet. | 69 // Actually send the packet. |
67 EXPECT_CALL(*mock_sender_, | 70 EXPECT_CALL(*mock_sender_, |
68 OnPacketSent(clock_.Now(), sequence_number_, kMaxPacketSize, | 71 OnPacketSent(clock_.Now(), |
| 72 sequence_number_, |
| 73 kMaxPacketSize, |
69 NO_RETRANSMITTABLE_DATA)); | 74 NO_RETRANSMITTABLE_DATA)); |
70 pacing_sender_->OnPacketSent(clock_.Now(), sequence_number_++, | 75 pacing_sender_->OnPacketSent(clock_.Now(), |
| 76 sequence_number_++, |
71 kMaxPacketSize, | 77 kMaxPacketSize, |
72 NO_RETRANSMITTABLE_DATA); | 78 NO_RETRANSMITTABLE_DATA); |
73 } | 79 } |
74 | 80 |
75 void CheckPacketIsDelayed(QuicTime::Delta delay) { | 81 void CheckPacketIsDelayed(QuicTime::Delta delay) { |
76 // In order for the packet to be sendable, the underlying sender must | 82 // In order for the packet to be sendable, the underlying sender must |
77 // permit it to be sent immediately. | 83 // permit it to be sent immediately. |
78 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 84 EXPECT_CALL(*mock_sender_, |
79 HAS_RETRANSMITTABLE_DATA)) | 85 TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)) |
80 .WillOnce(Return(zero_time_)); | 86 .WillOnce(Return(zero_time_)); |
81 // Verify that the packet is delayed. | 87 // Verify that the packet is delayed. |
82 EXPECT_EQ(delay.ToMicroseconds(), | 88 EXPECT_EQ( |
83 pacing_sender_->TimeUntilSend( | 89 delay.ToMicroseconds(), |
84 clock_.Now(), HAS_RETRANSMITTABLE_DATA).ToMicroseconds()); | 90 pacing_sender_->TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA) |
| 91 .ToMicroseconds()); |
85 } | 92 } |
86 | 93 |
87 const QuicTime::Delta zero_time_; | 94 const QuicTime::Delta zero_time_; |
88 const QuicTime::Delta infinite_time_; | 95 const QuicTime::Delta infinite_time_; |
89 MockClock clock_; | 96 MockClock clock_; |
90 QuicPacketSequenceNumber sequence_number_; | 97 QuicPacketSequenceNumber sequence_number_; |
91 StrictMock<MockSendAlgorithm>* mock_sender_; | 98 StrictMock<MockSendAlgorithm>* mock_sender_; |
92 scoped_ptr<PacingSender> pacing_sender_; | 99 scoped_ptr<PacingSender> pacing_sender_; |
93 }; | 100 }; |
94 | 101 |
95 TEST_F(PacingSenderTest, NoSend) { | 102 TEST_F(PacingSenderTest, NoSend) { |
96 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 103 EXPECT_CALL(*mock_sender_, |
97 HAS_RETRANSMITTABLE_DATA)) | 104 TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)) |
98 .WillOnce(Return(infinite_time_)); | 105 .WillOnce(Return(infinite_time_)); |
99 EXPECT_EQ(infinite_time_, | 106 EXPECT_EQ( |
100 pacing_sender_->TimeUntilSend(clock_.Now(), | 107 infinite_time_, |
101 HAS_RETRANSMITTABLE_DATA)); | 108 pacing_sender_->TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); |
102 } | 109 } |
103 | 110 |
104 TEST_F(PacingSenderTest, SendNow) { | 111 TEST_F(PacingSenderTest, SendNow) { |
105 EXPECT_CALL(*mock_sender_, TimeUntilSend(clock_.Now(), | 112 EXPECT_CALL(*mock_sender_, |
106 HAS_RETRANSMITTABLE_DATA)) | 113 TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)) |
107 .WillOnce(Return(zero_time_)); | 114 .WillOnce(Return(zero_time_)); |
108 EXPECT_EQ(zero_time_, | 115 EXPECT_EQ( |
109 pacing_sender_->TimeUntilSend(clock_.Now(), | 116 zero_time_, |
110 HAS_RETRANSMITTABLE_DATA)); | 117 pacing_sender_->TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); |
111 } | 118 } |
112 | 119 |
113 TEST_F(PacingSenderTest, VariousSending) { | 120 TEST_F(PacingSenderTest, VariousSending) { |
114 // Configure bandwith of 1 packet per 2 ms, for which the pacing rate | 121 // Configure bandwith of 1 packet per 2 ms, for which the pacing rate |
115 // will be 1 packet per 1 ms. | 122 // will be 1 packet per 1 ms. |
116 EXPECT_CALL(*mock_sender_, BandwidthEstimate()) | 123 EXPECT_CALL(*mock_sender_, BandwidthEstimate()) |
117 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta( | 124 .WillRepeatedly(Return(QuicBandwidth::FromBytesAndTimeDelta( |
118 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(2)))); | 125 kMaxPacketSize, QuicTime::Delta::FromMilliseconds(2)))); |
119 | 126 |
120 // Send a whole pile of packets, and verify that they are not paced. | 127 // Send a whole pile of packets, and verify that they are not paced. |
121 for (int i = 0 ; i < 1000; ++i) { | 128 for (int i = 0; i < 1000; ++i) { |
122 CheckPacketIsSentImmediately(); | 129 CheckPacketIsSentImmediately(); |
123 } | 130 } |
124 | 131 |
125 // Now update the RTT and verify that packets are actually paced. | 132 // Now update the RTT and verify that packets are actually paced. |
126 EXPECT_CALL(*mock_sender_, OnRttUpdated(1)); | 133 EXPECT_CALL(*mock_sender_, OnRttUpdated(1)); |
127 pacing_sender_->OnRttUpdated(1); | 134 pacing_sender_->OnRttUpdated(1); |
128 | 135 |
129 CheckPacketIsSentImmediately(); | 136 CheckPacketIsSentImmediately(); |
130 CheckPacketIsSentImmediately(); | 137 CheckPacketIsSentImmediately(); |
131 CheckPacketIsSentImmediately(); | 138 CheckPacketIsSentImmediately(); |
(...skipping 21 matching lines...) Expand all Loading... |
153 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); | 160 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); |
154 | 161 |
155 // Wake up early, but after enough time has passed to permit a send. | 162 // Wake up early, but after enough time has passed to permit a send. |
156 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 163 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
157 CheckPacketIsSentImmediately(); | 164 CheckPacketIsSentImmediately(); |
158 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); | 165 CheckPacketIsDelayed(QuicTime::Delta::FromMilliseconds(2)); |
159 } | 166 } |
160 | 167 |
161 } // namespace test | 168 } // namespace test |
162 } // namespace net | 169 } // namespace net |
OLD | NEW |