| 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..7df87154da94330978f81003da29828355edaf04 100644
|
| --- a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
|
| +++ b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
|
| @@ -16,11 +16,29 @@
|
| #include "webrtc/test/gtest.h"
|
|
|
| using ::testing::_;
|
| -using ::testing::InSequence;
|
| +using ::testing::ElementsAre;
|
| using ::testing::Invoke;
|
| using ::testing::Return;
|
|
|
| namespace webrtc {
|
| +namespace {
|
| +
|
| +std::vector<uint16_t> SequenceNumbers(const rtcp::TransportFeedback& packet) {
|
| + std::vector<uint16_t> sequence_numbers;
|
| + for (const auto& packet : packet.GetReceivedPackets()) {
|
| + sequence_numbers.push_back(packet.sequence_number());
|
| + }
|
| + return sequence_numbers;
|
| +}
|
| +
|
| +std::vector<int64_t> TimestampsMs(const rtcp::TransportFeedback& packet) {
|
| + std::vector<int64_t> timestamps;
|
| + int64_t timestamp_us = packet.GetBaseTimeUs();
|
| + for (const auto& packet : packet.GetReceivedPackets()) {
|
| + timestamps.push_back((timestamp_us += packet.delta_us()) / 1000);
|
| + }
|
| + return timestamps;
|
| +}
|
|
|
| class MockPacketRouter : public PacketRouter {
|
| public:
|
| @@ -62,20 +80,12 @@ 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);
|
| + EXPECT_THAT(SequenceNumbers(*packet), ElementsAre(kBaseSeq));
|
| + EXPECT_THAT(TimestampsMs(*packet), ElementsAre(kBaseTimeMs));
|
| return true;
|
| }));
|
|
|
| @@ -87,20 +97,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);
|
| + EXPECT_THAT(SequenceNumbers(*packet), ElementsAre(kBaseSeq));
|
| + EXPECT_THAT(TimestampsMs(*packet), ElementsAre(kBaseTimeMs));
|
| return true;
|
| }));
|
|
|
| @@ -111,30 +113,19 @@ 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);
|
| + EXPECT_THAT(SequenceNumbers(*packet), ElementsAre(kBaseSeq + 3));
|
| + EXPECT_THAT(TimestampsMs(*packet), ElementsAre(kBaseTimeMs + 3000));
|
| return true;
|
| }));
|
|
|
| @@ -147,27 +138,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);
|
| + EXPECT_THAT(SequenceNumbers(*packet),
|
| + ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 2));
|
| + EXPECT_THAT(TimestampsMs(*packet),
|
| + ElementsAre(kBaseTimeMs, kBaseTimeMs + kMaxSmallDeltaMs,
|
| + kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1));
|
| return true;
|
| }));
|
|
|
| @@ -181,45 +160,24 @@ TEST_F(RemoteEstimatorProxyTest, SendsFragmentedFeedback) {
|
| 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);
|
| + EXPECT_THAT(SequenceNumbers(*packet), ElementsAre(kBaseSeq));
|
| + EXPECT_THAT(TimestampsMs(*packet), ElementsAre(kBaseTimeMs));
|
| return true;
|
| }))
|
| - .RetiresOnSaturation();
|
| -
|
| - 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(*packet), ElementsAre(kBaseSeq + 1));
|
| + EXPECT_THAT(TimestampsMs(*packet),
|
| + ElementsAre(kBaseTimeMs + kTooLargeDelta));
|
| return true;
|
| - }))
|
| - .RetiresOnSaturation();
|
| + }));
|
|
|
| Process();
|
| }
|
| @@ -231,15 +189,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);
|
| + EXPECT_THAT(TimestampsMs(*packet), ElementsAre(kBaseTimeMs));
|
| return true;
|
| }));
|
|
|
| @@ -251,16 +205,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);
|
| + EXPECT_THAT(SequenceNumbers(*packet),
|
| + ElementsAre(kBaseSeq, kBaseSeq + 2));
|
| + EXPECT_THAT(TimestampsMs(*packet),
|
| + ElementsAre(kBaseTimeMs, kBaseTimeMs + 2));
|
| return true;
|
| }));
|
|
|
| @@ -269,17 +221,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);
|
| + EXPECT_THAT(SequenceNumbers(*packet),
|
| + ElementsAre(kBaseSeq + 1, kBaseSeq + 2));
|
| + EXPECT_THAT(TimestampsMs(*packet),
|
| + ElementsAre(kBaseTimeMs + 1, kBaseTimeMs + 2));
|
| return true;
|
| }));
|
|
|
| @@ -293,14 +242,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);
|
| + EXPECT_THAT(TimestampsMs(*packet), ElementsAre(kBaseTimeMs));
|
| return true;
|
| }));
|
|
|
| @@ -309,15 +254,10 @@ 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);
|
| + EXPECT_THAT(TimestampsMs(*packet), ElementsAre(kTimeoutTimeMs));
|
| return true;
|
| }));
|
|
|
| @@ -329,21 +269,14 @@ 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);
|
| + EXPECT_THAT(SequenceNumbers(*packet),
|
| + ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 3));
|
| + EXPECT_THAT(
|
| + TimestampsMs(*packet),
|
| + ElementsAre(kBaseTimeMs - 1, kTimeoutTimeMs - 1, kTimeoutTimeMs));
|
| return true;
|
| }));
|
|
|
| @@ -391,4 +324,5 @@ TEST_F(RemoteEstimatorProxyTest, TwccReportsUse5PercentOfAvailableBandwidth) {
|
| EXPECT_EQ(136, proxy_.TimeUntilNextProcess());
|
| }
|
|
|
| +} // namespace
|
| } // namespace webrtc
|
|
|