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

Side by Side Diff: webrtc/voice_engine/transport_feedback_packet_loss_tracker_unittest.cc

Issue 2751653006: TransportFeedbackPacketLossTrackerTest cosmetic modification (Closed)
Patch Set: Created 3 years, 9 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2017 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
11 #include <limits> 11 #include <limits>
12 #include <memory> 12 #include <memory>
13 #include <numeric> 13 #include <numeric>
14 #include <vector> 14 #include <vector>
15 15
16 #include "webrtc/base/checks.h" 16 #include "webrtc/base/checks.h"
17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
18 #include "webrtc/test/gmock.h" 18 #include "webrtc/test/gmock.h"
19 #include "webrtc/test/gtest.h" 19 #include "webrtc/test/gtest.h"
20 #include "webrtc/voice_engine/transport_feedback_packet_loss_tracker.h" 20 #include "webrtc/voice_engine/transport_feedback_packet_loss_tracker.h"
21 21
22 namespace webrtc { 22 namespace webrtc {
23 23
24 namespace { 24 namespace {
25 25
minyue-webrtc 2017/03/15 14:33:55 constexpr int64_t kDefaultSendIntervalMs = 10
elad.alon_webrtc.org 2017/03/16 17:17:20 Right you are!
26 constexpr size_t kDefaultSendInterval = 10;
27
minyue-webrtc 2017/03/15 14:33:55 you may also constexpr int kDefaultMaxWindowSize
elad.alon_webrtc.org 2017/03/16 17:17:20 Done.
26 class TransportFeedbackPacketLossTrackerTest 28 class TransportFeedbackPacketLossTrackerTest
27 : public ::testing::TestWithParam<uint16_t> { 29 : public ::testing::TestWithParam<uint16_t> {
28 using TransportFeedback = webrtc::rtcp::TransportFeedback; 30 using TransportFeedback = webrtc::rtcp::TransportFeedback;
29 31
30 public: 32 public:
31 TransportFeedbackPacketLossTrackerTest() = default; 33 TransportFeedbackPacketLossTrackerTest() = default;
32 virtual ~TransportFeedbackPacketLossTrackerTest() = default; 34 virtual ~TransportFeedbackPacketLossTrackerTest() = default;
33 35
34 protected: 36 protected:
35 void SendPackets(TransportFeedbackPacketLossTracker* tracker, 37 void SendPackets(TransportFeedbackPacketLossTracker* tracker,
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 private: 136 private:
135 int64_t time_ms_{0}; 137 int64_t time_ms_{0};
136 138
137 RTC_DISALLOW_COPY_AND_ASSIGN(TransportFeedbackPacketLossTrackerTest); 139 RTC_DISALLOW_COPY_AND_ASSIGN(TransportFeedbackPacketLossTrackerTest);
138 }; 140 };
139 141
140 } // namespace 142 } // namespace
141 143
142 // Sanity check on an empty window. 144 // Sanity check on an empty window.
143 TEST_P(TransportFeedbackPacketLossTrackerTest, EmptyWindow) { 145 TEST_P(TransportFeedbackPacketLossTrackerTest, EmptyWindow) {
144 TransportFeedbackPacketLossTracker tracker(5000, 5, 5); 146 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 5);
145 147
146 // PLR and RPLR reported as unknown before reception of first feedback. 148 // PLR and RPLR reported as unknown before reception of first feedback.
147 ValidatePacketLossStatistics(tracker, 149 ValidatePacketLossStatistics(tracker,
148 rtc::Optional<float>(), 150 rtc::Optional<float>(),
149 rtc::Optional<float>()); 151 rtc::Optional<float>());
150 } 152 }
151 153
152 // A feedback received for an empty window has no effect. 154 // A feedback received for an empty window has no effect.
153 TEST_P(TransportFeedbackPacketLossTrackerTest, EmptyWindowFeedback) { 155 TEST_P(TransportFeedbackPacketLossTrackerTest, EmptyWindowFeedback) {
154 TransportFeedbackPacketLossTracker tracker(5000, 3, 2); 156 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 3, 2);
155 157
156 // Feedback doesn't correspond to any packets - ignored. 158 // Feedback doesn't correspond to any packets - ignored.
157 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true}); 159 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true});
158 ValidatePacketLossStatistics(tracker, 160 ValidatePacketLossStatistics(tracker,
159 rtc::Optional<float>(), 161 rtc::Optional<float>(),
160 rtc::Optional<float>()); 162 rtc::Optional<float>());
161 163
162 // After the packets are transmitted, acking them would have an effect. 164 // After the packets are transmitted, acking them would have an effect.
163 SendPackets(&tracker, base_, 3, 10); 165 SendPackets(&tracker, base_, 3, kDefaultSendInterval);
164 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true}); 166 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true});
165 ValidatePacketLossStatistics(tracker, 1.0f / 3.0f, 0.5f); 167 ValidatePacketLossStatistics(tracker, 1.0f / 3.0f, 0.5f);
166 } 168 }
167 169
168 // Sanity check on partially filled window. 170 // Sanity check on partially filled window.
169 TEST_P(TransportFeedbackPacketLossTrackerTest, PartiallyFilledWindow) { 171 TEST_P(TransportFeedbackPacketLossTrackerTest, PartiallyFilledWindow) {
170 TransportFeedbackPacketLossTracker tracker(5000, 5, 4); 172 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 4);
171 173
172 // PLR unknown before minimum window size reached. 174 // PLR unknown before minimum window size reached.
173 // RPLR unknown before minimum pairs reached. 175 // RPLR unknown before minimum pairs reached.
174 // Expected window contents: [] -> [1001]. 176 // Expected window contents: [] -> [1001].
175 SendPackets(&tracker, base_, 3, 10); 177 SendPackets(&tracker, base_, 3, kDefaultSendInterval);
176 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, false, true}); 178 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, false, true});
177 ValidatePacketLossStatistics(tracker, 179 ValidatePacketLossStatistics(tracker,
178 rtc::Optional<float>(), 180 rtc::Optional<float>(),
179 rtc::Optional<float>()); 181 rtc::Optional<float>());
180 } 182 }
181 183
182 // Sanity check on minimum filled window - PLR known, RPLR unknown. 184 // Sanity check on minimum filled window - PLR known, RPLR unknown.
183 TEST_P(TransportFeedbackPacketLossTrackerTest, PlrMinimumFilledWindow) { 185 TEST_P(TransportFeedbackPacketLossTrackerTest, PlrMinimumFilledWindow) {
184 TransportFeedbackPacketLossTracker tracker(5000, 5, 5); 186 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 5);
185 187
186 // PLR correctly calculated after minimum window size reached. 188 // PLR correctly calculated after minimum window size reached.
187 // RPLR not necessarily known at that time (not if min-pairs not reached). 189 // RPLR not necessarily known at that time (not if min-pairs not reached).
188 // Expected window contents: [] -> [10011]. 190 // Expected window contents: [] -> [10011].
189 SendPackets(&tracker, base_, 5, 10); 191 SendPackets(&tracker, base_, 5, kDefaultSendInterval);
190 AddTransportFeedbackAndValidate(&tracker, base_, 192 AddTransportFeedbackAndValidate(&tracker, base_,
191 {true, false, false, true, true}); 193 {true, false, false, true, true});
192 ValidatePacketLossStatistics(tracker, 194 ValidatePacketLossStatistics(tracker,
193 rtc::Optional<float>(2.0f / 5.0f), 195 rtc::Optional<float>(2.0f / 5.0f),
194 rtc::Optional<float>()); 196 rtc::Optional<float>());
195 } 197 }
196 198
197 // Sanity check on minimum filled window - PLR unknown, RPLR known. 199 // Sanity check on minimum filled window - PLR unknown, RPLR known.
198 TEST_P(TransportFeedbackPacketLossTrackerTest, RplrMinimumFilledWindow) { 200 TEST_P(TransportFeedbackPacketLossTrackerTest, RplrMinimumFilledWindow) {
199 TransportFeedbackPacketLossTracker tracker(5000, 6, 4); 201 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 6, 4);
200 202
201 // RPLR correctly calculated after minimum pairs reached. 203 // RPLR correctly calculated after minimum pairs reached.
202 // PLR not necessarily known at that time (not if min window not reached). 204 // PLR not necessarily known at that time (not if min window not reached).
203 // Expected window contents: [] -> [10011]. 205 // Expected window contents: [] -> [10011].
204 SendPackets(&tracker, base_, 5, 10); 206 SendPackets(&tracker, base_, 5, kDefaultSendInterval);
205 AddTransportFeedbackAndValidate(&tracker, base_, 207 AddTransportFeedbackAndValidate(&tracker, base_,
206 {true, false, false, true, true}); 208 {true, false, false, true, true});
207 ValidatePacketLossStatistics(tracker, 209 ValidatePacketLossStatistics(tracker,
208 rtc::Optional<float>(), 210 rtc::Optional<float>(),
209 rtc::Optional<float>(1.0f / 4.0f)); 211 rtc::Optional<float>(1.0f / 4.0f));
210 } 212 }
211 213
212 // If packets are sent close enough together that the clock reading for both 214 // If packets are sent close enough together that the clock reading for both
213 // is the same, that's handled properly. 215 // is the same, that's handled properly.
214 TEST_P(TransportFeedbackPacketLossTrackerTest, SameSentTime) { 216 TEST_P(TransportFeedbackPacketLossTrackerTest, SameSentTime) {
215 TransportFeedbackPacketLossTracker tracker(5000, 3, 2); 217 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 3, 2);
216 218
217 // Expected window contents: [] -> [101]. 219 // Expected window contents: [] -> [101].
218 SendPackets(&tracker, base_, 3, 0); // Note: time interval = 0ms. 220 SendPackets(&tracker, base_, 3, 0); // Note: time interval = 0ms.
219 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true}); 221 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true});
220 222
221 ValidatePacketLossStatistics(tracker, 1.0f / 3.0f, 0.5f); 223 ValidatePacketLossStatistics(tracker, 1.0f / 3.0f, 0.5f);
222 } 224 }
223 225
224 // Additional reports update PLR and RPLR. 226 // Additional reports update PLR and RPLR.
225 TEST_P(TransportFeedbackPacketLossTrackerTest, ExtendWindow) { 227 TEST_P(TransportFeedbackPacketLossTrackerTest, ExtendWindow) {
226 TransportFeedbackPacketLossTracker tracker(5000, 5, 5); 228 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 5);
227 229
228 SendPackets(&tracker, base_, 25, 10); 230 SendPackets(&tracker, base_, 25, kDefaultSendInterval);
229 231
230 // Expected window contents: [] -> [10011]. 232 // Expected window contents: [] -> [10011].
231 AddTransportFeedbackAndValidate(&tracker, base_, 233 AddTransportFeedbackAndValidate(&tracker, base_,
232 {true, false, false, true, true}); 234 {true, false, false, true, true});
233 ValidatePacketLossStatistics(tracker, 235 ValidatePacketLossStatistics(tracker,
234 rtc::Optional<float>(2.0f / 5.0f), 236 rtc::Optional<float>(2.0f / 5.0f),
235 rtc::Optional<float>()); 237 rtc::Optional<float>());
236 238
237 // Expected window contents: [10011] -> [1001110101]. 239 // Expected window contents: [10011] -> [1001110101].
238 AddTransportFeedbackAndValidate(&tracker, base_ + 5, 240 AddTransportFeedbackAndValidate(&tracker, base_ + 5,
239 {true, false, true, false, true}); 241 {true, false, true, false, true});
240 ValidatePacketLossStatistics(tracker, 4.0f / 10.0f, 3.0f / 9.0f); 242 ValidatePacketLossStatistics(tracker, 4.0f / 10.0f, 3.0f / 9.0f);
241 243
242 // Expected window contents: [1001110101] -> [1001110101-GAP-10001]. 244 // Expected window contents: [1001110101] -> [1001110101-GAP-10001].
243 AddTransportFeedbackAndValidate(&tracker, base_ + 20, 245 AddTransportFeedbackAndValidate(&tracker, base_ + 20,
244 {true, false, false, false, true}); 246 {true, false, false, false, true});
245 ValidatePacketLossStatistics(tracker, 7.0f / 15.0f, 4.0f / 13.0f); 247 ValidatePacketLossStatistics(tracker, 7.0f / 15.0f, 4.0f / 13.0f);
246 } 248 }
247 249
248 // Correct calculation with different packet lengths. 250 // Correct calculation with different packet lengths.
249 TEST_P(TransportFeedbackPacketLossTrackerTest, DifferentSentIntervals) { 251 TEST_P(TransportFeedbackPacketLossTrackerTest, DifferentSentIntervals) {
250 TransportFeedbackPacketLossTracker tracker(5000, 5, 4); 252 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 4);
251 253
252 int64_t now_ms = 0;
253 int64_t frames[] = {20, 60, 120, 20, 60}; 254 int64_t frames[] = {20, 60, 120, 20, 60};
254 for (size_t i = 0; i < sizeof(frames) / sizeof(frames[0]); i++) { 255 for (size_t i = 0; i < sizeof(frames) / sizeof(frames[0]); i++) {
255 tracker.OnPacketAdded(static_cast<uint16_t>(base_ + i), now_ms); 256 SendPackets(&tracker, {static_cast<uint16_t>(base_ + i)}, frames[i]);
256 now_ms += frames[i];
257 } 257 }
258 258
259 // Expected window contents: [] -> [10011]. 259 // Expected window contents: [] -> [10011].
260 AddTransportFeedbackAndValidate(&tracker, base_, 260 AddTransportFeedbackAndValidate(&tracker, base_,
261 {true, false, false, true, true}); 261 {true, false, false, true, true});
262 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f); 262 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
263 } 263 }
264 264
265 // The window retains information up to sent times that exceed the the max 265 // The window retains information up to sent times that exceed the the max
266 // window size. The oldest packets get shifted out of window to make room 266 // window size. The oldest packets get shifted out of window to make room
267 // for the newer ones. 267 // for the newer ones.
268 TEST_P(TransportFeedbackPacketLossTrackerTest, MaxWindowSize) { 268 TEST_P(TransportFeedbackPacketLossTrackerTest, MaxWindowSize) {
269 TransportFeedbackPacketLossTracker tracker(40, 5, 1); 269 TransportFeedbackPacketLossTracker tracker(4 * kDefaultSendInterval, 5, 1);
270 270
271 SendPackets(&tracker, base_, 6, 10, true); 271 SendPackets(&tracker, base_, 6, kDefaultSendInterval, true);
272 272
273 // Up to the maximum time-span retained (first + 4 * 10ms). 273 // Up to the maximum time-span retained (first + 4 * kDefaultSendInterval).
274 // Expected window contents: [] -> [01001]. 274 // Expected window contents: [] -> [01001].
275 AddTransportFeedbackAndValidate(&tracker, base_, 275 AddTransportFeedbackAndValidate(&tracker, base_,
276 {false, true, false, false, true}); 276 {false, true, false, false, true});
277 ValidatePacketLossStatistics(tracker, 3.0f / 5.0f, 2.0f / 4.0f); 277 ValidatePacketLossStatistics(tracker, 3.0f / 5.0f, 2.0f / 4.0f);
278 278
279 // After the maximum time-span, older entries are discarded to accommodate 279 // After the maximum time-span, older entries are discarded to accommodate
280 // newer ones. 280 // newer ones.
281 // Expected window contents: [01001] -> [10011]. 281 // Expected window contents: [01001] -> [10011].
282 AddTransportFeedbackAndValidate(&tracker, base_ + 5, {true}); 282 AddTransportFeedbackAndValidate(&tracker, base_ + 5, {true});
283 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f); 283 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
284 } 284 }
285 285
286 // All packets received. 286 // All packets received.
287 TEST_P(TransportFeedbackPacketLossTrackerTest, AllReceived) { 287 TEST_P(TransportFeedbackPacketLossTrackerTest, AllReceived) {
288 TransportFeedbackPacketLossTracker tracker(5000, 5, 4); 288 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 4);
289 289
290 // Expected window contents: [] -> [11111]. 290 // Expected window contents: [] -> [11111].
291 SendPackets(&tracker, base_, 5, 10); 291 SendPackets(&tracker, base_, 5, kDefaultSendInterval);
292 AddTransportFeedbackAndValidate(&tracker, base_, 292 AddTransportFeedbackAndValidate(&tracker, base_,
293 {true, true, true, true, true}); 293 {true, true, true, true, true});
294 ValidatePacketLossStatistics(tracker, 0.0f, 0.0f); 294 ValidatePacketLossStatistics(tracker, 0.0f, 0.0f);
295 } 295 }
296 296
297 // All packets lost. 297 // All packets lost.
298 TEST_P(TransportFeedbackPacketLossTrackerTest, AllLost) { 298 TEST_P(TransportFeedbackPacketLossTrackerTest, AllLost) {
299 TransportFeedbackPacketLossTracker tracker(5000, 5, 4); 299 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 4);
300 300
301 // Note: The last packet in the feedback does not belong to the stream. 301 // Note: The last packet in the feedback does not belong to the stream.
302 // It's only there because we're not allowed to end a feedback with a loss. 302 // It's only there because we're not allowed to end a feedback with a loss.
303 // Expected window contents: [] -> [00000]. 303 // Expected window contents: [] -> [00000].
304 SendPackets(&tracker, base_, 5, 10); 304 SendPackets(&tracker, base_, 5, kDefaultSendInterval);
305 AddTransportFeedbackAndValidate(&tracker, base_, 305 AddTransportFeedbackAndValidate(&tracker, base_,
306 {false, false, false, false, false, true}); 306 {false, false, false, false, false, true});
307 ValidatePacketLossStatistics(tracker, 1.0f, 0.0f); 307 ValidatePacketLossStatistics(tracker, 1.0f, 0.0f);
308 } 308 }
309 309
310 // Repeated reports are ignored. 310 // Repeated reports are ignored.
311 TEST_P(TransportFeedbackPacketLossTrackerTest, ReportRepetition) { 311 TEST_P(TransportFeedbackPacketLossTrackerTest, ReportRepetition) {
312 TransportFeedbackPacketLossTracker tracker(5000, 5, 4); 312 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 4);
313 313
314 SendPackets(&tracker, base_, 5, 10); 314 SendPackets(&tracker, base_, 5, kDefaultSendInterval);
315 315
316 // Expected window contents: [] -> [10011]. 316 // Expected window contents: [] -> [10011].
317 AddTransportFeedbackAndValidate(&tracker, base_, 317 AddTransportFeedbackAndValidate(&tracker, base_,
318 {true, false, false, true, true}); 318 {true, false, false, true, true});
319 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f); 319 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
320 320
321 // Repeat entire previous feedback 321 // Repeat entire previous feedback
322 // Expected window contents: [10011] -> [10011]. 322 // Expected window contents: [10011] -> [10011].
323 AddTransportFeedbackAndValidate(&tracker, base_, 323 AddTransportFeedbackAndValidate(&tracker, base_,
324 {true, false, false, true, true}); 324 {true, false, false, true, true});
325 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f); 325 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
326 } 326 }
327 327
328 // Report overlap. 328 // Report overlap.
329 TEST_P(TransportFeedbackPacketLossTrackerTest, ReportOverlap) { 329 TEST_P(TransportFeedbackPacketLossTrackerTest, ReportOverlap) {
330 TransportFeedbackPacketLossTracker tracker(5000, 5, 1); 330 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 1);
331 331
332 SendPackets(&tracker, base_, 15, 10); 332 SendPackets(&tracker, base_, 15, kDefaultSendInterval);
333 333
334 // Expected window contents: [] -> [10011]. 334 // Expected window contents: [] -> [10011].
335 AddTransportFeedbackAndValidate(&tracker, base_, 335 AddTransportFeedbackAndValidate(&tracker, base_,
336 {true, false, false, true, true}); 336 {true, false, false, true, true});
337 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f); 337 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
338 338
339 // Expected window contents: [10011] -> [1001101]. 339 // Expected window contents: [10011] -> [1001101].
340 AddTransportFeedbackAndValidate(&tracker, base_ + 3, 340 AddTransportFeedbackAndValidate(&tracker, base_ + 3,
341 {true, true, false, true}); 341 {true, true, false, true});
342 ValidatePacketLossStatistics(tracker, 3.0f / 7.0f, 2.0f / 6.0f); 342 ValidatePacketLossStatistics(tracker, 3.0f / 7.0f, 2.0f / 6.0f);
343 } 343 }
344 344
345 // Report conflict. 345 // Report conflict.
346 TEST_P(TransportFeedbackPacketLossTrackerTest, ReportConflict) { 346 TEST_P(TransportFeedbackPacketLossTrackerTest, ReportConflict) {
347 TransportFeedbackPacketLossTracker tracker(5000, 5, 4); 347 TransportFeedbackPacketLossTracker tracker(500 * kDefaultSendInterval, 5, 4);
348 348
349 SendPackets(&tracker, base_, 15, 10); 349 SendPackets(&tracker, base_, 15, 10);
350 350
351 // Expected window contents: [] -> [01001]. 351 // Expected window contents: [] -> [01001].
352 AddTransportFeedbackAndValidate(&tracker, base_, 352 AddTransportFeedbackAndValidate(&tracker, base_,
353 {false, true, false, false, true}); 353 {false, true, false, false, true});
354 ValidatePacketLossStatistics(tracker, 3.0f / 5.0f, 2.0f / 4.0f); 354 ValidatePacketLossStatistics(tracker, 3.0f / 5.0f, 2.0f / 4.0f);
355 355
356 // Expected window contents: [01001] -> [11101]. 356 // Expected window contents: [01001] -> [11101].
357 // While false->true will be applied, true -> false will be ignored. 357 // While false->true will be applied, true -> false will be ignored.
358 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true}); 358 AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true});
359 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f); 359 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f);
360 } 360 }
361 361
362 // Skipped packets treated as unknown (not lost). 362 // Skipped packets treated as unknown (not lost).
363 TEST_P(TransportFeedbackPacketLossTrackerTest, SkippedPackets) { 363 TEST_P(TransportFeedbackPacketLossTrackerTest, SkippedPackets) {
364 TransportFeedbackPacketLossTracker tracker(200 * 10, 5, 1); 364 TransportFeedbackPacketLossTracker tracker(200 * kDefaultSendInterval, 5, 1);
365 365
366 SendPackets(&tracker, base_, 200, 10); 366 SendPackets(&tracker, base_, 200, kDefaultSendInterval);
367 367
368 // Expected window contents: [] -> [10011]. 368 // Expected window contents: [] -> [10011].
369 AddTransportFeedbackAndValidate(&tracker, base_, 369 AddTransportFeedbackAndValidate(&tracker, base_,
370 {true, false, false, true, true}); 370 {true, false, false, true, true});
371 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f); 371 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
372 372
373 // Expected window contents: [10011] -> [10011-GAP-101]. 373 // Expected window contents: [10011] -> [10011-GAP-101].
374 AddTransportFeedbackAndValidate(&tracker, base_ + 100, {true, false, true}); 374 AddTransportFeedbackAndValidate(&tracker, base_ + 100, {true, false, true});
375 ValidatePacketLossStatistics(tracker, 3.0f / 8.0f, 2.0f / 6.0f); 375 ValidatePacketLossStatistics(tracker, 3.0f / 8.0f, 2.0f / 6.0f);
376 } 376 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 // Messages that are *not* more than the span-limit away from the newest 409 // Messages that are *not* more than the span-limit away from the newest
410 // acked message are *not* too old. Acking them would have an effect. 410 // acked message are *not* too old. Acking them would have an effect.
411 AddTransportFeedbackAndValidate( 411 AddTransportFeedbackAndValidate(
412 &tracker, moved_newest_acked - max_window_size_ms, {true}); 412 &tracker, moved_newest_acked - max_window_size_ms, {true});
413 ValidatePacketLossStatistics(tracker, 3.0f / 7.0f, 1.0f / 5.0f); 413 ValidatePacketLossStatistics(tracker, 3.0f / 7.0f, 1.0f / 5.0f);
414 } 414 }
415 415
416 // Inserting feedback into the middle of a window works correctly - can 416 // Inserting feedback into the middle of a window works correctly - can
417 // complete two pairs. 417 // complete two pairs.
418 TEST_P(TransportFeedbackPacketLossTrackerTest, InsertionCompletesTwoPairs) { 418 TEST_P(TransportFeedbackPacketLossTrackerTest, InsertionCompletesTwoPairs) {
419 TransportFeedbackPacketLossTracker tracker(1500, 5, 1); 419 TransportFeedbackPacketLossTracker tracker(150 * kDefaultSendInterval, 5, 1);
420 420
421 SendPackets(&tracker, base_, 15, 10); 421 SendPackets(&tracker, base_, 15, kDefaultSendInterval);
422 422
423 // Expected window contents: [] -> [10111]. 423 // Expected window contents: [] -> [10111].
424 AddTransportFeedbackAndValidate(&tracker, base_, 424 AddTransportFeedbackAndValidate(&tracker, base_,
425 {true, false, true, true, true}); 425 {true, false, true, true, true});
426 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f); 426 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f);
427 427
428 // Expected window contents: [10111] -> [10111-GAP-10101]. 428 // Expected window contents: [10111] -> [10111-GAP-10101].
429 AddTransportFeedbackAndValidate(&tracker, base_ + 7, 429 AddTransportFeedbackAndValidate(&tracker, base_ + 7,
430 {true, false, true, false, true}); 430 {true, false, true, false, true});
431 ValidatePacketLossStatistics(tracker, 3.0f / 10.0f, 3.0f / 8.0f); 431 ValidatePacketLossStatistics(tracker, 3.0f / 10.0f, 3.0f / 8.0f);
432 432
433 // Insert in between, closing the gap completely. 433 // Insert in between, closing the gap completely.
434 // Expected window contents: [10111-GAP-10101] -> [101110110101]. 434 // Expected window contents: [10111-GAP-10101] -> [101110110101].
435 AddTransportFeedbackAndValidate(&tracker, base_ + 5, {false, true}); 435 AddTransportFeedbackAndValidate(&tracker, base_ + 5, {false, true});
436 ValidatePacketLossStatistics(tracker, 4.0f / 12.0f, 4.0f / 11.0f); 436 ValidatePacketLossStatistics(tracker, 4.0f / 12.0f, 4.0f / 11.0f);
437 } 437 }
438 438
439 // Sequence number gaps are not gaps in reception. However, gaps in reception 439 // Sequence number gaps are not gaps in reception. However, gaps in reception
440 // are still possible, if a packet which WAS sent on the stream is not acked. 440 // are still possible, if a packet which WAS sent on the stream is not acked.
441 TEST_P(TransportFeedbackPacketLossTrackerTest, SanityGapsInSequenceNumbers) { 441 TEST_P(TransportFeedbackPacketLossTrackerTest, SanityGapsInSequenceNumbers) {
442 TransportFeedbackPacketLossTracker tracker(500, 5, 1); 442 TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendInterval, 5, 1);
443 443
444 SendPackets(&tracker, 444 SendPackets(&tracker,
445 {static_cast<uint16_t>(base_), 445 {static_cast<uint16_t>(base_),
446 static_cast<uint16_t>(base_ + 2), 446 static_cast<uint16_t>(base_ + 2),
447 static_cast<uint16_t>(base_ + 4), 447 static_cast<uint16_t>(base_ + 4),
448 static_cast<uint16_t>(base_ + 6), 448 static_cast<uint16_t>(base_ + 6),
449 static_cast<uint16_t>(base_ + 8)}, 449 static_cast<uint16_t>(base_ + 8)},
450 10); 450 kDefaultSendInterval);
451 451
452 // Gaps in sequence numbers not considered as gaps in window, because only 452 // Gaps in sequence numbers not considered as gaps in window, because only
453 // those sequence numbers which were associated with the stream count. 453 // those sequence numbers which were associated with the stream count.
454 // Expected window contents: [] -> [11011]. 454 // Expected window contents: [] -> [11011].
455 AddTransportFeedbackAndValidate( 455 AddTransportFeedbackAndValidate(
456 // Note: Left packets belong to this stream, right ones ignored. 456 // Note: Left packets belong to this stream, right ones ignored.
457 &tracker, base_, {true, false, 457 &tracker, base_, {true, false,
458 true, false, 458 true, false,
459 false, false, 459 false, false,
460 true, false, 460 true, false,
461 true, true}); 461 true, true});
462 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f); 462 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f);
463 463
464 // Create gap by sending [base + 10] but not acking it. 464 // Create gap by sending [base + 10] but not acking it.
465 // Note: Acks for [base + 11] and [base + 13] ignored (other stream). 465 // Note: Acks for [base + 11] and [base + 13] ignored (other stream).
466 // Expected window contents: [11011] -> [11011-GAP-01]. 466 // Expected window contents: [11011] -> [11011-GAP-01].
467 SendPackets(&tracker, 467 SendPackets(&tracker,
468 {static_cast<uint16_t>(base_ + 10), 468 {static_cast<uint16_t>(base_ + 10),
469 static_cast<uint16_t>(base_ + 12), 469 static_cast<uint16_t>(base_ + 12),
470 static_cast<uint16_t>(base_ + 14)}, 470 static_cast<uint16_t>(base_ + 14)},
471 10); 471 kDefaultSendInterval);
472 AddTransportFeedbackAndValidate(&tracker, base_ + 11, 472 AddTransportFeedbackAndValidate(&tracker, base_ + 11,
473 {false, false, false, true, true}); 473 {false, false, false, true, true});
474 ValidatePacketLossStatistics(tracker, 2.0f / 7.0f, 2.0f / 5.0f); 474 ValidatePacketLossStatistics(tracker, 2.0f / 7.0f, 2.0f / 5.0f);
475 } 475 }
476 476
477 // The window cannot span more than 0x8000 in sequence numbers, regardless 477 // The window cannot span more than 0x8000 in sequence numbers, regardless
478 // of time stamps and ack/unacked status. 478 // of time stamps and ack/unacked status.
479 TEST_P(TransportFeedbackPacketLossTrackerTest, MaxUnackedPackets) { 479 TEST_P(TransportFeedbackPacketLossTrackerTest, MaxUnackedPackets) {
480 TransportFeedbackPacketLossTracker tracker(0x10000, 4, 1); 480 TransportFeedbackPacketLossTracker tracker(0x10000, 4, 1);
481 481
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 const uint16_t new_packet_seq_num = 530 const uint16_t new_packet_seq_num =
531 static_cast<uint16_t>(base_ + feedback.size() + 1); 531 static_cast<uint16_t>(base_ + feedback.size() + 1);
532 SendPackets(&tracker, {new_packet_seq_num}, 1); 532 SendPackets(&tracker, {new_packet_seq_num}, 1);
533 ValidatePacketLossStatistics(tracker, 2.0f / 6.0f, 2.0f / 5.0f); 533 ValidatePacketLossStatistics(tracker, 2.0f / 6.0f, 2.0f / 5.0f);
534 // Expected window contents: [011011] -> [110111]. 534 // Expected window contents: [011011] -> [110111].
535 AddTransportFeedbackAndValidate(&tracker, new_packet_seq_num, {true}); 535 AddTransportFeedbackAndValidate(&tracker, new_packet_seq_num, {true});
536 ValidatePacketLossStatistics(tracker, 1.0f / 6.0f, 1.0f / 5.0f); 536 ValidatePacketLossStatistics(tracker, 1.0f / 6.0f, 1.0f / 5.0f);
537 } 537 }
538 538
539 TEST_P(TransportFeedbackPacketLossTrackerTest, RepeatedSeqNumResetsWindow) { 539 TEST_P(TransportFeedbackPacketLossTrackerTest, RepeatedSeqNumResetsWindow) {
540 TransportFeedbackPacketLossTracker tracker(500, 2, 1); 540 TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendInterval, 2, 1);
541 541
542 // Baseline - window has acked messages. 542 // Baseline - window has acked messages.
543 // Expected window contents: [] -> [01101]. 543 // Expected window contents: [] -> [01101].
544 SendPackets(&tracker, base_, 5, 10); 544 SendPackets(&tracker, base_, 5, kDefaultSendInterval);
545 AddTransportFeedbackAndValidate(&tracker, base_, 545 AddTransportFeedbackAndValidate(&tracker, base_,
546 {false, true, true, false, true}); 546 {false, true, true, false, true});
547 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f); 547 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f);
548 548
549 // A reset occurs. 549 // A reset occurs.
550 SendPackets(&tracker, static_cast<uint16_t>(base_ + 2), 1, 10); 550 SendPackets(&tracker, {static_cast<uint16_t>(base_ + 2)},
551 kDefaultSendInterval);
551 ValidatePacketLossStatistics(tracker, 552 ValidatePacketLossStatistics(tracker,
552 rtc::Optional<float>(), 553 rtc::Optional<float>(),
553 rtc::Optional<float>()); 554 rtc::Optional<float>());
554 } 555 }
555 556
556 // The window is reset by the sending of a packet which is 0x8000 or more 557 // The window is reset by the sending of a packet which is 0x8000 or more
557 // away from the newest packet acked/unacked packet. 558 // away from the newest packet acked/unacked packet.
558 TEST_P(TransportFeedbackPacketLossTrackerTest, 559 TEST_P(TransportFeedbackPacketLossTrackerTest,
559 SendAfterLongSuspensionResetsWindow) { 560 SendAfterLongSuspensionResetsWindow) {
560 TransportFeedbackPacketLossTracker tracker(500, 2, 1); 561 TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendInterval, 2, 1);
561 562
562 // Baseline - window has acked messages. 563 // Baseline - window has acked messages.
563 // Expected window contents: [] -> [01101]. 564 // Expected window contents: [] -> [01101].
564 SendPackets(&tracker, base_, 5, 10); 565 SendPackets(&tracker, base_, 5, kDefaultSendInterval);
565 AddTransportFeedbackAndValidate(&tracker, base_, 566 AddTransportFeedbackAndValidate(&tracker, base_,
566 {false, true, true, false, true}); 567 {false, true, true, false, true});
567 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f); 568 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f);
568 569
569 // A reset occurs. 570 // A reset occurs.
570 SendPackets(&tracker, static_cast<uint16_t>(base_ + 5 + 0x8000), 1, 10); 571 SendPackets(&tracker, {static_cast<uint16_t>(base_ + 5 + 0x8000)},
572 kDefaultSendInterval);
571 ValidatePacketLossStatistics(tracker, 573 ValidatePacketLossStatistics(tracker,
572 rtc::Optional<float>(), 574 rtc::Optional<float>(),
573 rtc::Optional<float>()); 575 rtc::Optional<float>());
574 } 576 }
575 577
576 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) 578 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
577 TEST(TransportFeedbackPacketLossTrackerTest, InvalidConfigMaxWindowSize) { 579 TEST(TransportFeedbackPacketLossTrackerTest, InvalidConfigMaxWindowSize) {
578 EXPECT_DEATH(TransportFeedbackPacketLossTracker tracker(0, 20, 10), ""); 580 EXPECT_DEATH(TransportFeedbackPacketLossTracker tracker(0, 20, 10), "");
579 } 581 }
580 582
(...skipping 15 matching lines...) Expand all
596 598
597 // All tests are run multiple times with various baseline sequence number, 599 // All tests are run multiple times with various baseline sequence number,
598 // to weed out potential bugs with wrap-around handling. 600 // to weed out potential bugs with wrap-around handling.
599 constexpr uint16_t kBases[] = {0x0000, 0x3456, 0xc032, 0xfffe}; 601 constexpr uint16_t kBases[] = {0x0000, 0x3456, 0xc032, 0xfffe};
600 602
601 INSTANTIATE_TEST_CASE_P(_, 603 INSTANTIATE_TEST_CASE_P(_,
602 TransportFeedbackPacketLossTrackerTest, 604 TransportFeedbackPacketLossTrackerTest,
603 testing::ValuesIn(kBases)); 605 testing::ValuesIn(kBases));
604 606
605 } // namespace webrtc 607 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698