diff --git a/tests/stdio_test.cpp b/tests/stdio_test.cpp index 2a0549ac6..3194e59e9 100644 --- a/tests/stdio_test.cpp +++ b/tests/stdio_test.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -407,6 +408,28 @@ TEST(stdio, snprintf_negative_zero_5084292) { EXPECT_STREQ("-0.000000", buf); } +TEST(stdio, fprintf_failures_7229520) { + FILE* fp; + + // Unbuffered case where the fprintf(3) itself fails. + ASSERT_NE(nullptr, fp = tmpfile()); + setbuf(fp, NULL); + ASSERT_EQ(4, fprintf(fp, "epic")); + ASSERT_EQ(0, close(fileno(fp))); + ASSERT_EQ(-1, fprintf(fp, "fail")); + ASSERT_EQ(-1, fclose(fp)); + + // Buffered case where we won't notice until the fclose(3). + // It's likely this is what was actually seen in http://b/7229520, + // and that expecting fprintf to fail is setting yourself up for + // disappointment. Remember to check fclose(3)'s return value, kids! + ASSERT_NE(nullptr, fp = tmpfile()); + ASSERT_EQ(4, fprintf(fp, "epic")); + ASSERT_EQ(0, close(fileno(fp))); + ASSERT_EQ(4, fprintf(fp, "fail")); + ASSERT_EQ(-1, fclose(fp)); +} + TEST(stdio, popen) { FILE* fp = popen("cat /proc/version", "r"); ASSERT_TRUE(fp != NULL);