bye_unittest.cc (4440B)
1 /* 2 * Copyright (c) 2015 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/bye.h" 12 13 #include <cstddef> 14 #include <cstdint> 15 #include <string> 16 #include <vector> 17 18 #include "rtc_base/buffer.h" 19 #include "test/gmock.h" 20 #include "test/gtest.h" 21 #include "test/rtcp_packet_parser.h" 22 23 using ::testing::ElementsAre; 24 using webrtc::rtcp::Bye; 25 26 namespace webrtc { 27 namespace { 28 constexpr uint32_t kSenderSsrc = 0x12345678; 29 constexpr uint32_t kCsrc1 = 0x22232425; 30 constexpr uint32_t kCsrc2 = 0x33343536; 31 } // namespace 32 33 TEST(RtcpPacketByeTest, CreateAndParseWithoutReason) { 34 Bye bye; 35 bye.SetSenderSsrc(kSenderSsrc); 36 37 Buffer raw = bye.Build(); 38 Bye parsed_bye; 39 EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye)); 40 41 EXPECT_EQ(kSenderSsrc, parsed_bye.sender_ssrc()); 42 EXPECT_TRUE(parsed_bye.csrcs().empty()); 43 EXPECT_TRUE(parsed_bye.reason().empty()); 44 } 45 46 TEST(RtcpPacketByeTest, CreateAndParseWithCsrcs) { 47 Bye bye; 48 bye.SetSenderSsrc(kSenderSsrc); 49 EXPECT_TRUE(bye.SetCsrcs({kCsrc1, kCsrc2})); 50 EXPECT_TRUE(bye.reason().empty()); 51 52 Buffer raw = bye.Build(); 53 Bye parsed_bye; 54 EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye)); 55 56 EXPECT_EQ(kSenderSsrc, parsed_bye.sender_ssrc()); 57 EXPECT_THAT(parsed_bye.csrcs(), ElementsAre(kCsrc1, kCsrc2)); 58 EXPECT_TRUE(parsed_bye.reason().empty()); 59 } 60 61 TEST(RtcpPacketByeTest, CreateAndParseWithCsrcsAndAReason) { 62 Bye bye; 63 const std::string kReason = "Some Reason"; 64 65 bye.SetSenderSsrc(kSenderSsrc); 66 EXPECT_TRUE(bye.SetCsrcs({kCsrc1, kCsrc2})); 67 bye.SetReason(kReason); 68 69 Buffer raw = bye.Build(); 70 Bye parsed_bye; 71 EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye)); 72 73 EXPECT_EQ(kSenderSsrc, parsed_bye.sender_ssrc()); 74 EXPECT_THAT(parsed_bye.csrcs(), ElementsAre(kCsrc1, kCsrc2)); 75 EXPECT_EQ(kReason, parsed_bye.reason()); 76 } 77 78 TEST(RtcpPacketByeTest, CreateWithTooManyCsrcs) { 79 Bye bye; 80 bye.SetSenderSsrc(kSenderSsrc); 81 const int kMaxCsrcs = (1 << 5) - 2; // 5 bit len, first item is sender SSRC. 82 EXPECT_TRUE(bye.SetCsrcs(std::vector<uint32_t>(kMaxCsrcs, kCsrc1))); 83 EXPECT_FALSE(bye.SetCsrcs(std::vector<uint32_t>(kMaxCsrcs + 1, kCsrc1))); 84 } 85 86 TEST(RtcpPacketByeTest, CreateAndParseWithAReason) { 87 Bye bye; 88 const std::string kReason = "Some Random Reason"; 89 90 bye.SetSenderSsrc(kSenderSsrc); 91 bye.SetReason(kReason); 92 93 Buffer raw = bye.Build(); 94 Bye parsed_bye; 95 EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye)); 96 97 EXPECT_EQ(kSenderSsrc, parsed_bye.sender_ssrc()); 98 EXPECT_TRUE(parsed_bye.csrcs().empty()); 99 EXPECT_EQ(kReason, parsed_bye.reason()); 100 } 101 102 TEST(RtcpPacketByeTest, CreateAndParseWithReasons) { 103 // Test that packet creation/parsing behave with reasons of different length 104 // both when it require padding and when it does not. 105 for (size_t reminder = 0; reminder < 4; ++reminder) { 106 const std::string kReason(4 + reminder, 'a' + reminder); 107 Bye bye; 108 bye.SetSenderSsrc(kSenderSsrc); 109 bye.SetReason(kReason); 110 111 Buffer raw = bye.Build(); 112 Bye parsed_bye; 113 EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye)); 114 115 EXPECT_EQ(kReason, parsed_bye.reason()); 116 } 117 } 118 119 TEST(RtcpPacketByeTest, ParseEmptyPacket) { 120 uint8_t kEmptyPacket[] = {0x80, Bye::kPacketType, 0, 0}; 121 Bye parsed_bye; 122 EXPECT_TRUE(test::ParseSinglePacket(kEmptyPacket, &parsed_bye)); 123 EXPECT_EQ(0u, parsed_bye.sender_ssrc()); 124 EXPECT_TRUE(parsed_bye.csrcs().empty()); 125 EXPECT_TRUE(parsed_bye.reason().empty()); 126 } 127 128 TEST(RtcpPacketByeTest, ParseFailOnInvalidSrcCount) { 129 Bye bye; 130 bye.SetSenderSsrc(kSenderSsrc); 131 132 Buffer raw = bye.Build(); 133 raw[0]++; // Damage the packet: increase ssrc count by one. 134 135 Bye parsed_bye; 136 EXPECT_FALSE(test::ParseSinglePacket(raw, &parsed_bye)); 137 } 138 139 TEST(RtcpPacketByeTest, ParseFailOnInvalidReasonLength) { 140 Bye bye; 141 bye.SetSenderSsrc(kSenderSsrc); 142 bye.SetReason("18 characters long"); 143 144 Buffer raw = bye.Build(); 145 // Damage the packet: decrease payload size by 4 bytes 146 raw[3]--; 147 raw.SetSize(raw.size() - 4); 148 149 Bye parsed_bye; 150 EXPECT_FALSE(test::ParseSinglePacket(raw, &parsed_bye)); 151 } 152 153 } // namespace webrtc