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