xref: /aosp_15_r20/external/webrtc/pc/sctp_utils_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2013 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "pc/sctp_utils.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
16*d9f75844SAndroid Build Coastguard Worker #include "api/priority.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/byte_buffer.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/copy_on_write_buffer.h"
19*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker class SctpUtilsTest : public ::testing::Test {
22*d9f75844SAndroid Build Coastguard Worker  public:
VerifyOpenMessageFormat(const rtc::CopyOnWriteBuffer & packet,const std::string & label,const webrtc::DataChannelInit & config)23*d9f75844SAndroid Build Coastguard Worker   void VerifyOpenMessageFormat(const rtc::CopyOnWriteBuffer& packet,
24*d9f75844SAndroid Build Coastguard Worker                                const std::string& label,
25*d9f75844SAndroid Build Coastguard Worker                                const webrtc::DataChannelInit& config) {
26*d9f75844SAndroid Build Coastguard Worker     uint8_t message_type;
27*d9f75844SAndroid Build Coastguard Worker     uint8_t channel_type;
28*d9f75844SAndroid Build Coastguard Worker     uint32_t reliability;
29*d9f75844SAndroid Build Coastguard Worker     uint16_t priority;
30*d9f75844SAndroid Build Coastguard Worker     uint16_t label_length;
31*d9f75844SAndroid Build Coastguard Worker     uint16_t protocol_length;
32*d9f75844SAndroid Build Coastguard Worker 
33*d9f75844SAndroid Build Coastguard Worker     rtc::ByteBufferReader buffer(packet.data<char>(), packet.size());
34*d9f75844SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.ReadUInt8(&message_type));
35*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(0x03, message_type);
36*d9f75844SAndroid Build Coastguard Worker 
37*d9f75844SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.ReadUInt8(&channel_type));
38*d9f75844SAndroid Build Coastguard Worker     if (config.ordered) {
39*d9f75844SAndroid Build Coastguard Worker       EXPECT_EQ(
40*d9f75844SAndroid Build Coastguard Worker           config.maxRetransmits ? 0x01 : (config.maxRetransmitTime ? 0x02 : 0),
41*d9f75844SAndroid Build Coastguard Worker           channel_type);
42*d9f75844SAndroid Build Coastguard Worker     } else {
43*d9f75844SAndroid Build Coastguard Worker       EXPECT_EQ(config.maxRetransmits
44*d9f75844SAndroid Build Coastguard Worker                     ? 0x81
45*d9f75844SAndroid Build Coastguard Worker                     : (config.maxRetransmitTime ? 0x82 : 0x80),
46*d9f75844SAndroid Build Coastguard Worker                 channel_type);
47*d9f75844SAndroid Build Coastguard Worker     }
48*d9f75844SAndroid Build Coastguard Worker 
49*d9f75844SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.ReadUInt16(&priority));
50*d9f75844SAndroid Build Coastguard Worker     if (config.priority) {
51*d9f75844SAndroid Build Coastguard Worker       // Exact values are checked by round-trip conversion, but
52*d9f75844SAndroid Build Coastguard Worker       // all values defined are greater than zero.
53*d9f75844SAndroid Build Coastguard Worker       EXPECT_GT(priority, 0);
54*d9f75844SAndroid Build Coastguard Worker     } else {
55*d9f75844SAndroid Build Coastguard Worker       EXPECT_EQ(priority, 0);
56*d9f75844SAndroid Build Coastguard Worker     }
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.ReadUInt32(&reliability));
59*d9f75844SAndroid Build Coastguard Worker     if (config.maxRetransmits || config.maxRetransmitTime) {
60*d9f75844SAndroid Build Coastguard Worker       EXPECT_EQ(config.maxRetransmits ? *config.maxRetransmits
61*d9f75844SAndroid Build Coastguard Worker                                       : *config.maxRetransmitTime,
62*d9f75844SAndroid Build Coastguard Worker                 static_cast<int>(reliability));
63*d9f75844SAndroid Build Coastguard Worker     }
64*d9f75844SAndroid Build Coastguard Worker 
65*d9f75844SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.ReadUInt16(&label_length));
66*d9f75844SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.ReadUInt16(&protocol_length));
67*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(label.size(), label_length);
68*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(config.protocol.size(), protocol_length);
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker     std::string label_output;
71*d9f75844SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.ReadString(&label_output, label_length));
72*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(label, label_output);
73*d9f75844SAndroid Build Coastguard Worker     std::string protocol_output;
74*d9f75844SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.ReadString(&protocol_output, protocol_length));
75*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(config.protocol, protocol_output);
76*d9f75844SAndroid Build Coastguard Worker   }
77*d9f75844SAndroid Build Coastguard Worker };
78*d9f75844SAndroid Build Coastguard Worker 
TEST_F(SctpUtilsTest,WriteParseOpenMessageWithOrderedReliable)79*d9f75844SAndroid Build Coastguard Worker TEST_F(SctpUtilsTest, WriteParseOpenMessageWithOrderedReliable) {
80*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelInit config;
81*d9f75844SAndroid Build Coastguard Worker   std::string label = "abc";
82*d9f75844SAndroid Build Coastguard Worker   config.protocol = "y";
83*d9f75844SAndroid Build Coastguard Worker 
84*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer packet;
85*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker   VerifyOpenMessageFormat(packet, label, config);
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker   std::string output_label;
90*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelInit output_config;
91*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(packet, &output_label,
92*d9f75844SAndroid Build Coastguard Worker                                                   &output_config));
93*d9f75844SAndroid Build Coastguard Worker 
94*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(label, output_label);
95*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.protocol, output_config.protocol);
96*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.ordered, output_config.ordered);
97*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.maxRetransmitTime, output_config.maxRetransmitTime);
98*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.maxRetransmits, output_config.maxRetransmits);
99*d9f75844SAndroid Build Coastguard Worker }
100*d9f75844SAndroid Build Coastguard Worker 
TEST_F(SctpUtilsTest,WriteParseOpenMessageWithMaxRetransmitTime)101*d9f75844SAndroid Build Coastguard Worker TEST_F(SctpUtilsTest, WriteParseOpenMessageWithMaxRetransmitTime) {
102*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelInit config;
103*d9f75844SAndroid Build Coastguard Worker   std::string label = "abc";
104*d9f75844SAndroid Build Coastguard Worker   config.ordered = false;
105*d9f75844SAndroid Build Coastguard Worker   config.maxRetransmitTime = 10;
106*d9f75844SAndroid Build Coastguard Worker   config.protocol = "y";
107*d9f75844SAndroid Build Coastguard Worker 
108*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer packet;
109*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
110*d9f75844SAndroid Build Coastguard Worker 
111*d9f75844SAndroid Build Coastguard Worker   VerifyOpenMessageFormat(packet, label, config);
112*d9f75844SAndroid Build Coastguard Worker 
113*d9f75844SAndroid Build Coastguard Worker   std::string output_label;
114*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelInit output_config;
115*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(packet, &output_label,
116*d9f75844SAndroid Build Coastguard Worker                                                   &output_config));
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(label, output_label);
119*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.protocol, output_config.protocol);
120*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.ordered, output_config.ordered);
121*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(*config.maxRetransmitTime, *output_config.maxRetransmitTime);
122*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(output_config.maxRetransmits);
123*d9f75844SAndroid Build Coastguard Worker }
124*d9f75844SAndroid Build Coastguard Worker 
TEST_F(SctpUtilsTest,WriteParseOpenMessageWithMaxRetransmits)125*d9f75844SAndroid Build Coastguard Worker TEST_F(SctpUtilsTest, WriteParseOpenMessageWithMaxRetransmits) {
126*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelInit config;
127*d9f75844SAndroid Build Coastguard Worker   std::string label = "abc";
128*d9f75844SAndroid Build Coastguard Worker   config.maxRetransmits = 10;
129*d9f75844SAndroid Build Coastguard Worker   config.protocol = "y";
130*d9f75844SAndroid Build Coastguard Worker 
131*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer packet;
132*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
133*d9f75844SAndroid Build Coastguard Worker 
134*d9f75844SAndroid Build Coastguard Worker   VerifyOpenMessageFormat(packet, label, config);
135*d9f75844SAndroid Build Coastguard Worker 
136*d9f75844SAndroid Build Coastguard Worker   std::string output_label;
137*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelInit output_config;
138*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(packet, &output_label,
139*d9f75844SAndroid Build Coastguard Worker                                                   &output_config));
140*d9f75844SAndroid Build Coastguard Worker 
141*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(label, output_label);
142*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.protocol, output_config.protocol);
143*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.ordered, output_config.ordered);
144*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(config.maxRetransmits, output_config.maxRetransmits);
145*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(output_config.maxRetransmitTime);
146*d9f75844SAndroid Build Coastguard Worker }
147*d9f75844SAndroid Build Coastguard Worker 
TEST_F(SctpUtilsTest,WriteParseOpenMessageWithPriority)148*d9f75844SAndroid Build Coastguard Worker TEST_F(SctpUtilsTest, WriteParseOpenMessageWithPriority) {
149*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelInit config;
150*d9f75844SAndroid Build Coastguard Worker   std::string label = "abc";
151*d9f75844SAndroid Build Coastguard Worker   config.protocol = "y";
152*d9f75844SAndroid Build Coastguard Worker   config.priority = webrtc::Priority::kVeryLow;
153*d9f75844SAndroid Build Coastguard Worker 
154*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer packet;
155*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
156*d9f75844SAndroid Build Coastguard Worker 
157*d9f75844SAndroid Build Coastguard Worker   VerifyOpenMessageFormat(packet, label, config);
158*d9f75844SAndroid Build Coastguard Worker 
159*d9f75844SAndroid Build Coastguard Worker   std::string output_label;
160*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelInit output_config;
161*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(packet, &output_label,
162*d9f75844SAndroid Build Coastguard Worker                                                   &output_config));
163*d9f75844SAndroid Build Coastguard Worker 
164*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(label, output_label);
165*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(output_config.priority);
166*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(*config.priority, *output_config.priority);
167*d9f75844SAndroid Build Coastguard Worker }
168*d9f75844SAndroid Build Coastguard Worker 
TEST_F(SctpUtilsTest,WriteParseAckMessage)169*d9f75844SAndroid Build Coastguard Worker TEST_F(SctpUtilsTest, WriteParseAckMessage) {
170*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer packet;
171*d9f75844SAndroid Build Coastguard Worker   webrtc::WriteDataChannelOpenAckMessage(&packet);
172*d9f75844SAndroid Build Coastguard Worker 
173*d9f75844SAndroid Build Coastguard Worker   uint8_t message_type;
174*d9f75844SAndroid Build Coastguard Worker   rtc::ByteBufferReader buffer(packet.data<char>(), packet.size());
175*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(buffer.ReadUInt8(&message_type));
176*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0x02, message_type);
177*d9f75844SAndroid Build Coastguard Worker 
178*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(webrtc::ParseDataChannelOpenAckMessage(packet));
179*d9f75844SAndroid Build Coastguard Worker }
180*d9f75844SAndroid Build Coastguard Worker 
TEST_F(SctpUtilsTest,TestIsOpenMessage)181*d9f75844SAndroid Build Coastguard Worker TEST_F(SctpUtilsTest, TestIsOpenMessage) {
182*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer open(1);
183*d9f75844SAndroid Build Coastguard Worker   open.MutableData()[0] = 0x03;
184*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(webrtc::IsOpenMessage(open));
185*d9f75844SAndroid Build Coastguard Worker 
186*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer openAck(1);
187*d9f75844SAndroid Build Coastguard Worker   openAck.MutableData()[0] = 0x02;
188*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(webrtc::IsOpenMessage(openAck));
189*d9f75844SAndroid Build Coastguard Worker 
190*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer invalid(1);
191*d9f75844SAndroid Build Coastguard Worker   invalid.MutableData()[0] = 0x01;
192*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(webrtc::IsOpenMessage(invalid));
193*d9f75844SAndroid Build Coastguard Worker 
194*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer empty;
195*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(webrtc::IsOpenMessage(empty));
196*d9f75844SAndroid Build Coastguard Worker }
197