//===- 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
