blob: 7ab1383e1c0c2ffd77d54b0e0c7905106a43ee2c [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/quic_socket_address_coder.h"
6
vasilvv872e7a32019-03-12 16:42:44 -07007#include <string>
8
QUICHE teama6ef0a62019-03-07 20:34:33 -05009#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050010#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
11
12namespace quic {
13namespace test {
14
15class QuicSocketAddressCoderTest : public QuicTest {};
16
17TEST_F(QuicSocketAddressCoderTest, EncodeIPv4) {
18 QuicIpAddress ip;
19 ip.FromString("4.31.198.44");
20 QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x1234));
vasilvvc48c8712019-03-11 13:38:16 -070021 std::string serialized = coder.Encode();
22 std::string expected("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8);
QUICHE teama6ef0a62019-03-07 20:34:33 -050023 EXPECT_EQ(expected, serialized);
24}
25
26TEST_F(QuicSocketAddressCoderTest, EncodeIPv6) {
27 QuicIpAddress ip;
28 ip.FromString("2001:700:300:1800::f");
29 QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x5678));
vasilvvc48c8712019-03-11 13:38:16 -070030 std::string serialized = coder.Encode();
31 std::string expected(
QUICHE teama6ef0a62019-03-07 20:34:33 -050032 "\x0a\x00"
33 "\x20\x01\x07\x00\x03\x00\x18\x00"
34 "\x00\x00\x00\x00\x00\x00\x00\x0f"
35 "\x78\x56",
36 20);
37 EXPECT_EQ(expected, serialized);
38}
39
40TEST_F(QuicSocketAddressCoderTest, DecodeIPv4) {
vasilvvc48c8712019-03-11 13:38:16 -070041 std::string serialized("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8);
QUICHE teama6ef0a62019-03-07 20:34:33 -050042 QuicSocketAddressCoder coder;
43 ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length()));
44 EXPECT_EQ(IpAddressFamily::IP_V4, coder.ip().address_family());
vasilvvc48c8712019-03-11 13:38:16 -070045 std::string expected_addr("\x04\x1f\xc6\x2c");
QUICHE teama6ef0a62019-03-07 20:34:33 -050046 EXPECT_EQ(expected_addr, coder.ip().ToPackedString());
47 EXPECT_EQ(0x1234, coder.port());
48}
49
50TEST_F(QuicSocketAddressCoderTest, DecodeIPv6) {
vasilvvc48c8712019-03-11 13:38:16 -070051 std::string serialized(
QUICHE teama6ef0a62019-03-07 20:34:33 -050052 "\x0a\x00"
53 "\x20\x01\x07\x00\x03\x00\x18\x00"
54 "\x00\x00\x00\x00\x00\x00\x00\x0f"
55 "\x78\x56",
56 20);
57 QuicSocketAddressCoder coder;
58 ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length()));
59 EXPECT_EQ(IpAddressFamily::IP_V6, coder.ip().address_family());
vasilvvc48c8712019-03-11 13:38:16 -070060 std::string expected_addr(
QUICHE teama6ef0a62019-03-07 20:34:33 -050061 "\x20\x01\x07\x00\x03\x00\x18\x00"
62 "\x00\x00\x00\x00\x00\x00\x00\x0f",
63 16);
64 EXPECT_EQ(expected_addr, coder.ip().ToPackedString());
65 EXPECT_EQ(0x5678, coder.port());
66}
67
68TEST_F(QuicSocketAddressCoderTest, DecodeBad) {
vasilvvc48c8712019-03-11 13:38:16 -070069 std::string serialized(
QUICHE teama6ef0a62019-03-07 20:34:33 -050070 "\x0a\x00"
71 "\x20\x01\x07\x00\x03\x00\x18\x00"
72 "\x00\x00\x00\x00\x00\x00\x00\x0f"
73 "\x78\x56",
74 20);
75 QuicSocketAddressCoder coder;
76 EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length()));
77 // Append junk.
78 serialized.push_back('\0');
79 EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length()));
80 // Undo.
81 serialized.resize(20);
82 EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length()));
83
84 // Set an unknown address family.
85 serialized[0] = '\x03';
86 EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length()));
87 // Undo.
88 serialized[0] = '\x0a';
89 EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length()));
90
91 // Truncate.
92 size_t len = serialized.length();
93 for (size_t i = 0; i < len; i++) {
94 ASSERT_FALSE(serialized.empty());
95 serialized.erase(serialized.length() - 1);
96 EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length()));
97 }
98 EXPECT_TRUE(serialized.empty());
99}
100
101TEST_F(QuicSocketAddressCoderTest, EncodeAndDecode) {
102 struct {
103 const char* ip_literal;
104 uint16_t port;
105 } test_case[] = {
106 {"93.184.216.119", 0x1234},
107 {"199.204.44.194", 80},
108 {"149.20.4.69", 443},
109 {"127.0.0.1", 8080},
110 {"2001:700:300:1800::", 0x5678},
111 {"::1", 65534},
112 };
113
114 for (size_t i = 0; i < QUIC_ARRAYSIZE(test_case); i++) {
115 QuicIpAddress ip;
116 ASSERT_TRUE(ip.FromString(test_case[i].ip_literal));
117 QuicSocketAddressCoder encoder(QuicSocketAddress(ip, test_case[i].port));
vasilvvc48c8712019-03-11 13:38:16 -0700118 std::string serialized = encoder.Encode();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500119
120 QuicSocketAddressCoder decoder;
121 ASSERT_TRUE(decoder.Decode(serialized.data(), serialized.length()));
122 EXPECT_EQ(encoder.ip(), decoder.ip());
123 EXPECT_EQ(encoder.port(), decoder.port());
124 }
125}
126
127} // namespace test
128} // namespace quic