No public description PiperOrigin-RevId: 720590342
diff --git a/fuzztest/internal/fixture_driver.h b/fuzztest/internal/fixture_driver.h index 164aa3f..61a1abc 100644 --- a/fuzztest/internal/fixture_driver.h +++ b/fuzztest/internal/fixture_driver.h
@@ -52,6 +52,17 @@ static void TearDownTestSuite() {} }; +class FixtureWithReentrantSetUp { + public: + virtual ~FixtureWithReentrantSetUp() = default; + + virtual void SetUp() = 0; + virtual void TearDown() = 0; + + static void SetUpTestSuite() {} + static void TearDownTestSuite() {} +}; + // Marker interfaces for specifying the fixture's instantiation semantics: // // - Per-iteration semantics: The fixture object is instantiated and discarded
diff --git a/fuzztest/internal/registry.h b/fuzztest/internal/registry.h index a9d201e..c464de1 100644 --- a/fuzztest/internal/registry.h +++ b/fuzztest/internal/registry.h
@@ -34,6 +34,41 @@ namespace fuzztest { namespace internal { +template <typename Fixture, typename = void> +class FuzzTestFuzzerProvider; + +#if defined(FUZZTEST_COMPATIBILITY_MODE) && defined(FUZZTEST_USE_CENTIPEDE) +#error FuzzTest compatibility mode cannot work together with Centipede. +#endif +#if defined(FUZZTEST_COMPATIBILITY_MODE) +template <typename Fixture> +class FuzzTestFuzzerProvider< + Fixture, std::enable_if_t<std::negation_v< + std::is_base_of<FixtureWithReentrantSetUp, Fixture>>>> + : public FuzzTestExternalEngineAdaptor { + public: + using FuzzTestExternalEngineAdaptor::FuzzTestExternalEngineAdaptor; +}; +#elif defined(FUZZTEST_USE_CENTIPEDE) +template <typename Fixture> +class FuzzTestFuzzerProvider< + Fixture, std::enable_if_t<std::negation_v< + std::is_base_of<FixtureWithReentrantSetUp, Fixture>>>> + : public CentipedeFuzzerAdaptor { + public: + using CentipedeFuzzerAdaptor::CentipedeFuzzerAdaptor; +}; +#else +template <typename Fixture> +class FuzzTestFuzzerProvider< + Fixture, std::enable_if_t<std::negation_v< + std::is_base_of<FixtureWithReentrantSetUp, Fixture>>>> + : public FuzzTestFuzzerImpl { + public: + using FuzzTestFuzzerImpl::FuzzTestFuzzerImpl; +}; +#endif + void RegisterImpl(BasicTestInfo test_info, FuzzTestFuzzerFactory factory); void ForEachTest(absl::FunctionRef<void(FuzzTest&)> func); @@ -70,16 +105,7 @@ typename SeedProvider> static FuzzTestFuzzerFactory GetFuzzTestFuzzerFactory( Registration<Fixture, TargetFunction, RegBase, SeedProvider>&& reg) { -#if defined(FUZZTEST_COMPATIBILITY_MODE) && defined(FUZZTEST_USE_CENTIPEDE) -#error FuzzTest compatibility mode cannot work together with Centipede. -#endif -#if defined(FUZZTEST_COMPATIBILITY_MODE) - using FuzzerImpl = FuzzTestExternalEngineAdaptor; -#elif defined(FUZZTEST_USE_CENTIPEDE) - using FuzzerImpl = CentipedeFuzzerAdaptor; -#else - using FuzzerImpl = FuzzTestFuzzerImpl; -#endif + using FuzzerImpl = FuzzTestFuzzerProvider<Fixture>; return [target_function = reg.target_function_, domain = reg.GetDomains(), seeds = reg.seeds(), seed_provider = reg.seed_provider()](