//===-- FileTest.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 "lldb/Host/File.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/FileUtilities.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/Program.h"
#include "gtest/gtest.h"

using namespace lldb;
using namespace lldb_private;

TEST(File, GetWaitableHandleFileno) {
  const auto *Info = testing::UnitTest::GetInstance()->current_test_info();

  llvm::SmallString<128> name;
  int fd;
  llvm::sys::fs::createTemporaryFile(llvm::Twine(Info->test_case_name()) + "-" +
                                         Info->name(),
                                     "test", fd, name);
  llvm::FileRemover remover(name);
  ASSERT_GE(fd, 0);

  FILE *stream = fdopen(fd, "r");
  ASSERT_TRUE(stream);

  NativeFile file(stream, true);
  EXPECT_EQ(file.GetWaitableHandle(), fd);
}

TEST(File, GetStreamFromDescriptor) {
  const auto *Info = testing::UnitTest::GetInstance()->current_test_info();
  llvm::SmallString<128> name;
  int fd;
  llvm::sys::fs::createTemporaryFile(llvm::Twine(Info->test_case_name()) + "-" +
                                         Info->name(),
                                     "test", fd, name);

  llvm::FileRemover remover(name);
  ASSERT_GE(fd, 0);

  NativeFile file(fd, File::eOpenOptionWriteOnly, true);
  ASSERT_TRUE(file.IsValid());

  FILE *stream = file.GetStream();
  ASSERT_TRUE(stream != NULL);

  EXPECT_EQ(file.GetDescriptor(), fd);
  EXPECT_EQ(file.GetWaitableHandle(), fd);
}
