// Copyright 2016 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 "third_party/blink/renderer/platform/network/network_utils.h"

#include "net/base/ip_address.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"

namespace blink {

TEST(NetworkUtilsTest, IsReservedIPAddress) {
  // Unreserved IPv4 addresses (in various forms).
  EXPECT_FALSE(network_utils::IsReservedIPAddress("8.8.8.8"));
  EXPECT_FALSE(network_utils::IsReservedIPAddress("99.64.0.0"));
  EXPECT_FALSE(network_utils::IsReservedIPAddress("212.15.0.0"));
  EXPECT_FALSE(network_utils::IsReservedIPAddress("212.15"));
  EXPECT_FALSE(network_utils::IsReservedIPAddress("212.15.0"));
  EXPECT_FALSE(network_utils::IsReservedIPAddress("3557752832"));

  // Reserved IPv4 addresses (in various forms).
  EXPECT_TRUE(network_utils::IsReservedIPAddress("192.168.0.0"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress("192.168.0.6"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress("10.0.0.5"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress("10.0.0"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress("10.0"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress("3232235526"));

  // Unreserved IPv6 addresses.
  EXPECT_FALSE(network_utils::IsReservedIPAddress(
      "[FFC0:ba98:7654:3210:FEDC:BA98:7654:3210]"));
  EXPECT_FALSE(network_utils::IsReservedIPAddress(
      "[2000:ba98:7654:2301:EFCD:BA98:7654:3210]"));
  // IPv4-mapped to IPv6
  EXPECT_FALSE(network_utils::IsReservedIPAddress("[::ffff:8.8.8.8]"));

  // Reserved IPv6 addresses.
  EXPECT_TRUE(network_utils::IsReservedIPAddress("[::1]"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress("[::192.9.5.5]"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress("[::ffff:192.168.1.1]"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress("[FEED::BEEF]"));
  EXPECT_TRUE(network_utils::IsReservedIPAddress(
      "[FEC0:ba98:7654:3210:FEDC:BA98:7654:3210]"));

  // Not IP addresses at all.
  EXPECT_FALSE(network_utils::IsReservedIPAddress("example.com"));
  EXPECT_FALSE(network_utils::IsReservedIPAddress("127.0.0.1.example.com"));

  // Moar IPv4
  for (int i = 0; i < 256; i++) {
    net::IPAddress address(i, 0, 0, 1);
    std::string address_string = address.ToString();
    if (i == 0 || i == 10 || i == 127 || i > 223) {
      EXPECT_TRUE(network_utils::IsReservedIPAddress(
          String::FromUTF8(address_string.data(), address_string.length())));
    } else {
      EXPECT_FALSE(network_utils::IsReservedIPAddress(
          String::FromUTF8(address_string.data(), address_string.length())));
    }
  }
}

TEST(NetworkUtilsTest, GetDomainAndRegistry) {
  EXPECT_EQ("", network_utils::GetDomainAndRegistry(
                    "", network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("", network_utils::GetDomainAndRegistry(
                    ".", network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("", network_utils::GetDomainAndRegistry(
                    "..", network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("", network_utils::GetDomainAndRegistry(
                    "com", network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("", network_utils::GetDomainAndRegistry(
                    ".com", network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("", network_utils::GetDomainAndRegistry(
                    "www.example.com:8000",
                    network_utils::kIncludePrivateRegistries));

  EXPECT_EQ("", network_utils::GetDomainAndRegistry(
                    "localhost", network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("", network_utils::GetDomainAndRegistry(
                    "127.0.0.1", network_utils::kIncludePrivateRegistries));

  EXPECT_EQ("example.com",
            network_utils::GetDomainAndRegistry(
                "example.com", network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("example.com",
            network_utils::GetDomainAndRegistry(
                "www.example.com", network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("example.com", network_utils::GetDomainAndRegistry(
                               "static.example.com",
                               network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("example.com", network_utils::GetDomainAndRegistry(
                               "multilevel.www.example.com",
                               network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("example.co.uk",
            network_utils::GetDomainAndRegistry(
                "www.example.co.uk", network_utils::kIncludePrivateRegistries));

  // Verify proper handling of 'private registries'.
  EXPECT_EQ("foo.appspot.com", network_utils::GetDomainAndRegistry(
                                   "www.foo.appspot.com",
                                   network_utils::kIncludePrivateRegistries));
  EXPECT_EQ("appspot.com", network_utils::GetDomainAndRegistry(
                               "www.foo.appspot.com",
                               network_utils::kExcludePrivateRegistries));

  // Verify that unknown registries are included.
  EXPECT_EQ("example.notarealregistry",
            network_utils::GetDomainAndRegistry(
                "www.example.notarealregistry",
                network_utils::kIncludePrivateRegistries));
}

}  // namespace blink
