diff --git a/test/format-test.cc b/test/format-test.cc index 9c89e898..8406d86a 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -15,12 +15,15 @@ #include // uint32_t -#include // INT_MAX -#include // std::signbit -#include // std::strlen -#include // std::back_inserter -#include // std::list -#include // std::is_default_constructible +#include // INT_MAX +#include // std::signbit +#include // std::condition_variable +#include // std::strlen +#include // std::back_inserter +#include // std::list +#include // std::mutex +#include // std::thread +#include // std::is_default_constructible #include "gtest-extra.h" #include "mock-allocator.h" @@ -1756,14 +1759,26 @@ TEST(format_test, big_print) { #if FMT_USE_FCNTL && !defined(_WIN32) TEST(format_test, line_buffering) { auto pipe = fmt::pipe(); - auto read_end = pipe.read_end.fdopen("r"); + auto write_end = pipe.write_end.fdopen("w"); setvbuf(write_end.get(), nullptr, _IOLBF, 4096); write_end.print("42\n"); - int n = 0; - int result = fscanf(read_end.get(), "%d", &n); - (void)result; - EXPECT_EQ(n, 42); + + std::mutex mutex; + std::condition_variable cv; + auto read_end = pipe.read_end.fdopen("r"); + std::thread reader([&]() { + int n = 0; + int result = fscanf(read_end.get(), "%d", &n); + (void)result; + EXPECT_EQ(n, 42); + cv.notify_one(); + }); + + std::unique_lock lock(mutex); + ASSERT_EQ(cv.wait_for(lock, std::chrono::seconds(1)), + std::cv_status::no_timeout); + reader.join(); } #endif