Testing: Make TempFile safe to move; test Temp{Dir,File,Link}

Default the moves and delete the copies for TempFile, matching TempDir
and TempLink, and add tests for all of them to confirm that the
destructor is not harmful after it has been moved from.

Differential Revision: https://reviews.llvm.org/D120691
This commit is contained in:
Duncan P. N. Exon Smith 2022-02-28 16:47:29 -08:00
parent 736c6e246f
commit 15ab7bc3af
5 changed files with 118 additions and 0 deletions

View File

@ -238,6 +238,12 @@ public:
}
}
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; }
};

View File

@ -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)

View File

@ -0,0 +1 @@
add_subdirectory(Support)

View File

@ -0,0 +1,10 @@
set(LLVM_LINK_COMPONENTS
Support
TestingSupport
)
add_llvm_unittest(TestingSupportTests
TempPathTest.cpp
)
target_link_libraries(TestingSupportTests PRIVATE LLVMTestingSupport)

View File

@ -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<TempDir> 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<TempFile> File1, File2;
File1.emplace(D.path("file"), "suffix", "content");
EXPECT_EQ("file.suffix", sys::path::filename(File1->path()));
{
ErrorOr<std::unique_ptr<MemoryBuffer>> 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<TempLink> Link1, Link2;
Link1.emplace(File.path(), D.path("link"));
EXPECT_EQ("link", sys::path::filename(Link1->path()));
{
ErrorOr<std::unique_ptr<MemoryBuffer>> 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