1*15ab7bc3SDuncan P. N. Exon Smith //===- TempPathTest.cpp ---------------------------------------------------===//
2*15ab7bc3SDuncan P. N. Exon Smith //
3*15ab7bc3SDuncan P. N. Exon Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*15ab7bc3SDuncan P. N. Exon Smith // See https://llvm.org/LICENSE.txt for license information.
5*15ab7bc3SDuncan P. N. Exon Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*15ab7bc3SDuncan P. N. Exon Smith //
7*15ab7bc3SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===//
8*15ab7bc3SDuncan P. N. Exon Smith 
9*15ab7bc3SDuncan P. N. Exon Smith #include "llvm/Support/FileSystem.h"
10*15ab7bc3SDuncan P. N. Exon Smith #include "llvm/Support/MemoryBuffer.h"
11*15ab7bc3SDuncan P. N. Exon Smith #include "llvm/Testing/Support/SupportHelpers.h"
12*15ab7bc3SDuncan P. N. Exon Smith #include "gtest/gtest.h"
13*15ab7bc3SDuncan P. N. Exon Smith 
14*15ab7bc3SDuncan P. N. Exon Smith using namespace llvm;
15*15ab7bc3SDuncan P. N. Exon Smith using llvm::unittest::TempDir;
16*15ab7bc3SDuncan P. N. Exon Smith using llvm::unittest::TempFile;
17*15ab7bc3SDuncan P. N. Exon Smith using llvm::unittest::TempLink;
18*15ab7bc3SDuncan P. N. Exon Smith 
19*15ab7bc3SDuncan P. N. Exon Smith namespace {
20*15ab7bc3SDuncan P. N. Exon Smith 
TEST(TempPathTest,TempDir)21*15ab7bc3SDuncan P. N. Exon Smith TEST(TempPathTest, TempDir) {
22*15ab7bc3SDuncan P. N. Exon Smith   Optional<TempDir> Dir1, Dir2;
23*15ab7bc3SDuncan P. N. Exon Smith   StringRef Prefix = "temp-path-test";
24*15ab7bc3SDuncan P. N. Exon Smith   Dir1.emplace(Prefix, /*Unique=*/true);
25*15ab7bc3SDuncan P. N. Exon Smith   EXPECT_EQ(Prefix,
26*15ab7bc3SDuncan P. N. Exon Smith             sys::path::filename(Dir1->path()).take_front(Prefix.size()));
27*15ab7bc3SDuncan P. N. Exon Smith   EXPECT_NE(Prefix, sys::path::filename(Dir1->path()));
28*15ab7bc3SDuncan P. N. Exon Smith 
29*15ab7bc3SDuncan P. N. Exon Smith   std::string Path = Dir1->path().str();
30*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
31*15ab7bc3SDuncan P. N. Exon Smith 
32*15ab7bc3SDuncan P. N. Exon Smith   Dir2 = std::move(*Dir1);
33*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_EQ(Path, Dir2->path());
34*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
35*15ab7bc3SDuncan P. N. Exon Smith 
36*15ab7bc3SDuncan P. N. Exon Smith   Dir1 = None;
37*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
38*15ab7bc3SDuncan P. N. Exon Smith 
39*15ab7bc3SDuncan P. N. Exon Smith   Dir2 = None;
40*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_FALSE(sys::fs::exists(Path));
41*15ab7bc3SDuncan P. N. Exon Smith }
42*15ab7bc3SDuncan P. N. Exon Smith 
TEST(TempPathTest,TempFile)43*15ab7bc3SDuncan P. N. Exon Smith TEST(TempPathTest, TempFile) {
44*15ab7bc3SDuncan P. N. Exon Smith   TempDir D("temp-path-test", /*Unique=*/true);
45*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(D.path()));
46*15ab7bc3SDuncan P. N. Exon Smith 
47*15ab7bc3SDuncan P. N. Exon Smith   Optional<TempFile> File1, File2;
48*15ab7bc3SDuncan P. N. Exon Smith   File1.emplace(D.path("file"), "suffix", "content");
49*15ab7bc3SDuncan P. N. Exon Smith   EXPECT_EQ("file.suffix", sys::path::filename(File1->path()));
50*15ab7bc3SDuncan P. N. Exon Smith   {
51*15ab7bc3SDuncan P. N. Exon Smith     ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer =
52*15ab7bc3SDuncan P. N. Exon Smith         MemoryBuffer::getFile(File1->path());
53*15ab7bc3SDuncan P. N. Exon Smith     ASSERT_TRUE(Buffer);
54*15ab7bc3SDuncan P. N. Exon Smith     ASSERT_EQ("content", (*Buffer)->getBuffer());
55*15ab7bc3SDuncan P. N. Exon Smith   }
56*15ab7bc3SDuncan P. N. Exon Smith 
57*15ab7bc3SDuncan P. N. Exon Smith   std::string Path = File1->path().str();
58*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
59*15ab7bc3SDuncan P. N. Exon Smith 
60*15ab7bc3SDuncan P. N. Exon Smith   File2 = std::move(*File1);
61*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_EQ(Path, File2->path());
62*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
63*15ab7bc3SDuncan P. N. Exon Smith 
64*15ab7bc3SDuncan P. N. Exon Smith   File1 = None;
65*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
66*15ab7bc3SDuncan P. N. Exon Smith 
67*15ab7bc3SDuncan P. N. Exon Smith   File2 = None;
68*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_FALSE(sys::fs::exists(Path));
69*15ab7bc3SDuncan P. N. Exon Smith }
70*15ab7bc3SDuncan P. N. Exon Smith 
TEST(TempPathTest,TempLink)71*15ab7bc3SDuncan P. N. Exon Smith TEST(TempPathTest, TempLink) {
72*15ab7bc3SDuncan P. N. Exon Smith   TempDir D("temp-path-test", /*Unique=*/true);
73*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(D.path()));
74*15ab7bc3SDuncan P. N. Exon Smith   TempFile File(D.path("file"), "suffix", "content");
75*15ab7bc3SDuncan P. N. Exon Smith 
76*15ab7bc3SDuncan P. N. Exon Smith   Optional<TempLink> Link1, Link2;
77*15ab7bc3SDuncan P. N. Exon Smith   Link1.emplace(File.path(), D.path("link"));
78*15ab7bc3SDuncan P. N. Exon Smith   EXPECT_EQ("link", sys::path::filename(Link1->path()));
79*15ab7bc3SDuncan P. N. Exon Smith   {
80*15ab7bc3SDuncan P. N. Exon Smith     ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer =
81*15ab7bc3SDuncan P. N. Exon Smith         MemoryBuffer::getFile(Link1->path());
82*15ab7bc3SDuncan P. N. Exon Smith     ASSERT_TRUE(Buffer);
83*15ab7bc3SDuncan P. N. Exon Smith     ASSERT_EQ("content", (*Buffer)->getBuffer());
84*15ab7bc3SDuncan P. N. Exon Smith   }
85*15ab7bc3SDuncan P. N. Exon Smith 
86*15ab7bc3SDuncan P. N. Exon Smith   std::string Path = Link1->path().str();
87*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
88*15ab7bc3SDuncan P. N. Exon Smith 
89*15ab7bc3SDuncan P. N. Exon Smith   Link2 = std::move(*Link1);
90*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_EQ(Path, Link2->path());
91*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
92*15ab7bc3SDuncan P. N. Exon Smith 
93*15ab7bc3SDuncan P. N. Exon Smith   Link1 = None;
94*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_TRUE(sys::fs::exists(Path));
95*15ab7bc3SDuncan P. N. Exon Smith 
96*15ab7bc3SDuncan P. N. Exon Smith   Link2 = None;
97*15ab7bc3SDuncan P. N. Exon Smith   ASSERT_FALSE(sys::fs::exists(Path));
98*15ab7bc3SDuncan P. N. Exon Smith }
99*15ab7bc3SDuncan P. N. Exon Smith 
100*15ab7bc3SDuncan P. N. Exon Smith } // namespace
101