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