• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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