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