From 85e07aa6e060747ca3613d0eecad16a92c89d9ab Mon Sep 17 00:00:00 2001 From: Xinhao Yuan Date: Fri, 7 Feb 2025 12:26:10 -0800 Subject: [PATCH] Fix the fixture to properly run the workflow exactly once for each param. Tested with extra logging in RunUpdateCorpusDatabase(). PiperOrigin-RevId: 724433749 --- e2e_tests/BUILD | 1 + e2e_tests/corpus_database_test.cc | 41 +++++++++++++++++-------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/e2e_tests/BUILD b/e2e_tests/BUILD index 516eb204..f662ec35 100644 --- a/e2e_tests/BUILD +++ b/e2e_tests/BUILD @@ -120,6 +120,7 @@ cc_test( deps = [ ":test_binary_util", "@com_google_absl//absl/base:no_destructor", + "@com_google_absl//absl/container:flat_hash_map", "@com_google_absl//absl/log:check", "@com_google_absl//absl/status", "@com_google_absl//absl/status:statusor", diff --git a/e2e_tests/corpus_database_test.cc b/e2e_tests/corpus_database_test.cc index 608a9c60..77bbe0e2 100644 --- a/e2e_tests/corpus_database_test.cc +++ b/e2e_tests/corpus_database_test.cc @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include #include // NOLINT +#include #include #include #include @@ -21,6 +21,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/base/no_destructor.h" +#include "absl/container/flat_hash_map.h" #include "absl/log/check.h" #include "absl/status/status.h" #include "absl/status/statusor.h" @@ -60,6 +61,11 @@ enum class ExecutionModelParam { kWithCentipedeBinary, }; +struct UpdateCorpusDatabaseRunInfo { + std::unique_ptr workspace; + std::string std_err; +}; + class UpdateCorpusDatabaseTest : public ::testing::TestWithParam { protected: @@ -74,36 +80,34 @@ class UpdateCorpusDatabaseTest "Please run with --config=fuzztest-experimental."; #endif #endif - CHECK(temp_dir_ == nullptr); } static void RunUpdateCorpusDatabase() { - if (temp_dir_ != nullptr) return; - temp_dir_ = new TempDir(); + if (run_info_map_->contains(GetParam())) return; + auto &run_info = (*run_info_map_)[GetParam()]; + run_info.workspace = std::make_unique(); RunOptions run_options; run_options.fuzztest_flags = { {"corpus_database", GetCorpusDatabasePath()}, {"fuzz_for", "30s"}, {"jobs", "2"}, }; - auto [status, std_out, std_err] = RunBinaryMaybeWithCentipede( - GetCorpusDatabaseTestingBinaryPath(), run_options); - *update_corpus_database_std_err_ = std::move(std_err); + const auto [status_unused, std_out_unused, std_err] = + RunBinaryMaybeWithCentipede(GetCorpusDatabaseTestingBinaryPath(), + run_options); + run_info.std_err = std::move(std_err); } - static void TearDownTestSuite() { - delete temp_dir_; - temp_dir_ = nullptr; - } + static void TearDownTestSuite() { run_info_map_->clear(); } static std::string GetCorpusDatabasePath() { RunUpdateCorpusDatabase(); - return temp_dir_->path() / "corpus_database"; + return (*run_info_map_)[GetParam()].workspace->path() / "corpus_database"; } static absl::string_view GetUpdateCorpusDatabaseStdErr() { RunUpdateCorpusDatabase(); - return *update_corpus_database_std_err_; + return (*run_info_map_)[GetParam()].std_err; } static RunResults RunBinaryMaybeWithCentipede(absl::string_view binary_path, @@ -135,13 +139,14 @@ class UpdateCorpusDatabaseTest } private: - static TempDir *temp_dir_; - static absl::NoDestructor update_corpus_database_std_err_; + static absl::NoDestructor< + absl::flat_hash_map> + run_info_map_; }; -TempDir *UpdateCorpusDatabaseTest::temp_dir_ = nullptr; -absl::NoDestructor - UpdateCorpusDatabaseTest::update_corpus_database_std_err_{}; +absl::NoDestructor< + absl::flat_hash_map> + UpdateCorpusDatabaseTest::run_info_map_{}; TEST_P(UpdateCorpusDatabaseTest, RunsFuzzTests) { EXPECT_THAT(GetUpdateCorpusDatabaseStdErr(),