forked from OSchip/llvm-project
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:
parent
736c6e246f
commit
15ab7bc3af
|
@ -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; }
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
add_subdirectory(Support)
|
|
@ -0,0 +1,10 @@
|
|||
set(LLVM_LINK_COMPONENTS
|
||||
Support
|
||||
TestingSupport
|
||||
)
|
||||
|
||||
add_llvm_unittest(TestingSupportTests
|
||||
TempPathTest.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(TestingSupportTests PRIVATE LLVMTestingSupport)
|
|
@ -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
|
Loading…
Reference in New Issue