1 /*
2 * Copyright (c) 2016 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
11 #include "modules/rtp_rtcp/source/rtcp_packet/remb.h"
12
13 #include "test/gmock.h"
14 #include "test/gtest.h"
15 #include "test/rtcp_packet_parser.h"
16
17 using ::testing::ElementsAreArray;
18 using ::testing::IsEmpty;
19 using ::testing::make_tuple;
20 using webrtc::rtcp::Remb;
21
22 namespace webrtc {
23 namespace {
24 const uint32_t kSenderSsrc = 0x12345678;
25 const uint32_t kRemoteSsrcs[] = {0x23456789, 0x2345678a, 0x2345678b};
26 const uint32_t kBitrateBps = 0x3fb93 * 2; // 522022;
27 const int64_t kBitrateBps64bit = int64_t{0x3fb93} << 30;
28 const uint8_t kPacket[] = {0x8f, 206, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
29 0x00, 0x00, 0x00, 0x00, 'R', 'E', 'M', 'B',
30 0x03, 0x07, 0xfb, 0x93, 0x23, 0x45, 0x67, 0x89,
31 0x23, 0x45, 0x67, 0x8a, 0x23, 0x45, 0x67, 0x8b};
32 const size_t kPacketLength = sizeof(kPacket);
33 } // namespace
34
TEST(RtcpPacketRembTest,Create)35 TEST(RtcpPacketRembTest, Create) {
36 Remb remb;
37 remb.SetSenderSsrc(kSenderSsrc);
38 remb.SetSsrcs(
39 std::vector<uint32_t>(std::begin(kRemoteSsrcs), std::end(kRemoteSsrcs)));
40 remb.SetBitrateBps(kBitrateBps);
41
42 rtc::Buffer packet = remb.Build();
43
44 EXPECT_THAT(make_tuple(packet.data(), packet.size()),
45 ElementsAreArray(kPacket));
46 }
47
TEST(RtcpPacketRembTest,Parse)48 TEST(RtcpPacketRembTest, Parse) {
49 Remb remb;
50 EXPECT_TRUE(test::ParseSinglePacket(kPacket, &remb));
51 const Remb& parsed = remb;
52
53 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
54 EXPECT_EQ(kBitrateBps, parsed.bitrate_bps());
55 EXPECT_THAT(parsed.ssrcs(), ElementsAreArray(kRemoteSsrcs));
56 }
57
TEST(RtcpPacketRembTest,CreateAndParseWithoutSsrcs)58 TEST(RtcpPacketRembTest, CreateAndParseWithoutSsrcs) {
59 Remb remb;
60 remb.SetSenderSsrc(kSenderSsrc);
61 remb.SetBitrateBps(kBitrateBps);
62 rtc::Buffer packet = remb.Build();
63
64 Remb parsed;
65 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
66 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
67 EXPECT_EQ(kBitrateBps, parsed.bitrate_bps());
68 EXPECT_THAT(parsed.ssrcs(), IsEmpty());
69 }
70
TEST(RtcpPacketRembTest,CreateAndParse64bitBitrate)71 TEST(RtcpPacketRembTest, CreateAndParse64bitBitrate) {
72 Remb remb;
73 remb.SetBitrateBps(kBitrateBps64bit);
74 rtc::Buffer packet = remb.Build();
75
76 Remb parsed;
77 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
78 EXPECT_EQ(kBitrateBps64bit, parsed.bitrate_bps());
79 }
80
TEST(RtcpPacketRembTest,ParseFailsOnTooSmallPacketToBeRemb)81 TEST(RtcpPacketRembTest, ParseFailsOnTooSmallPacketToBeRemb) {
82 // Make it too small.
83 constexpr size_t kTooSmallSize = (1 + 3) * 4;
84 uint8_t packet[kTooSmallSize];
85 memcpy(packet, kPacket, kTooSmallSize);
86 packet[3] = 3;
87
88 Remb remb;
89 EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
90 }
91
TEST(RtcpPacketRembTest,ParseFailsWhenUniqueIdentifierIsNotRemb)92 TEST(RtcpPacketRembTest, ParseFailsWhenUniqueIdentifierIsNotRemb) {
93 uint8_t packet[kPacketLength];
94 memcpy(packet, kPacket, kPacketLength);
95 packet[12] = 'N'; // Swap 'R' -> 'N' in the 'REMB' unique identifier.
96
97 Remb remb;
98 EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
99 }
100
TEST(RtcpPacketRembTest,ParseFailsWhenBitrateDoNotFitIn64bits)101 TEST(RtcpPacketRembTest, ParseFailsWhenBitrateDoNotFitIn64bits) {
102 uint8_t packet[kPacketLength];
103 memcpy(packet, kPacket, kPacketLength);
104 packet[17] |= 0xfc; // Set exponenta component to maximum of 63.
105 packet[19] |= 0x02; // Ensure mantissa is at least 2.
106
107 Remb remb;
108 EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
109 }
110
TEST(RtcpPacketRembTest,ParseFailsWhenSsrcCountMismatchLength)111 TEST(RtcpPacketRembTest, ParseFailsWhenSsrcCountMismatchLength) {
112 uint8_t packet[kPacketLength];
113 memcpy(packet, kPacket, kPacketLength);
114 packet[16]++; // Swap 3 -> 4 in the ssrcs count.
115
116 Remb remb;
117 EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
118 }
119
TEST(RtcpPacketRembTest,TooManySsrcs)120 TEST(RtcpPacketRembTest, TooManySsrcs) {
121 Remb remb;
122 EXPECT_FALSE(remb.SetSsrcs(
123 std::vector<uint32_t>(Remb::kMaxNumberOfSsrcs + 1, kRemoteSsrcs[0])));
124 EXPECT_TRUE(remb.SetSsrcs(
125 std::vector<uint32_t>(Remb::kMaxNumberOfSsrcs, kRemoteSsrcs[0])));
126 }
127
128 } // namespace webrtc
129