git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-11.0.2/test/os-test.cc

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
// Formatting library for C++ - tests of the OS-specific functionality
f8deb5b9 Poul Sander 2022-01-15 13:55 2
//
f8deb5b9 Poul Sander 2022-01-15 13:55 3
// Copyright (c) 2012 - present, Victor Zverovich
f8deb5b9 Poul Sander 2022-01-15 13:55 4
// All rights reserved.
f8deb5b9 Poul Sander 2022-01-15 13:55 5
//
f8deb5b9 Poul Sander 2022-01-15 13:55 6
// For the license information refer to format.h.
f8deb5b9 Poul Sander 2022-01-15 13:55 7
f8deb5b9 Poul Sander 2022-01-15 13:55 8
#include "fmt/os.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 9
f8deb5b9 Poul Sander 2022-01-15 13:55 10
#include <cstdlib>  // std::exit
f8deb5b9 Poul Sander 2022-01-15 13:55 11
#include <cstring>
f8deb5b9 Poul Sander 2022-01-15 13:55 12
#include <memory>
f8deb5b9 Poul Sander 2022-01-15 13:55 13
f8deb5b9 Poul Sander 2022-01-15 13:55 14
#include "gtest-extra.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 15
#include "util.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 16
f8deb5b9 Poul Sander 2022-01-15 13:55 17
using fmt::buffered_file;
f8deb5b9 Poul Sander 2022-01-15 13:55 18
using testing::HasSubstr;
f8deb5b9 Poul Sander 2022-01-15 13:55 19
using wstring_view = fmt::basic_string_view<wchar_t>;
f8deb5b9 Poul Sander 2022-01-15 13:55 20
47fd5c32 Poul Sander 2024-10-05 08:44 21
static std::string uniq_file_name(unsigned line_number) {
47fd5c32 Poul Sander 2024-10-05 08:44 22
  return "test-file" + std::to_string(line_number);
f8deb5b9 Poul Sander 2022-01-15 13:55 23
}
f8deb5b9 Poul Sander 2022-01-15 13:55 24
47fd5c32 Poul Sander 2024-10-05 08:44 25
#ifdef _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 26
47fd5c32 Poul Sander 2024-10-05 08:44 27
#  include <windows.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 28
f8deb5b9 Poul Sander 2022-01-15 13:55 29
TEST(os_test, format_windows_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 30
  LPWSTR message = nullptr;
f8deb5b9 Poul Sander 2022-01-15 13:55 31
  auto result = FormatMessageW(
f8deb5b9 Poul Sander 2022-01-15 13:55 32
      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
f8deb5b9 Poul Sander 2022-01-15 13:55 33
          FORMAT_MESSAGE_IGNORE_INSERTS,
f8deb5b9 Poul Sander 2022-01-15 13:55 34
      nullptr, ERROR_FILE_EXISTS, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
f8deb5b9 Poul Sander 2022-01-15 13:55 35
      reinterpret_cast<LPWSTR>(&message), 0, nullptr);
47fd5c32 Poul Sander 2024-10-05 08:44 36
  auto utf8_message =
47fd5c32 Poul Sander 2024-10-05 08:44 37
      fmt::detail::to_utf8<wchar_t>(wstring_view(message, result - 2));
f8deb5b9 Poul Sander 2022-01-15 13:55 38
  LocalFree(message);
f8deb5b9 Poul Sander 2022-01-15 13:55 39
  fmt::memory_buffer actual_message;
f8deb5b9 Poul Sander 2022-01-15 13:55 40
  fmt::detail::format_windows_error(actual_message, ERROR_FILE_EXISTS, "test");
f8deb5b9 Poul Sander 2022-01-15 13:55 41
  EXPECT_EQ(fmt::format("test: {}", utf8_message.str()),
f8deb5b9 Poul Sander 2022-01-15 13:55 42
            fmt::to_string(actual_message));
f8deb5b9 Poul Sander 2022-01-15 13:55 43
  actual_message.resize(0);
f8deb5b9 Poul Sander 2022-01-15 13:55 44
}
f8deb5b9 Poul Sander 2022-01-15 13:55 45
f8deb5b9 Poul Sander 2022-01-15 13:55 46
TEST(os_test, format_long_windows_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 47
  LPWSTR message = nullptr;
f8deb5b9 Poul Sander 2022-01-15 13:55 48
  // this error code is not available on all Windows platforms and
f8deb5b9 Poul Sander 2022-01-15 13:55 49
  // Windows SDKs, so do not fail the test if the error string cannot
f8deb5b9 Poul Sander 2022-01-15 13:55 50
  // be retrieved.
f8deb5b9 Poul Sander 2022-01-15 13:55 51
  int provisioning_not_allowed = 0x80284013L;  // TBS_E_PROVISIONING_NOT_ALLOWED
f8deb5b9 Poul Sander 2022-01-15 13:55 52
  auto result = FormatMessageW(
f8deb5b9 Poul Sander 2022-01-15 13:55 53
      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
f8deb5b9 Poul Sander 2022-01-15 13:55 54
          FORMAT_MESSAGE_IGNORE_INSERTS,
f8deb5b9 Poul Sander 2022-01-15 13:55 55
      nullptr, static_cast<DWORD>(provisioning_not_allowed),
f8deb5b9 Poul Sander 2022-01-15 13:55 56
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
f8deb5b9 Poul Sander 2022-01-15 13:55 57
      reinterpret_cast<LPWSTR>(&message), 0, nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 58
  if (result == 0) {
f8deb5b9 Poul Sander 2022-01-15 13:55 59
    LocalFree(message);
f8deb5b9 Poul Sander 2022-01-15 13:55 60
    return;
f8deb5b9 Poul Sander 2022-01-15 13:55 61
  }
47fd5c32 Poul Sander 2024-10-05 08:44 62
  auto utf8_message =
47fd5c32 Poul Sander 2024-10-05 08:44 63
      fmt::detail::to_utf8<wchar_t>(wstring_view(message, result - 2));
f8deb5b9 Poul Sander 2022-01-15 13:55 64
  LocalFree(message);
f8deb5b9 Poul Sander 2022-01-15 13:55 65
  fmt::memory_buffer actual_message;
f8deb5b9 Poul Sander 2022-01-15 13:55 66
  fmt::detail::format_windows_error(actual_message, provisioning_not_allowed,
f8deb5b9 Poul Sander 2022-01-15 13:55 67
                                    "test");
f8deb5b9 Poul Sander 2022-01-15 13:55 68
  EXPECT_EQ(fmt::format("test: {}", utf8_message.str()),
f8deb5b9 Poul Sander 2022-01-15 13:55 69
            fmt::to_string(actual_message));
f8deb5b9 Poul Sander 2022-01-15 13:55 70
}
f8deb5b9 Poul Sander 2022-01-15 13:55 71
f8deb5b9 Poul Sander 2022-01-15 13:55 72
TEST(os_test, windows_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 73
  auto error = std::system_error(std::error_code());
f8deb5b9 Poul Sander 2022-01-15 13:55 74
  try {
f8deb5b9 Poul Sander 2022-01-15 13:55 75
    throw fmt::windows_error(ERROR_FILE_EXISTS, "test {}", "error");
f8deb5b9 Poul Sander 2022-01-15 13:55 76
  } catch (const std::system_error& e) {
f8deb5b9 Poul Sander 2022-01-15 13:55 77
    error = e;
f8deb5b9 Poul Sander 2022-01-15 13:55 78
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 79
  fmt::memory_buffer message;
f8deb5b9 Poul Sander 2022-01-15 13:55 80
  fmt::detail::format_windows_error(message, ERROR_FILE_EXISTS, "test error");
f8deb5b9 Poul Sander 2022-01-15 13:55 81
  EXPECT_THAT(error.what(), HasSubstr(to_string(message)));
f8deb5b9 Poul Sander 2022-01-15 13:55 82
  EXPECT_EQ(ERROR_FILE_EXISTS, error.code().value());
f8deb5b9 Poul Sander 2022-01-15 13:55 83
}
f8deb5b9 Poul Sander 2022-01-15 13:55 84
f8deb5b9 Poul Sander 2022-01-15 13:55 85
TEST(os_test, report_windows_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 86
  fmt::memory_buffer out;
f8deb5b9 Poul Sander 2022-01-15 13:55 87
  fmt::detail::format_windows_error(out, ERROR_FILE_EXISTS, "test error");
f8deb5b9 Poul Sander 2022-01-15 13:55 88
  out.push_back('\n');
f8deb5b9 Poul Sander 2022-01-15 13:55 89
  EXPECT_WRITE(stderr,
f8deb5b9 Poul Sander 2022-01-15 13:55 90
               fmt::report_windows_error(ERROR_FILE_EXISTS, "test error"),
f8deb5b9 Poul Sander 2022-01-15 13:55 91
               fmt::to_string(out));
f8deb5b9 Poul Sander 2022-01-15 13:55 92
}
f8deb5b9 Poul Sander 2022-01-15 13:55 93
47fd5c32 Poul Sander 2024-10-05 08:44 94
#  if FMT_USE_FCNTL && !defined(__MINGW32__)
47fd5c32 Poul Sander 2024-10-05 08:44 95
TEST(file_test, open_windows_file) {
47fd5c32 Poul Sander 2024-10-05 08:44 96
  using fmt::file;
47fd5c32 Poul Sander 2024-10-05 08:44 97
  file out = file::open_windows_file(L"test-file",
47fd5c32 Poul Sander 2024-10-05 08:44 98
                                     file::WRONLY | file::CREATE | file::TRUNC);
47fd5c32 Poul Sander 2024-10-05 08:44 99
  out.write("x", 1);
47fd5c32 Poul Sander 2024-10-05 08:44 100
  file in = file::open_windows_file(L"test-file", file::RDONLY);
47fd5c32 Poul Sander 2024-10-05 08:44 101
  EXPECT_READ(in, "x");
47fd5c32 Poul Sander 2024-10-05 08:44 102
}
47fd5c32 Poul Sander 2024-10-05 08:44 103
#  endif  // FMT_USE_FCNTL && !defined(__MINGW32__)
47fd5c32 Poul Sander 2024-10-05 08:44 104
f8deb5b9 Poul Sander 2022-01-15 13:55 105
#endif  // _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 106
f8deb5b9 Poul Sander 2022-01-15 13:55 107
#if FMT_USE_FCNTL
f8deb5b9 Poul Sander 2022-01-15 13:55 108
f8deb5b9 Poul Sander 2022-01-15 13:55 109
using fmt::file;
f8deb5b9 Poul Sander 2022-01-15 13:55 110
47fd5c32 Poul Sander 2024-10-05 08:44 111
auto isclosed(int fd) -> bool {
f8deb5b9 Poul Sander 2022-01-15 13:55 112
  char buffer;
f8deb5b9 Poul Sander 2022-01-15 13:55 113
  auto result = std::streamsize();
f8deb5b9 Poul Sander 2022-01-15 13:55 114
  SUPPRESS_ASSERT(result = FMT_POSIX(read(fd, &buffer, 1)));
f8deb5b9 Poul Sander 2022-01-15 13:55 115
  return result == -1 && errno == EBADF;
f8deb5b9 Poul Sander 2022-01-15 13:55 116
}
f8deb5b9 Poul Sander 2022-01-15 13:55 117
f8deb5b9 Poul Sander 2022-01-15 13:55 118
// Opens a file for reading.
47fd5c32 Poul Sander 2024-10-05 08:44 119
auto open_file() -> file {
47fd5c32 Poul Sander 2024-10-05 08:44 120
  auto pipe = fmt::pipe();
47fd5c32 Poul Sander 2024-10-05 08:44 121
  pipe.write_end.write(file_content, std::strlen(file_content));
47fd5c32 Poul Sander 2024-10-05 08:44 122
  pipe.write_end.close();
47fd5c32 Poul Sander 2024-10-05 08:44 123
  return std::move(pipe.read_end);
f8deb5b9 Poul Sander 2022-01-15 13:55 124
}
f8deb5b9 Poul Sander 2022-01-15 13:55 125
f8deb5b9 Poul Sander 2022-01-15 13:55 126
// Attempts to write a string to a file.
f8deb5b9 Poul Sander 2022-01-15 13:55 127
void write(file& f, fmt::string_view s) {
f8deb5b9 Poul Sander 2022-01-15 13:55 128
  size_t num_chars_left = s.size();
f8deb5b9 Poul Sander 2022-01-15 13:55 129
  const char* ptr = s.data();
f8deb5b9 Poul Sander 2022-01-15 13:55 130
  do {
f8deb5b9 Poul Sander 2022-01-15 13:55 131
    size_t count = f.write(ptr, num_chars_left);
f8deb5b9 Poul Sander 2022-01-15 13:55 132
    ptr += count;
f8deb5b9 Poul Sander 2022-01-15 13:55 133
    // We can't write more than size_t bytes since num_chars_left
f8deb5b9 Poul Sander 2022-01-15 13:55 134
    // has type size_t.
f8deb5b9 Poul Sander 2022-01-15 13:55 135
    num_chars_left -= count;
f8deb5b9 Poul Sander 2022-01-15 13:55 136
  } while (num_chars_left != 0);
f8deb5b9 Poul Sander 2022-01-15 13:55 137
}
f8deb5b9 Poul Sander 2022-01-15 13:55 138
f8deb5b9 Poul Sander 2022-01-15 13:55 139
TEST(buffered_file_test, default_ctor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 140
  auto f = buffered_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 141
  EXPECT_TRUE(f.get() == nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 142
}
f8deb5b9 Poul Sander 2022-01-15 13:55 143
f8deb5b9 Poul Sander 2022-01-15 13:55 144
TEST(buffered_file_test, move_ctor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 145
  buffered_file bf = open_buffered_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 146
  FILE* fp = bf.get();
f8deb5b9 Poul Sander 2022-01-15 13:55 147
  EXPECT_TRUE(fp != nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 148
  buffered_file bf2(std::move(bf));
f8deb5b9 Poul Sander 2022-01-15 13:55 149
  EXPECT_EQ(fp, bf2.get());
f8deb5b9 Poul Sander 2022-01-15 13:55 150
  EXPECT_TRUE(bf.get() == nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 151
}
f8deb5b9 Poul Sander 2022-01-15 13:55 152
f8deb5b9 Poul Sander 2022-01-15 13:55 153
TEST(buffered_file_test, move_assignment) {
f8deb5b9 Poul Sander 2022-01-15 13:55 154
  buffered_file bf = open_buffered_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 155
  FILE* fp = bf.get();
f8deb5b9 Poul Sander 2022-01-15 13:55 156
  EXPECT_TRUE(fp != nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 157
  buffered_file bf2;
f8deb5b9 Poul Sander 2022-01-15 13:55 158
  bf2 = std::move(bf);
f8deb5b9 Poul Sander 2022-01-15 13:55 159
  EXPECT_EQ(fp, bf2.get());
f8deb5b9 Poul Sander 2022-01-15 13:55 160
  EXPECT_TRUE(bf.get() == nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 161
}
f8deb5b9 Poul Sander 2022-01-15 13:55 162
f8deb5b9 Poul Sander 2022-01-15 13:55 163
TEST(buffered_file_test, move_assignment_closes_file) {
f8deb5b9 Poul Sander 2022-01-15 13:55 164
  buffered_file bf = open_buffered_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 165
  buffered_file bf2 = open_buffered_file();
47fd5c32 Poul Sander 2024-10-05 08:44 166
  int old_fd = bf2.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 167
  bf2 = std::move(bf);
f8deb5b9 Poul Sander 2022-01-15 13:55 168
  EXPECT_TRUE(isclosed(old_fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 169
}
f8deb5b9 Poul Sander 2022-01-15 13:55 170
f8deb5b9 Poul Sander 2022-01-15 13:55 171
TEST(buffered_file_test, move_from_temporary_in_ctor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 172
  FILE* fp = nullptr;
f8deb5b9 Poul Sander 2022-01-15 13:55 173
  buffered_file f = open_buffered_file(&fp);
f8deb5b9 Poul Sander 2022-01-15 13:55 174
  EXPECT_EQ(fp, f.get());
f8deb5b9 Poul Sander 2022-01-15 13:55 175
}
f8deb5b9 Poul Sander 2022-01-15 13:55 176
f8deb5b9 Poul Sander 2022-01-15 13:55 177
TEST(buffered_file_test, move_from_temporary_in_assignment) {
f8deb5b9 Poul Sander 2022-01-15 13:55 178
  FILE* fp = nullptr;
f8deb5b9 Poul Sander 2022-01-15 13:55 179
  auto f = buffered_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 180
  f = open_buffered_file(&fp);
f8deb5b9 Poul Sander 2022-01-15 13:55 181
  EXPECT_EQ(fp, f.get());
f8deb5b9 Poul Sander 2022-01-15 13:55 182
}
f8deb5b9 Poul Sander 2022-01-15 13:55 183
f8deb5b9 Poul Sander 2022-01-15 13:55 184
TEST(buffered_file_test, move_from_temporary_in_assignment_closes_file) {
f8deb5b9 Poul Sander 2022-01-15 13:55 185
  buffered_file f = open_buffered_file();
47fd5c32 Poul Sander 2024-10-05 08:44 186
  int old_fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 187
  f = open_buffered_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 188
  EXPECT_TRUE(isclosed(old_fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 189
}
f8deb5b9 Poul Sander 2022-01-15 13:55 190
f8deb5b9 Poul Sander 2022-01-15 13:55 191
TEST(buffered_file_test, close_file_in_dtor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 192
  int fd = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 193
  {
f8deb5b9 Poul Sander 2022-01-15 13:55 194
    buffered_file f = open_buffered_file();
47fd5c32 Poul Sander 2024-10-05 08:44 195
    fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 196
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 197
  EXPECT_TRUE(isclosed(fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 198
}
f8deb5b9 Poul Sander 2022-01-15 13:55 199
f8deb5b9 Poul Sander 2022-01-15 13:55 200
TEST(buffered_file_test, close_error_in_dtor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 201
  auto f =
f8deb5b9 Poul Sander 2022-01-15 13:55 202
      std::unique_ptr<buffered_file>(new buffered_file(open_buffered_file()));
f8deb5b9 Poul Sander 2022-01-15 13:55 203
  EXPECT_WRITE(
f8deb5b9 Poul Sander 2022-01-15 13:55 204
      stderr,
f8deb5b9 Poul Sander 2022-01-15 13:55 205
      {
f8deb5b9 Poul Sander 2022-01-15 13:55 206
        // The close function must be called inside EXPECT_WRITE,
f8deb5b9 Poul Sander 2022-01-15 13:55 207
        // otherwise the system may recycle closed file descriptor when
f8deb5b9 Poul Sander 2022-01-15 13:55 208
        // redirecting the output in EXPECT_STDERR and the second close
f8deb5b9 Poul Sander 2022-01-15 13:55 209
        // will break output redirection.
47fd5c32 Poul Sander 2024-10-05 08:44 210
        FMT_POSIX(close(f->descriptor()));
f8deb5b9 Poul Sander 2022-01-15 13:55 211
        SUPPRESS_ASSERT(f.reset(nullptr));
f8deb5b9 Poul Sander 2022-01-15 13:55 212
      },
f8deb5b9 Poul Sander 2022-01-15 13:55 213
      system_error_message(EBADF, "cannot close file") + "\n");
f8deb5b9 Poul Sander 2022-01-15 13:55 214
}
f8deb5b9 Poul Sander 2022-01-15 13:55 215
f8deb5b9 Poul Sander 2022-01-15 13:55 216
TEST(buffered_file_test, close) {
f8deb5b9 Poul Sander 2022-01-15 13:55 217
  buffered_file f = open_buffered_file();
47fd5c32 Poul Sander 2024-10-05 08:44 218
  int fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 219
  f.close();
f8deb5b9 Poul Sander 2022-01-15 13:55 220
  EXPECT_TRUE(f.get() == nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 221
  EXPECT_TRUE(isclosed(fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 222
}
f8deb5b9 Poul Sander 2022-01-15 13:55 223
f8deb5b9 Poul Sander 2022-01-15 13:55 224
TEST(buffered_file_test, close_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 225
  buffered_file f = open_buffered_file();
47fd5c32 Poul Sander 2024-10-05 08:44 226
  FMT_POSIX(close(f.descriptor()));
f8deb5b9 Poul Sander 2022-01-15 13:55 227
  EXPECT_SYSTEM_ERROR_NOASSERT(f.close(), EBADF, "cannot close file");
f8deb5b9 Poul Sander 2022-01-15 13:55 228
  EXPECT_TRUE(f.get() == nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 229
}
f8deb5b9 Poul Sander 2022-01-15 13:55 230
47fd5c32 Poul Sander 2024-10-05 08:44 231
TEST(buffered_file_test, descriptor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 232
  auto f = open_buffered_file();
47fd5c32 Poul Sander 2024-10-05 08:44 233
  EXPECT_TRUE(f.descriptor() != -1);
47fd5c32 Poul Sander 2024-10-05 08:44 234
  file copy = file::dup(f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 235
  EXPECT_READ(copy, file_content);
f8deb5b9 Poul Sander 2022-01-15 13:55 236
}
f8deb5b9 Poul Sander 2022-01-15 13:55 237
f8deb5b9 Poul Sander 2022-01-15 13:55 238
TEST(ostream_test, move) {
47fd5c32 Poul Sander 2024-10-05 08:44 239
  auto test_file = uniq_file_name(__LINE__);
47fd5c32 Poul Sander 2024-10-05 08:44 240
  fmt::ostream out = fmt::output_file(test_file);
f8deb5b9 Poul Sander 2022-01-15 13:55 241
  fmt::ostream moved(std::move(out));
f8deb5b9 Poul Sander 2022-01-15 13:55 242
  moved.print("hello");
f8deb5b9 Poul Sander 2022-01-15 13:55 243
}
f8deb5b9 Poul Sander 2022-01-15 13:55 244
f8deb5b9 Poul Sander 2022-01-15 13:55 245
TEST(ostream_test, move_while_holding_data) {
47fd5c32 Poul Sander 2024-10-05 08:44 246
  auto test_file = uniq_file_name(__LINE__);
f8deb5b9 Poul Sander 2022-01-15 13:55 247
  {
47fd5c32 Poul Sander 2024-10-05 08:44 248
    fmt::ostream out = fmt::output_file(test_file);
f8deb5b9 Poul Sander 2022-01-15 13:55 249
    out.print("Hello, ");
f8deb5b9 Poul Sander 2022-01-15 13:55 250
    fmt::ostream moved(std::move(out));
f8deb5b9 Poul Sander 2022-01-15 13:55 251
    moved.print("world!\n");
f8deb5b9 Poul Sander 2022-01-15 13:55 252
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 253
  {
47fd5c32 Poul Sander 2024-10-05 08:44 254
    file in(test_file, file::RDONLY);
f8deb5b9 Poul Sander 2022-01-15 13:55 255
    EXPECT_READ(in, "Hello, world!\n");
f8deb5b9 Poul Sander 2022-01-15 13:55 256
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 257
}
f8deb5b9 Poul Sander 2022-01-15 13:55 258
f8deb5b9 Poul Sander 2022-01-15 13:55 259
TEST(ostream_test, print) {
47fd5c32 Poul Sander 2024-10-05 08:44 260
  auto test_file = uniq_file_name(__LINE__);
47fd5c32 Poul Sander 2024-10-05 08:44 261
  fmt::ostream out = fmt::output_file(test_file);
47fd5c32 Poul Sander 2024-10-05 08:44 262
  out.print("The answer is {}.\n", 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 263
  out.close();
47fd5c32 Poul Sander 2024-10-05 08:44 264
  file in(test_file, file::RDONLY);
f8deb5b9 Poul Sander 2022-01-15 13:55 265
  EXPECT_READ(in, "The answer is 42.\n");
f8deb5b9 Poul Sander 2022-01-15 13:55 266
}
f8deb5b9 Poul Sander 2022-01-15 13:55 267
f8deb5b9 Poul Sander 2022-01-15 13:55 268
TEST(ostream_test, buffer_boundary) {
f8deb5b9 Poul Sander 2022-01-15 13:55 269
  auto str = std::string(4096, 'x');
47fd5c32 Poul Sander 2024-10-05 08:44 270
  auto test_file = uniq_file_name(__LINE__);
47fd5c32 Poul Sander 2024-10-05 08:44 271
  fmt::ostream out = fmt::output_file(test_file);
f8deb5b9 Poul Sander 2022-01-15 13:55 272
  out.print("{}", str);
f8deb5b9 Poul Sander 2022-01-15 13:55 273
  out.print("{}", str);
f8deb5b9 Poul Sander 2022-01-15 13:55 274
  out.close();
47fd5c32 Poul Sander 2024-10-05 08:44 275
  file in(test_file, file::RDONLY);
f8deb5b9 Poul Sander 2022-01-15 13:55 276
  EXPECT_READ(in, str + str);
f8deb5b9 Poul Sander 2022-01-15 13:55 277
}
f8deb5b9 Poul Sander 2022-01-15 13:55 278
f8deb5b9 Poul Sander 2022-01-15 13:55 279
TEST(ostream_test, buffer_size) {
47fd5c32 Poul Sander 2024-10-05 08:44 280
  auto test_file = uniq_file_name(__LINE__);
47fd5c32 Poul Sander 2024-10-05 08:44 281
  fmt::ostream out = fmt::output_file(test_file, fmt::buffer_size = 1);
f8deb5b9 Poul Sander 2022-01-15 13:55 282
  out.print("{}", "foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 283
  out.close();
47fd5c32 Poul Sander 2024-10-05 08:44 284
  file in(test_file, file::RDONLY);
f8deb5b9 Poul Sander 2022-01-15 13:55 285
  EXPECT_READ(in, "foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 286
}
f8deb5b9 Poul Sander 2022-01-15 13:55 287
f8deb5b9 Poul Sander 2022-01-15 13:55 288
TEST(ostream_test, truncate) {
47fd5c32 Poul Sander 2024-10-05 08:44 289
  auto test_file = uniq_file_name(__LINE__);
f8deb5b9 Poul Sander 2022-01-15 13:55 290
  {
47fd5c32 Poul Sander 2024-10-05 08:44 291
    fmt::ostream out = fmt::output_file(test_file);
f8deb5b9 Poul Sander 2022-01-15 13:55 292
    out.print("0123456789");
f8deb5b9 Poul Sander 2022-01-15 13:55 293
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 294
  {
47fd5c32 Poul Sander 2024-10-05 08:44 295
    fmt::ostream out = fmt::output_file(test_file);
f8deb5b9 Poul Sander 2022-01-15 13:55 296
    out.print("foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 297
  }
47fd5c32 Poul Sander 2024-10-05 08:44 298
  file in(test_file, file::RDONLY);
f8deb5b9 Poul Sander 2022-01-15 13:55 299
  EXPECT_EQ("foo", read(in, 4));
f8deb5b9 Poul Sander 2022-01-15 13:55 300
}
f8deb5b9 Poul Sander 2022-01-15 13:55 301
f8deb5b9 Poul Sander 2022-01-15 13:55 302
TEST(ostream_test, flush) {
47fd5c32 Poul Sander 2024-10-05 08:44 303
  auto test_file = uniq_file_name(__LINE__);
47fd5c32 Poul Sander 2024-10-05 08:44 304
  auto out = fmt::output_file(test_file);
f8deb5b9 Poul Sander 2022-01-15 13:55 305
  out.print("x");
f8deb5b9 Poul Sander 2022-01-15 13:55 306
  out.flush();
47fd5c32 Poul Sander 2024-10-05 08:44 307
  auto in = fmt::file(test_file, file::RDONLY);
f8deb5b9 Poul Sander 2022-01-15 13:55 308
  EXPECT_READ(in, "x");
f8deb5b9 Poul Sander 2022-01-15 13:55 309
}
f8deb5b9 Poul Sander 2022-01-15 13:55 310
f8deb5b9 Poul Sander 2022-01-15 13:55 311
TEST(file_test, default_ctor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 312
  file f;
f8deb5b9 Poul Sander 2022-01-15 13:55 313
  EXPECT_EQ(-1, f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 314
}
f8deb5b9 Poul Sander 2022-01-15 13:55 315
f8deb5b9 Poul Sander 2022-01-15 13:55 316
TEST(file_test, open_buffered_file_in_ctor) {
47fd5c32 Poul Sander 2024-10-05 08:44 317
  auto test_file = uniq_file_name(__LINE__);
47fd5c32 Poul Sander 2024-10-05 08:44 318
  FILE* fp = safe_fopen(test_file.c_str(), "w");
f8deb5b9 Poul Sander 2022-01-15 13:55 319
  std::fputs(file_content, fp);
f8deb5b9 Poul Sander 2022-01-15 13:55 320
  std::fclose(fp);
47fd5c32 Poul Sander 2024-10-05 08:44 321
  file f(test_file.c_str(), file::RDONLY);
f8deb5b9 Poul Sander 2022-01-15 13:55 322
  // Check if the file is open by reading one character from it.
f8deb5b9 Poul Sander 2022-01-15 13:55 323
  char buffer;
f8deb5b9 Poul Sander 2022-01-15 13:55 324
  bool isopen = FMT_POSIX(read(f.descriptor(), &buffer, 1)) == 1;
f8deb5b9 Poul Sander 2022-01-15 13:55 325
  ASSERT_TRUE(isopen);
f8deb5b9 Poul Sander 2022-01-15 13:55 326
}
f8deb5b9 Poul Sander 2022-01-15 13:55 327
f8deb5b9 Poul Sander 2022-01-15 13:55 328
TEST(file_test, open_buffered_file_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 329
  EXPECT_SYSTEM_ERROR(file("nonexistent", file::RDONLY), ENOENT,
f8deb5b9 Poul Sander 2022-01-15 13:55 330
                      "cannot open file nonexistent");
f8deb5b9 Poul Sander 2022-01-15 13:55 331
}
f8deb5b9 Poul Sander 2022-01-15 13:55 332
f8deb5b9 Poul Sander 2022-01-15 13:55 333
TEST(file_test, move_ctor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 334
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 335
  int fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 336
  EXPECT_NE(-1, fd);
f8deb5b9 Poul Sander 2022-01-15 13:55 337
  file f2(std::move(f));
f8deb5b9 Poul Sander 2022-01-15 13:55 338
  EXPECT_EQ(fd, f2.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 339
  EXPECT_EQ(-1, f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 340
}
f8deb5b9 Poul Sander 2022-01-15 13:55 341
f8deb5b9 Poul Sander 2022-01-15 13:55 342
TEST(file_test, move_assignment) {
f8deb5b9 Poul Sander 2022-01-15 13:55 343
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 344
  int fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 345
  EXPECT_NE(-1, fd);
f8deb5b9 Poul Sander 2022-01-15 13:55 346
  file f2;
f8deb5b9 Poul Sander 2022-01-15 13:55 347
  f2 = std::move(f);
f8deb5b9 Poul Sander 2022-01-15 13:55 348
  EXPECT_EQ(fd, f2.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 349
  EXPECT_EQ(-1, f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 350
}
f8deb5b9 Poul Sander 2022-01-15 13:55 351
f8deb5b9 Poul Sander 2022-01-15 13:55 352
TEST(file_test, move_assignment_closes_file) {
f8deb5b9 Poul Sander 2022-01-15 13:55 353
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 354
  file f2 = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 355
  int old_fd = f2.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 356
  f2 = std::move(f);
f8deb5b9 Poul Sander 2022-01-15 13:55 357
  EXPECT_TRUE(isclosed(old_fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 358
}
f8deb5b9 Poul Sander 2022-01-15 13:55 359
f8deb5b9 Poul Sander 2022-01-15 13:55 360
file open_buffered_file(int& fd) {
f8deb5b9 Poul Sander 2022-01-15 13:55 361
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 362
  fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 363
  return f;
f8deb5b9 Poul Sander 2022-01-15 13:55 364
}
f8deb5b9 Poul Sander 2022-01-15 13:55 365
f8deb5b9 Poul Sander 2022-01-15 13:55 366
TEST(file_test, move_from_temporary_in_ctor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 367
  int fd = 0xdead;
f8deb5b9 Poul Sander 2022-01-15 13:55 368
  file f(open_buffered_file(fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 369
  EXPECT_EQ(fd, f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 370
}
f8deb5b9 Poul Sander 2022-01-15 13:55 371
f8deb5b9 Poul Sander 2022-01-15 13:55 372
TEST(file_test, move_from_temporary_in_assignment) {
f8deb5b9 Poul Sander 2022-01-15 13:55 373
  int fd = 0xdead;
f8deb5b9 Poul Sander 2022-01-15 13:55 374
  file f;
f8deb5b9 Poul Sander 2022-01-15 13:55 375
  f = open_buffered_file(fd);
f8deb5b9 Poul Sander 2022-01-15 13:55 376
  EXPECT_EQ(fd, f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 377
}
f8deb5b9 Poul Sander 2022-01-15 13:55 378
f8deb5b9 Poul Sander 2022-01-15 13:55 379
TEST(file_test, move_from_temporary_in_assignment_closes_file) {
f8deb5b9 Poul Sander 2022-01-15 13:55 380
  int fd = 0xdead;
f8deb5b9 Poul Sander 2022-01-15 13:55 381
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 382
  int old_fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 383
  f = open_buffered_file(fd);
f8deb5b9 Poul Sander 2022-01-15 13:55 384
  EXPECT_TRUE(isclosed(old_fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 385
}
f8deb5b9 Poul Sander 2022-01-15 13:55 386
f8deb5b9 Poul Sander 2022-01-15 13:55 387
TEST(file_test, close_file_in_dtor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 388
  int fd = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 389
  {
f8deb5b9 Poul Sander 2022-01-15 13:55 390
    file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 391
    fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 392
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 393
  EXPECT_TRUE(isclosed(fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 394
}
f8deb5b9 Poul Sander 2022-01-15 13:55 395
f8deb5b9 Poul Sander 2022-01-15 13:55 396
TEST(file_test, close_error_in_dtor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 397
  std::unique_ptr<file> f(new file(open_file()));
f8deb5b9 Poul Sander 2022-01-15 13:55 398
  EXPECT_WRITE(
f8deb5b9 Poul Sander 2022-01-15 13:55 399
      stderr,
f8deb5b9 Poul Sander 2022-01-15 13:55 400
      {
f8deb5b9 Poul Sander 2022-01-15 13:55 401
        // The close function must be called inside EXPECT_WRITE,
f8deb5b9 Poul Sander 2022-01-15 13:55 402
        // otherwise the system may recycle closed file descriptor when
f8deb5b9 Poul Sander 2022-01-15 13:55 403
        // redirecting the output in EXPECT_STDERR and the second close
f8deb5b9 Poul Sander 2022-01-15 13:55 404
        // will break output redirection.
f8deb5b9 Poul Sander 2022-01-15 13:55 405
        FMT_POSIX(close(f->descriptor()));
f8deb5b9 Poul Sander 2022-01-15 13:55 406
        SUPPRESS_ASSERT(f.reset(nullptr));
f8deb5b9 Poul Sander 2022-01-15 13:55 407
      },
f8deb5b9 Poul Sander 2022-01-15 13:55 408
      system_error_message(EBADF, "cannot close file") + "\n");
f8deb5b9 Poul Sander 2022-01-15 13:55 409
}
f8deb5b9 Poul Sander 2022-01-15 13:55 410
f8deb5b9 Poul Sander 2022-01-15 13:55 411
TEST(file_test, close) {
f8deb5b9 Poul Sander 2022-01-15 13:55 412
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 413
  int fd = f.descriptor();
f8deb5b9 Poul Sander 2022-01-15 13:55 414
  f.close();
f8deb5b9 Poul Sander 2022-01-15 13:55 415
  EXPECT_EQ(-1, f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 416
  EXPECT_TRUE(isclosed(fd));
f8deb5b9 Poul Sander 2022-01-15 13:55 417
}
f8deb5b9 Poul Sander 2022-01-15 13:55 418
f8deb5b9 Poul Sander 2022-01-15 13:55 419
TEST(file_test, close_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 420
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 421
  FMT_POSIX(close(f.descriptor()));
f8deb5b9 Poul Sander 2022-01-15 13:55 422
  EXPECT_SYSTEM_ERROR_NOASSERT(f.close(), EBADF, "cannot close file");
f8deb5b9 Poul Sander 2022-01-15 13:55 423
  EXPECT_EQ(-1, f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 424
}
f8deb5b9 Poul Sander 2022-01-15 13:55 425
f8deb5b9 Poul Sander 2022-01-15 13:55 426
TEST(file_test, read) {
f8deb5b9 Poul Sander 2022-01-15 13:55 427
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 428
  EXPECT_READ(f, file_content);
f8deb5b9 Poul Sander 2022-01-15 13:55 429
}
f8deb5b9 Poul Sander 2022-01-15 13:55 430
f8deb5b9 Poul Sander 2022-01-15 13:55 431
TEST(file_test, read_error) {
47fd5c32 Poul Sander 2024-10-05 08:44 432
  auto test_file = uniq_file_name(__LINE__); 
47fd5c32 Poul Sander 2024-10-05 08:44 433
  file f(test_file, file::WRONLY | file::CREATE);
f8deb5b9 Poul Sander 2022-01-15 13:55 434
  char buf;
f8deb5b9 Poul Sander 2022-01-15 13:55 435
  // We intentionally read from a file opened in the write-only mode to
f8deb5b9 Poul Sander 2022-01-15 13:55 436
  // cause error.
f8deb5b9 Poul Sander 2022-01-15 13:55 437
  EXPECT_SYSTEM_ERROR(f.read(&buf, 1), EBADF, "cannot read from file");
f8deb5b9 Poul Sander 2022-01-15 13:55 438
}
f8deb5b9 Poul Sander 2022-01-15 13:55 439
f8deb5b9 Poul Sander 2022-01-15 13:55 440
TEST(file_test, write) {
47fd5c32 Poul Sander 2024-10-05 08:44 441
  auto pipe = fmt::pipe();
47fd5c32 Poul Sander 2024-10-05 08:44 442
  auto test_file = uniq_file_name(__LINE__);
47fd5c32 Poul Sander 2024-10-05 08:44 443
  write(pipe.write_end, test_file);
47fd5c32 Poul Sander 2024-10-05 08:44 444
  pipe.write_end.close();
47fd5c32 Poul Sander 2024-10-05 08:44 445
  EXPECT_READ(pipe.read_end, test_file);
f8deb5b9 Poul Sander 2022-01-15 13:55 446
}
f8deb5b9 Poul Sander 2022-01-15 13:55 447
f8deb5b9 Poul Sander 2022-01-15 13:55 448
TEST(file_test, write_error) {
47fd5c32 Poul Sander 2024-10-05 08:44 449
  auto test_file = uniq_file_name(__LINE__);
47fd5c32 Poul Sander 2024-10-05 08:44 450
  file f(test_file, file::RDONLY | file::CREATE);
f8deb5b9 Poul Sander 2022-01-15 13:55 451
  // We intentionally write to a file opened in the read-only mode to
f8deb5b9 Poul Sander 2022-01-15 13:55 452
  // cause error.
f8deb5b9 Poul Sander 2022-01-15 13:55 453
  EXPECT_SYSTEM_ERROR(f.write(" ", 1), EBADF, "cannot write to file");
f8deb5b9 Poul Sander 2022-01-15 13:55 454
}
f8deb5b9 Poul Sander 2022-01-15 13:55 455
f8deb5b9 Poul Sander 2022-01-15 13:55 456
TEST(file_test, dup) {
f8deb5b9 Poul Sander 2022-01-15 13:55 457
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 458
  file copy = file::dup(f.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 459
  EXPECT_NE(f.descriptor(), copy.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 460
  EXPECT_EQ(file_content, read(copy, std::strlen(file_content)));
f8deb5b9 Poul Sander 2022-01-15 13:55 461
}
f8deb5b9 Poul Sander 2022-01-15 13:55 462
f8deb5b9 Poul Sander 2022-01-15 13:55 463
#  ifndef __COVERITY__
f8deb5b9 Poul Sander 2022-01-15 13:55 464
TEST(file_test, dup_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 465
  int value = -1;
f8deb5b9 Poul Sander 2022-01-15 13:55 466
  EXPECT_SYSTEM_ERROR_NOASSERT(file::dup(value), EBADF,
f8deb5b9 Poul Sander 2022-01-15 13:55 467
                               "cannot duplicate file descriptor -1");
f8deb5b9 Poul Sander 2022-01-15 13:55 468
}
f8deb5b9 Poul Sander 2022-01-15 13:55 469
#  endif
f8deb5b9 Poul Sander 2022-01-15 13:55 470
f8deb5b9 Poul Sander 2022-01-15 13:55 471
TEST(file_test, dup2) {
f8deb5b9 Poul Sander 2022-01-15 13:55 472
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 473
  file copy = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 474
  f.dup2(copy.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 475
  EXPECT_NE(f.descriptor(), copy.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 476
  EXPECT_READ(copy, file_content);
f8deb5b9 Poul Sander 2022-01-15 13:55 477
}
f8deb5b9 Poul Sander 2022-01-15 13:55 478
f8deb5b9 Poul Sander 2022-01-15 13:55 479
TEST(file_test, dup2_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 480
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 481
  EXPECT_SYSTEM_ERROR_NOASSERT(
f8deb5b9 Poul Sander 2022-01-15 13:55 482
      f.dup2(-1), EBADF,
f8deb5b9 Poul Sander 2022-01-15 13:55 483
      fmt::format("cannot duplicate file descriptor {} to -1", f.descriptor()));
f8deb5b9 Poul Sander 2022-01-15 13:55 484
}
f8deb5b9 Poul Sander 2022-01-15 13:55 485
f8deb5b9 Poul Sander 2022-01-15 13:55 486
TEST(file_test, dup2_noexcept) {
f8deb5b9 Poul Sander 2022-01-15 13:55 487
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 488
  file copy = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 489
  std::error_code ec;
f8deb5b9 Poul Sander 2022-01-15 13:55 490
  f.dup2(copy.descriptor(), ec);
f8deb5b9 Poul Sander 2022-01-15 13:55 491
  EXPECT_EQ(ec.value(), 0);
f8deb5b9 Poul Sander 2022-01-15 13:55 492
  EXPECT_NE(f.descriptor(), copy.descriptor());
f8deb5b9 Poul Sander 2022-01-15 13:55 493
  EXPECT_READ(copy, file_content);
f8deb5b9 Poul Sander 2022-01-15 13:55 494
}
f8deb5b9 Poul Sander 2022-01-15 13:55 495
f8deb5b9 Poul Sander 2022-01-15 13:55 496
TEST(file_test, dup2_noexcept_error) {
f8deb5b9 Poul Sander 2022-01-15 13:55 497
  file f = open_file();
f8deb5b9 Poul Sander 2022-01-15 13:55 498
  std::error_code ec;
f8deb5b9 Poul Sander 2022-01-15 13:55 499
  SUPPRESS_ASSERT(f.dup2(-1, ec));
f8deb5b9 Poul Sander 2022-01-15 13:55 500
  EXPECT_EQ(EBADF, ec.value());
f8deb5b9 Poul Sander 2022-01-15 13:55 501
}
f8deb5b9 Poul Sander 2022-01-15 13:55 502
f8deb5b9 Poul Sander 2022-01-15 13:55 503
TEST(file_test, pipe) {
47fd5c32 Poul Sander 2024-10-05 08:44 504
  auto pipe = fmt::pipe();
47fd5c32 Poul Sander 2024-10-05 08:44 505
  EXPECT_NE(-1, pipe.read_end.descriptor());
47fd5c32 Poul Sander 2024-10-05 08:44 506
  EXPECT_NE(-1, pipe.write_end.descriptor());
47fd5c32 Poul Sander 2024-10-05 08:44 507
  write(pipe.write_end, "test");
47fd5c32 Poul Sander 2024-10-05 08:44 508
  EXPECT_READ(pipe.read_end, "test");
f8deb5b9 Poul Sander 2022-01-15 13:55 509
}
f8deb5b9 Poul Sander 2022-01-15 13:55 510
f8deb5b9 Poul Sander 2022-01-15 13:55 511
TEST(file_test, fdopen) {
47fd5c32 Poul Sander 2024-10-05 08:44 512
  auto pipe = fmt::pipe();
47fd5c32 Poul Sander 2024-10-05 08:44 513
  int read_fd = pipe.read_end.descriptor();
47fd5c32 Poul Sander 2024-10-05 08:44 514
  EXPECT_EQ(read_fd, FMT_POSIX(fileno(pipe.read_end.fdopen("r").get())));
f8deb5b9 Poul Sander 2022-01-15 13:55 515
}
f8deb5b9 Poul Sander 2022-01-15 13:55 516
#endif  // FMT_USE_FCNTL
1970-01-01 00:00 517