blob: 99137dcdf37f34d7576346a04e84ded41c65bef0 [file] [log] [blame]
// Copyright 2021 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 "src/sys/fuzzing/common/input.h"
#include <gtest/gtest.h>
namespace fuzzing {
namespace {
TEST(InputTest, DefaultConstructor) {
Input input;
EXPECT_EQ(input.size(), 0U);
EXPECT_EQ(input.data(), nullptr);
}
TEST(InputTest, VectorConstructor) {
std::vector<uint8_t> bytes = {0xde, 0xad, 0xbe, 0xef};
Input input(bytes);
ASSERT_EQ(input.size(), bytes.size());
EXPECT_EQ(memcmp(input.data(), bytes.data(), bytes.size()), 0);
}
TEST(InputTest, Compare) {
Input input({0xde, 0xad, 0xbe, 0xef});
input.set_num_features(3);
// First compare using length, with shorter first.
Input input1({0xde, 0xad, 0xbe});
EXPECT_GT(input, input1);
Input input2({0xde, 0xad, 0xbe, 0xef, 0x00});
EXPECT_LT(input, input2);
// Next compare using features, with more features first.
Input input3({0xde, 0xad, 0xbe, 0xef});
input3.set_num_features(2);
EXPECT_LT(input, input3);
Input input4({0xde, 0xad, 0xbe, 0xef});
input4.set_num_features(4);
EXPECT_GT(input, input4);
// Finally, compare lexicographically.
Input input5({0xde, 0xad, 0xbe, 0xee});
input5.set_num_features(3);
EXPECT_GT(input, input5);
Input input6({0xde, 0xad, 0xbe, 0xf0});
input6.set_num_features(3);
EXPECT_LT(input, input6);
Input input7({0xde, 0xad, 0xbe, 0xef});
input7.set_num_features(3);
EXPECT_EQ(input, input7);
}
TEST(InputTest, ToHex) {
Input input({0xde, 0xad, 0xbe, 0xef});
EXPECT_EQ(input.ToHex(), std::string("deadbeef"));
}
TEST(InputTest, Duplicate) {
Input input1({0xfe, 0xed, 0xfa, 0xce});
input1.set_num_features(5);
auto input2 = input1.Duplicate();
EXPECT_EQ(input1.ToHex(), input2.ToHex());
EXPECT_EQ(input2.num_features(), 5U);
Input input3;
input3.Duplicate(input1);
EXPECT_EQ(input1.ToHex(), input3.ToHex());
EXPECT_EQ(input3.num_features(), 5U);
}
TEST(InputTest, StringConstructor) {
Input input1({0xde, 0xad, 0xbe, 0xef});
Input input2("\xde\xad\xbe\xef");
EXPECT_EQ(input1.ToHex(), input2.ToHex());
}
TEST(InputTest, SharedMemoryConstructor) {
Input input1({0xde, 0xad, 0xbe, 0xef});
SharedMemory shmem;
EXPECT_EQ(shmem.Reserve(input1.size()), ZX_OK);
EXPECT_EQ(shmem.Write(input1.data(), input1.size()), ZX_OK);
Input input2(shmem);
EXPECT_EQ(input1.ToHex(), input2.ToHex());
}
TEST(InputTest, SizeConstructor) {
Input input1({0x00, 0x00, 0x00});
Input input2(3);
EXPECT_EQ(input1.ToHex(), input2.ToHex());
}
TEST(InputTest, MoveAssignment) {
Input input1({0xde, 0xad, 0xbe, 0xef});
auto input2 = input1.Duplicate();
input2.set_num_features(7);
Input input3;
input3 = std::move(input2);
EXPECT_EQ(input1.ToHex(), input3.ToHex());
EXPECT_EQ(input3.num_features(), 7U);
}
TEST(InputTest, MoveConstructor) {
Input input1({0xde, 0xad, 0xbe, 0xef});
input1.set_num_features(11);
auto input2 = input1.Duplicate();
Input input3(std::move(input1));
EXPECT_EQ(input2.ToHex(), input3.ToHex());
EXPECT_EQ(input3.num_features(), 11U);
}
TEST(InputTest, ReserveWriteAndTruncate) {
Input input1({0xfe, 0xed, 0xfa, 0xce});
Input input2;
input2.Reserve(1);
EXPECT_EQ(input2.capacity(), 1U);
input2.Write(input1.data()[0]);
auto input3 = input1.Duplicate();
input3.Truncate(1);
EXPECT_EQ(input2.ToHex(), input3.ToHex());
}
TEST(InputTest, ReserveWriteAndShrink) {
Input input1({0xfe, 0xed, 0xfa, 0xce});
Input input2;
input2.Reserve(8);
EXPECT_EQ(input2.capacity(), 8U);
input2.Write(input1.data(), input1.size());
EXPECT_EQ(input1.ToHex(), input2.ToHex());
input2.ShrinkToFit();
EXPECT_EQ(input2.capacity(), 4U);
EXPECT_EQ(input1.ToHex(), input2.ToHex());
}
TEST(InputTest, Clear) {
Input input({0xfe, 0xed, 0xfa, 0xce});
input.Clear();
// Sets size of valid data to 0...
EXPECT_EQ(input.size(), 0U);
// ..but doesn't touch capacity or the actual allocation.
EXPECT_NE(input.data(), nullptr);
EXPECT_EQ(input.capacity(), 4U);
}
} // namespace
} // namespace fuzzing