FileOutputBufferTest.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //===- llvm/unittest/Support/FileOutputBuffer.cpp - unit tests ------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/Support/Errc.h"
  10. #include "llvm/Support/ErrorHandling.h"
  11. #include "llvm/Support/FileOutputBuffer.h"
  12. #include "llvm/Support/FileSystem.h"
  13. #include "llvm/Support/Path.h"
  14. #include "llvm/Support/raw_ostream.h"
  15. #include "gtest/gtest.h"
  16. using namespace llvm;
  17. using namespace llvm::sys;
  18. #define ASSERT_NO_ERROR(x) \
  19. if (std::error_code ASSERT_NO_ERROR_ec = x) { \
  20. errs() << #x ": did not return errc::success.\n" \
  21. << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \
  22. << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \
  23. } else { \
  24. }
  25. namespace {
  26. TEST(FileOutputBuffer, Test) {
  27. // Create unique temporary directory for these tests
  28. SmallString<128> TestDirectory;
  29. {
  30. ASSERT_NO_ERROR(
  31. fs::createUniqueDirectory("FileOutputBuffer-test", TestDirectory));
  32. }
  33. // TEST 1: Verify commit case.
  34. SmallString<128> File1(TestDirectory);
  35. File1.append("/file1");
  36. {
  37. std::unique_ptr<FileOutputBuffer> Buffer;
  38. ASSERT_NO_ERROR(FileOutputBuffer::create(File1, 8192, Buffer));
  39. // Start buffer with special header.
  40. memcpy(Buffer->getBufferStart(), "AABBCCDDEEFFGGHHIIJJ", 20);
  41. // Write to end of buffer to verify it is writable.
  42. memcpy(Buffer->getBufferEnd() - 20, "AABBCCDDEEFFGGHHIIJJ", 20);
  43. // Commit buffer.
  44. ASSERT_NO_ERROR(Buffer->commit());
  45. }
  46. // Verify file is correct size.
  47. uint64_t File1Size;
  48. ASSERT_NO_ERROR(fs::file_size(Twine(File1), File1Size));
  49. ASSERT_EQ(File1Size, 8192ULL);
  50. ASSERT_NO_ERROR(fs::remove(File1.str()));
  51. // TEST 2: Verify abort case.
  52. SmallString<128> File2(TestDirectory);
  53. File2.append("/file2");
  54. {
  55. std::unique_ptr<FileOutputBuffer> Buffer2;
  56. ASSERT_NO_ERROR(FileOutputBuffer::create(File2, 8192, Buffer2));
  57. // Fill buffer with special header.
  58. memcpy(Buffer2->getBufferStart(), "AABBCCDDEEFFGGHHIIJJ", 20);
  59. // Do *not* commit buffer.
  60. }
  61. // Verify file does not exist (because buffer not committed).
  62. ASSERT_EQ(fs::access(Twine(File2), fs::AccessMode::Exist),
  63. errc::no_such_file_or_directory);
  64. ASSERT_NO_ERROR(fs::remove(File2.str()));
  65. // TEST 3: Verify sizing down case.
  66. SmallString<128> File3(TestDirectory);
  67. File3.append("/file3");
  68. {
  69. std::unique_ptr<FileOutputBuffer> Buffer;
  70. ASSERT_NO_ERROR(FileOutputBuffer::create(File3, 8192000, Buffer));
  71. // Start buffer with special header.
  72. memcpy(Buffer->getBufferStart(), "AABBCCDDEEFFGGHHIIJJ", 20);
  73. // Write to end of buffer to verify it is writable.
  74. memcpy(Buffer->getBufferEnd() - 20, "AABBCCDDEEFFGGHHIIJJ", 20);
  75. ASSERT_NO_ERROR(Buffer->commit());
  76. }
  77. // Verify file is correct size.
  78. uint64_t File3Size;
  79. ASSERT_NO_ERROR(fs::file_size(Twine(File3), File3Size));
  80. ASSERT_EQ(File3Size, 8192000ULL);
  81. ASSERT_NO_ERROR(fs::remove(File3.str()));
  82. // TEST 4: Verify file can be made executable.
  83. SmallString<128> File4(TestDirectory);
  84. File4.append("/file4");
  85. {
  86. std::unique_ptr<FileOutputBuffer> Buffer;
  87. ASSERT_NO_ERROR(FileOutputBuffer::create(File4, 8192, Buffer,
  88. FileOutputBuffer::F_executable));
  89. // Start buffer with special header.
  90. memcpy(Buffer->getBufferStart(), "AABBCCDDEEFFGGHHIIJJ", 20);
  91. // Commit buffer.
  92. ASSERT_NO_ERROR(Buffer->commit());
  93. }
  94. // Verify file exists and is executable.
  95. fs::file_status Status;
  96. ASSERT_NO_ERROR(fs::status(Twine(File4), Status));
  97. bool IsExecutable = (Status.permissions() & fs::owner_exe);
  98. EXPECT_TRUE(IsExecutable);
  99. ASSERT_NO_ERROR(fs::remove(File4.str()));
  100. // Clean up.
  101. ASSERT_NO_ERROR(fs::remove(TestDirectory.str()));
  102. }
  103. } // anonymous namespace