// 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 <base/json/json_reader.h>
#include <fuzzer/FuzzedDataProvider.h>
#include <stddef.h>
#include <stdint.h>

#include <string>

#include "runtime_probe/probe_function.h"
#include "runtime_probe/probe_result_checker.h"
#include "runtime_probe/runtime_probe_fuzzer_helper.h"

using std::string;

namespace runtime_probe {

struct Environment {
  Environment() {
    logging::SetMinLogLevel(logging::LOG_FATAL);  // Disable logging.
  }
};

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

  string ops[6] = {"!eq ", "!ne ", "!gt ", "!ge ", "!lt ", "!le "};
  FuzzedDataProvider fuzz_data(data, size);

  string rule;
  if (fuzz_data.ConsumeBool()) {
    int8_t op = fuzz_data.ConsumeIntegralInRange<int8_t>(0, 5);
    string str = fuzz_data.ConsumeRandomLengthString(10) + "?";
    rule = R"(, ")" + ops[op] + JsonSafe(str) + R"(" )";
  }

  const auto expect_string = R"({
    "str": [true, "str")" + rule +
                             R"(],
    "int": [true, "int"],
    "double": [true, "double"],
    "hex": [true, "hex"]
  })";

  string str[4] = {fuzz_data.ConsumeRandomLengthString(30),
                   fuzz_data.ConsumeRandomLengthString(30),
                   fuzz_data.ConsumeRandomLengthString(30),
                   fuzz_data.ConsumeRandomLengthString(30)};

  const auto probe_result_string = R"({
    "str": ")" + JsonSafe(str[0]) + R"(",
    "int": ")" + JsonSafe(str[1]) + R"(",
    "double": ")" + JsonSafe(str[2]) +
                                   R"(",
    "hex": ")" + JsonSafe(str[3]) + R"("
  })";

  auto expect = base::JSONReader::Read(expect_string);
  if (!expect.has_value())
    return 0;

  auto probe_result = base::JSONReader::Read(probe_result_string);
  if (!probe_result.has_value())
    return 0;

  auto checker = ProbeResultChecker::FromValue(*expect);
  if (checker == nullptr)
    return 0;

  checker->Apply(&*probe_result);
  return 0;
}

}  // namespace runtime_probe
