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