// Copyright 2019 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 <arpa/inet.h>
#include <errno.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>

#include <gtest/gtest.h>

TEST(GetAddrInfoTest, GetAddrInfoTest) {
  struct addrinfo hints;
  struct addrinfo *result;
  struct sockaddr_in *addr4;
  struct sockaddr_in6 *addr6;
  struct in_addr golden_v4;
  inet_pton(AF_INET, "192.0.2.1", &golden_v4);
  struct in6_addr golden_v6;
  inet_pton(AF_INET6, "2001:db8::1", &golden_v6);

  // Test AF_INET / SOCK_STREAM / http
  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;

  ASSERT_EQ(getaddrinfo("example.com", "http", &hints, &result), 0);
  addr4 = reinterpret_cast<struct sockaddr_in *>(result->ai_addr);
  ASSERT_EQ(((struct in_addr)addr4->sin_addr).s_addr, golden_v4.s_addr);
  ASSERT_EQ(addr4->sin_port, htons(80));

  freeaddrinfo(result);

  // Test AF_INET6 / SOCK_DGRAM / ntp
  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET6;
  hints.ai_socktype = SOCK_DGRAM;

  ASSERT_EQ(getaddrinfo("example.com", "ntp", &hints, &result), 0);
  addr6 = reinterpret_cast<struct sockaddr_in6 *>(result->ai_addr);
  ASSERT_EQ(memcmp(golden_v6.s6_addr, ((struct in6_addr)addr6->sin6_addr).s6_addr, 16), 0);
  ASSERT_EQ(addr6->sin6_port, htons(123));

  freeaddrinfo(result);

  // Test EAI_NONAME
  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;

  ASSERT_EQ(getaddrinfo("google.com", "http", &hints, &result), EAI_NONAME);
}
