// Copyright 2019 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 <cstddef>
#include <cstdint>
#include <memory>
#include <string>

#include <base/files/file_path.h>
#include <base/files/scoped_temp_dir.h>
#include <base/logging.h>
#include <base/system/sys_info.h>
#include <chromeos/chromeos-config/libcros_config/fake_cros_config.h>
#include <fuzzer/FuzzedDataProvider.h>

#include "diagnostics/common/file_test_utils.h"
#include "diagnostics/cros_healthd/fetchers/system_fetcher.h"
#include "diagnostics/cros_healthd/system/mock_context.h"

namespace diagnostics {

namespace {

void SetUpSystemFiles(const base::FilePath& root_dir,
                      FuzzedDataProvider* provider) {
  // Populate fake cached VPD values.
  base::FilePath relative_vpd_rw_dir = root_dir.Append(kRelativeVpdRwPath);
  CHECK(WriteFileAndCreateParentDirs(
      relative_vpd_rw_dir.Append(kFirstPowerDateFileName),
      provider->ConsumeRandomLengthString()));
  base::FilePath relative_vpd_ro_dir = root_dir.Append(kRelativeVpdRoPath);
  CHECK(WriteFileAndCreateParentDirs(
      relative_vpd_ro_dir.Append(kManufactureDateFileName),
      provider->ConsumeRandomLengthString()));
  CHECK(WriteFileAndCreateParentDirs(
      relative_vpd_ro_dir.Append(kSkuNumberFileName),
      provider->ConsumeRandomLengthString()));
  // Populate fake DMI values.
  base::FilePath relative_dmi_info_path = root_dir.Append(kRelativeDmiInfoPath);
  CHECK(WriteFileAndCreateParentDirs(
      relative_dmi_info_path.Append(kBiosVersionFileName),
      provider->ConsumeRandomLengthString()));
  CHECK(WriteFileAndCreateParentDirs(
      relative_dmi_info_path.Append(kBoardNameFileName),
      provider->ConsumeRandomLengthString()));
  CHECK(WriteFileAndCreateParentDirs(
      relative_dmi_info_path.Append(kBoardVersionFileName),
      provider->ConsumeRandomLengthString()));
  CHECK(WriteFileAndCreateParentDirs(
      relative_dmi_info_path.Append(kChassisTypeFileName),
      provider->ConsumeRandomLengthString()));
  CHECK(WriteFileAndCreateParentDirs(
      relative_dmi_info_path.Append(kProductNameFileName),
      provider->ConsumeRandomLengthString()));
  // Populate the fake lsb-release file.
  base::SysInfo::SetChromeOSVersionInfoForTest(
      provider->ConsumeRandomLengthString(), base::Time::Now());
}

}  // namespace

class Environment {
 public:
  Environment() {
    logging::SetMinLogLevel(logging::LOGGING_FATAL);  // Disable logging.
  }
};

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  static Environment env;

  // 100 KiB max input size. Doing multiple writes and read for significantly
  // large files can potentially cause the fuzzer to timeout.
  constexpr int kMaxInputSize = 102400;
  if (size > kMaxInputSize)
    return 0;

  FuzzedDataProvider provider(data, size);
  base::ScopedTempDir temp_dir;
  // Setup temp dir for writing out the system files the fetcher will read
  // from.
  CHECK(temp_dir.CreateUniqueTempDir());
  SetUpSystemFiles(temp_dir.GetPath(), &provider);

  MockContext mock_context;
  mock_context.Initialize();
  mock_context.fake_system_config()->SetHasSkuNumber(true);
  mock_context.fake_system_config()->SetMarketingName("fake_marketing_name");
  SystemFetcher system_fetcher{&mock_context};
  auto system_info =
      system_fetcher.FetchSystemInfo(base::FilePath(temp_dir.GetPath()));

  return 0;
}

}  // namespace diagnostics
