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/tmmbn.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::TmmbItem;
21 using webrtc::rtcp::Tmmbn;
22
23 namespace webrtc {
24 namespace {
25 const uint32_t kSenderSsrc = 0x12345678;
26 const uint32_t kRemoteSsrc = 0x23456789;
27 const uint32_t kBitrateBps = 312000;
28 const uint16_t kOverhead = 0x1fe;
29 const uint8_t kPacket[] = {0x84, 205, 0x00, 0x04, 0x12, 0x34, 0x56,
30 0x78, 0x00, 0x00, 0x00, 0x00, 0x23, 0x45,
31 0x67, 0x89, 0x0a, 0x61, 0x61, 0xfe};
32 } // namespace
33
TEST(RtcpPacketTmmbnTest,Create)34 TEST(RtcpPacketTmmbnTest, Create) {
35 Tmmbn tmmbn;
36 tmmbn.SetSenderSsrc(kSenderSsrc);
37 tmmbn.AddTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead));
38
39 rtc::Buffer packet = tmmbn.Build();
40
41 EXPECT_THAT(make_tuple(packet.data(), packet.size()),
42 ElementsAreArray(kPacket));
43 }
44
TEST(RtcpPacketTmmbnTest,Parse)45 TEST(RtcpPacketTmmbnTest, Parse) {
46 Tmmbn tmmbn;
47 EXPECT_TRUE(test::ParseSinglePacket(kPacket, &tmmbn));
48
49 const Tmmbn& parsed = tmmbn;
50
51 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
52 ASSERT_EQ(1u, parsed.items().size());
53 EXPECT_EQ(kRemoteSsrc, parsed.items().front().ssrc());
54 EXPECT_EQ(kBitrateBps, parsed.items().front().bitrate_bps());
55 EXPECT_EQ(kOverhead, parsed.items().front().packet_overhead());
56 }
57
TEST(RtcpPacketTmmbnTest,CreateAndParseWithoutItems)58 TEST(RtcpPacketTmmbnTest, CreateAndParseWithoutItems) {
59 Tmmbn tmmbn;
60 tmmbn.SetSenderSsrc(kSenderSsrc);
61
62 rtc::Buffer packet = tmmbn.Build();
63 Tmmbn parsed;
64 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
65
66 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
67 EXPECT_THAT(parsed.items(), IsEmpty());
68 }
69
TEST(RtcpPacketTmmbnTest,CreateAndParseWithTwoItems)70 TEST(RtcpPacketTmmbnTest, CreateAndParseWithTwoItems) {
71 Tmmbn tmmbn;
72 tmmbn.SetSenderSsrc(kSenderSsrc);
73 tmmbn.AddTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead));
74 tmmbn.AddTmmbr(TmmbItem(kRemoteSsrc + 1, 4 * kBitrateBps, 40));
75
76 rtc::Buffer packet = tmmbn.Build();
77 Tmmbn parsed;
78 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
79
80 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
81 EXPECT_EQ(2u, parsed.items().size());
82 EXPECT_EQ(kRemoteSsrc, parsed.items()[0].ssrc());
83 EXPECT_EQ(kBitrateBps, parsed.items()[0].bitrate_bps());
84 EXPECT_EQ(kOverhead, parsed.items()[0].packet_overhead());
85 EXPECT_EQ(kRemoteSsrc + 1, parsed.items()[1].ssrc());
86 EXPECT_EQ(4 * kBitrateBps, parsed.items()[1].bitrate_bps());
87 EXPECT_EQ(40U, parsed.items()[1].packet_overhead());
88 }
89
TEST(RtcpPacketTmmbnTest,ParseFailsOnTooSmallPacket)90 TEST(RtcpPacketTmmbnTest, ParseFailsOnTooSmallPacket) {
91 const uint8_t kSmallPacket[] = {0x84, 205, 0x00, 0x01,
92 0x12, 0x34, 0x56, 0x78};
93 Tmmbn tmmbn;
94 EXPECT_FALSE(test::ParseSinglePacket(kSmallPacket, &tmmbn));
95 }
96
TEST(RtcpPacketTmmbnTest,ParseFailsOnUnAlignedPacket)97 TEST(RtcpPacketTmmbnTest, ParseFailsOnUnAlignedPacket) {
98 const uint8_t kUnalignedPacket[] = {0x84, 205, 0x00, 0x03, 0x12, 0x34,
99 0x56, 0x78, 0x00, 0x00, 0x00, 0x00,
100 0x23, 0x45, 0x67, 0x89};
101
102 Tmmbn tmmbn;
103 EXPECT_FALSE(test::ParseSinglePacket(kUnalignedPacket, &tmmbn));
104 }
105 } // namespace webrtc
106