tmmbr_unittest.cc (3150B)
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/tmmbr.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::make_tuple; 23 using webrtc::rtcp::TmmbItem; 24 using webrtc::rtcp::Tmmbr; 25 26 namespace webrtc { 27 namespace { 28 constexpr uint32_t kSenderSsrc = 0x12345678; 29 constexpr uint32_t kRemoteSsrc = 0x23456789; 30 constexpr uint32_t kBitrateBps = 312000; 31 constexpr uint16_t kOverhead = 0x1fe; 32 constexpr uint8_t kPacket[] = {0x83, 205, 0x00, 0x04, 0x12, 0x34, 0x56, 33 0x78, 0x00, 0x00, 0x00, 0x00, 0x23, 0x45, 34 0x67, 0x89, 0x0a, 0x61, 0x61, 0xfe}; 35 } // namespace 36 37 TEST(RtcpPacketTmmbrTest, Create) { 38 Tmmbr tmmbr; 39 tmmbr.SetSenderSsrc(kSenderSsrc); 40 tmmbr.AddTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead)); 41 42 Buffer packet = tmmbr.Build(); 43 44 EXPECT_THAT(make_tuple(packet.data(), packet.size()), 45 ElementsAreArray(kPacket)); 46 } 47 48 TEST(RtcpPacketTmmbrTest, Parse) { 49 Tmmbr tmmbr; 50 EXPECT_TRUE(test::ParseSinglePacket(kPacket, &tmmbr)); 51 const Tmmbr& parsed = tmmbr; 52 53 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 54 ASSERT_EQ(1u, parsed.requests().size()); 55 EXPECT_EQ(kRemoteSsrc, parsed.requests().front().ssrc()); 56 EXPECT_EQ(kBitrateBps, parsed.requests().front().bitrate_bps()); 57 EXPECT_EQ(kOverhead, parsed.requests().front().packet_overhead()); 58 } 59 60 TEST(RtcpPacketTmmbrTest, CreateAndParseWithTwoEntries) { 61 Tmmbr tmmbr; 62 tmmbr.SetSenderSsrc(kSenderSsrc); 63 tmmbr.AddTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead)); 64 tmmbr.AddTmmbr(TmmbItem(kRemoteSsrc + 1, 4 * kBitrateBps, kOverhead + 1)); 65 66 Buffer packet = tmmbr.Build(); 67 68 Tmmbr parsed; 69 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); 70 71 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 72 EXPECT_EQ(2u, parsed.requests().size()); 73 EXPECT_EQ(kRemoteSsrc, parsed.requests()[0].ssrc()); 74 EXPECT_EQ(kRemoteSsrc + 1, parsed.requests()[1].ssrc()); 75 } 76 77 TEST(RtcpPacketTmmbrTest, ParseFailsWithoutItems) { 78 const uint8_t kZeroItemsPacket[] = {0x83, 205, 0x00, 0x02, 0x12, 0x34, 79 0x56, 0x78, 0x00, 0x00, 0x00, 0x00}; 80 81 Tmmbr tmmbr; 82 EXPECT_FALSE(test::ParseSinglePacket(kZeroItemsPacket, &tmmbr)); 83 } 84 85 TEST(RtcpPacketTmmbrTest, ParseFailsOnUnAlignedPacket) { 86 const uint8_t kUnalignedPacket[] = { 87 0x83, 205, 0x00, 0x05, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00, 88 0x23, 0x45, 0x67, 0x89, 0x0a, 0x61, 0x61, 0xfe, 0x34, 0x56, 0x78, 0x9a}; 89 90 Tmmbr tmmbr; 91 EXPECT_FALSE(test::ParseSinglePacket(kUnalignedPacket, &tmmbr)); 92 } 93 } // namespace webrtc