|  | // 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 |