xref: /llvm-project/llvm/unittests/Support/raw_pwrite_stream_test.cpp (revision 0d802a4923e6a603aa1ee06d0969a793cc93f858)
137b70159SRafael Espindola //===- raw_pwrite_stream_test.cpp - raw_pwrite_stream tests ---------------===//
237b70159SRafael Espindola //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
637b70159SRafael Espindola //
737b70159SRafael Espindola //===----------------------------------------------------------------------===//
837b70159SRafael Espindola 
937b70159SRafael Espindola #include "llvm/ADT/SmallString.h"
10432a3883SNico Weber #include "llvm/Config/llvm-config.h"
11c54a0d0bSRafael Espindola #include "llvm/Support/FileSystem.h"
1275e557f1SReid Kleckner #include "llvm/Support/FileUtilities.h"
1337b70159SRafael Espindola #include "llvm/Support/raw_ostream.h"
149a67b073SChandler Carruth #include "gtest/gtest.h"
1537b70159SRafael Espindola 
1637b70159SRafael Espindola using namespace llvm;
1737b70159SRafael Espindola 
18*0d802a49SPavel Labath #define ASSERT_NO_ERROR(x)                                                     \
19*0d802a49SPavel Labath   if (std::error_code ASSERT_NO_ERROR_ec = x) {                                \
20*0d802a49SPavel Labath     SmallString<128> MessageStorage;                                           \
21*0d802a49SPavel Labath     raw_svector_ostream Message(MessageStorage);                               \
22*0d802a49SPavel Labath     Message << #x ": did not return errc::success.\n"                          \
23*0d802a49SPavel Labath             << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n"          \
24*0d802a49SPavel Labath             << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n";      \
25*0d802a49SPavel Labath     GTEST_FATAL_FAILURE_(MessageStorage.c_str());                              \
26*0d802a49SPavel Labath   } else {                                                                     \
27*0d802a49SPavel Labath   }
2875e557f1SReid Kleckner 
2937b70159SRafael Espindola namespace {
3037b70159SRafael Espindola 
TEST(raw_pwrite_ostreamTest,TestSVector)3137b70159SRafael Espindola TEST(raw_pwrite_ostreamTest, TestSVector) {
324ba9af11SRafael Espindola   SmallVector<char, 0> Buffer;
3337b70159SRafael Espindola   raw_svector_ostream OS(Buffer);
344ba9af11SRafael Espindola   OS << "abcd";
3537b70159SRafael Espindola   StringRef Test = "test";
3637b70159SRafael Espindola   OS.pwrite(Test.data(), Test.size(), 0);
3737b70159SRafael Espindola   EXPECT_EQ(Test, OS.str());
384ba9af11SRafael Espindola 
394ba9af11SRafael Espindola #ifdef GTEST_HAS_DEATH_TEST
404ba9af11SRafael Espindola #ifndef NDEBUG
414ba9af11SRafael Espindola   EXPECT_DEATH(OS.pwrite("12345", 5, 0),
424ba9af11SRafael Espindola                "We don't support extending the stream");
434ba9af11SRafael Espindola #endif
444ba9af11SRafael Espindola #endif
4537b70159SRafael Espindola }
46c54a0d0bSRafael Espindola 
47bc469276SNAKAMURA Takumi #ifdef _WIN32
4875e557f1SReid Kleckner #define setenv(name, var, ignore) _putenv_s(name, var)
4975e557f1SReid Kleckner #endif
5075e557f1SReid Kleckner 
TEST(raw_pwrite_ostreamTest,TestFD)51c54a0d0bSRafael Espindola TEST(raw_pwrite_ostreamTest, TestFD) {
52c54a0d0bSRafael Espindola   SmallString<64> Path;
53c54a0d0bSRafael Espindola   int FD;
5475e557f1SReid Kleckner 
5575e557f1SReid Kleckner   // If we want to clean up from a death test, we have to remove the file from
5675e557f1SReid Kleckner   // the parent process. Have the parent create the file, pass it via
5775e557f1SReid Kleckner   // environment variable to the child, let the child crash, and then remove it
5875e557f1SReid Kleckner   // in the parent.
5975e557f1SReid Kleckner   const char *ParentPath = getenv("RAW_PWRITE_TEST_FILE");
6075e557f1SReid Kleckner   if (ParentPath) {
6175e557f1SReid Kleckner     Path = ParentPath;
6275e557f1SReid Kleckner     ASSERT_NO_ERROR(sys::fs::openFileForRead(Path, FD));
6375e557f1SReid Kleckner   } else {
6475e557f1SReid Kleckner     ASSERT_NO_ERROR(sys::fs::createTemporaryFile("foo", "bar", FD, Path));
6575e557f1SReid Kleckner     setenv("RAW_PWRITE_TEST_FILE", Path.c_str(), true);
6675e557f1SReid Kleckner   }
6775e557f1SReid Kleckner   FileRemover Cleanup(Path);
6875e557f1SReid Kleckner 
69c54a0d0bSRafael Espindola   raw_fd_ostream OS(FD, true);
70c54a0d0bSRafael Espindola   OS << "abcd";
71c54a0d0bSRafael Espindola   StringRef Test = "test";
72c54a0d0bSRafael Espindola   OS.pwrite(Test.data(), Test.size(), 0);
73c54a0d0bSRafael Espindola   OS.pwrite(Test.data(), Test.size(), 0);
74c54a0d0bSRafael Espindola 
75c54a0d0bSRafael Espindola #ifdef GTEST_HAS_DEATH_TEST
76c54a0d0bSRafael Espindola #ifndef NDEBUG
77c54a0d0bSRafael Espindola   EXPECT_DEATH(OS.pwrite("12345", 5, 0),
78c54a0d0bSRafael Espindola                "We don't support extending the stream");
79c54a0d0bSRafael Espindola #endif
80c54a0d0bSRafael Espindola #endif
81c54a0d0bSRafael Espindola }
82c54a0d0bSRafael Espindola 
8397b7e26dSReid Kleckner #ifdef LLVM_ON_UNIX
TEST(raw_pwrite_ostreamTest,TestDevNull)84c54a0d0bSRafael Espindola TEST(raw_pwrite_ostreamTest, TestDevNull) {
85c54a0d0bSRafael Espindola   int FD;
861f67a3cbSZachary Turner   sys::fs::openFileForWrite("/dev/null", FD, sys::fs::CD_OpenExisting);
87c54a0d0bSRafael Espindola   raw_fd_ostream OS(FD, true);
88c54a0d0bSRafael Espindola   OS << "abcd";
89c54a0d0bSRafael Espindola   StringRef Test = "test";
90c54a0d0bSRafael Espindola   OS.pwrite(Test.data(), Test.size(), 0);
91c54a0d0bSRafael Espindola   OS.pwrite(Test.data(), Test.size(), 0);
92c54a0d0bSRafael Espindola }
9397b7e26dSReid Kleckner #endif
9437b70159SRafael Espindola }
95