// Copyright 2018 The Chromium OS 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 "crosdns/hosts_modifier.h"

#include <string>

#include <base/files/scoped_temp_dir.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <gtest/gtest.h>

namespace crosdns {

namespace {

constexpr char kBaseFileContents[] =
    "# Example /etc/hosts file\n"
    "127.0.0.1 localhost\n";
constexpr char kFileModificationDelimeter[] =
    "\n#####DYNAMIC-CROSDNS-ENTRIES#####\n";

class HostsModifierTest : public ::testing::Test {
 public:
  HostsModifierTest() {
    CHECK(temp_dir_.CreateUniqueTempDir());
    hosts_file_ = temp_dir_.GetPath().Append("hosts");
    WriteHostsContents(kBaseFileContents);
  }
  ~HostsModifierTest() override = default;

  void WriteHostsContents(const std::string& file_contents) {
    EXPECT_EQ(file_contents.size(),
              base::WriteFile(hosts_file_, file_contents.c_str(),
                              file_contents.size()));
  }

  std::string ReadHostsContents() const {
    std::string ret;
    EXPECT_TRUE(base::ReadFileToString(hosts_file_, &ret));
    return ret;
  }

  HostsModifier* hosts_modifier() { return &hosts_modifier_; }
  base::FilePath hosts_file() const { return hosts_file_; }

 private:
  base::ScopedTempDir temp_dir_;
  base::FilePath hosts_file_;
  HostsModifier hosts_modifier_;

  DISALLOW_COPY_AND_ASSIGN(HostsModifierTest);
};

}  // namespace

TEST_F(HostsModifierTest, InitSucceeds) {
  EXPECT_TRUE(hosts_modifier()->Init(hosts_file()));
  // The hosts file contents should be unchanged now.
  EXPECT_EQ(kBaseFileContents, ReadHostsContents());
}

TEST_F(HostsModifierTest, InitFailsNonExistentFile) {
  EXPECT_TRUE(base::DeleteFile(hosts_file(), false));
  EXPECT_FALSE(hosts_modifier()->Init(hosts_file()));
}

TEST_F(HostsModifierTest, InitRemovesOldEntries) {
  std::string extra_contents = kBaseFileContents;
  extra_contents += kFileModificationDelimeter;
  extra_contents += "1.2.3.4 example.com\n";
  WriteHostsContents(extra_contents);
  EXPECT_TRUE(hosts_modifier()->Init(hosts_file()));
  // The hosts file contents should be the original contents up to our
  // delimeter.
  EXPECT_EQ(kBaseFileContents, ReadHostsContents());
}

TEST_F(HostsModifierTest, SettingRemovingHostnames) {
  std::string err;
  EXPECT_TRUE(hosts_modifier()->Init(hosts_file()));
  // Valid hostname for default container.
  EXPECT_TRUE(hosts_modifier()->SetHostnameIpMapping(
      "linuxhost", "100.115.92.24", "", &err));
  // Valid hostnames for vm/container.
  EXPECT_TRUE(hosts_modifier()->SetHostnameIpMapping(
      "foo12-local", "100.115.92.22", "", &err));
  EXPECT_TRUE(hosts_modifier()->SetHostnameIpMapping(
      "penguin-termina-local", "100.115.92.253", "", &err));
  // Invalid hostnames.
  EXPECT_FALSE(hosts_modifier()->SetHostnameIpMapping(
      "google.com", "100.115.92.24", "", &err));
  EXPECT_FALSE(hosts_modifier()->SetHostnameIpMapping(
      "localhost", "100.115.92.24", "", &err));
  EXPECT_FALSE(hosts_modifier()->SetHostnameIpMapping(
      "-foo-local", "100.115.92.24", "", &err));
  EXPECT_FALSE(
      hosts_modifier()->SetHostnameIpMapping("", "100.115.92.24", "", &err));
  // Invalid IPs.
  EXPECT_FALSE(hosts_modifier()->SetHostnameIpMapping(
      "linuxhost", "100.115.91.24", "", &err));
  EXPECT_FALSE(
      hosts_modifier()->SetHostnameIpMapping("linuxhost", "8.8.8.8", "", &err));
  EXPECT_FALSE(hosts_modifier()->SetHostnameIpMapping(
      "linuxhost", "101.115.92.24", "", &err));
  // Verify the contents of the hosts file. We are assuming an ordered map is
  // used here (which it is in the code) to make analyzing the results easier.
  std::string extra_contents = kBaseFileContents;
  extra_contents += kFileModificationDelimeter;
  extra_contents += "100.115.92.22 foo12-local\n";
  extra_contents += "100.115.92.24 linuxhost\n";
  extra_contents += "100.115.92.253 penguin-termina-local\n";
  EXPECT_EQ(extra_contents, ReadHostsContents());

  // Removing an invalid hostname should fail.
  EXPECT_FALSE(hosts_modifier()->RemoveHostnameIpMapping("bar-local", &err));
  EXPECT_FALSE(hosts_modifier()->RemoveHostnameIpMapping("google.com", &err));
  // Removing a valid hostname should succeed.
  EXPECT_TRUE(hosts_modifier()->RemoveHostnameIpMapping("linuxhost", &err));
  EXPECT_TRUE(hosts_modifier()->RemoveHostnameIpMapping("foo12-local", &err));

  // Verify the contents of the hosts file again, there should be one entry
  // left.
  extra_contents = kBaseFileContents;
  extra_contents += kFileModificationDelimeter;
  extra_contents += "100.115.92.253 penguin-termina-local\n";
  EXPECT_EQ(extra_contents, ReadHostsContents());
}

}  // namespace crosdns
