1 /*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10 #include "modules/congestion_controller/rtp/transport_feedback_demuxer.h"
11
12 #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
13 #include "test/gmock.h"
14 #include "test/gtest.h"
15
16 namespace webrtc {
17 namespace {
18
19 using ::testing::AllOf;
20 using ::testing::ElementsAre;
21 using ::testing::Field;
22 using PacketInfo = StreamFeedbackObserver::StreamPacketInfo;
23
24 static constexpr uint32_t kSsrc = 8492;
25
26 class MockStreamFeedbackObserver : public webrtc::StreamFeedbackObserver {
27 public:
28 MOCK_METHOD(void,
29 OnPacketFeedbackVector,
30 (std::vector<StreamPacketInfo> packet_feedback_vector),
31 (override));
32 };
33
CreatePacket(uint32_t ssrc,uint16_t rtp_sequence_number,int64_t transport_sequence_number,bool is_retransmission)34 RtpPacketSendInfo CreatePacket(uint32_t ssrc,
35 uint16_t rtp_sequence_number,
36 int64_t transport_sequence_number,
37 bool is_retransmission) {
38 RtpPacketSendInfo res;
39 res.media_ssrc = ssrc;
40 res.transport_sequence_number = transport_sequence_number;
41 res.rtp_sequence_number = rtp_sequence_number;
42 res.packet_type = is_retransmission ? RtpPacketMediaType::kRetransmission
43 : RtpPacketMediaType::kVideo;
44 return res;
45 }
46 } // namespace
47
TEST(TransportFeedbackDemuxerTest,ObserverSanity)48 TEST(TransportFeedbackDemuxerTest, ObserverSanity) {
49 TransportFeedbackDemuxer demuxer;
50 MockStreamFeedbackObserver mock;
51 demuxer.RegisterStreamFeedbackObserver({kSsrc}, &mock);
52
53 const uint16_t kRtpStartSeq = 55;
54 const int64_t kTransportStartSeq = 1;
55 demuxer.AddPacket(CreatePacket(kSsrc, kRtpStartSeq, kTransportStartSeq,
56 /*is_retransmit=*/false));
57 demuxer.AddPacket(CreatePacket(kSsrc, kRtpStartSeq + 1,
58 kTransportStartSeq + 1,
59 /*is_retransmit=*/false));
60 demuxer.AddPacket(CreatePacket(
61 kSsrc, kRtpStartSeq + 2, kTransportStartSeq + 2, /*is_retransmit=*/true));
62
63 rtcp::TransportFeedback feedback;
64 feedback.SetBase(kTransportStartSeq, Timestamp::Millis(1));
65 ASSERT_TRUE(
66 feedback.AddReceivedPacket(kTransportStartSeq, Timestamp::Millis(1)));
67 // Drop middle packet.
68 ASSERT_TRUE(
69 feedback.AddReceivedPacket(kTransportStartSeq + 2, Timestamp::Millis(3)));
70
71 EXPECT_CALL(
72 mock, OnPacketFeedbackVector(ElementsAre(
73 AllOf(Field(&PacketInfo::received, true),
74 Field(&PacketInfo::ssrc, kSsrc),
75 Field(&PacketInfo::rtp_sequence_number, kRtpStartSeq),
76 Field(&PacketInfo::is_retransmission, false)),
77 AllOf(Field(&PacketInfo::received, false),
78 Field(&PacketInfo::ssrc, kSsrc),
79 Field(&PacketInfo::rtp_sequence_number, kRtpStartSeq + 1),
80 Field(&PacketInfo::is_retransmission, false)),
81 AllOf(Field(&PacketInfo::received, true),
82 Field(&PacketInfo::ssrc, kSsrc),
83 Field(&PacketInfo::rtp_sequence_number, kRtpStartSeq + 2),
84 Field(&PacketInfo::is_retransmission, true)))));
85 demuxer.OnTransportFeedback(feedback);
86
87 demuxer.DeRegisterStreamFeedbackObserver(&mock);
88
89 demuxer.AddPacket(
90 CreatePacket(kSsrc, kRtpStartSeq + 3, kTransportStartSeq + 3, false));
91 rtcp::TransportFeedback second_feedback;
92 second_feedback.SetBase(kTransportStartSeq + 3, Timestamp::Millis(4));
93 ASSERT_TRUE(second_feedback.AddReceivedPacket(kTransportStartSeq + 3,
94 Timestamp::Millis(4)));
95
96 EXPECT_CALL(mock, OnPacketFeedbackVector).Times(0);
97 demuxer.OnTransportFeedback(second_feedback);
98 }
99 } // namespace webrtc
100