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