// Copyright 2020 The Fuchsia 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 "src/lib/inet/socket_address.h"

#include <gtest/gtest.h>

namespace inet {
namespace test {

TEST(SocketAddressTest, BuildFromFIDL) {
  auto fnet_v4 = fuchsia::net::SocketAddress::WithIpv4(
      fuchsia::net::Ipv4SocketAddress{fuchsia::net::Ipv4Address{{192, 168, 0, 1}}, 80});
  SocketAddress sockaddr_v4(IpAddress(192, 168, 0, 1), IpPort::From_uint16_t(80));

  EXPECT_EQ(SocketAddress(&fnet_v4), sockaddr_v4);
  EXPECT_EQ(SocketAddress(&fnet_v4.ipv4()), sockaddr_v4);

  auto fnet_v6 = fuchsia::net::SocketAddress::WithIpv6(fuchsia::net::Ipv6SocketAddress{
      fuchsia::net::Ipv6Address{{0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xed, 0xaa,
                                 0x12, 0x16, 0x78, 0xf6, 0x79}},
      80, 1});
  SocketAddress sockaddr_v6(
      IpAddress(0xfe80, 0x0000, 0x000, 0x0000, 0xc4ed, 0xaa12, 0x1678, 0xf679),
      IpPort::From_uint16_t(80), 1);

  EXPECT_EQ(SocketAddress(&fnet_v6), sockaddr_v6);
  EXPECT_EQ(SocketAddress(&fnet_v6.ipv6()), sockaddr_v6);
}

}  // namespace test
}  // namespace inet
