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 |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |