From c9244bdac1ae254bdbb9687da9cdbb4c3f4cb432 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Wed, 14 May 2014 13:31:35 -0700 Subject: [PATCH] Add tests for fprintf behavior when the underlying fd is bad. Bug: 7229520 Change-Id: Ie878e0c13fdcda7b9131fa56208b84ed88125be7 --- tests/stdio_test.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) 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);