diff --git a/Tests/LibC/CMakeLists.txt b/Tests/LibC/CMakeLists.txt index 02bde80580..2391c05ae0 100644 --- a/Tests/LibC/CMakeLists.txt +++ b/Tests/LibC/CMakeLists.txt @@ -18,6 +18,7 @@ set(TEST_SOURCES TestSearch.cpp TestSnprintf.cpp TestStackSmash.cpp + TestStdio.cpp TestStrlcpy.cpp TestStrtodAccuracy.cpp TestWchar.cpp diff --git a/Tests/LibC/TestStdio.cpp b/Tests/LibC/TestStdio.cpp new file mode 100644 index 0000000000..0c0b818d0e --- /dev/null +++ b/Tests/LibC/TestStdio.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022, Daniel Bertalan + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +// Test whether file writes are flushed to disk at program termination, +// even if we do not close the files or call fflush(). +TEST_CASE(flush_on_exit) +{ + static constexpr auto test_str = "peekaboo"; + auto pid = fork(); + VERIFY(pid >= 0); + + if (pid == 0) { + auto* fp = fopen("/tmp/flushtest", "w"); + VERIFY(fp != nullptr); + auto nwritten = fwrite(test_str, 1, strlen(test_str), fp); + VERIFY(nwritten != 0); + // We intentionally leak `fp` here. + exit(0); + } else { + int wstatus; + auto rc = waitpid(pid, &wstatus, 0); + VERIFY(rc >= 0); + + char buf[256]; + auto* fp = fopen("/tmp/flushtest", "r"); + VERIFY(fp != nullptr); + auto* sp = fgets(buf, sizeof(buf), fp); + VERIFY(sp != nullptr); + fclose(fp); + unlink("/tmp/flushtest"); + + EXPECT_EQ(strcmp(test_str, buf), 0); + } +}