[PATCH] D143415: LibclangTest: remove libclang-test-* tmp dir reliably

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 1 06:45:48 PST 2023


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG3eceab95f314: LibclangTest: remove libclang-test-* tmp dir reliably (authored by vedgy, committed by aaron.ballman).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143415/new/

https://reviews.llvm.org/D143415

Files:
  clang/unittests/libclang/LibclangTest.cpp
  clang/unittests/libclang/TestUtils.h


Index: clang/unittests/libclang/TestUtils.h
===================================================================
--- clang/unittests/libclang/TestUtils.h
+++ clang/unittests/libclang/TestUtils.h
@@ -14,18 +14,21 @@
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Path.h"
 
+#include "gtest/gtest.h"
 #include <fstream>
+#include <functional>
 #include <memory>
 #include <string>
 #include <vector>
-#include "gtest/gtest.h"
 
 class LibclangParseTest : public ::testing::Test {
-  std::set<std::string> Files;
+  // std::greater<> to remove files before their parent dirs in TearDown().
+  std::set<std::string, std::greater<>> Files;
   typedef std::unique_ptr<std::string> fixed_addr_string;
   std::map<fixed_addr_string, fixed_addr_string> UnsavedFileContents;
 public:
   std::string TestDir;
+  bool RemoveTestDirRecursivelyDuringTeardown = false;
   CXIndex Index;
   CXTranslationUnit ClangTU;
   unsigned TUFlags;
@@ -43,16 +46,26 @@
   void TearDown() override {
     clang_disposeTranslationUnit(ClangTU);
     clang_disposeIndex(Index);
+
+    namespace fs = llvm::sys::fs;
     for (const std::string &Path : Files)
-      llvm::sys::fs::remove(Path);
-    llvm::sys::fs::remove(TestDir);
+      EXPECT_FALSE(fs::remove(Path, /*IgnoreNonExisting=*/false));
+    if (RemoveTestDirRecursivelyDuringTeardown)
+      EXPECT_FALSE(fs::remove_directories(TestDir, /*IgnoreErrors=*/false));
+    else
+      EXPECT_FALSE(fs::remove(TestDir, /*IgnoreNonExisting=*/false));
   }
   void WriteFile(std::string &Filename, const std::string &Contents) {
     if (!llvm::sys::path::is_absolute(Filename)) {
       llvm::SmallString<256> Path(TestDir);
-      llvm::sys::path::append(Path, Filename);
+      namespace path = llvm::sys::path;
+      for (auto FileI = path::begin(Filename), FileEnd = path::end(Filename);
+           FileI != FileEnd; ++FileI) {
+        ASSERT_NE(*FileI, ".");
+        path::append(Path, *FileI);
+        Files.emplace(Path.str());
+      }
       Filename = std::string(Path.str());
-      Files.insert(Filename);
     }
     llvm::sys::fs::create_directories(llvm::sys::path::parent_path(Filename));
     std::ofstream OS(Filename);
Index: clang/unittests/libclang/LibclangTest.cpp
===================================================================
--- clang/unittests/libclang/LibclangTest.cpp
+++ clang/unittests/libclang/LibclangTest.cpp
@@ -515,6 +515,8 @@
   WriteFile(HeaderName, std::string(HeaderTop) + HeaderBottom);
   WriteFile(ModName, ModFile);
 
+  // Removing recursively is necessary to delete the module cache.
+  RemoveTestDirRecursivelyDuringTeardown = true;
   std::string ModulesCache = std::string("-fmodules-cache-path=") + TestDir;
   const char *Args[] = { "-fmodules", ModulesCache.c_str(),
                          "-I", TestDir.c_str() };


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143415.501496.patch
Type: text/x-patch
Size: 2820 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230301/c59790d0/attachment.bin>


More information about the cfe-commits mailing list