| #include "./common/temp_dir.h" | |
| #include <cstdlib> | |
| #include <filesystem> // NOLINT | |
| #include <system_error> // NOLINT | |
| #include "absl/strings/str_cat.h" | |
| #include "absl/strings/string_view.h" | |
| #include "./common/logging.h" | |
| namespace fuzztest::internal { | |
| namespace fs = std::filesystem; | |
| TempDir::TempDir(absl::string_view custom_prefix) { | |
| fs::path temp_root; | |
| temp_root = absl::NullSafeStringView(getenv("TEST_TMPDIR")); | |
| if (temp_root.empty()) { | |
| std::error_code error; | |
| temp_root = std::filesystem::temp_directory_path(error); | |
| FUZZTEST_CHECK(!error) << "Failed to get the root temp directory path: " | |
| << error.message(); | |
| } | |
| absl::string_view prefix = custom_prefix.empty() ? "temp_dir" : custom_prefix; | |
| const fs::path path_template = temp_root / absl::StrCat(prefix, "_XXXXXX"); | |
| #if !defined(_MSC_VER) | |
| path_ = mkdtemp(path_template.string().data()); | |
| #else | |
| FUZZTEST_LOG(FATAL) << "Windows is not supported yet."; | |
| #endif | |
| FUZZTEST_CHECK(std::filesystem::is_directory(path_)); | |
| } | |
| TempDir::~TempDir() { | |
| std::error_code error; | |
| std::filesystem::remove_all(path_, error); | |
| // TODO(b/432413085): Convert to FUZZTEST_CHECK once the bug is fixed. | |
| FUZZTEST_LOG_IF(ERROR, error) << "Unable to clean up temporary dir " << path_ | |
| << ": " << error.message(); | |
| } | |
| } // namespace fuzztest::internal |