// Copyright (c) 2009 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/dns/dns_util.h"

#include "starboard/common/string.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

bool IsValidDNSDomainName(const char* name) {
  size_t length = SbStringGetLength(name);
  for (size_t i = 0; i < length; ++i) {
    if (name[i] == '.') {
      if (i == 0 || name[i - 1] == '.') {
        return false;
      }
      continue;
    }

    if (!net::IsValidHostLabelCharacter(name[i],
                                        i == 0 || name[i - 1] == '.')) {
      return false;
    }
  }
  return true;
}

}  // namespace

namespace net {

class DNSUtilTest : public testing::Test {
};

// IncludeNUL converts a char* to a std::string and includes the terminating
// NUL in the result.
static std::string IncludeNUL(const char* in) {
  return std::string(in, SbStringGetLength(in) + 1);
}

TEST_F(DNSUtilTest, DNSDomainFromDot) {
  std::string out;

  EXPECT_FALSE(DNSDomainFromDot("", &out));
  EXPECT_FALSE(DNSDomainFromDot(".", &out));
  EXPECT_FALSE(DNSDomainFromDot("..", &out));
  EXPECT_FALSE(DNSDomainFromDot("foo,bar.com", &out));

  EXPECT_TRUE(DNSDomainFromDot("com", &out));
  EXPECT_EQ(out, IncludeNUL("\003com"));
  EXPECT_TRUE(DNSDomainFromDot("google.com", &out));
  EXPECT_EQ(out, IncludeNUL("\x006google\003com"));
  EXPECT_TRUE(DNSDomainFromDot("www.google.com", &out));
  EXPECT_EQ(out, IncludeNUL("\003www\006google\003com"));

  // Label is 63 chars: still valid
  EXPECT_TRUE(DNSDomainFromDot("z23456789a123456789a123456789a123456789a123456789a123456789a123", &out));
  EXPECT_EQ(out, IncludeNUL("\077z23456789a123456789a123456789a123456789a123456789a123456789a123"));

  // Label is too long: invalid
  EXPECT_FALSE(DNSDomainFromDot("123456789a123456789a123456789a123456789a123456789a123456789a1234", &out));

  // 253 characters in the name: still valid
  EXPECT_TRUE(DNSDomainFromDot("abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi.abc", &out));
  EXPECT_EQ(out, IncludeNUL("\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\011abcdefghi\003abc"));

  // 254 characters in the name: invalid
  EXPECT_FALSE(DNSDomainFromDot("123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.1234", &out));

  // Zero length labels should fail, except that one trailing dot is allowed
  // (to disable suffix search):
  EXPECT_FALSE(DNSDomainFromDot(".google.com", &out));
  EXPECT_FALSE(DNSDomainFromDot("www..google.com", &out));

  EXPECT_TRUE(DNSDomainFromDot("www.google.com.", &out));
  EXPECT_EQ(out, IncludeNUL("\003www\006google\003com"));
}

TEST_F(DNSUtilTest, DNSDomainToString) {
  EXPECT_EQ("", DNSDomainToString(IncludeNUL("")));
  EXPECT_EQ("foo", DNSDomainToString(IncludeNUL("\003foo")));
  EXPECT_EQ("foo.bar", DNSDomainToString(IncludeNUL("\003foo\003bar")));
  EXPECT_EQ("foo.bar.uk",
            DNSDomainToString(IncludeNUL("\003foo\003bar\002uk")));

  // It should cope with a lack of root label.
  EXPECT_EQ("foo.bar", DNSDomainToString("\003foo\003bar"));

  // Invalid inputs should return an empty string.
  EXPECT_EQ("", DNSDomainToString(IncludeNUL("\x80")));
  EXPECT_EQ("", DNSDomainToString("\x06"));
}

TEST_F(DNSUtilTest, IsValidDNSDomain) {
  const char* const bad_hostnames[] = {
      "%20%20noodles.blorg", "noo dles.blorg ",    "noo dles.blorg. ",
      "^noodles.blorg",      "noodles^.blorg",     "noo&dles.blorg",
      "noodles.blorg`",      "www.-noodles.blorg",
  };

  // TODO(palmer): In the future, when we can remove support for invalid names,
  // change the calls to from |IsValidDNSDomainName| to |IsValidDNSDomain|, and
  // remove |IsValidDNSDomainName| (defined above).

  for (size_t i = 0; i < arraysize(bad_hostnames); ++i) {
    EXPECT_FALSE(IsValidDNSDomainName(bad_hostnames[i]));
  }

  const char* const good_hostnames[] = {
      "www.noodles.blorg",   "1www.noodles.blorg", "www.2noodles.blorg",
      "www.n--oodles.blorg", "www.noodl_es.blorg", "www.no-_odles.blorg",
      "www_.noodles.blorg",  "www.noodles.blorg.", "_privet._tcp.local",
  };

  for (size_t i = 0; i < arraysize(good_hostnames); ++i) {
    EXPECT_TRUE(IsValidDNSDomainName(good_hostnames[i]));
  }
}

TEST_F(DNSUtilTest, GetURLFromTemplateWithoutParameters) {
  EXPECT_EQ("https://dnsserver.example.net/dns-query",
            GetURLFromTemplateWithoutParameters(
                "https://dnsserver.example.net/dns-query{?dns}"));
}

TEST_F(DNSUtilTest, IsValidDoHTemplate) {
  EXPECT_TRUE(IsValidDoHTemplate(
      "https://dnsserver.example.net/dns-query{?dns}", "GET"));
  EXPECT_TRUE(IsValidDoHTemplate(
      "https://dnsserver.example.net/dns-query{?dns,extra}", "GET"));
  EXPECT_TRUE(IsValidDoHTemplate(
      "https://dnsserver.example.net/dns-query{?dns}", "POST"));
  EXPECT_TRUE(IsValidDoHTemplate(
      "https://dnsserver.example.net/dns-query{?query}", "POST"));
  EXPECT_TRUE(
      IsValidDoHTemplate("https://dnsserver.example.net/dns-query", "POST"));
  EXPECT_TRUE(
      IsValidDoHTemplate("https://query:{dns}@dnsserver.example.net", "GET"));
  EXPECT_TRUE(IsValidDoHTemplate("https://dnsserver.example.net{/dns}", "GET"));
  // Invalid template format
  EXPECT_FALSE(IsValidDoHTemplate(
      "https://dnsserver.example.net/dns-query{{?dns}}", "GET"));
  // Must be HTTPS
  EXPECT_FALSE(
      IsValidDoHTemplate("http://dnsserver.example.net/dns-query", "POST"));
  EXPECT_FALSE(IsValidDoHTemplate(
      "http://dnsserver.example.net/dns-query{?dns}", "GET"));
  // GET requests require the template to have a dns variable
  EXPECT_FALSE(IsValidDoHTemplate(
      "https://dnsserver.example.net/dns-query{?query}", "GET"));
  // Template must expand to a valid URL
  EXPECT_FALSE(IsValidDoHTemplate("https://{?dns}", "GET"));
  // The hostname must not contain the dns variable
  EXPECT_FALSE(IsValidDoHTemplate("https://{dns}.dnsserver.net", "GET"));
}

}  // namespace net
