diff --git a/llvm/include/llvm/Testing/Support/SupportHelpers.h b/llvm/include/llvm/Testing/Support/SupportHelpers.h index 2419fc95d8178c..ec1485bf0f16ba 100644 --- a/llvm/include/llvm/Testing/Support/SupportHelpers.h +++ b/llvm/include/llvm/Testing/Support/SupportHelpers.h @@ -238,6 +238,12 @@ class TempFile { } } + TempFile(const TempFile &) = delete; + TempFile &operator=(const TempFile &) = delete; + + TempFile(TempFile &&) = default; + TempFile &operator=(TempFile &&) = default; + /// The path to the file. StringRef path() const { return Path; } }; diff --git a/llvm/unittests/CMakeLists.txt b/llvm/unittests/CMakeLists.txt index 99782949b25593..c372aa7a91734a 100644 --- a/llvm/unittests/CMakeLists.txt +++ b/llvm/unittests/CMakeLists.txt @@ -45,6 +45,7 @@ add_subdirectory(ProfileData) add_subdirectory(Support) add_subdirectory(TableGen) add_subdirectory(Target) +add_subdirectory(Testing) add_subdirectory(TextAPI) add_subdirectory(Transforms) add_subdirectory(XRay) diff --git a/llvm/unittests/Testing/CMakeLists.txt b/llvm/unittests/Testing/CMakeLists.txt new file mode 100644 index 00000000000000..fc23e64eeb7a43 --- /dev/null +++ b/llvm/unittests/Testing/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(Support) diff --git a/llvm/unittests/Testing/Support/CMakeLists.txt b/llvm/unittests/Testing/Support/CMakeLists.txt new file mode 100644 index 00000000000000..b2d2b1bda82ffe --- /dev/null +++ b/llvm/unittests/Testing/Support/CMakeLists.txt @@ -0,0 +1,10 @@ +set(LLVM_LINK_COMPONENTS + Support + TestingSupport + ) + +add_llvm_unittest(TestingSupportTests + TempPathTest.cpp + ) + +target_link_libraries(TestingSupportTests PRIVATE LLVMTestingSupport) diff --git a/llvm/unittests/Testing/Support/TempPathTest.cpp b/llvm/unittests/Testing/Support/TempPathTest.cpp new file mode 100644 index 00000000000000..830221c30d7c2d --- /dev/null +++ b/llvm/unittests/Testing/Support/TempPathTest.cpp @@ -0,0 +1,100 @@ +//===- TempPathTest.cpp ---------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Testing/Support/SupportHelpers.h" +#include "gtest/gtest.h" + +using namespace llvm; +using llvm::unittest::TempDir; +using llvm::unittest::TempFile; +using llvm::unittest::TempLink; + +namespace { + +TEST(TempPathTest, TempDir) { + Optional Dir1, Dir2; + StringRef Prefix = "temp-path-test"; + Dir1.emplace(Prefix, /*Unique=*/true); + EXPECT_EQ(Prefix, + sys::path::filename(Dir1->path()).take_front(Prefix.size())); + EXPECT_NE(Prefix, sys::path::filename(Dir1->path())); + + std::string Path = Dir1->path().str(); + ASSERT_TRUE(sys::fs::exists(Path)); + + Dir2 = std::move(*Dir1); + ASSERT_EQ(Path, Dir2->path()); + ASSERT_TRUE(sys::fs::exists(Path)); + + Dir1 = None; + ASSERT_TRUE(sys::fs::exists(Path)); + + Dir2 = None; + ASSERT_FALSE(sys::fs::exists(Path)); +} + +TEST(TempPathTest, TempFile) { + TempDir D("temp-path-test", /*Unique=*/true); + ASSERT_TRUE(sys::fs::exists(D.path())); + + Optional File1, File2; + File1.emplace(D.path("file"), "suffix", "content"); + EXPECT_EQ("file.suffix", sys::path::filename(File1->path())); + { + ErrorOr> Buffer = + MemoryBuffer::getFile(File1->path()); + ASSERT_TRUE(Buffer); + ASSERT_EQ("content", (*Buffer)->getBuffer()); + } + + std::string Path = File1->path().str(); + ASSERT_TRUE(sys::fs::exists(Path)); + + File2 = std::move(*File1); + ASSERT_EQ(Path, File2->path()); + ASSERT_TRUE(sys::fs::exists(Path)); + + File1 = None; + ASSERT_TRUE(sys::fs::exists(Path)); + + File2 = None; + ASSERT_FALSE(sys::fs::exists(Path)); +} + +TEST(TempPathTest, TempLink) { + TempDir D("temp-path-test", /*Unique=*/true); + ASSERT_TRUE(sys::fs::exists(D.path())); + TempFile File(D.path("file"), "suffix", "content"); + + Optional Link1, Link2; + Link1.emplace(File.path(), D.path("link")); + EXPECT_EQ("link", sys::path::filename(Link1->path())); + { + ErrorOr> Buffer = + MemoryBuffer::getFile(Link1->path()); + ASSERT_TRUE(Buffer); + ASSERT_EQ("content", (*Buffer)->getBuffer()); + } + + std::string Path = Link1->path().str(); + ASSERT_TRUE(sys::fs::exists(Path)); + + Link2 = std::move(*Link1); + ASSERT_EQ(Path, Link2->path()); + ASSERT_TRUE(sys::fs::exists(Path)); + + Link1 = None; + ASSERT_TRUE(sys::fs::exists(Path)); + + Link2 = None; + ASSERT_FALSE(sys::fs::exists(Path)); +} + +} // namespace