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