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