git repos / blockattack-game

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