Index: webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc |
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc |
index dbb3eaa4d78abd41074875cb2bb1ebfb854a43a5..1aeb55bceafb292a22abacc7a4518510caa31353 100644 |
--- a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc |
+++ b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc |
@@ -16,15 +16,43 @@ |
#include "webrtc/test/gtest.h" |
using ::testing::_; |
-using ::testing::InSequence; |
+using ::testing::ElementsAre; |
using ::testing::Invoke; |
using ::testing::Return; |
namespace webrtc { |
+namespace { |
+ |
+constexpr size_t kDefaultPacketSize = 100; |
+constexpr uint32_t kMediaSsrc = 456; |
+constexpr uint16_t kBaseSeq = 10; |
+constexpr int64_t kBaseTimeMs = 123; |
+constexpr int64_t kMaxSmallDeltaMs = |
+ (rtcp::TransportFeedback::kDeltaScaleFactor * 0xFF) / 1000; |
+ |
+std::vector<uint16_t> SequenceNumbers( |
+ const rtcp::TransportFeedback& feedback_packet) { |
+ std::vector<uint16_t> sequence_numbers; |
+ for (const auto& rtp_packet_received : feedback_packet.GetReceivedPackets()) { |
+ sequence_numbers.push_back(rtp_packet_received.sequence_number()); |
+ } |
+ return sequence_numbers; |
+} |
+ |
+std::vector<int64_t> TimestampsMs( |
+ const rtcp::TransportFeedback& feedback_packet) { |
+ std::vector<int64_t> timestamps; |
+ int64_t timestamp_us = feedback_packet.GetBaseTimeUs(); |
+ for (const auto& rtp_packet_received : feedback_packet.GetReceivedPackets()) { |
+ timestamp_us += rtp_packet_received.delta_us(); |
+ timestamps.push_back(timestamp_us / 1000); |
+ } |
+ return timestamps; |
+} |
class MockPacketRouter : public PacketRouter { |
public: |
- MOCK_METHOD1(SendFeedback, bool(rtcp::TransportFeedback* packet)); |
+ MOCK_METHOD1(SendFeedback, bool(rtcp::TransportFeedback* feedback_packet)); |
}; |
class RemoteEstimatorProxyTest : public ::testing::Test { |
@@ -49,33 +77,18 @@ class RemoteEstimatorProxyTest : public ::testing::Test { |
SimulatedClock clock_; |
testing::StrictMock<MockPacketRouter> router_; |
RemoteEstimatorProxy proxy_; |
- |
- const size_t kDefaultPacketSize = 100; |
- const uint32_t kMediaSsrc = 456; |
- const uint16_t kBaseSeq = 10; |
- const int64_t kBaseTimeMs = 123; |
- const int64_t kMaxSmallDeltaMs = |
- (rtcp::TransportFeedback::kDeltaScaleFactor * 0xFF) / 1000; |
}; |
TEST_F(RemoteEstimatorProxyTest, SendsSinglePacketFeedback) { |
IncomingPacket(kBaseSeq, kBaseTimeMs); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<rtcp::TransportFeedback::StatusSymbol> status_vec = |
- packet->GetStatusVector(); |
- EXPECT_EQ(1u, status_vec.size()); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kReceivedSmallDelta, |
- status_vec[0]); |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(1u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs, (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
+ |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
return true; |
})); |
@@ -87,20 +100,12 @@ TEST_F(RemoteEstimatorProxyTest, DuplicatedPackets) { |
IncomingPacket(kBaseSeq, kBaseTimeMs + 1000); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<rtcp::TransportFeedback::StatusSymbol> status_vec = |
- packet->GetStatusVector(); |
- EXPECT_EQ(1u, status_vec.size()); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kReceivedSmallDelta, |
- status_vec[0]); |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(1u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs, (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
+ |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
return true; |
})); |
@@ -111,30 +116,21 @@ TEST_F(RemoteEstimatorProxyTest, FeedbackWithMissingStart) { |
// First feedback. |
IncomingPacket(kBaseSeq, kBaseTimeMs); |
IncomingPacket(kBaseSeq + 1, kBaseTimeMs + 1000); |
- EXPECT_CALL(router_, SendFeedback(_)).Times(1).WillOnce(Return(true)); |
+ EXPECT_CALL(router_, SendFeedback(_)).WillOnce(Return(true)); |
Process(); |
// Second feedback starts with a missing packet (DROP kBaseSeq + 2). |
IncomingPacket(kBaseSeq + 3, kBaseTimeMs + 3000); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq + 2, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<rtcp::TransportFeedback::StatusSymbol> status_vec = |
- packet->GetStatusVector(); |
- EXPECT_EQ(2u, status_vec.size()); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kNotReceived, |
- status_vec[0]); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kReceivedSmallDelta, |
- status_vec[1]); |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(1u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs + 3000, |
- (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq + 2, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
+ |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), |
+ ElementsAre(kBaseSeq + 3)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), |
+ ElementsAre(kBaseTimeMs + 3000)); |
return true; |
})); |
@@ -147,27 +143,15 @@ TEST_F(RemoteEstimatorProxyTest, SendsFeedbackWithVaryingDeltas) { |
IncomingPacket(kBaseSeq + 2, kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<rtcp::TransportFeedback::StatusSymbol> status_vec = |
- packet->GetStatusVector(); |
- EXPECT_EQ(3u, status_vec.size()); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kReceivedSmallDelta, |
- status_vec[0]); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kReceivedSmallDelta, |
- status_vec[1]); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kReceivedLargeDelta, |
- status_vec[2]); |
- |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(3u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs, (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
- EXPECT_EQ(kMaxSmallDeltaMs, delta_vec[1] / 1000); |
- EXPECT_EQ(kMaxSmallDeltaMs + 1, delta_vec[2] / 1000); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
+ |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), |
+ ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 2)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), |
+ ElementsAre(kBaseTimeMs, kBaseTimeMs + kMaxSmallDeltaMs, |
+ kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1)); |
return true; |
})); |
@@ -175,51 +159,31 @@ TEST_F(RemoteEstimatorProxyTest, SendsFeedbackWithVaryingDeltas) { |
} |
TEST_F(RemoteEstimatorProxyTest, SendsFragmentedFeedback) { |
- const int64_t kTooLargeDelta = |
+ static constexpr int64_t kTooLargeDelta = |
rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 16); |
IncomingPacket(kBaseSeq, kBaseTimeMs); |
IncomingPacket(kBaseSeq + 1, kBaseTimeMs + kTooLargeDelta); |
- InSequence s; |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([kTooLargeDelta, this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<rtcp::TransportFeedback::StatusSymbol> status_vec = |
- packet->GetStatusVector(); |
- EXPECT_EQ(1u, status_vec.size()); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kReceivedSmallDelta, |
- status_vec[0]); |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(1u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs, (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
- return true; |
- })) |
- .RetiresOnSaturation(); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
- EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([kTooLargeDelta, this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq + 1, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<rtcp::TransportFeedback::StatusSymbol> status_vec = |
- packet->GetStatusVector(); |
- EXPECT_EQ(1u, status_vec.size()); |
- EXPECT_EQ(rtcp::TransportFeedback::StatusSymbol::kReceivedSmallDelta, |
- status_vec[0]); |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(1u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs + kTooLargeDelta, |
- (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
return true; |
})) |
- .RetiresOnSaturation(); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq + 1, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
+ |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), |
+ ElementsAre(kBaseSeq + 1)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), |
+ ElementsAre(kBaseTimeMs + kTooLargeDelta)); |
+ return true; |
+ })); |
Process(); |
} |
@@ -231,15 +195,11 @@ TEST_F(RemoteEstimatorProxyTest, GracefullyHandlesReorderingAndWrap) { |
IncomingPacket(kLargeSeq, kBaseTimeMs + kDeltaMs); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(1u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs, (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
+ |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
return true; |
})); |
@@ -251,16 +211,14 @@ TEST_F(RemoteEstimatorProxyTest, ResendsTimestampsOnReordering) { |
IncomingPacket(kBaseSeq + 2, kBaseTimeMs + 2); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(2u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs, (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
- EXPECT_EQ(2, delta_vec[1] / 1000); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
+ |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), |
+ ElementsAre(kBaseSeq, kBaseSeq + 2)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), |
+ ElementsAre(kBaseTimeMs, kBaseTimeMs + 2)); |
return true; |
})); |
@@ -269,17 +227,14 @@ TEST_F(RemoteEstimatorProxyTest, ResendsTimestampsOnReordering) { |
IncomingPacket(kBaseSeq + 1, kBaseTimeMs + 1); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq + 1, packet->GetBaseSequence()); |
- EXPECT_EQ(kMediaSsrc, packet->media_ssrc()); |
- |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(2u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs + 1, |
- (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
- EXPECT_EQ(1, delta_vec[1] / 1000); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq + 1, feedback_packet->GetBaseSequence()); |
+ EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
+ |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), |
+ ElementsAre(kBaseSeq + 1, kBaseSeq + 2)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), |
+ ElementsAre(kBaseTimeMs + 1, kBaseTimeMs + 2)); |
return true; |
})); |
@@ -293,14 +248,10 @@ TEST_F(RemoteEstimatorProxyTest, RemovesTimestampsOutOfScope) { |
IncomingPacket(kBaseSeq + 2, kBaseTimeMs); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([kTimeoutTimeMs, this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq + 2, packet->GetBaseSequence()); |
- |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(1u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs, (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
+ .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq + 2, feedback_packet->GetBaseSequence()); |
+ |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
return true; |
})); |
@@ -309,17 +260,14 @@ TEST_F(RemoteEstimatorProxyTest, RemovesTimestampsOutOfScope) { |
IncomingPacket(kBaseSeq + 3, kTimeoutTimeMs); // kBaseSeq + 2 times out here. |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([kTimeoutTimeMs, this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq + 3, packet->GetBaseSequence()); |
- |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(1u, delta_vec.size()); |
- EXPECT_EQ(kTimeoutTimeMs, |
- (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
- return true; |
- })); |
+ .WillOnce( |
+ Invoke([kTimeoutTimeMs](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq + 3, feedback_packet->GetBaseSequence()); |
+ |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), |
+ ElementsAre(kTimeoutTimeMs)); |
+ return true; |
+ })); |
Process(); |
@@ -329,23 +277,17 @@ TEST_F(RemoteEstimatorProxyTest, RemovesTimestampsOutOfScope) { |
IncomingPacket(kBaseSeq + 1, kTimeoutTimeMs - 1); |
EXPECT_CALL(router_, SendFeedback(_)) |
- .Times(1) |
- .WillOnce(Invoke([kTimeoutTimeMs, this](rtcp::TransportFeedback* packet) { |
- packet->Build(); |
- EXPECT_EQ(kBaseSeq, packet->GetBaseSequence()); |
- |
- // Four status entries (kBaseSeq + 3 missing). |
- EXPECT_EQ(4u, packet->GetStatusVector().size()); |
- |
- // Only three actual timestamps. |
- std::vector<int64_t> delta_vec = packet->GetReceiveDeltasUs(); |
- EXPECT_EQ(3u, delta_vec.size()); |
- EXPECT_EQ(kBaseTimeMs - 1, |
- (packet->GetBaseTimeUs() + delta_vec[0]) / 1000); |
- EXPECT_EQ(kTimeoutTimeMs - kBaseTimeMs, delta_vec[1] / 1000); |
- EXPECT_EQ(1, delta_vec[2] / 1000); |
- return true; |
- })); |
+ .WillOnce( |
+ Invoke([kTimeoutTimeMs](rtcp::TransportFeedback* feedback_packet) { |
+ EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
+ |
+ EXPECT_THAT(SequenceNumbers(*feedback_packet), |
+ ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 3)); |
+ EXPECT_THAT(TimestampsMs(*feedback_packet), |
+ ElementsAre(kBaseTimeMs - 1, kTimeoutTimeMs - 1, |
+ kTimeoutTimeMs)); |
+ return true; |
+ })); |
Process(); |
} |
@@ -391,4 +333,5 @@ TEST_F(RemoteEstimatorProxyTest, TwccReportsUse5PercentOfAvailableBandwidth) { |
EXPECT_EQ(136, proxy_.TimeUntilNextProcess()); |
} |
+} // namespace |
} // namespace webrtc |