// 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 "net/base/sys_addrinfo.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
