Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions domain_tests/arbitrary_domains_flatbuffers_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@
#include "./domain_tests/domain_testing.h"
#include "./fuzztest/flatbuffers.h"
#include "./fuzztest/internal/meta.h"
#include "./fuzztest/internal/test_flatbuffers_64bits_generated.h"
#include "./fuzztest/internal/test_flatbuffers_generated.h"

namespace fuzztest {
namespace {

using ::fuzztest::internal::BoolTable;
using ::fuzztest::internal::DefaultTable;
using ::fuzztest::internal::DefaultTable64;
using ::fuzztest::internal::OptionalTable;
using ::fuzztest::internal::RecursiveTable;
using ::fuzztest::internal::RequiredTable;
Expand Down Expand Up @@ -592,5 +594,29 @@ TEST(FlatbuffersTableDomainImplTest, RecursiveTable) {
ASSERT_THAT(new_table, IsNull());
}

TEST(FlatbuffersTableDomainImplTest, DefaultTable64ValueRoundTrip) {
flatbuffers::FlatBufferBuilder64 fbb;
auto str_offset = fbb.CreateString<flatbuffers::Offset64>("foo bar baz");
auto table_offset = internal::CreateDefaultTable64(fbb, str_offset);
fbb.Finish(table_offset);
auto table = flatbuffers::GetRoot<DefaultTable64>(fbb.GetBufferPointer());

auto domain = Arbitrary<const DefaultTable64*>();
auto corpus = domain.FromValue(table);
ASSERT_TRUE(corpus.has_value());
ASSERT_OK(domain.ValidateCorpusValue(*corpus));

auto ir = domain.SerializeCorpus(corpus.value());

auto new_corpus = domain.ParseCorpus(ir);
ASSERT_TRUE(new_corpus.has_value());
ASSERT_OK(domain.ValidateCorpusValue(*new_corpus));

auto new_table = domain.GetValue(*new_corpus);
ASSERT_THAT(new_table, NotNull());
ASSERT_THAT(new_table->str(), NotNull());
EXPECT_EQ(new_table->str()->str(), "foo bar baz");
}

} // namespace
} // namespace fuzztest
7 changes: 6 additions & 1 deletion fuzztest/internal/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -616,8 +616,13 @@ cc_test(

flatbuffer_library_public(
name = "test_flatbuffers_fbs",
srcs = ["test_flatbuffers.fbs"],
srcs = [
"test_flatbuffers.fbs",
"test_flatbuffers_64bits.fbs",
],
outs = [
"test_flatbuffers_64bits_bfbs_generated.h",
"test_flatbuffers_64bits_generated.h",
"test_flatbuffers_bfbs_generated.h",
"test_flatbuffers_generated.h",
],
Expand Down
1 change: 1 addition & 0 deletions fuzztest/internal/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,7 @@ if (FUZZTEST_BUILD_FLATBUFFERS)
test_flatbuffers_headers
SCHEMAS
"test_flatbuffers.fbs"
"test_flatbuffers_64bits.fbs"
FLAGS
--bfbs-gen-embed --gen-name-strings
TESTONLY
Expand Down
25 changes: 6 additions & 19 deletions fuzztest/internal/domains/flatbuffers_domain_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -136,23 +136,10 @@ uint64_t FlatbuffersTableUntypedDomainImpl::MutateSelectedField(
}

++field_counter;
if (field_counter == selected_field_index) {
VisitFlatbufferField(
schema_, field,
MutateVisitor{*this, prng, metadata, only_shrink, val});
return field_counter;
}

if (field->type()->base_type() == reflection::BaseType::Obj) {
auto sub_object = schema_->objects()->Get(field->type()->index());
if (!sub_object->is_struct()) {
field_counter +=
GetCachedDomain<FlatbuffersTableTag>(field).MutateSelectedField(
val[field->id()], prng, metadata, only_shrink,
selected_field_index - field_counter);
}
// TODO: Add support for structs.
}
VisitFlatbufferField(
schema_, field,
MutateSelectedFieldVisitor{*this, field_counter, val, prng, metadata,
only_shrink, selected_field_index});

if (field_counter >= selected_field_index) {
return field_counter;
Expand Down Expand Up @@ -276,11 +263,11 @@ bool FlatbuffersTableUntypedDomainImpl::IsSupportedField(
}

uint32_t FlatbuffersTableUntypedDomainImpl::BuildTable(
const corpus_type& value, flatbuffers::FlatBufferBuilder& builder) const {
const corpus_type& value, flatbuffers::FlatBufferBuilder64& builder) const {
// Add all the fields to the builder.

// Offsets is the map of field id to its offset in the table.
absl::flat_hash_map<typename corpus_type::key_type, flatbuffers::uoffset_t>
absl::flat_hash_map<typename corpus_type::key_type, flatbuffers::uoffset64_t>
offsets;

// Some fields are stored inline in the flatbuffer table itself (a.k.a
Expand Down
Loading
Loading