// Copyright 2020 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.

#ifndef SRC_LIB_FUZZING_FIDL_TEST_INPUT_H_
#define SRC_LIB_FUZZING_FIDL_TEST_INPUT_H_

#include <lib/fxl/macros.h>
#include <lib/zx/vmo.h>
#include <stddef.h>
#include <stdint.h>
#include <zircon/types.h>

#include "shared-memory.h"

namespace fuzzing {

// This class is a specialization of |SharedMemory| that has a fixed size matching the largest input
// that can be generated by libFuzzer, and that has utility methods to read and write its data.
class TestInput final : public SharedMemory {
 public:
  static const size_t kVmoSize = 1 << 20;  // Matches libFuzzer's "kMaxSaneLen".
  static const size_t kMaxInputSize;

  TestInput();
  ~TestInput() override;

  const uint8_t *data() const { return data_; }
  size_t size() const { return size_ ? *size_ : 0; }

  // Creates a new VMO and maps it. If |len| is provided, it MUST be kVmoSize.
  zx_status_t Create(size_t len = kVmoSize) override;

  // Maps |vmo| as the backing shared memory for this test input. If |len| is provided, it MUST be
  // kVmoSize.
  zx_status_t Link(const zx::vmo &vmo, size_t len = kVmoSize) override;

  // If a VMO is mapped, appends |size| bytes of |data| to it.
  zx_status_t Write(const void *data, size_t size) const;

  // If a VMO is mapped, sets the input size to 0.
  zx_status_t Clear() const;

 private:
  uint8_t *data_ = nullptr;
  uint64_t *size_ = nullptr;

  FXL_DISALLOW_COPY_ASSIGN_AND_MOVE(TestInput);
};

}  // namespace fuzzing

#endif  // SRC_LIB_FUZZING_FIDL_TEST_INPUT_H_
