Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(447)

Side by Side Diff: webrtc/modules/pacing/packet_router_unittest.cc

Issue 1247293002: Add support for transport wide sequence numbers (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 15 matching lines...) Expand all
26 namespace webrtc { 26 namespace webrtc {
27 27
28 class PacketRouterTest : public ::testing::Test { 28 class PacketRouterTest : public ::testing::Test {
29 public: 29 public:
30 PacketRouterTest() : packet_router_(new PacketRouter()) {} 30 PacketRouterTest() : packet_router_(new PacketRouter()) {}
31 protected: 31 protected:
32 const rtc::scoped_ptr<PacketRouter> packet_router_; 32 const rtc::scoped_ptr<PacketRouter> packet_router_;
33 }; 33 };
34 34
35 TEST_F(PacketRouterTest, TimeToSendPacket) { 35 TEST_F(PacketRouterTest, TimeToSendPacket) {
36 const uint16_t kSsrc1 = 1234;
37 const uint16_t kSsrc2 = 4567;
38
36 MockRtpRtcp rtp_1; 39 MockRtpRtcp rtp_1;
40 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
37 MockRtpRtcp rtp_2; 41 MockRtpRtcp rtp_2;
42 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
38 packet_router_->AddRtpModule(&rtp_1); 43 packet_router_->AddRtpModule(&rtp_1);
39 packet_router_->AddRtpModule(&rtp_2); 44 packet_router_->AddRtpModule(&rtp_2);
40 45
41 const uint16_t kSsrc1 = 1234;
42 uint16_t sequence_number = 17; 46 uint16_t sequence_number = 17;
43 uint64_t timestamp = 7890; 47 uint64_t timestamp = 7890;
44 bool retransmission = false; 48 bool retransmission = false;
45 49
46 // Send on the first module by letting rtp_1 be sending with correct ssrc. 50 // Send on the first module by letting rtp_1 be sending with correct ssrc.
47 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); 51 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
48 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
49 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp, 52 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp,
50 retransmission)) 53 retransmission))
51 .Times(1) 54 .Times(1)
52 .WillOnce(Return(true)); 55 .WillOnce(Return(true));
53 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); 56 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0);
54 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, 57 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
55 timestamp, retransmission)); 58 timestamp, retransmission));
56 59
57 // Send on the second module by letting rtp_2 be sending, but not rtp_1. 60 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
58 ++sequence_number; 61 ++sequence_number;
59 timestamp += 30; 62 timestamp += 30;
60 retransmission = true; 63 retransmission = true;
61 const uint16_t kSsrc2 = 4567;
62 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); 64 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
63 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); 65 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
64 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
65 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); 66 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0);
66 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, sequence_number, timestamp, 67 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, sequence_number, timestamp,
67 retransmission)) 68 retransmission))
68 .Times(1) 69 .Times(1)
69 .WillOnce(Return(true)); 70 .WillOnce(Return(true));
71 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
72 timestamp, retransmission));
70 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number, 73 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number,
71 timestamp, retransmission)); 74 timestamp, retransmission));
72 75
73 // No module is sending, hence no packet should be sent. 76 // No module is sending, hence no packet should be sent.
74 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); 77 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
75 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); 78 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0);
76 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false)); 79 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
77 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); 80 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0);
78 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, 81 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
79 timestamp, retransmission)); 82 timestamp, retransmission));
83 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number,
84 timestamp, retransmission));
80 85
81 // Add a packet with incorrect ssrc and test it's dropped in the router. 86 // Add a packet with incorrect ssrc and test it's dropped in the router.
82 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
83 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
84 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
85 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
86 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); 87 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0);
87 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); 88 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0);
88 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1 + kSsrc2, sequence_number, 89 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1 + kSsrc2, sequence_number,
89 timestamp, retransmission)); 90 timestamp, retransmission));
90 91
91 packet_router_->RemoveRtpModule(&rtp_1); 92 packet_router_->RemoveRtpModule(&rtp_1);
92 93
93 // rtp_1 has been removed, try sending a packet on that ssrc and make sure 94 // rtp_1 has been removed, try sending a packet on that ssrc and make sure
94 // it is dropped as expected by not expecting any calls to rtp_1. 95 // it is dropped as expected by not expecting any calls to rtp_1.
95 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
96 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
97 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); 96 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0);
98 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, 97 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
99 timestamp, retransmission)); 98 timestamp, retransmission));
100 99
101 packet_router_->RemoveRtpModule(&rtp_2); 100 packet_router_->RemoveRtpModule(&rtp_2);
102 } 101 }
103 102
104 TEST_F(PacketRouterTest, TimeToSendPadding) { 103 TEST_F(PacketRouterTest, TimeToSendPadding) {
104 const uint16_t kSsrc1 = 1234;
105 const uint16_t kSsrc2 = 4567;
106
105 MockRtpRtcp rtp_1; 107 MockRtpRtcp rtp_1;
108 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
106 MockRtpRtcp rtp_2; 109 MockRtpRtcp rtp_2;
110 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
107 packet_router_->AddRtpModule(&rtp_1); 111 packet_router_->AddRtpModule(&rtp_1);
108 packet_router_->AddRtpModule(&rtp_2); 112 packet_router_->AddRtpModule(&rtp_2);
109 113
110 // Default configuration, sending padding on the first sending module. 114 // Default configuration, sending padding on all modules sending media,
115 // ordered by SSRC.
111 const size_t requested_padding_bytes = 1000; 116 const size_t requested_padding_bytes = 1000;
112 const size_t sent_padding_bytes = 890; 117 const size_t sent_padding_bytes = 890;
113 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); 118 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
114 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)) 119 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes))
115 .Times(1) 120 .Times(1)
116 .WillOnce(Return(sent_padding_bytes)); 121 .WillOnce(Return(sent_padding_bytes));
117 EXPECT_CALL(rtp_2, TimeToSendPadding(_)).Times(0); 122 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
118 EXPECT_EQ(sent_padding_bytes, 123 EXPECT_CALL(rtp_2,
124 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes))
125 .Times(1)
126 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
127 EXPECT_EQ(requested_padding_bytes,
119 packet_router_->TimeToSendPadding(requested_padding_bytes)); 128 packet_router_->TimeToSendPadding(requested_padding_bytes));
120 129
121 // Let only the second module be sending and verify the padding request is 130 // Let only the second module be sending and verify the padding request is
122 // routed there. 131 // routed there.
123 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); 132 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
124 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0); 133 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0);
125 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); 134 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
126 EXPECT_CALL(rtp_2, TimeToSendPadding(_)) 135 EXPECT_CALL(rtp_2, TimeToSendPadding(_))
127 .Times(1) 136 .Times(1)
128 .WillOnce(Return(sent_padding_bytes)); 137 .WillOnce(Return(sent_padding_bytes));
129 EXPECT_EQ(sent_padding_bytes, 138 EXPECT_EQ(sent_padding_bytes,
130 packet_router_->TimeToSendPadding(requested_padding_bytes)); 139 packet_router_->TimeToSendPadding(requested_padding_bytes));
131 140
132 // No sending module at all. 141 // No sending module at all.
133 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); 142 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
134 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0); 143 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0);
135 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false)); 144 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
136 EXPECT_CALL(rtp_2, TimeToSendPadding(_)).Times(0); 145 EXPECT_CALL(rtp_2, TimeToSendPadding(_)).Times(0);
137 EXPECT_EQ(static_cast<size_t>(0), 146 EXPECT_EQ(0u, packet_router_->TimeToSendPadding(requested_padding_bytes));
138 packet_router_->TimeToSendPadding(requested_padding_bytes));
139 147
140 packet_router_->RemoveRtpModule(&rtp_1); 148 packet_router_->RemoveRtpModule(&rtp_1);
141 149
142 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked 150 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
143 // to send by not expecting any calls. Instead verify rtp_2 is called. 151 // to send by not expecting any calls. Instead verify rtp_2 is called.
144 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); 152 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
145 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes)).Times(1); 153 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes)).Times(1);
146 EXPECT_EQ(static_cast<size_t>(0), 154 EXPECT_EQ(0u, packet_router_->TimeToSendPadding(requested_padding_bytes));
147 packet_router_->TimeToSendPadding(requested_padding_bytes));
148 155
149 packet_router_->RemoveRtpModule(&rtp_2); 156 packet_router_->RemoveRtpModule(&rtp_2);
150 } 157 }
158
159 TEST_F(PacketRouterTest, ChangingSsrc) {
160 const uint16_t kSsrc1 = 1234;
161 const uint16_t kSsrc2 = 4567;
162 uint16_t sequence_number = 17;
163 uint64_t timestamp = 7890;
164 bool retransmission = false;
165
166 MockRtpRtcp rtp_1;
167 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
168
169 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
170 packet_router_->AddRtpModule(&rtp_1);
171
172 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp,
173 retransmission))
174 .Times(1)
175 .WillOnce(Return(true));
176 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
177 timestamp, retransmission));
178
179 packet_router_->OnSsrcChanged();
180
181 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc2));
182 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc2, sequence_number, timestamp,
183 retransmission))
184 .Times(1)
185 .WillOnce(Return(true));
186 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number,
187 timestamp, retransmission));
188
189 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc2));
190 packet_router_->RemoveRtpModule(&rtp_1);
191 }
192
193 TEST_F(PacketRouterTest, TransportSeqNotEnabled) {
194 packet_router_->SetTransportWideSequenceNumber(1000);
195 EXPECT_EQ(0u, packet_router_->AllocateSequenceNumber());
196
197 const uint16_t kSeq = 1;
198 packet_router_->OnPacketSent(kSeq, 1);
199 std::vector<PacketInfo> packet_vec;
200 packet_vec.push_back(PacketInfo(0, 0, kSeq, 0, false));
201 EXPECT_EQ(0u, packet_router_->PopulateSendTimes(&packet_vec));
202 }
203
204 TEST_F(PacketRouterTest, AddAndPopulateTransportSeq) {
205 packet_router_->EnableTransportWideFeedback();
206
207 const uint16_t kStartSeq = 0xFFF0;
208 const int64_t kStartTime = 2000;
209 const size_t kNumPackets = 32;
210
211 packet_router_->SetTransportWideSequenceNumber(kStartSeq - 1);
212 std::vector<PacketInfo> packet_vec;
213
214 for (size_t i = 0; i < kNumPackets; ++i) {
215 uint16_t seq = packet_router_->AllocateSequenceNumber();
216 packet_router_->OnPacketSent(seq, kStartTime + i);
217 packet_vec.push_back(PacketInfo(0, 0, seq, 0, false));
218 }
219
220 EXPECT_EQ(kNumPackets, packet_router_->PopulateSendTimes(&packet_vec));
221 for (size_t i = 0; i < kNumPackets; ++i) {
222 EXPECT_EQ(static_cast<uint16_t>(kStartSeq + i),
223 packet_vec[i].sequence_number);
224 EXPECT_EQ(static_cast<int64_t>(kStartTime + i), packet_vec[i].send_time_ms);
225 }
226 }
227
228 TEST_F(PacketRouterTest, AddAndPopulateTransportSeqWithLosses) {
229 packet_router_->EnableTransportWideFeedback();
230
231 const uint16_t kStartSeq = 0xFFF0;
232 const int64_t kStartTime = 2000;
233 const size_t kNumPackets = 32;
234
235 packet_router_->SetTransportWideSequenceNumber(kStartSeq - 1);
236 std::vector<PacketInfo> packet_vec;
237
238 for (size_t i = 0; i < kNumPackets; ++i) {
239 uint16_t seq = packet_router_->AllocateSequenceNumber();
240 packet_router_->OnPacketSent(seq, kStartTime + i);
241 packet_vec.push_back(PacketInfo(0, 0, seq, 0, false));
242 }
243
244 const size_t kNumReceivedPackets = 16;
245 const size_t kFirstLossPos = 5;
246 packet_vec.erase(
247 packet_vec.begin() + kFirstLossPos,
248 packet_vec.begin() + kFirstLossPos + (kNumPackets - kNumReceivedPackets));
249
250 EXPECT_EQ(kNumReceivedPackets,
251 packet_router_->PopulateSendTimes(&packet_vec));
252 for (const PacketInfo& info : packet_vec) {
253 uint16_t seq_delta = info.sequence_number - kStartSeq;
254 EXPECT_EQ(static_cast<int64_t>(kStartTime + seq_delta), info.send_time_ms);
255 }
256 }
257
151 } // namespace webrtc 258 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698