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

#include "hammerd/update_fw.h"

namespace hammerd {

class Environment {
 public:
  Environment() { logging::SetMinLogLevel(logging::LOG_FATAL); }
};

class FuzzedUsbEndpoint : public UsbEndpointInterface {
 public:
  explicit FuzzedUsbEndpoint(FuzzedDataProvider* const fuzz)
      : fuzz_provider_(fuzz) {}
  ~FuzzedUsbEndpoint() override = default;

  void Close() override {}
  bool UsbSysfsExists() override { return true; }
  UsbConnectStatus Connect() override { return UsbConnectStatus::kSuccess; }
  bool IsConnected() const override { return true; }
  std::string GetConfigurationString() const override { return "fake"; }

  int GetChunkLength() const override {
    // wMaxPacketSize in USB spec is 2 bytes
    return fuzz_provider_->ConsumeIntegral<uint16_t>();
  }

  int Transfer(const void* outbuf,
               int outlen,
               void* inbuf,
               int inlen,
               bool allow_less,
               unsigned int timeout_ms) override {
    if (inlen == 0)
      return 0;
    return Receive(inbuf, inlen, allow_less, timeout_ms);
  }

  int Send(const void* outbuf, int outlen, unsigned int timeout_ms) override {
    // Just ignore
    return 0;
  }

  int Receive(void* inbuf,
              int inlen,
              bool allow_less,
              unsigned int timeout_ms) override {
    constexpr int kError = -1;
    size_t remaining_bytes = fuzz_provider_->remaining_bytes();
    if (remaining_bytes < inlen) {
      if (!allow_less)
        return kError;
      inbuf = fuzz_provider_->ConsumeRemainingBytes<uint8_t>().data();
      return remaining_bytes;
    }

    inbuf = fuzz_provider_->ConsumeBytes<uint8_t>(inlen).data();
    return inlen;
  }

 private:
  FuzzedDataProvider* const fuzz_provider_;
};

namespace {

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  static Environment env;
  uint8_t resp[255];
  constexpr int max_cmd_body_len = 1024;

  FuzzedDataProvider data_provider(data, size);
  FirmwareUpdater fw_updater_(
      std::make_unique<FuzzedUsbEndpoint>(&data_provider));

  fw_updater_.TryConnectUsb();
  fw_updater_.SendSubcommand(data_provider.ConsumeEnum<UpdateExtraCommand>());
  fw_updater_.InjectEntropyWithPayload(
      data_provider.ConsumeBytesAsString(kEntropySize));
  fw_updater_.SendSubcommandReceiveResponse(
      data_provider.ConsumeEnum<UpdateExtraCommand>(),
      data_provider.ConsumeRandomLengthString(max_cmd_body_len), &resp,
      sizeof(resp));
  // TODO(swboyd): Implement below
  // fw_updater_.TransferImage();

  return 0;
}
}  // namespace
}  // namespace hammerd
