blob: 19850b365354c2cb284792c8f38748b0b8b43224 [file] [log] [blame] [edit]
/*
* Copyright (c) 2019 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 "modules/congestion_controller/rtp/transport_feedback_demuxer.h"
#include <cstdint>
#include <vector>
#include "api/transport/network_types.h"
#include "api/units/timestamp.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "test/gmock.h"
#include "test/gtest.h"
namespace webrtc {
namespace {
using ::testing::AllOf;
using ::testing::ElementsAre;
using ::testing::Field;
using PacketInfo = StreamFeedbackObserver::StreamPacketInfo;
constexpr uint32_t kSsrc = 8492;
class MockStreamFeedbackObserver : public StreamFeedbackObserver {
public:
MOCK_METHOD(void,
OnPacketFeedbackVector,
(std::vector<StreamPacketInfo> packet_feedback_vector),
(override));
};
PacketResult CreatePacket(uint32_t ssrc,
uint16_t rtp_sequence_number,
bool received,
bool is_retransmission) {
PacketResult res;
res.rtp_packet_info = {
.ssrc = ssrc,
.rtp_sequence_number = rtp_sequence_number,
.is_retransmission = is_retransmission,
};
res.receive_time =
received ? Timestamp::Seconds(123) : Timestamp::PlusInfinity();
return res;
}
} // namespace
TEST(TransportFeedbackDemuxerTest, ObserverSanity) {
TransportFeedbackDemuxer demuxer;
MockStreamFeedbackObserver mock;
demuxer.RegisterStreamFeedbackObserver({kSsrc}, &mock);
TransportPacketsFeedback feedback;
feedback.packet_feedbacks = {CreatePacket(kSsrc, /*rtp_sequence_number=*/55,
/*received=*/true,
/*is_retransmission=*/false),
CreatePacket(kSsrc, /*rtp_sequence_number=*/56,
/*received=*/false,
/*is_retransmission=*/false),
CreatePacket(kSsrc, /*rtp_sequence_number=*/57,
/*received=*/true,
/*is_retransmission=*/true)};
EXPECT_CALL(mock, OnPacketFeedbackVector(ElementsAre(
AllOf(Field(&PacketInfo::received, true),
Field(&PacketInfo::ssrc, kSsrc),
Field(&PacketInfo::rtp_sequence_number, 55),
Field(&PacketInfo::is_retransmission, false)),
AllOf(Field(&PacketInfo::received, false),
Field(&PacketInfo::ssrc, kSsrc),
Field(&PacketInfo::rtp_sequence_number, 56),
Field(&PacketInfo::is_retransmission, false)),
AllOf(Field(&PacketInfo::received, true),
Field(&PacketInfo::ssrc, kSsrc),
Field(&PacketInfo::rtp_sequence_number, 57),
Field(&PacketInfo::is_retransmission, true)))));
demuxer.OnTransportFeedback(feedback);
demuxer.DeRegisterStreamFeedbackObserver(&mock);
TransportPacketsFeedback second_feedback;
second_feedback.packet_feedbacks = {
CreatePacket(kSsrc, /*rtp_sequence_number=*/58,
/*received=*/true,
/*is_retransmission=*/false)};
EXPECT_CALL(mock, OnPacketFeedbackVector).Times(0);
demuxer.OnTransportFeedback(second_feedback);
}
} // namespace webrtc