diff options
author | Elliott Hughes <enh@google.com> | 2020-08-12 14:25:41 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2020-08-12 15:52:14 -0700 |
commit | 7cebf835f310650f67b254295a685918681656fc (patch) | |
tree | daf485447fccb691750149c465b2c629adf6e305 /tests/stdio_test.cpp | |
parent | a4110def5cec22306313a34fff64b5810c9b1792 (diff) |
Various coverage improvements.
Mostly from extra test cases, but also:
* Move the fgets size < 0 assertion into fgets.
* Use ELF aliases for strtoq/strtouq rather than duplicating code.
* Don't check uname() succeeded, since it can't fail.
Test: treehugger
Change-Id: I2e6b3b88b0a3eb16bd68be68b9bc9f40d8043291
Diffstat (limited to 'tests/stdio_test.cpp')
-rw-r--r-- | tests/stdio_test.cpp | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/tests/stdio_test.cpp b/tests/stdio_test.cpp index f6eca05f4..c21c3b8b6 100644 --- a/tests/stdio_test.cpp +++ b/tests/stdio_test.cpp @@ -371,6 +371,11 @@ TEST(STDIO_TEST, snprintf_n) { #endif } +TEST(STDIO_TEST, snprintf_measure) { + char buf[16]; + ASSERT_EQ(11, snprintf(buf, 0, "Hello %s", "world")); +} + TEST(STDIO_TEST, snprintf_smoke) { char buf[BUFSIZ]; @@ -1155,7 +1160,6 @@ TEST(STDIO_TEST, sscanf_mc) { free(p1); } - TEST(STDIO_TEST, sscanf_mlc) { // This is so useless that clang doesn't even believe it exists... #pragma clang diagnostic push @@ -1189,7 +1193,6 @@ TEST(STDIO_TEST, sscanf_mlc) { #pragma clang diagnostic pop } - TEST(STDIO_TEST, sscanf_ms) { CheckScanfM(sscanf, "hello", "%ms", 1, "hello"); CheckScanfM(sscanf, "hello", "%4ms", 1, "hell"); @@ -2533,6 +2536,16 @@ TEST(STDIO_TEST, puts) { eth.Run([&]() { exit(puts("a b c")); }, 0, "a b c\n"); } +TEST(STDIO_TEST, putchar) { + ExecTestHelper eth; + eth.Run([&]() { exit(putchar('A')); }, 65, "A"); +} + +TEST(STDIO_TEST, putchar_unlocked) { + ExecTestHelper eth; + eth.Run([&]() { exit(putchar('B')); }, 66, "B"); +} + TEST(STDIO_TEST, unlocked) { TemporaryFile tf; @@ -2733,3 +2746,73 @@ TEST(STDIO_TEST, renameat2_flags) { ASSERT_NE(0, RENAME_WHITEOUT); #endif } + +TEST(STDIO_TEST, fdopen_failures) { + FILE* fp; + int fd = open("/proc/version", O_RDONLY); + ASSERT_TRUE(fd != -1); + + // Nonsense mode. + errno = 0; + fp = fdopen(fd, "nonsense"); + ASSERT_TRUE(fp == nullptr); + ASSERT_EQ(EINVAL, errno); + + // Mode that isn't a subset of the fd's actual mode. + errno = 0; + fp = fdopen(fd, "w"); + ASSERT_TRUE(fp == nullptr); + ASSERT_EQ(EINVAL, errno); + + // Can't set append on the underlying fd. + errno = 0; + fp = fdopen(fd, "a"); + ASSERT_TRUE(fp == nullptr); + ASSERT_EQ(EINVAL, errno); + + // Bad fd. + errno = 0; + fp = fdopen(-1, "re"); + ASSERT_TRUE(fp == nullptr); + ASSERT_EQ(EBADF, errno); + + close(fd); +} + +TEST(STDIO_TEST, fmemopen_invalid_mode) { + errno = 0; + FILE* fp = fmemopen(nullptr, 16, "nonsense"); + ASSERT_TRUE(fp == nullptr); + ASSERT_EQ(EINVAL, errno); +} + +TEST(STDIO_TEST, fopen_invalid_mode) { + errno = 0; + FILE* fp = fopen("/proc/version", "nonsense"); + ASSERT_TRUE(fp == nullptr); + ASSERT_EQ(EINVAL, errno); +} + +TEST(STDIO_TEST, freopen_invalid_mode) { + FILE* fp = fopen("/proc/version", "re"); + ASSERT_TRUE(fp != nullptr); + + errno = 0; + fp = freopen("/proc/version", "nonsense", fp); + ASSERT_TRUE(fp == nullptr); + ASSERT_EQ(EINVAL, errno); +} + +TEST(STDIO_TEST, asprintf_smoke) { + char* p = nullptr; + ASSERT_EQ(11, asprintf(&p, "hello %s", "world")); + ASSERT_STREQ("hello world", p); + free(p); +} + +TEST(STDIO_TEST, fopen_ENOENT) { + errno = 0; + FILE* fp = fopen("/proc/does-not-exist", "re"); + ASSERT_TRUE(fp == nullptr); + ASSERT_EQ(ENOENT, errno); +} |