15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_socket_address_coder.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using std::string; 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net { 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace test { 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(QuicSocketAddressCoderTest, EncodeIPv4) { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPAddressNumber ip; 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(ParseIPLiteralToNumber("4.31.198.44", &ip)); 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicSocketAddressCoder coder(IPEndPoint(ip, 0x1234)); 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string serialized = coder.Encode(); 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string expected("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8); 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected, serialized); 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(QuicSocketAddressCoderTest, EncodeIPv6) { 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPAddressNumber ip; 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(ParseIPLiteralToNumber("2001:700:300:1800::f", &ip)); 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicSocketAddressCoder coder(IPEndPoint(ip, 0x5678)); 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string serialized = coder.Encode(); 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string expected("\x0a\x00" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x20\x01\x07\x00\x03\x00\x18\x00" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x00\x00\x00\x00\x00\x00\x00\x0f" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x78\x56", 20); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected, serialized); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(QuicSocketAddressCoderTest, DecodeIPv4) { 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string serialized("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8); 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicSocketAddressCoder coder; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length())); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(AF_INET, ConvertAddressFamily(GetAddressFamily(coder.ip()))); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string expected_addr("\x04\x1f\xc6\x2c", 4); 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_addr, IPAddressToPackedString(coder.ip())); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0x1234, coder.port()); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(QuicSocketAddressCoderTest, DecodeIPv6) { 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string serialized("\x0a\x00" 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x20\x01\x07\x00\x03\x00\x18\x00" 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x00\x00\x00\x00\x00\x00\x00\x0f" 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x78\x56", 20); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicSocketAddressCoder coder; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length())); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(AF_INET6, ConvertAddressFamily(GetAddressFamily(coder.ip()))); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string expected_addr("\x20\x01\x07\x00\x03\x00\x18\x00" 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x00\x00\x00\x00\x00\x00\x00\x0f", 16); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_addr, IPAddressToPackedString(coder.ip())); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0x5678, coder.port()); 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(QuicSocketAddressCoderTest, DecodeBad) { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string serialized("\x0a\x00" 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x20\x01\x07\x00\x03\x00\x18\x00" 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x00\x00\x00\x00\x00\x00\x00\x0f" 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\x78\x56", 20); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicSocketAddressCoder coder; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Append junk. 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) serialized.push_back('\0'); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Undo. 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) serialized.resize(20); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set an unknown address family. 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) serialized[0] = '\x03'; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Undo. 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) serialized[0] = '\x0a'; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Truncate. 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t len = serialized.length(); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < len; i++) { 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(serialized.empty()); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) serialized.erase(serialized.length() - 1); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(serialized.empty()); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(QuicSocketAddressCoderTest, EncodeAndDecode) { 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* ip_literal; 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint16 port; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } test_case[] = { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "93.184.216.119", 0x1234 }, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "199.204.44.194", 80 }, 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "149.20.4.69", 443 }, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "127.0.0.1", 8080 }, 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "2001:700:300:1800::", 0x5678 }, 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "::1", 65534 }, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_case); i++) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPAddressNumber ip; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(ParseIPLiteralToNumber(test_case[i].ip_literal, &ip)); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicSocketAddressCoder encoder(IPEndPoint(ip, test_case[i].port)); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string serialized = encoder.Encode(); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicSocketAddressCoder decoder; 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(decoder.Decode(serialized.data(), serialized.length())); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(encoder.ip(), decoder.ip()); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(encoder.port(), decoder.port()); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace test 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace net 118