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