1 // 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 "quiche/quic/core/quic_socket_address_coder.h"
6
7 #include <string>
8
9 #include "absl/base/macros.h"
10 #include "quiche/quic/platform/api/quic_ip_address.h"
11 #include "quiche/quic/platform/api/quic_ip_address_family.h"
12 #include "quiche/quic/platform/api/quic_test.h"
13
14 namespace quic {
15 namespace test {
16
17 class QuicSocketAddressCoderTest : public QuicTest {};
18
TEST_F(QuicSocketAddressCoderTest,EncodeIPv4)19 TEST_F(QuicSocketAddressCoderTest, EncodeIPv4) {
20 QuicIpAddress ip;
21 ip.FromString("4.31.198.44");
22 QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x1234));
23 std::string serialized = coder.Encode();
24 std::string expected("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8);
25 EXPECT_EQ(expected, serialized);
26 }
27
TEST_F(QuicSocketAddressCoderTest,EncodeIPv6)28 TEST_F(QuicSocketAddressCoderTest, EncodeIPv6) {
29 QuicIpAddress ip;
30 ip.FromString("2001:700:300:1800::f");
31 QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x5678));
32 std::string serialized = coder.Encode();
33 std::string expected(
34 "\x0a\x00"
35 "\x20\x01\x07\x00\x03\x00\x18\x00"
36 "\x00\x00\x00\x00\x00\x00\x00\x0f"
37 "\x78\x56",
38 20);
39 EXPECT_EQ(expected, serialized);
40 }
41
TEST_F(QuicSocketAddressCoderTest,DecodeIPv4)42 TEST_F(QuicSocketAddressCoderTest, DecodeIPv4) {
43 std::string serialized("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8);
44 QuicSocketAddressCoder coder;
45 ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length()));
46 EXPECT_EQ(IpAddressFamily::IP_V4, coder.ip().address_family());
47 std::string expected_addr("\x04\x1f\xc6\x2c");
48 EXPECT_EQ(expected_addr, coder.ip().ToPackedString());
49 EXPECT_EQ(0x1234, coder.port());
50 }
51
TEST_F(QuicSocketAddressCoderTest,DecodeIPv6)52 TEST_F(QuicSocketAddressCoderTest, DecodeIPv6) {
53 std::string serialized(
54 "\x0a\x00"
55 "\x20\x01\x07\x00\x03\x00\x18\x00"
56 "\x00\x00\x00\x00\x00\x00\x00\x0f"
57 "\x78\x56",
58 20);
59 QuicSocketAddressCoder coder;
60 ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length()));
61 EXPECT_EQ(IpAddressFamily::IP_V6, coder.ip().address_family());
62 std::string expected_addr(
63 "\x20\x01\x07\x00\x03\x00\x18\x00"
64 "\x00\x00\x00\x00\x00\x00\x00\x0f",
65 16);
66 EXPECT_EQ(expected_addr, coder.ip().ToPackedString());
67 EXPECT_EQ(0x5678, coder.port());
68 }
69
TEST_F(QuicSocketAddressCoderTest,DecodeBad)70 TEST_F(QuicSocketAddressCoderTest, DecodeBad) {
71 std::string serialized(
72 "\x0a\x00"
73 "\x20\x01\x07\x00\x03\x00\x18\x00"
74 "\x00\x00\x00\x00\x00\x00\x00\x0f"
75 "\x78\x56",
76 20);
77 QuicSocketAddressCoder coder;
78 EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length()));
79 // Append junk.
80 serialized.push_back('\0');
81 EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length()));
82 // Undo.
83 serialized.resize(20);
84 EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length()));
85
86 // Set an unknown address family.
87 serialized[0] = '\x03';
88 EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length()));
89 // Undo.
90 serialized[0] = '\x0a';
91 EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length()));
92
93 // Truncate.
94 size_t len = serialized.length();
95 for (size_t i = 0; i < len; i++) {
96 ASSERT_FALSE(serialized.empty());
97 serialized.erase(serialized.length() - 1);
98 EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length()));
99 }
100 EXPECT_TRUE(serialized.empty());
101 }
102
TEST_F(QuicSocketAddressCoderTest,EncodeAndDecode)103 TEST_F(QuicSocketAddressCoderTest, EncodeAndDecode) {
104 struct {
105 const char* ip_literal;
106 uint16_t port;
107 } test_case[] = {
108 {"93.184.216.119", 0x1234},
109 {"199.204.44.194", 80},
110 {"149.20.4.69", 443},
111 {"127.0.0.1", 8080},
112 {"2001:700:300:1800::", 0x5678},
113 {"::1", 65534},
114 };
115
116 for (size_t i = 0; i < ABSL_ARRAYSIZE(test_case); i++) {
117 QuicIpAddress ip;
118 ASSERT_TRUE(ip.FromString(test_case[i].ip_literal));
119 QuicSocketAddressCoder encoder(QuicSocketAddress(ip, test_case[i].port));
120 std::string serialized = encoder.Encode();
121
122 QuicSocketAddressCoder decoder;
123 ASSERT_TRUE(decoder.Decode(serialized.data(), serialized.length()));
124 EXPECT_EQ(encoder.ip(), decoder.ip());
125 EXPECT_EQ(encoder.port(), decoder.port());
126 }
127 }
128
129 } // namespace test
130 } // namespace quic
131