| // 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 "net/quic/quic_socket_address_coder.h" |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| using std::string; |
| |
| namespace net { |
| namespace test { |
| |
| TEST(QuicSocketAddressCoderTest, EncodeIPv4) { |
| IPAddressNumber ip; |
| ASSERT_TRUE(ParseIPLiteralToNumber("4.31.198.44", &ip)); |
| QuicSocketAddressCoder coder(IPEndPoint(ip, 0x1234)); |
| string serialized = coder.Encode(); |
| string expected("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8); |
| EXPECT_EQ(expected, serialized); |
| } |
| |
| TEST(QuicSocketAddressCoderTest, EncodeIPv6) { |
| IPAddressNumber ip; |
| ASSERT_TRUE(ParseIPLiteralToNumber("2001:700:300:1800::f", &ip)); |
| QuicSocketAddressCoder coder(IPEndPoint(ip, 0x5678)); |
| string serialized = coder.Encode(); |
| 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(QuicSocketAddressCoderTest, DecodeIPv4) { |
| string serialized("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8); |
| QuicSocketAddressCoder coder; |
| ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| EXPECT_EQ(AF_INET, ConvertAddressFamily(GetAddressFamily(coder.ip()))); |
| string expected_addr("\x04\x1f\xc6\x2c", 4); |
| EXPECT_EQ(expected_addr, IPAddressToPackedString(coder.ip())); |
| EXPECT_EQ(0x1234, coder.port()); |
| } |
| |
| TEST(QuicSocketAddressCoderTest, DecodeIPv6) { |
| 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(AF_INET6, ConvertAddressFamily(GetAddressFamily(coder.ip()))); |
| string expected_addr("\x20\x01\x07\x00\x03\x00\x18\x00" |
| "\x00\x00\x00\x00\x00\x00\x00\x0f", 16); |
| EXPECT_EQ(expected_addr, IPAddressToPackedString(coder.ip())); |
| EXPECT_EQ(0x5678, coder.port()); |
| } |
| |
| TEST(QuicSocketAddressCoderTest, DecodeBad) { |
| 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(QuicSocketAddressCoderTest, EncodeAndDecode) { |
| struct { |
| const char* ip_literal; |
| uint16 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 < arraysize(test_case); i++) { |
| IPAddressNumber ip; |
| ASSERT_TRUE(ParseIPLiteralToNumber(test_case[i].ip_literal, &ip)); |
| QuicSocketAddressCoder encoder(IPEndPoint(ip, test_case[i].port)); |
| 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 net |