xref: /aosp_15_r20/external/webrtc/media/base/turn_utils_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2016 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 "media/base/turn_utils.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker namespace cricket {
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker // Invalid TURN send indication messages. Messages are proper STUN
18*d9f75844SAndroid Build Coastguard Worker // messages with incorrect values in attributes.
TEST(TurnUtilsTest,InvalidTurnSendIndicationMessages)19*d9f75844SAndroid Build Coastguard Worker TEST(TurnUtilsTest, InvalidTurnSendIndicationMessages) {
20*d9f75844SAndroid Build Coastguard Worker   size_t content_pos = SIZE_MAX;
21*d9f75844SAndroid Build Coastguard Worker   size_t content_size = SIZE_MAX;
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker   // Stun Indication message with Zero length
24*d9f75844SAndroid Build Coastguard Worker   uint8_t kTurnSendIndicationMsgWithNoAttributes[] = {
25*d9f75844SAndroid Build Coastguard Worker       0x00, 0x16, 0x00, 0x00,  // Zero length
26*d9f75844SAndroid Build Coastguard Worker       0x21, 0x12, 0xA4, 0x42,  // magic cookie
27*d9f75844SAndroid Build Coastguard Worker       '0',  '1',  '2',  '3',   // transaction id
28*d9f75844SAndroid Build Coastguard Worker       '4',  '5',  '6',  '7',  '8', '9', 'a', 'b',
29*d9f75844SAndroid Build Coastguard Worker   };
30*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(UnwrapTurnPacket(kTurnSendIndicationMsgWithNoAttributes,
31*d9f75844SAndroid Build Coastguard Worker                                 sizeof(kTurnSendIndicationMsgWithNoAttributes),
32*d9f75844SAndroid Build Coastguard Worker                                 &content_pos, &content_size));
33*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(SIZE_MAX, content_pos);
34*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(SIZE_MAX, content_size);
35*d9f75844SAndroid Build Coastguard Worker 
36*d9f75844SAndroid Build Coastguard Worker   // Stun Send Indication message with invalid length in stun header.
37*d9f75844SAndroid Build Coastguard Worker   const uint8_t kTurnSendIndicationMsgWithInvalidLength[] = {
38*d9f75844SAndroid Build Coastguard Worker       0x00, 0x16, 0xFF, 0x00,  // length of 0xFF00
39*d9f75844SAndroid Build Coastguard Worker       0x21, 0x12, 0xA4, 0x42,  // magic cookie
40*d9f75844SAndroid Build Coastguard Worker       '0',  '1',  '2',  '3',   // transaction id
41*d9f75844SAndroid Build Coastguard Worker       '4',  '5',  '6',  '7',  '8', '9', 'a', 'b',
42*d9f75844SAndroid Build Coastguard Worker   };
43*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(UnwrapTurnPacket(kTurnSendIndicationMsgWithInvalidLength,
44*d9f75844SAndroid Build Coastguard Worker                                 sizeof(kTurnSendIndicationMsgWithInvalidLength),
45*d9f75844SAndroid Build Coastguard Worker                                 &content_pos, &content_size));
46*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(SIZE_MAX, content_pos);
47*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(SIZE_MAX, content_size);
48*d9f75844SAndroid Build Coastguard Worker 
49*d9f75844SAndroid Build Coastguard Worker   // Stun Send Indication message with no DATA attribute in message.
50*d9f75844SAndroid Build Coastguard Worker   const uint8_t kTurnSendIndicatinMsgWithNoDataAttribute[] = {
51*d9f75844SAndroid Build Coastguard Worker       // clang-format off
52*d9f75844SAndroid Build Coastguard Worker       // clang formatting doesn't respect inline comments.
53*d9f75844SAndroid Build Coastguard Worker       0x00, 0x16, 0x00, 0x08,  // length of
54*d9f75844SAndroid Build Coastguard Worker       0x21, 0x12, 0xA4, 0x42,  // magic cookie
55*d9f75844SAndroid Build Coastguard Worker       '0',  '1',  '2',  '3',   // transaction id
56*d9f75844SAndroid Build Coastguard Worker       '4',  '5',  '6',  '7',  '8',  '9', 'a',  'b',
57*d9f75844SAndroid Build Coastguard Worker       0x00, 0x20, 0x00, 0x04,  // Mapped address.
58*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00,
59*d9f75844SAndroid Build Coastguard Worker       // clang-format on
60*d9f75844SAndroid Build Coastguard Worker   };
61*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(
62*d9f75844SAndroid Build Coastguard Worker       UnwrapTurnPacket(kTurnSendIndicatinMsgWithNoDataAttribute,
63*d9f75844SAndroid Build Coastguard Worker                        sizeof(kTurnSendIndicatinMsgWithNoDataAttribute),
64*d9f75844SAndroid Build Coastguard Worker                        &content_pos, &content_size));
65*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(SIZE_MAX, content_pos);
66*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(SIZE_MAX, content_size);
67*d9f75844SAndroid Build Coastguard Worker }
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker // Valid TURN Send Indication messages.
TEST(TurnUtilsTest,ValidTurnSendIndicationMessage)70*d9f75844SAndroid Build Coastguard Worker TEST(TurnUtilsTest, ValidTurnSendIndicationMessage) {
71*d9f75844SAndroid Build Coastguard Worker   size_t content_pos = SIZE_MAX;
72*d9f75844SAndroid Build Coastguard Worker   size_t content_size = SIZE_MAX;
73*d9f75844SAndroid Build Coastguard Worker   // A valid STUN indication message with a valid RTP header in data attribute
74*d9f75844SAndroid Build Coastguard Worker   // payload field and no extension bit set.
75*d9f75844SAndroid Build Coastguard Worker   const uint8_t kTurnSendIndicationMsgWithoutRtpExtension[] = {
76*d9f75844SAndroid Build Coastguard Worker       // clang-format off
77*d9f75844SAndroid Build Coastguard Worker       // clang formatting doesn't respect inline comments.
78*d9f75844SAndroid Build Coastguard Worker       0x00, 0x16, 0x00, 0x18,  // length of
79*d9f75844SAndroid Build Coastguard Worker       0x21, 0x12, 0xA4, 0x42,  // magic cookie
80*d9f75844SAndroid Build Coastguard Worker       '0',  '1',  '2',  '3',   // transaction id
81*d9f75844SAndroid Build Coastguard Worker       '4',  '5',  '6',  '7',  '8',  '9',  'a',  'b',
82*d9f75844SAndroid Build Coastguard Worker       0x00, 0x20, 0x00, 0x04,  // Mapped address.
83*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00,
84*d9f75844SAndroid Build Coastguard Worker       0x00, 0x13, 0x00, 0x0C,  // Data attribute.
85*d9f75844SAndroid Build Coastguard Worker       0x80, 0x00, 0x00, 0x00,  // RTP packet.
86*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87*d9f75844SAndroid Build Coastguard Worker       // clang-format on
88*d9f75844SAndroid Build Coastguard Worker   };
89*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(
90*d9f75844SAndroid Build Coastguard Worker       UnwrapTurnPacket(kTurnSendIndicationMsgWithoutRtpExtension,
91*d9f75844SAndroid Build Coastguard Worker                        sizeof(kTurnSendIndicationMsgWithoutRtpExtension),
92*d9f75844SAndroid Build Coastguard Worker                        &content_pos, &content_size));
93*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(12U, content_size);
94*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(32U, content_pos);
95*d9f75844SAndroid Build Coastguard Worker }
96*d9f75844SAndroid Build Coastguard Worker 
97*d9f75844SAndroid Build Coastguard Worker // Verify that parsing of valid TURN Channel Messages.
TEST(TurnUtilsTest,ValidTurnChannelMessages)98*d9f75844SAndroid Build Coastguard Worker TEST(TurnUtilsTest, ValidTurnChannelMessages) {
99*d9f75844SAndroid Build Coastguard Worker   const uint8_t kTurnChannelMsgWithRtpPacket[] = {
100*d9f75844SAndroid Build Coastguard Worker       // clang-format off
101*d9f75844SAndroid Build Coastguard Worker       // clang formatting doesn't respect inline comments.
102*d9f75844SAndroid Build Coastguard Worker       0x40, 0x00, 0x00, 0x0C,
103*d9f75844SAndroid Build Coastguard Worker       0x80, 0x00, 0x00, 0x00,  // RTP packet.
104*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105*d9f75844SAndroid Build Coastguard Worker       // clang-format on
106*d9f75844SAndroid Build Coastguard Worker   };
107*d9f75844SAndroid Build Coastguard Worker 
108*d9f75844SAndroid Build Coastguard Worker   size_t content_pos = 0, content_size = 0;
109*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(UnwrapTurnPacket(kTurnChannelMsgWithRtpPacket,
110*d9f75844SAndroid Build Coastguard Worker                                sizeof(kTurnChannelMsgWithRtpPacket),
111*d9f75844SAndroid Build Coastguard Worker                                &content_pos, &content_size));
112*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(12U, content_size);
113*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(4U, content_pos);
114*d9f75844SAndroid Build Coastguard Worker }
115*d9f75844SAndroid Build Coastguard Worker 
TEST(TurnUtilsTest,ChannelMessageZeroLength)116*d9f75844SAndroid Build Coastguard Worker TEST(TurnUtilsTest, ChannelMessageZeroLength) {
117*d9f75844SAndroid Build Coastguard Worker   const uint8_t kTurnChannelMsgWithZeroLength[] = {0x40, 0x00, 0x00, 0x00};
118*d9f75844SAndroid Build Coastguard Worker   size_t content_pos = SIZE_MAX;
119*d9f75844SAndroid Build Coastguard Worker   size_t content_size = SIZE_MAX;
120*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(UnwrapTurnPacket(kTurnChannelMsgWithZeroLength,
121*d9f75844SAndroid Build Coastguard Worker                                sizeof(kTurnChannelMsgWithZeroLength),
122*d9f75844SAndroid Build Coastguard Worker                                &content_pos, &content_size));
123*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(4u, content_pos);
124*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0u, content_size);
125*d9f75844SAndroid Build Coastguard Worker }
126*d9f75844SAndroid Build Coastguard Worker 
127*d9f75844SAndroid Build Coastguard Worker }  // namespace cricket
128