// 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 <base/strings/string_number_conversions.h>
#include <base/test/fuzzed_data_provider.h>

constexpr char kBaseFileContents[] =
    "# Example /etc/hosts file\n"
    "127.0.0.1 localhost\n";
constexpr char kValidIpPrefix[] = "100.115.92.";
constexpr char kValidHostnameSuffix[] = ".linux.test";

struct Environment {
  Environment() {
    CHECK(temp_dir.CreateUniqueTempDir());
    base::FilePath hosts_file = temp_dir.GetPath().Append("hosts");
    base::WriteFile(hosts_file, kBaseFileContents, strlen(kBaseFileContents));
    hosts_modifier.Init(hosts_file);
  }

  base::ScopedTempDir temp_dir;
  crosdns::HostsModifier hosts_modifier;
};

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  static Environment env;
  base::FuzzedDataProvider data_provider(data, size);
  // The aspects that we randomize based on the fuzzed data for better coverage
  // are:
  // - Using a valid numerical IP address (i.e. x.x.x.x where x < 256)
  // - Using an IP address in our allowed range of 100.115.92.x
  // - Using a valid hostname suffix of .linux.test
  // - Using the same hostname for remove as add vs. a fuzzed hostname
  std::string ip;
  bool useNumericIp = data_provider.ConsumeBool();
  if (useNumericIp) {
    bool useValidIpRange = data_provider.ConsumeBool();
    if (useValidIpRange) {
      ip = kValidIpPrefix;
      ip.append(base::IntToString(data_provider.ConsumeUint8()));
    } else {
      ip = base::IntToString(data_provider.ConsumeUint8()) + "." +
           base::IntToString(data_provider.ConsumeUint8()) + "." +
           base::IntToString(data_provider.ConsumeUint8()) + "." +
           base::IntToString(data_provider.ConsumeUint8());
    }
  } else {
    // We will want up to 3 strings, so take a random length of 1/3 the total
    // length.
    ip = data_provider.ConsumeRandomLengthString(size / 3);
  }
  std::string hostname;
  bool useValidHostnameSuffix = data_provider.ConsumeBool();
  if (useValidHostnameSuffix) {
    hostname = data_provider.ConsumeRandomLengthString(size / 3) +
               kValidHostnameSuffix;
  } else {
    hostname = data_provider.ConsumeRandomLengthString(size / 3);
  }
  std::string err;
  // Use the empty string for IPv6 since we don't do anything with that arg yet.
  env.hosts_modifier.SetHostnameIpMapping(hostname, ip, "", &err);

  bool removeSameHostnameAdded = data_provider.ConsumeBool();
  if (removeSameHostnameAdded) {
    env.hosts_modifier.RemoveHostnameIpMapping(hostname, &err);
  } else {
    env.hosts_modifier.RemoveHostnameIpMapping(
        data_provider.ConsumeRandomLengthString(size / 3), &err);
  }
  return 0;
}
