// 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 "fuzz_input.h"

#include <cstdint>
#include <cstdlib>

#include <gtest/gtest.h>

namespace {

using namespace fuzzing;

TEST(FuzzInputTest, CantCopyBytesToNull) {
  uint8_t data[] = {0x00, 0x01, 0x02, 0x03};
  FuzzInput src(static_cast<uint8_t*>(data), 4);
  EXPECT_FALSE(src.CopyBytes(nullptr, 4));
}

TEST(FuzzInputTest, CantCopyObjectToNull) {
  uint8_t data[] = {0x00, 0x01, 0x02, 0x03};
  FuzzInput src(static_cast<uint8_t*>(data), 4);
  uint8_t* out = nullptr;
  EXPECT_FALSE(src.CopyObject(out));
}

TEST(FuzzInputTest, CanTakeBytes) {
  uint8_t data[] = {0x00, 0x01, 0x02, 0x03};
  FuzzInput src(static_cast<uint8_t*>(data), 4);
  const uint8_t* ret = src.TakeBytes(4);
  EXPECT_NE(nullptr, ret);
}

TEST(FuzzInputTest, CantTakeBytesTooBig) {
  uint8_t data[] = {0x00, 0x01, 0x02, 0x03};
  FuzzInput src(static_cast<uint8_t*>(data), 4);
  const uint8_t* ret = src.TakeBytes(5);
  EXPECT_EQ(nullptr, ret);
}

TEST(FuzzInputTest, CanCopy) {
  int value = 1;
  int* data = reinterpret_cast<int*>(malloc(sizeof(value)));
  *data = 2;
  FuzzInput src(reinterpret_cast<uint8_t*>(data), sizeof(value));
  EXPECT_TRUE(src.CopyObject(&value));
  EXPECT_EQ(2, value);
  free(data);
}

TEST(FuzzInputTest, CantCopyTooBig) {
  int value = 1;
  uint8_t* data = reinterpret_cast<uint8_t*>(malloc(sizeof(value) - 1));
  FuzzInput src(data, sizeof(value) - 1);
  EXPECT_FALSE(src.CopyObject(&value));
  free(data);
}

TEST(FuzzInputTest, TakeBytesAndCopyAccumulate) {
  int i;
  long l;
  const uint8_t* three_bytes_ptr = nullptr;
  uint8_t one_byte;
  const uint8_t* one_byte_ptr = nullptr;
  uint8_t* data = reinterpret_cast<uint8_t*>(malloc(sizeof(int) + sizeof(long) + 3));
  FuzzInput src(data, sizeof(int) + sizeof(long) + 3);
  EXPECT_TRUE(src.CopyObject(&i));
  EXPECT_TRUE(src.CopyObject(&l));
  three_bytes_ptr = src.TakeBytes(3);
  EXPECT_NE(nullptr, three_bytes_ptr);
  one_byte_ptr = src.TakeBytes(1);
  EXPECT_EQ(nullptr, one_byte_ptr);
  EXPECT_FALSE(src.CopyObject(&one_byte));
  free(data);
}

}  // namespace
