Skip to content

Commit 2f58430

Browse files
committed
Move buffering tests to os-test
1 parent d5d32c1 commit 2f58430

2 files changed

Lines changed: 46 additions & 48 deletions

File tree

test/format-test.cc

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,54 +1825,6 @@ TEST(format_test, big_print) {
18251825
EXPECT_WRITE(stdout, big_print(), std::string(count, 'x'));
18261826
}
18271827

1828-
// Windows CRT implements _IOLBF incorrectly (full buffering).
1829-
#if FMT_USE_FCNTL
1830-
1831-
# ifndef _WIN32
1832-
TEST(format_test, line_buffering) {
1833-
auto pipe = fmt::pipe();
1834-
1835-
int write_fd = pipe.write_end.descriptor();
1836-
auto write_end = pipe.write_end.fdopen("w");
1837-
setvbuf(write_end.get(), nullptr, _IOLBF, 4096);
1838-
write_end.print("42\n");
1839-
close(write_fd);
1840-
try {
1841-
write_end.close();
1842-
} catch (const std::system_error&) {
1843-
}
1844-
1845-
auto read_end = pipe.read_end.fdopen("r");
1846-
std::thread reader([&]() {
1847-
int n = 0;
1848-
int result = fscanf(read_end.get(), "%d", &n);
1849-
(void)result;
1850-
EXPECT_EQ(n, 42);
1851-
});
1852-
1853-
reader.join();
1854-
}
1855-
# endif
1856-
1857-
TEST(format_test, buffer_boundary) {
1858-
auto pipe = fmt::pipe();
1859-
1860-
auto write_end = pipe.write_end.fdopen("w");
1861-
setvbuf(write_end.get(), nullptr, _IOFBF, 4096);
1862-
for (int i = 3; i < 4094; i++)
1863-
write_end.print("{}", (i % 73) != 0 ? 'x' : '\n');
1864-
write_end.print("{} {}", 1234, 567);
1865-
write_end.close();
1866-
1867-
auto read_end = pipe.read_end.fdopen("r");
1868-
char buf[4091] = {};
1869-
size_t n = fread(buf, 1, sizeof(buf), read_end.get());
1870-
EXPECT_EQ(n, sizeof(buf));
1871-
EXPECT_STREQ(fgets(buf, sizeof(buf), read_end.get()), "1234 567");
1872-
}
1873-
1874-
#endif // FMT_USE_FCNTL
1875-
18761828
struct deadlockable {
18771829
int value = 0;
18781830
mutable std::mutex mutex;

test/os-test.cc

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <cstdlib> // std::exit
1111
#include <cstring>
1212
#include <memory>
13+
#include <thread>
1314

1415
#include "gtest-extra.h"
1516
#include "util.h"
@@ -513,4 +514,49 @@ TEST(file_test, fdopen) {
513514
int read_fd = pipe.read_end.descriptor();
514515
EXPECT_EQ(read_fd, FMT_POSIX(fileno(pipe.read_end.fdopen("r").get())));
515516
}
517+
518+
// Windows CRT implements _IOLBF incorrectly (full buffering).
519+
# ifndef _WIN32
520+
TEST(file_test, line_buffering) {
521+
auto pipe = fmt::pipe();
522+
523+
int write_fd = pipe.write_end.descriptor();
524+
auto write_end = pipe.write_end.fdopen("w");
525+
setvbuf(write_end.get(), nullptr, _IOLBF, 4096);
526+
write_end.print("42\n");
527+
close(write_fd);
528+
try {
529+
write_end.close();
530+
} catch (const std::system_error&) {
531+
}
532+
533+
auto read_end = pipe.read_end.fdopen("r");
534+
std::thread reader([&]() {
535+
int n = 0;
536+
int result = fscanf(read_end.get(), "%d", &n);
537+
(void)result;
538+
EXPECT_EQ(n, 42);
539+
});
540+
541+
reader.join();
542+
}
543+
# endif // _WIN32
544+
545+
TEST(file_test, buffer_boundary) {
546+
auto pipe = fmt::pipe();
547+
548+
auto write_end = pipe.write_end.fdopen("w");
549+
setvbuf(write_end.get(), nullptr, _IOFBF, 4096);
550+
for (int i = 3; i < 4094; i++)
551+
write_end.print("{}", (i % 73) != 0 ? 'x' : '\n');
552+
write_end.print("{} {}", 1234, 567);
553+
write_end.close();
554+
555+
auto read_end = pipe.read_end.fdopen("r");
556+
char buf[4091] = {};
557+
size_t n = fread(buf, 1, sizeof(buf), read_end.get());
558+
EXPECT_EQ(n, sizeof(buf));
559+
EXPECT_STREQ(fgets(buf, sizeof(buf), read_end.get()), "1234 567");
560+
}
561+
516562
#endif // FMT_USE_FCNTL

0 commit comments

Comments
 (0)