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