| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "quic/core/quic_socket_address_coder.h" |
| |
| #include <string> |
| |
| #include "absl/base/macros.h" |
| #include "quic/platform/api/quic_test.h" |
| |
| namespace quic { |
| namespace test { |
| |
| class QuicSocketAddressCoderTest : public QuicTest {}; |
| |
| TEST_F(QuicSocketAddressCoderTest, EncodeIPv4) { |
| QuicIpAddress ip; |
| ip.FromString("4.31.198.44"); |
| QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x1234)); |
| std::string serialized = coder.Encode(); |
| std::string expected("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8); |
| EXPECT_EQ(expected, serialized); |
| } |
| |
| TEST_F(QuicSocketAddressCoderTest, EncodeIPv6) { |
| QuicIpAddress ip; |
| ip.FromString("2001:700:300:1800::f"); |
| QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x5678)); |
| std::string serialized = coder.Encode(); |
| std::string expected( |
| "\x0a\x00" |
| "\x20\x01\x07\x00\x03\x00\x18\x00" |
| "\x00\x00\x00\x00\x00\x00\x00\x0f" |
| "\x78\x56", |
| 20); |
| EXPECT_EQ(expected, serialized); |
| } |
| |
| TEST_F(QuicSocketAddressCoderTest, DecodeIPv4) { |
| std::string serialized("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8); |
| QuicSocketAddressCoder coder; |
| ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| EXPECT_EQ(IpAddressFamily::IP_V4, coder.ip().address_family()); |
| std::string expected_addr("\x04\x1f\xc6\x2c"); |
| EXPECT_EQ(expected_addr, coder.ip().ToPackedString()); |
| EXPECT_EQ(0x1234, coder.port()); |
| } |
| |
| TEST_F(QuicSocketAddressCoderTest, DecodeIPv6) { |
| std::string serialized( |
| "\x0a\x00" |
| "\x20\x01\x07\x00\x03\x00\x18\x00" |
| "\x00\x00\x00\x00\x00\x00\x00\x0f" |
| "\x78\x56", |
| 20); |
| QuicSocketAddressCoder coder; |
| ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| EXPECT_EQ(IpAddressFamily::IP_V6, coder.ip().address_family()); |
| std::string expected_addr( |
| "\x20\x01\x07\x00\x03\x00\x18\x00" |
| "\x00\x00\x00\x00\x00\x00\x00\x0f", |
| 16); |
| EXPECT_EQ(expected_addr, coder.ip().ToPackedString()); |
| EXPECT_EQ(0x5678, coder.port()); |
| } |
| |
| TEST_F(QuicSocketAddressCoderTest, DecodeBad) { |
| std::string serialized( |
| "\x0a\x00" |
| "\x20\x01\x07\x00\x03\x00\x18\x00" |
| "\x00\x00\x00\x00\x00\x00\x00\x0f" |
| "\x78\x56", |
| 20); |
| QuicSocketAddressCoder coder; |
| EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| // Append junk. |
| serialized.push_back('\0'); |
| EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); |
| // Undo. |
| serialized.resize(20); |
| EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| |
| // Set an unknown address family. |
| serialized[0] = '\x03'; |
| EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); |
| // Undo. |
| serialized[0] = '\x0a'; |
| EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| |
| // Truncate. |
| size_t len = serialized.length(); |
| for (size_t i = 0; i < len; i++) { |
| ASSERT_FALSE(serialized.empty()); |
| serialized.erase(serialized.length() - 1); |
| EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); |
| } |
| EXPECT_TRUE(serialized.empty()); |
| } |
| |
| TEST_F(QuicSocketAddressCoderTest, EncodeAndDecode) { |
| struct { |
| const char* ip_literal; |
| uint16_t port; |
| } test_case[] = { |
| {"93.184.216.119", 0x1234}, |
| {"199.204.44.194", 80}, |
| {"149.20.4.69", 443}, |
| {"127.0.0.1", 8080}, |
| {"2001:700:300:1800::", 0x5678}, |
| {"::1", 65534}, |
| }; |
| |
| for (size_t i = 0; i < ABSL_ARRAYSIZE(test_case); i++) { |
| QuicIpAddress ip; |
| ASSERT_TRUE(ip.FromString(test_case[i].ip_literal)); |
| QuicSocketAddressCoder encoder(QuicSocketAddress(ip, test_case[i].port)); |
| std::string serialized = encoder.Encode(); |
| |
| QuicSocketAddressCoder decoder; |
| ASSERT_TRUE(decoder.Decode(serialized.data(), serialized.length())); |
| EXPECT_EQ(encoder.ip(), decoder.ip()); |
| EXPECT_EQ(encoder.port(), decoder.port()); |
| } |
| } |
| |
| } // namespace test |
| } // namespace quic |