// Copyright 2019 The Fuchsia 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 <lib/syslog/cpp/macros.h>
#include <stddef.h>
#include <stdint.h>

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

#include <gtest/gtest.h>

#include "src/lib/files/directory.h"
#include "src/lib/files/file.h"

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);

namespace fuzzing {

static std::vector<std::string> gTestInputs;
static std::string gArgv0;

TEST(LlvmFuzzerTest, OneInput) {
  // Should work with null
  EXPECT_EQ(0, LLVMFuzzerTestOneInput(nullptr, 0));

  //  Should work with non-null but zero size
  uint8_t ignored = 0;
  EXPECT_EQ(0, LLVMFuzzerTestOneInput(&ignored, 0));
}

TEST(LlvmFuzzerTest, SeedCorpus) {
#if defined(__Fuchsia__)
  FX_LOGS(INFO) << "Fuzzer built as test: " << gArgv0;
#endif

  // Should work with any files in directories specified on the command line.
  for (const auto &pathname : gTestInputs) {
    SCOPED_TRACE(pathname);
    std::vector<uint8_t> data;
    ASSERT_TRUE(files::ReadFileToVector(pathname, &data));
    EXPECT_EQ(0, LLVMFuzzerTestOneInput(&data[0], data.size()));
  }
}

TEST(LlvmFuzzerTest, MultipleCalls) {
  // Should work even when called multiple times consecutively
  EXPECT_EQ(0, LLVMFuzzerTestOneInput(nullptr, 0));
  EXPECT_EQ(0, LLVMFuzzerTestOneInput(nullptr, 0));
}

bool ExtractFlag(const std::string &flag, int *argc, char **argv) {
  int len = *argc;
  char **end = argv + len;
  char **src = std::find(argv, end, flag);
  if (src == end) {
    return false;
  }
  char **dst = src++;
  while (src != end) {
    *dst++ = *src++;
  }
  *argc = len - 1;
  return true;
}

}  // namespace fuzzing

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  if (::fuzzing::ExtractFlag("-h", &argc, argv)) {
    std::cout << std::endl << "usage: " << argv[0] << " [-q] <corpus-dir> [...]" << std::endl;
    return 0;
  }
  bool quiet = ::fuzzing::ExtractFlag("-q", &argc, argv);
  for (int i = 1; i < argc; ++i) {
    std::string arg(argv[i]);
    if (arg.empty() || arg[0] == '-') {
      continue;
    }
    if (arg[0] != '/') {
      arg = "/pkg/" + arg;
    }
    if (files::IsFile(arg)) {
      ::fuzzing::gTestInputs.push_back(arg);
      continue;
    }
    std::vector<std::string> corpus;
    if (!files::ReadDirContents(arg, &corpus)) {
      if (!quiet) {
        FX_LOGS(WARNING) << "No such directory: " << arg << std::endl;
      }
      continue;
    }
    for (const auto &filename : corpus) {
      std::string pathname = arg + "/" + filename;
      if (files::IsFile(pathname)) {
        ::fuzzing::gTestInputs.push_back(pathname);
      }
    }
  }
  if (::fuzzing::gTestInputs.size() == 0 && !quiet) {
    FX_LOGS(WARNING) << "No inputs provided." << std::endl;
  } else {
    FX_LOGS(INFO) << "Testing with " << ::fuzzing::gTestInputs.size() << " inputs." << std::endl;
  }

  ::fuzzing::gArgv0 = argv[0];

  return RUN_ALL_TESTS();
}
