Index: webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc |
diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc |
deleted file mode 100644 |
index b312f96f107277fc63a9b722d2af2af4ee674cbf..0000000000000000000000000000000000000000 |
--- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc |
+++ /dev/null |
@@ -1,364 +0,0 @@ |
-/* |
- * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
- |
-#include <limits> |
-#include <memory> |
-#include <vector> |
- |
-#include "webrtc/test/gmock.h" |
-#include "webrtc/test/gtest.h" |
- |
-#include "webrtc/base/checks.h" |
-#include "webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h" |
-#include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h" |
-#include "webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h" |
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
-#include "webrtc/system_wrappers/include/clock.h" |
- |
-using ::testing::_; |
-using ::testing::Invoke; |
- |
-namespace webrtc { |
-namespace test { |
- |
-class TransportFeedbackAdapterTest : public ::testing::Test { |
- public: |
- TransportFeedbackAdapterTest() |
- : clock_(0), |
- bitrate_estimator_(nullptr), |
- bitrate_controller_(this), |
- receiver_estimated_bitrate_(0) {} |
- |
- virtual ~TransportFeedbackAdapterTest() {} |
- |
- virtual void SetUp() { |
- adapter_.reset(new TransportFeedbackAdapter(&clock_)); |
- |
- bitrate_estimator_ = new MockRemoteBitrateEstimator(); |
- adapter_->SetBitrateEstimator(bitrate_estimator_); |
- } |
- |
- virtual void TearDown() { |
- adapter_.reset(); |
- } |
- |
- protected: |
- // Proxy class used since TransportFeedbackAdapter will own the instance |
- // passed at construction. |
- class MockBitrateControllerAdapter : public MockBitrateController { |
- public: |
- explicit MockBitrateControllerAdapter(TransportFeedbackAdapterTest* owner) |
- : MockBitrateController(), owner_(owner) {} |
- |
- ~MockBitrateControllerAdapter() override {} |
- |
- void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs, |
- uint32_t bitrate_bps) override { |
- owner_->receiver_estimated_bitrate_ = bitrate_bps; |
- } |
- |
- TransportFeedbackAdapterTest* const owner_; |
- }; |
- |
- void OnReceivedEstimatedBitrate(uint32_t bitrate) {} |
- |
- void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks, |
- int64_t rtt, |
- int64_t now_ms) {} |
- |
- void ComparePacketVectors(const std::vector<PacketInfo>& truth, |
- const std::vector<PacketInfo>& input) { |
- ASSERT_EQ(truth.size(), input.size()); |
- size_t len = truth.size(); |
- // truth contains the input data for the test, and input is what will be |
- // sent to the bandwidth estimator. truth.arrival_tims_ms is used to |
- // populate the transport feedback messages. As these times may be changed |
- // (because of resolution limits in the packets, and because of the time |
- // base adjustment performed by the TransportFeedbackAdapter at the first |
- // packet, the truth[x].arrival_time and input[x].arrival_time may not be |
- // equal. However, the difference must be the same for all x. |
- int64_t arrival_time_delta = |
- truth[0].arrival_time_ms - input[0].arrival_time_ms; |
- for (size_t i = 0; i < len; ++i) { |
- EXPECT_EQ(truth[i].arrival_time_ms, |
- input[i].arrival_time_ms + arrival_time_delta); |
- EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); |
- EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); |
- EXPECT_EQ(truth[i].payload_size, input[i].payload_size); |
- EXPECT_EQ(truth[i].probe_cluster_id, input[i].probe_cluster_id); |
- } |
- } |
- |
- // Utility method, to reset arrival_time_ms before adding send time. |
- void OnSentPacket(PacketInfo info) { |
- info.arrival_time_ms = 0; |
- adapter_->AddPacket(info.sequence_number, info.payload_size, |
- info.probe_cluster_id); |
- adapter_->OnSentPacket(info.sequence_number, info.send_time_ms); |
- } |
- |
- SimulatedClock clock_; |
- MockRemoteBitrateEstimator* bitrate_estimator_; |
- MockBitrateControllerAdapter bitrate_controller_; |
- std::unique_ptr<TransportFeedbackAdapter> adapter_; |
- |
- uint32_t receiver_estimated_bitrate_; |
-}; |
- |
-TEST_F(TransportFeedbackAdapterTest, AdaptsFeedbackAndPopulatesSendTimes) { |
- std::vector<PacketInfo> packets; |
- packets.push_back(PacketInfo(100, 200, 0, 1500, 0)); |
- packets.push_back(PacketInfo(110, 210, 1, 1500, 0)); |
- packets.push_back(PacketInfo(120, 220, 2, 1500, 0)); |
- packets.push_back(PacketInfo(130, 230, 3, 1500, 1)); |
- packets.push_back(PacketInfo(140, 240, 4, 1500, 1)); |
- |
- for (const PacketInfo& packet : packets) |
- OnSentPacket(packet); |
- |
- rtcp::TransportFeedback feedback; |
- feedback.SetBase(packets[0].sequence_number, |
- packets[0].arrival_time_ms * 1000); |
- |
- for (const PacketInfo& packet : packets) { |
- EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
- packet.arrival_time_ms * 1000)); |
- } |
- |
- feedback.Build(); |
- |
- EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
- .Times(1) |
- .WillOnce(Invoke( |
- [packets, this](const std::vector<PacketInfo>& feedback_vector) { |
- ComparePacketVectors(packets, feedback_vector); |
- })); |
- adapter_->OnTransportFeedback(feedback); |
-} |
- |
-TEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) { |
- std::vector<PacketInfo> packets; |
- packets.push_back(PacketInfo(100, 200, 0, 1500, 1)); |
- packets.push_back(PacketInfo(110, 210, 1, 1500, 2)); |
- packets.push_back(PacketInfo(120, 220, 2, 1500, 3)); |
- packets.push_back(PacketInfo(130, 230, 3, 1500, 4)); |
- packets.push_back(PacketInfo(140, 240, 4, 1500, 5)); |
- |
- const uint16_t kSendSideDropBefore = 1; |
- const uint16_t kReceiveSideDropAfter = 3; |
- |
- for (const PacketInfo& packet : packets) { |
- if (packet.sequence_number >= kSendSideDropBefore) |
- OnSentPacket(packet); |
- } |
- |
- rtcp::TransportFeedback feedback; |
- feedback.SetBase(packets[0].sequence_number, |
- packets[0].arrival_time_ms * 1000); |
- |
- for (const PacketInfo& packet : packets) { |
- if (packet.sequence_number <= kReceiveSideDropAfter) { |
- EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
- packet.arrival_time_ms * 1000)); |
- } |
- } |
- |
- feedback.Build(); |
- |
- std::vector<PacketInfo> expected_packets( |
- packets.begin() + kSendSideDropBefore, |
- packets.begin() + kReceiveSideDropAfter + 1); |
- |
- EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
- .Times(1) |
- .WillOnce(Invoke([expected_packets, |
- this](const std::vector<PacketInfo>& feedback_vector) { |
- ComparePacketVectors(expected_packets, feedback_vector); |
- })); |
- adapter_->OnTransportFeedback(feedback); |
-} |
- |
-TEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) { |
- int64_t kHighArrivalTimeMs = rtcp::TransportFeedback::kDeltaScaleFactor * |
- static_cast<int64_t>(1 << 8) * |
- static_cast<int64_t>((1 << 23) - 1) / 1000; |
- std::vector<PacketInfo> packets; |
- packets.push_back(PacketInfo(kHighArrivalTimeMs - 64, 200, 0, 1500, |
- PacketInfo::kNotAProbe)); |
- packets.push_back(PacketInfo(kHighArrivalTimeMs + 64, 210, 1, 1500, |
- PacketInfo::kNotAProbe)); |
- packets.push_back( |
- PacketInfo(kHighArrivalTimeMs, 220, 2, 1500, PacketInfo::kNotAProbe)); |
- |
- for (const PacketInfo& packet : packets) |
- OnSentPacket(packet); |
- |
- for (size_t i = 0; i < packets.size(); ++i) { |
- std::unique_ptr<rtcp::TransportFeedback> feedback( |
- new rtcp::TransportFeedback()); |
- feedback->SetBase(packets[i].sequence_number, |
- packets[i].arrival_time_ms * 1000); |
- |
- EXPECT_TRUE(feedback->AddReceivedPacket(packets[i].sequence_number, |
- packets[i].arrival_time_ms * 1000)); |
- |
- rtc::Buffer raw_packet = feedback->Build(); |
- feedback = rtcp::TransportFeedback::ParseFrom(raw_packet.data(), |
- raw_packet.size()); |
- |
- std::vector<PacketInfo> expected_packets; |
- expected_packets.push_back(packets[i]); |
- |
- EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
- .Times(1) |
- .WillOnce(Invoke([expected_packets, this]( |
- const std::vector<PacketInfo>& feedback_vector) { |
- ComparePacketVectors(expected_packets, feedback_vector); |
- })); |
- adapter_->OnTransportFeedback(*feedback.get()); |
- } |
-} |
- |
-TEST_F(TransportFeedbackAdapterTest, HandlesReordering) { |
- std::vector<PacketInfo> packets; |
- packets.push_back(PacketInfo(120, 200, 0, 1500, 0)); |
- packets.push_back(PacketInfo(110, 210, 1, 1500, 0)); |
- packets.push_back(PacketInfo(100, 220, 2, 1500, 0)); |
- std::vector<PacketInfo> expected_packets; |
- expected_packets.push_back(packets[2]); |
- expected_packets.push_back(packets[1]); |
- expected_packets.push_back(packets[0]); |
- |
- for (const PacketInfo& packet : packets) |
- OnSentPacket(packet); |
- |
- rtcp::TransportFeedback feedback; |
- feedback.SetBase(packets[0].sequence_number, |
- packets[0].arrival_time_ms * 1000); |
- |
- for (const PacketInfo& packet : packets) { |
- EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
- packet.arrival_time_ms * 1000)); |
- } |
- |
- feedback.Build(); |
- |
- EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
- .Times(1) |
- .WillOnce(Invoke([expected_packets, |
- this](const std::vector<PacketInfo>& feedback_vector) { |
- ComparePacketVectors(expected_packets, feedback_vector); |
- })); |
- adapter_->OnTransportFeedback(feedback); |
-} |
- |
-TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { |
- std::vector<PacketInfo> sent_packets; |
- const int64_t kSmallDeltaUs = |
- rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); |
- const int64_t kLargePositiveDeltaUs = |
- rtcp::TransportFeedback::kDeltaScaleFactor * |
- std::numeric_limits<int16_t>::max(); |
- const int64_t kLargeNegativeDeltaUs = |
- rtcp::TransportFeedback::kDeltaScaleFactor * |
- std::numeric_limits<int16_t>::min(); |
- |
- PacketInfo info(100, 200, 0, 1500, true, PacketInfo::kNotAProbe); |
- sent_packets.push_back(info); |
- |
- info.send_time_ms += kSmallDeltaUs / 1000; |
- info.arrival_time_ms += kSmallDeltaUs / 1000; |
- ++info.sequence_number; |
- sent_packets.push_back(info); |
- |
- info.send_time_ms += kLargePositiveDeltaUs / 1000; |
- info.arrival_time_ms += kLargePositiveDeltaUs / 1000; |
- ++info.sequence_number; |
- sent_packets.push_back(info); |
- |
- info.send_time_ms += kLargeNegativeDeltaUs / 1000; |
- info.arrival_time_ms += kLargeNegativeDeltaUs / 1000; |
- ++info.sequence_number; |
- sent_packets.push_back(info); |
- |
- // Too large, delta - will need two feedback messages. |
- info.send_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; |
- info.arrival_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; |
- ++info.sequence_number; |
- |
- // Expected to be ordered on arrival time when the feedback message has been |
- // parsed. |
- std::vector<PacketInfo> expected_packets; |
- expected_packets.push_back(sent_packets[0]); |
- expected_packets.push_back(sent_packets[3]); |
- expected_packets.push_back(sent_packets[1]); |
- expected_packets.push_back(sent_packets[2]); |
- |
- // Packets will be added to send history. |
- for (const PacketInfo& packet : sent_packets) |
- OnSentPacket(packet); |
- OnSentPacket(info); |
- |
- // Create expected feedback and send into adapter. |
- std::unique_ptr<rtcp::TransportFeedback> feedback( |
- new rtcp::TransportFeedback()); |
- feedback->SetBase(sent_packets[0].sequence_number, |
- sent_packets[0].arrival_time_ms * 1000); |
- |
- for (const PacketInfo& packet : sent_packets) { |
- EXPECT_TRUE(feedback->AddReceivedPacket(packet.sequence_number, |
- packet.arrival_time_ms * 1000)); |
- } |
- EXPECT_FALSE(feedback->AddReceivedPacket(info.sequence_number, |
- info.arrival_time_ms * 1000)); |
- |
- rtc::Buffer raw_packet = feedback->Build(); |
- feedback = |
- rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); |
- |
- std::vector<PacketInfo> received_feedback; |
- |
- EXPECT_TRUE(feedback.get() != nullptr); |
- EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
- .Times(1) |
- .WillOnce(Invoke([expected_packets, &received_feedback]( |
- const std::vector<PacketInfo>& feedback_vector) { |
- EXPECT_EQ(expected_packets.size(), feedback_vector.size()); |
- received_feedback = feedback_vector; |
- })); |
- adapter_->OnTransportFeedback(*feedback.get()); |
- |
- // Create a new feedback message and add the trailing item. |
- feedback.reset(new rtcp::TransportFeedback()); |
- feedback->SetBase(info.sequence_number, info.arrival_time_ms * 1000); |
- EXPECT_TRUE(feedback->AddReceivedPacket(info.sequence_number, |
- info.arrival_time_ms * 1000)); |
- raw_packet = feedback->Build(); |
- feedback = |
- rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); |
- |
- EXPECT_TRUE(feedback.get() != nullptr); |
- EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
- .Times(1) |
- .WillOnce(Invoke( |
- [&received_feedback](const std::vector<PacketInfo>& feedback_vector) { |
- EXPECT_EQ(1u, feedback_vector.size()); |
- received_feedback.push_back(feedback_vector[0]); |
- })); |
- adapter_->OnTransportFeedback(*feedback.get()); |
- |
- expected_packets.push_back(info); |
- |
- ComparePacketVectors(expected_packets, received_feedback); |
-} |
- |
-} // namespace test |
-} // namespace webrtc |