Skip to content
Merged
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
1 change: 0 additions & 1 deletion domain_tests/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ cc_test(
"@abseil-cpp//absl/status",
"@com_google_fuzztest//fuzztest:domain",
"@com_google_fuzztest//fuzztest:flatbuffers",
"@com_google_fuzztest//fuzztest:fuzztest_macros",
"@com_google_fuzztest//fuzztest/internal:meta",
"@com_google_fuzztest//fuzztest/internal:test_flatbuffers_cc_fbs",
"@flatbuffers//:runtime_cc",
Expand Down
1 change: 0 additions & 1 deletion domain_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ if (FUZZTEST_BUILD_FLATBUFFERS)
fuzztest::domain
fuzztest::domain_testing
fuzztest::flatbuffers
fuzztest::fuzztest_macros
GTest::gmock_main
fuzztest_test_flatbuffers_headers
)
Expand Down
23 changes: 7 additions & 16 deletions domain_tests/arbitrary_domains_flatbuffers_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -213,26 +213,17 @@ TEST(FlatbuffersEnumDomainImplTest, InvalidEnumValuesAreRejected) {
internal::FlatbuffersEnumDomainImpl<uint8_t>(enum_def).WithExcludedValues(
{internal::ByteEnum_First});
{
auto invalid_value =
static_cast<internal::FlatbuffersEnumDomainImpl<uint8_t>::corpus_type>(
internal::ByteEnum_MIN - 1);

EXPECT_THAT(domain.ValidateCorpusValue(invalid_value),
StatusIs(absl::StatusCode::kInvalidArgument));
auto invalid_corpus_value = domain.FromValue(internal::ByteEnum_First);
EXPECT_FALSE(invalid_corpus_value.has_value());
}
{
auto invalid_value =
static_cast<internal::FlatbuffersEnumDomainImpl<uint8_t>::corpus_type>(
internal::ByteEnum_MAX + 1);

EXPECT_THAT(domain.ValidateCorpusValue(invalid_value),
StatusIs(absl::StatusCode::kInvalidArgument));
auto invalid_corpus_value = domain.FromValue(internal::ByteEnum_MAX + 1);
EXPECT_FALSE(invalid_corpus_value.has_value());
}
{
auto invalid_value =
static_cast<internal::FlatbuffersEnumDomainImpl<uint8_t>::corpus_type>(
internal::ByteEnum_First);
EXPECT_THAT(domain.ValidateCorpusValue(invalid_value),
EXPECT_THAT(domain.ValidateCorpusValue(
internal::corpus_type_t<
internal::FlatbuffersEnumDomainImpl<uint8_t>>(255ul)),
StatusIs(absl::StatusCode::kInvalidArgument));
}
}
Expand Down
21 changes: 6 additions & 15 deletions fuzztest/internal/domains/flatbuffers_domain_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#define FUZZTEST_FUZZTEST_INTERNAL_DOMAINS_FLATBUFFERS_DOMAIN_IMPL_H_

#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <initializer_list>
#include <limits>
Expand Down Expand Up @@ -187,11 +186,11 @@ auto VisitFlatbufferField(const reflection::Schema* absl_nonnull schema,
}

// Flatbuffers enum domain implementation.
template <typename Underlaying>
template <typename Underlying>
class FlatbuffersEnumDomainImpl
: public domain_implementor::DomainBase<
/*Derived=*/FlatbuffersEnumDomainImpl<Underlaying>,
/*ValueType=*/Underlaying,
/*Derived=*/FlatbuffersEnumDomainImpl<Underlying>,
/*ValueType=*/Underlying,
/*CorpusType=*/ElementOfImplCorpusType> {
public:
using typename FlatbuffersEnumDomainImpl::DomainBase::corpus_type;
Expand All @@ -204,7 +203,7 @@ class FlatbuffersEnumDomainImpl
std::initializer_list<value_type> excluded_values) {
excluded_values_ = {excluded_values.begin(), excluded_values.end()};
inner_ =
ElementOfImpl<Underlaying>(GetEnumValues(enum_def_, excluded_values));
ElementOfImpl<Underlying>(GetEnumValues(enum_def_, excluded_values));
return *this;
}

Expand Down Expand Up @@ -236,23 +235,15 @@ class FlatbuffersEnumDomainImpl
}

absl::Status ValidateCorpusValue(const corpus_type& corpus_value) const {
for (const auto* value : *enum_def_->values()) {
if (excluded_values_.contains(value->value())) continue;
if (value->value() == static_cast<size_t>(corpus_value)) {
return absl::OkStatus();
}
}
return absl::InvalidArgumentError(absl::StrCat("Enum value ", corpus_value,
" is not valid for enum ",
enum_def_->name()->str()));
return inner_.ValidateCorpusValue(corpus_value);
}

auto GetPrinter() const { return Printer{*this}; }

private:
const reflection::Enum* enum_def_;
absl::flat_hash_set<value_type> excluded_values_;
ElementOfImpl<Underlaying> inner_;
ElementOfImpl<Underlying> inner_;

static std::vector<value_type> GetEnumValues(
const reflection::Enum* enum_def,
Expand Down
Loading