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