From 4a0e2c447eeac47eaa497a2db6925590b3cec3bd Mon Sep 17 00:00:00 2001 From: Jan Synacek Date: Thu, 23 Nov 2017 11:42:05 +0100 Subject: [PATCH] test-fileio: also test read_line() with actual files Just in case the real FILE and the one from fmemopen weren't exactly the same. (cherry picked from commit 2c9de13912350f5887ccccdae9e1707512208053) Resolves: #1503106 --- src/test/test-fileio.c | 63 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c index fc59693228..791bfc97b0 100644 --- a/src/test/test-fileio.c +++ b/src/test/test-fileio.c @@ -392,20 +392,17 @@ static void test_load_env_file_pairs(void) { unlink(fn); } -static void test_read_line(void) { - _cleanup_fclose_ FILE *f = NULL; - _cleanup_free_ char *line = NULL; - char buffer[] = - "Some test data\n" - "With newlines, and a NUL byte\0" - "\n" - "an empty line\n" - "an ignored line\n" - "and a very long line that is supposed to be truncated, because it is so long\n"; +static const char buffer[] = + "Some test data\n" + "With newlines, and a NUL byte\0" + "\n" + "an empty line\n" + "an ignored line\n" + "and a very long line that is supposed to be truncated, because it is so long\n"; - f = fmemopen(buffer, sizeof(buffer), "re"); - assert_se(f); +static void test_read_line_one_file(FILE *f) { + _cleanup_free_ char *line = NULL; assert_se(read_line(f, (size_t) -1, &line) == 15 && streq(line, "Some test data")); line = mfree(line); @@ -435,6 +432,46 @@ static void test_read_line(void) { assert_se(read_line(f, 1024, &line) == 0 && streq(line, "")); } +static void test_read_line(void) { + _cleanup_fclose_ FILE *f = NULL; + _cleanup_free_ char *line = NULL; + + f = fmemopen((void*) buffer, sizeof(buffer), "re"); + assert_se(f); + + test_read_line_one_file(f); +} + +static void test_read_line2(void) { + char name[] = "/tmp/test-fileio.XXXXXX"; + int fd; + _cleanup_fclose_ FILE *f = NULL; + + fd = mkostemp_safe(name, O_CLOEXEC); + assert_se(fd >= 0); + assert_se((size_t) write(fd, buffer, sizeof(buffer)) == sizeof(buffer)); + + assert_se(lseek(fd, 0, SEEK_SET) == 0); + assert_se(f = fdopen(fd, "r")); + + test_read_line_one_file(f); +} + +static void test_read_line3(void) { + _cleanup_fclose_ FILE *f = NULL; + _cleanup_free_ char *line = NULL; + int r; + + f = fopen("/proc/cmdline", "re"); + if (!f && IN_SET(errno, ENOENT, EPERM)) + return; + assert_se(f); + + r = read_line(f, LINE_MAX, &line); + assert_se((size_t) r == strlen(line) + 1); + assert_se(read_line(f, LINE_MAX, NULL) == 0); +} + int main(int argc, char *argv[]) { log_parse_environment(); log_open(); @@ -449,6 +486,8 @@ int main(int argc, char *argv[]) { test_write_string_file_no_create(); test_load_env_file_pairs(); test_read_line(); + test_read_line2(); + test_read_line3(); return 0; }