| 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 kDefaultSendIntervalMs = 10; |
| 27 constexpr int64_t kDefaultMaxWindowSizeMs = 500 * kDefaultSendIntervalMs; |
| 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, kDefaultSendIntervalMs); |
| 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, kDefaultSendIntervalMs); |
| 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, kDefaultSendIntervalMs); |
| 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, kDefaultSendIntervalMs); |
| 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, kDefaultSendIntervalMs); |
| 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 * kDefaultSendIntervalMs, 5, 1); |
| 270 | 271 |
| 271 SendPackets(&tracker, base_, 6, 10, true); | 272 SendPackets(&tracker, base_, 6, kDefaultSendIntervalMs, true); |
| 272 | 273 |
| 273 // Up to the maximum time-span retained (first + 4 * 10ms). | 274 // Up to the maximum time-span retained (first + 4 * kDefaultSendIntervalMs). |
| 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, kDefaultSendIntervalMs); |
| 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, kDefaultSendIntervalMs); |
| 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, kDefaultSendIntervalMs); |
| 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, kDefaultSendIntervalMs); |
| 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 * kDefaultSendIntervalMs, 5, |
| 366 1); |
| 365 | 367 |
| 366 SendPackets(&tracker, base_, 200, 10); | 368 SendPackets(&tracker, base_, 200, kDefaultSendIntervalMs); |
| 367 | 369 |
| 368 // Expected window contents: [] -> [10011]. | 370 // Expected window contents: [] -> [10011]. |
| 369 AddTransportFeedbackAndValidate(&tracker, base_, | 371 AddTransportFeedbackAndValidate(&tracker, base_, |
| 370 {true, false, false, true, true}); | 372 {true, false, false, true, true}); |
| 371 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f); | 373 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f); |
| 372 | 374 |
| 373 // Expected window contents: [10011] -> [10011-GAP-101]. | 375 // Expected window contents: [10011] -> [10011-GAP-101]. |
| 374 AddTransportFeedbackAndValidate(&tracker, base_ + 100, {true, false, true}); | 376 AddTransportFeedbackAndValidate(&tracker, base_ + 100, {true, false, true}); |
| 375 ValidatePacketLossStatistics(tracker, 3.0f / 8.0f, 2.0f / 6.0f); | 377 ValidatePacketLossStatistics(tracker, 3.0f / 8.0f, 2.0f / 6.0f); |
| 376 } | 378 } |
| (...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 | 411 // 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. | 412 // acked message are *not* too old. Acking them would have an effect. |
| 411 AddTransportFeedbackAndValidate( | 413 AddTransportFeedbackAndValidate( |
| 412 &tracker, moved_newest_acked - max_window_size_ms, {true}); | 414 &tracker, moved_newest_acked - max_window_size_ms, {true}); |
| 413 ValidatePacketLossStatistics(tracker, 3.0f / 7.0f, 1.0f / 5.0f); | 415 ValidatePacketLossStatistics(tracker, 3.0f / 7.0f, 1.0f / 5.0f); |
| 414 } | 416 } |
| 415 | 417 |
| 416 // Inserting feedback into the middle of a window works correctly - can | 418 // Inserting feedback into the middle of a window works correctly - can |
| 417 // complete two pairs. | 419 // complete two pairs. |
| 418 TEST_P(TransportFeedbackPacketLossTrackerTest, InsertionCompletesTwoPairs) { | 420 TEST_P(TransportFeedbackPacketLossTrackerTest, InsertionCompletesTwoPairs) { |
| 419 TransportFeedbackPacketLossTracker tracker(1500, 5, 1); | 421 TransportFeedbackPacketLossTracker tracker(150 * kDefaultSendIntervalMs, 5, |
| 422 1); |
| 420 | 423 |
| 421 SendPackets(&tracker, base_, 15, 10); | 424 SendPackets(&tracker, base_, 15, kDefaultSendIntervalMs); |
| 422 | 425 |
| 423 // Expected window contents: [] -> [10111]. | 426 // Expected window contents: [] -> [10111]. |
| 424 AddTransportFeedbackAndValidate(&tracker, base_, | 427 AddTransportFeedbackAndValidate(&tracker, base_, |
| 425 {true, false, true, true, true}); | 428 {true, false, true, true, true}); |
| 426 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f); | 429 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f); |
| 427 | 430 |
| 428 // Expected window contents: [10111] -> [10111-GAP-10101]. | 431 // Expected window contents: [10111] -> [10111-GAP-10101]. |
| 429 AddTransportFeedbackAndValidate(&tracker, base_ + 7, | 432 AddTransportFeedbackAndValidate(&tracker, base_ + 7, |
| 430 {true, false, true, false, true}); | 433 {true, false, true, false, true}); |
| 431 ValidatePacketLossStatistics(tracker, 3.0f / 10.0f, 3.0f / 8.0f); | 434 ValidatePacketLossStatistics(tracker, 3.0f / 10.0f, 3.0f / 8.0f); |
| 432 | 435 |
| 433 // Insert in between, closing the gap completely. | 436 // Insert in between, closing the gap completely. |
| 434 // Expected window contents: [10111-GAP-10101] -> [101110110101]. | 437 // Expected window contents: [10111-GAP-10101] -> [101110110101]. |
| 435 AddTransportFeedbackAndValidate(&tracker, base_ + 5, {false, true}); | 438 AddTransportFeedbackAndValidate(&tracker, base_ + 5, {false, true}); |
| 436 ValidatePacketLossStatistics(tracker, 4.0f / 12.0f, 4.0f / 11.0f); | 439 ValidatePacketLossStatistics(tracker, 4.0f / 12.0f, 4.0f / 11.0f); |
| 437 } | 440 } |
| 438 | 441 |
| 439 // Sequence number gaps are not gaps in reception. However, gaps in reception | 442 // 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. | 443 // are still possible, if a packet which WAS sent on the stream is not acked. |
| 441 TEST_P(TransportFeedbackPacketLossTrackerTest, SanityGapsInSequenceNumbers) { | 444 TEST_P(TransportFeedbackPacketLossTrackerTest, SanityGapsInSequenceNumbers) { |
| 442 TransportFeedbackPacketLossTracker tracker(500, 5, 1); | 445 TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendIntervalMs, 5, 1); |
| 443 | 446 |
| 444 SendPackets(&tracker, | 447 SendPackets(&tracker, |
| 445 {static_cast<uint16_t>(base_), | 448 {static_cast<uint16_t>(base_), |
| 446 static_cast<uint16_t>(base_ + 2), | 449 static_cast<uint16_t>(base_ + 2), |
| 447 static_cast<uint16_t>(base_ + 4), | 450 static_cast<uint16_t>(base_ + 4), |
| 448 static_cast<uint16_t>(base_ + 6), | 451 static_cast<uint16_t>(base_ + 6), |
| 449 static_cast<uint16_t>(base_ + 8)}, | 452 static_cast<uint16_t>(base_ + 8)}, |
| 450 10); | 453 kDefaultSendIntervalMs); |
| 451 | 454 |
| 452 // Gaps in sequence numbers not considered as gaps in window, because only | 455 // Gaps in sequence numbers not considered as gaps in window, because only |
| 453 // those sequence numbers which were associated with the stream count. | 456 // those sequence numbers which were associated with the stream count. |
| 454 // Expected window contents: [] -> [11011]. | 457 // Expected window contents: [] -> [11011]. |
| 455 AddTransportFeedbackAndValidate( | 458 AddTransportFeedbackAndValidate( |
| 456 // Note: Left packets belong to this stream, right ones ignored. | 459 // Note: Left packets belong to this stream, right ones ignored. |
| 457 &tracker, base_, {true, false, | 460 &tracker, base_, {true, false, |
| 458 true, false, | 461 true, false, |
| 459 false, false, | 462 false, false, |
| 460 true, false, | 463 true, false, |
| 461 true, true}); | 464 true, true}); |
| 462 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f); | 465 ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f); |
| 463 | 466 |
| 464 // Create gap by sending [base + 10] but not acking it. | 467 // Create gap by sending [base + 10] but not acking it. |
| 465 // Note: Acks for [base + 11] and [base + 13] ignored (other stream). | 468 // Note: Acks for [base + 11] and [base + 13] ignored (other stream). |
| 466 // Expected window contents: [11011] -> [11011-GAP-01]. | 469 // Expected window contents: [11011] -> [11011-GAP-01]. |
| 467 SendPackets(&tracker, | 470 SendPackets(&tracker, |
| 468 {static_cast<uint16_t>(base_ + 10), | 471 {static_cast<uint16_t>(base_ + 10), |
| 469 static_cast<uint16_t>(base_ + 12), | 472 static_cast<uint16_t>(base_ + 12), |
| 470 static_cast<uint16_t>(base_ + 14)}, | 473 static_cast<uint16_t>(base_ + 14)}, |
| 471 10); | 474 kDefaultSendIntervalMs); |
| 472 AddTransportFeedbackAndValidate(&tracker, base_ + 11, | 475 AddTransportFeedbackAndValidate(&tracker, base_ + 11, |
| 473 {false, false, false, true, true}); | 476 {false, false, false, true, true}); |
| 474 ValidatePacketLossStatistics(tracker, 2.0f / 7.0f, 2.0f / 5.0f); | 477 ValidatePacketLossStatistics(tracker, 2.0f / 7.0f, 2.0f / 5.0f); |
| 475 } | 478 } |
| 476 | 479 |
| 477 // The window cannot span more than 0x8000 in sequence numbers, regardless | 480 // The window cannot span more than 0x8000 in sequence numbers, regardless |
| 478 // of time stamps and ack/unacked status. | 481 // of time stamps and ack/unacked status. |
| 479 TEST_P(TransportFeedbackPacketLossTrackerTest, MaxUnackedPackets) { | 482 TEST_P(TransportFeedbackPacketLossTrackerTest, MaxUnackedPackets) { |
| 480 TransportFeedbackPacketLossTracker tracker(0x10000, 4, 1); | 483 TransportFeedbackPacketLossTracker tracker(0x10000, 4, 1); |
| 481 | 484 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 const uint16_t new_packet_seq_num = | 533 const uint16_t new_packet_seq_num = |
| 531 static_cast<uint16_t>(base_ + feedback.size() + 1); | 534 static_cast<uint16_t>(base_ + feedback.size() + 1); |
| 532 SendPackets(&tracker, {new_packet_seq_num}, 1); | 535 SendPackets(&tracker, {new_packet_seq_num}, 1); |
| 533 ValidatePacketLossStatistics(tracker, 2.0f / 6.0f, 2.0f / 5.0f); | 536 ValidatePacketLossStatistics(tracker, 2.0f / 6.0f, 2.0f / 5.0f); |
| 534 // Expected window contents: [011011] -> [110111]. | 537 // Expected window contents: [011011] -> [110111]. |
| 535 AddTransportFeedbackAndValidate(&tracker, new_packet_seq_num, {true}); | 538 AddTransportFeedbackAndValidate(&tracker, new_packet_seq_num, {true}); |
| 536 ValidatePacketLossStatistics(tracker, 1.0f / 6.0f, 1.0f / 5.0f); | 539 ValidatePacketLossStatistics(tracker, 1.0f / 6.0f, 1.0f / 5.0f); |
| 537 } | 540 } |
| 538 | 541 |
| 539 TEST_P(TransportFeedbackPacketLossTrackerTest, RepeatedSeqNumResetsWindow) { | 542 TEST_P(TransportFeedbackPacketLossTrackerTest, RepeatedSeqNumResetsWindow) { |
| 540 TransportFeedbackPacketLossTracker tracker(500, 2, 1); | 543 TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendIntervalMs, 2, 1); |
| 541 | 544 |
| 542 // Baseline - window has acked messages. | 545 // Baseline - window has acked messages. |
| 543 // Expected window contents: [] -> [01101]. | 546 // Expected window contents: [] -> [01101]. |
| 544 SendPackets(&tracker, base_, 5, 10); | 547 SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs); |
| 545 AddTransportFeedbackAndValidate(&tracker, base_, | 548 AddTransportFeedbackAndValidate(&tracker, base_, |
| 546 {false, true, true, false, true}); | 549 {false, true, true, false, true}); |
| 547 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f); | 550 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f); |
| 548 | 551 |
| 549 // A reset occurs. | 552 // A reset occurs. |
| 550 SendPackets(&tracker, static_cast<uint16_t>(base_ + 2), 1, 10); | 553 SendPackets(&tracker, {static_cast<uint16_t>(base_ + 2)}, |
| 554 kDefaultSendIntervalMs); |
| 551 ValidatePacketLossStatistics(tracker, | 555 ValidatePacketLossStatistics(tracker, |
| 552 rtc::Optional<float>(), | 556 rtc::Optional<float>(), |
| 553 rtc::Optional<float>()); | 557 rtc::Optional<float>()); |
| 554 } | 558 } |
| 555 | 559 |
| 556 // The window is reset by the sending of a packet which is 0x8000 or more | 560 // The window is reset by the sending of a packet which is 0x8000 or more |
| 557 // away from the newest packet acked/unacked packet. | 561 // away from the newest packet acked/unacked packet. |
| 558 TEST_P(TransportFeedbackPacketLossTrackerTest, | 562 TEST_P(TransportFeedbackPacketLossTrackerTest, |
| 559 SendAfterLongSuspensionResetsWindow) { | 563 SendAfterLongSuspensionResetsWindow) { |
| 560 TransportFeedbackPacketLossTracker tracker(500, 2, 1); | 564 TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendIntervalMs, 2, 1); |
| 561 | 565 |
| 562 // Baseline - window has acked messages. | 566 // Baseline - window has acked messages. |
| 563 // Expected window contents: [] -> [01101]. | 567 // Expected window contents: [] -> [01101]. |
| 564 SendPackets(&tracker, base_, 5, 10); | 568 SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs); |
| 565 AddTransportFeedbackAndValidate(&tracker, base_, | 569 AddTransportFeedbackAndValidate(&tracker, base_, |
| 566 {false, true, true, false, true}); | 570 {false, true, true, false, true}); |
| 567 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f); | 571 ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f); |
| 568 | 572 |
| 569 // A reset occurs. | 573 // A reset occurs. |
| 570 SendPackets(&tracker, static_cast<uint16_t>(base_ + 5 + 0x8000), 1, 10); | 574 SendPackets(&tracker, {static_cast<uint16_t>(base_ + 5 + 0x8000)}, |
| 575 kDefaultSendIntervalMs); |
| 571 ValidatePacketLossStatistics(tracker, | 576 ValidatePacketLossStatistics(tracker, |
| 572 rtc::Optional<float>(), | 577 rtc::Optional<float>(), |
| 573 rtc::Optional<float>()); | 578 rtc::Optional<float>()); |
| 574 } | 579 } |
| 575 | 580 |
| 576 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 581 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
| 577 TEST(TransportFeedbackPacketLossTrackerTest, InvalidConfigMaxWindowSize) { | 582 TEST(TransportFeedbackPacketLossTrackerTest, InvalidConfigMaxWindowSize) { |
| 578 EXPECT_DEATH(TransportFeedbackPacketLossTracker tracker(0, 20, 10), ""); | 583 EXPECT_DEATH(TransportFeedbackPacketLossTracker tracker(0, 20, 10), ""); |
| 579 } | 584 } |
| 580 | 585 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 596 | 601 |
| 597 // All tests are run multiple times with various baseline sequence number, | 602 // All tests are run multiple times with various baseline sequence number, |
| 598 // to weed out potential bugs with wrap-around handling. | 603 // to weed out potential bugs with wrap-around handling. |
| 599 constexpr uint16_t kBases[] = {0x0000, 0x3456, 0xc032, 0xfffe}; | 604 constexpr uint16_t kBases[] = {0x0000, 0x3456, 0xc032, 0xfffe}; |
| 600 | 605 |
| 601 INSTANTIATE_TEST_CASE_P(_, | 606 INSTANTIATE_TEST_CASE_P(_, |
| 602 TransportFeedbackPacketLossTrackerTest, | 607 TransportFeedbackPacketLossTrackerTest, |
| 603 testing::ValuesIn(kBases)); | 608 testing::ValuesIn(kBases)); |
| 604 | 609 |
| 605 } // namespace webrtc | 610 } // namespace webrtc |
| OLD | NEW |