X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftest%2Ftest-fileio.c;h=cdf1973ea597826f6789db563e72b0cd83463c43;hb=0e707326fcecd3968efa7dc827123032f1b2cb61;hp=eb4fbc91d2dcd2dc50463185ccc99d78c78ca1fd;hpb=5fba7bbfa47ef5c03a28000252d06ec82405d461;p=elogind.git diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c index eb4fbc91d..cdf1973ea 100644 --- a/src/test/test-fileio.c +++ b/src/test/test-fileio.c @@ -41,11 +41,11 @@ static void test_parse_env_file(void) { char **i; unsigned k; - fd = mkstemp(p); + fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); close(fd); - fd = mkostemp(t, O_CLOEXEC); + fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); f = fdopen(fd, "w"); @@ -72,7 +72,7 @@ static void test_parse_env_file(void) { fflush(f); fclose(f); - r = load_env_file(t, NULL, &a); + r = load_env_file(NULL, t, NULL, &a); assert_se(r >= 0); STRV_FOREACH(i, a) @@ -90,7 +90,7 @@ static void test_parse_env_file(void) { assert_se(streq_ptr(a[9], "ten=")); assert_se(a[10] == NULL); - strv_env_clean_log(a, "test"); + strv_env_clean_log(a, NULL, "test"); k = 0; STRV_FOREACH(i, b) { @@ -139,7 +139,7 @@ static void test_parse_env_file(void) { r = write_env_file(p, a); assert_se(r >= 0); - r = load_env_file(p, NULL, &b); + r = load_env_file(NULL, p, NULL, &b); assert_se(r >= 0); unlink(t); @@ -154,11 +154,11 @@ static void test_parse_multiline_env_file(void) { _cleanup_strv_free_ char **a = NULL, **b = NULL; char **i; - fd = mkstemp(p); + fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); close(fd); - fd = mkostemp(t, O_CLOEXEC); + fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); f = fdopen(fd, "w"); @@ -179,7 +179,7 @@ static void test_parse_multiline_env_file(void) { fflush(f); fclose(f); - r = load_env_file(t, NULL, &a); + r = load_env_file(NULL, t, NULL, &a); assert_se(r >= 0); STRV_FOREACH(i, a) @@ -193,7 +193,7 @@ static void test_parse_multiline_env_file(void) { r = write_env_file(p, a); assert_se(r >= 0); - r = load_env_file(p, NULL, &b); + r = load_env_file(NULL, p, NULL, &b); assert_se(r >= 0); unlink(t); @@ -207,7 +207,7 @@ static void test_executable_is_script(void) { FILE *f; char *command; - fd = mkostemp(t, O_CLOEXEC); + fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); f = fdopen(fd, "w"); @@ -246,25 +246,25 @@ static void test_status_field(void) { r = get_status_field("/proc/meminfo", "MemTotal:", &p); if (r != -ENOENT) { - assert(r == 0); + assert_se(r == 0); puts(p); assert_se(safe_atollu(p, &total) == 0); } r = get_status_field("/proc/meminfo", "\nBuffers:", &s); if (r != -ENOENT) { - assert(r == 0); + assert_se(r == 0); puts(s); assert_se(safe_atollu(s, &buffers) == 0); } - if (p && t) - assert(buffers < total); + if (p) + assert_se(buffers < total); /* Seccomp should be a good test for field full of zeros. */ r = get_status_field("/proc/meminfo", "\nSeccomp:", &z); if (r != -ENOENT) { - assert(r == 0); + assert_se(r == 0); puts(z); assert_se(safe_atollu(z, &buffers) == 0); } @@ -283,13 +283,115 @@ static void test_capeff(void) { if (r == -ENOENT || r == -EPERM) return; - assert(r == 0); - assert(*capeff); + assert_se(r == 0); + assert_se(*capeff); p = capeff[strspn(capeff, DIGITS "abcdefABCDEF")]; - assert(!p || isspace(p)); + assert_se(!p || isspace(p)); } } +static void test_write_string_stream(void) { + char fn[] = "/tmp/test-write_string_stream-XXXXXX"; + _cleanup_fclose_ FILE *f = NULL; + int fd; + char buf[64]; + + fd = mkostemp_safe(fn, O_RDWR); + assert_se(fd >= 0); + + f = fdopen(fd, "r"); + assert_se(f); + assert_se(write_string_stream(f, "boohoo") < 0); + + f = freopen(fn, "r+", f); + assert_se(f); + + assert_se(write_string_stream(f, "boohoo") == 0); + rewind(f); + + assert_se(fgets(buf, sizeof(buf), f)); + assert_se(streq(buf, "boohoo\n")); + + unlink(fn); +} + +static void test_write_string_file(void) { + char fn[] = "/tmp/test-write_string_file-XXXXXX"; + char buf[64] = {}; + _cleanup_close_ int fd; + + fd = mkostemp_safe(fn, O_RDWR); + assert_se(fd >= 0); + + assert_se(write_string_file(fn, "boohoo") == 0); + + assert_se(read(fd, buf, sizeof(buf)) == 7); + assert_se(streq(buf, "boohoo\n")); + + unlink(fn); +} + +static void test_write_string_file_no_create(void) { + char fn[] = "/tmp/test-write_string_file_no_create-XXXXXX"; + _cleanup_close_ int fd; + char buf[64] = {0}; + + fd = mkostemp_safe(fn, O_RDWR); + assert_se(fd >= 0); + + assert_se(write_string_file_no_create("/a/file/which/does/not/exists/i/guess", "boohoo") < 0); + assert_se(write_string_file_no_create(fn, "boohoo") == 0); + + assert_se(read(fd, buf, sizeof(buf)) == strlen("boohoo\n")); + assert_se(streq(buf, "boohoo\n")); + + unlink(fn); +} + +static void test_load_env_file_pairs(void) { + char fn[] = "/tmp/test-load_env_file_pairs-XXXXXX"; + int fd; + int r; + _cleanup_fclose_ FILE *f = NULL; + _cleanup_strv_free_ char **l = NULL; + char **k, **v; + + fd = mkostemp_safe(fn, O_RDWR); + assert_se(fd >= 0); + + r = write_string_file(fn, + "NAME=\"Arch Linux\"\n" + "ID=arch\n" + "PRETTY_NAME=\"Arch Linux\"\n" + "ANSI_COLOR=\"0;36\"\n" + "HOME_URL=\"https://www.archlinux.org/\"\n" + "SUPPORT_URL=\"https://bbs.archlinux.org/\"\n" + "BUG_REPORT_URL=\"https://bugs.archlinux.org/\"\n" + ); + assert_se(r == 0); + + f = fdopen(fd, "r"); + assert_se(f); + + r = load_env_file_pairs(f, fn, NULL, &l); + assert_se(r >= 0); + + assert_se(strv_length(l) == 14); + STRV_FOREACH_PAIR(k, v, l) { + assert_se(STR_IN_SET(*k, "NAME", "ID", "PRETTY_NAME", "ANSI_COLOR", "HOME_URL", "SUPPORT_URL", "BUG_REPORT_URL")); + printf("%s=%s\n", *k, *v); + if (streq(*k, "NAME")) assert_se(streq(*v, "Arch Linux")); + if (streq(*k, "ID")) assert_se(streq(*v, "arch")); + if (streq(*k, "PRETTY_NAME")) assert_se(streq(*v, "Arch Linux")); + if (streq(*k, "ANSI_COLOR")) assert_se(streq(*v, "0;36")); + if (streq(*k, "HOME_URL")) assert_se(streq(*v, "https://www.archlinux.org/")); + if (streq(*k, "SUPPORT_URL")) assert_se(streq(*v, "https://bbs.archlinux.org/")); + if (streq(*k, "BUG_REPORT_URL")) assert_se(streq(*v, "https://bugs.archlinux.org/")); + } + + unlink(fn); +} + int main(int argc, char *argv[]) { log_parse_environment(); log_open(); @@ -299,6 +401,10 @@ int main(int argc, char *argv[]) { test_executable_is_script(); test_status_field(); test_capeff(); + test_write_string_stream(); + test_write_string_file(); + test_write_string_file_no_create(); + test_load_env_file_pairs(); return 0; }