X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ftest%2Ftest-util.c;h=dbc7cfe39789aaecc888daa4e91e31329a848e75;hp=1d952ebf1dafd4dea215d07b6d582d2c18f54b76;hb=927be00cb3dd09a911a6a4a29b5b7486c3c4c776;hpb=03e334a1c7dc8c20c38902aa039440763acc9b17 diff --git a/src/test/test-util.c b/src/test/test-util.c index 1d952ebf1..dbc7cfe39 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -25,8 +25,10 @@ #include #include #include +#include #include "util.h" +#include "mkdir.h" #include "strv.h" #include "def.h" #include "fileio.h" @@ -37,6 +39,36 @@ static void test_streq_ptr(void) { assert_se(!streq_ptr("abc", "cdef")); } +static void test_align_power2(void) { + unsigned long i, p2; + + assert_se(ALIGN_POWER2(0) == 0); + assert_se(ALIGN_POWER2(1) == 1); + assert_se(ALIGN_POWER2(2) == 2); + assert_se(ALIGN_POWER2(3) == 4); + assert_se(ALIGN_POWER2(12) == 16); + + assert_se(ALIGN_POWER2(ULONG_MAX) == 0); + assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0); + assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0); + assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1); + assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0); + + for (i = 1; i < 131071; ++i) { + for (p2 = 1; p2 < i; p2 <<= 1) + /* empty */ ; + + assert_se(ALIGN_POWER2(i) == p2); + } + + for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) { + for (p2 = 1; p2 && p2 < i; p2 <<= 1) + /* empty */ ; + + assert_se(ALIGN_POWER2(i) == p2); + } +} + static void test_first_word(void) { assert_se(first_word("Hello", "")); assert_se(first_word("Hello", "Hello")); @@ -265,14 +297,14 @@ static void test_undecchar(void) { static void test_cescape(void) { _cleanup_free_ char *escaped; - escaped = cescape("abc\\\"\b\f\n\r\t\v\003\177\234\313"); - assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\003\\177\\234\\313")); + escaped = cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"); + assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313")); } static void test_cunescape(void) { _cleanup_free_ char *unescaped; - unescaped = cunescape("abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\003\\177\\234\\313"); - assert_se(streq(unescaped, "abc\\\"\b\f\n\r\t\v\003\177\234\313")); + unescaped = cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313"); + assert_se(streq(unescaped, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313")); } static void test_foreach_word(void) { @@ -404,7 +436,7 @@ static void test_get_process_comm(void) { log_info("pid1 cmdline truncated: '%s'", d); assert_se(get_parent_of_pid(1, &e) >= 0); - log_info("pid1 ppid: '%llu'", (unsigned long long) e); + log_info("pid1 ppid: "PID_FMT, e); assert_se(e == 0); assert_se(is_kernel_thread(1) == 0); @@ -414,11 +446,11 @@ static void test_get_process_comm(void) { log_info("pid1 exe: '%s'", strna(f)); assert_se(get_process_uid(1, &u) == 0); - log_info("pid1 uid: '%llu'", (unsigned long long) u); + log_info("pid1 uid: "UID_FMT, u); assert_se(u == 0); assert_se(get_process_gid(1, &g) == 0); - log_info("pid1 gid: '%llu'", (unsigned long long) g); + log_info("pid1 gid: "GID_FMT, g); assert_se(g == 0); assert(get_ctty_devnr(1, &h) == -ENOENT); @@ -624,6 +656,8 @@ static void test_writing_tmpfile(void) { assert(r == 0); printf("contents: %s", contents); assert(streq(contents, "abc\n" ALPHANUMERICAL "\n")); + + unlink(name); } static void test_hexdump(void) { @@ -656,11 +690,211 @@ static void test_log2i(void) { assert_se(log2i(INT_MAX) == sizeof(int)*8-2); } +static void test_foreach_string(void) { + const char * const t[] = { + "foo", + "bar", + "waldo", + NULL + }; + const char *x; + unsigned i = 0; + + FOREACH_STRING(x, "foo", "bar", "waldo") + assert_se(streq_ptr(t[i++], x)); + + assert_se(i == 3); + + FOREACH_STRING(x, "zzz") + assert_se(streq(x, "zzz")); +} + +static void test_filename_is_safe(void) { + char foo[FILENAME_MAX+2]; + int i; + + assert_se(!filename_is_safe("")); + assert_se(!filename_is_safe("/bar/foo")); + assert_se(!filename_is_safe("/")); + assert_se(!filename_is_safe(".")); + assert_se(!filename_is_safe("..")); + + for (i=0; i= 0); + assert_se(symlink(name, name_alias) >= 0); + + assert_se(files_same(name, name)); + assert_se(files_same(name, name_alias)); + + unlink(name); + unlink(name_alias); +} + +static void test_is_valid_documentation_url(void) { + assert_se(is_valid_documentation_url("http://www.freedesktop.org/wiki/Software/systemd")); + assert_se(is_valid_documentation_url("https://www.kernel.org/doc/Documentation/binfmt_misc.txt")); + assert_se(is_valid_documentation_url("file:foo")); + assert_se(is_valid_documentation_url("man:systemd.special(7)")); + assert_se(is_valid_documentation_url("info:bar")); + + assert_se(!is_valid_documentation_url("foo:")); + assert_se(!is_valid_documentation_url("info:")); + assert_se(!is_valid_documentation_url("")); +} + +static void test_file_in_same_dir(void) { + assert_se(streq(file_in_same_dir("/", "a"), "/a")); + assert_se(streq(file_in_same_dir("/", "/a"), "/a")); + assert_se(streq(file_in_same_dir("", "a"), "a")); + assert_se(streq(file_in_same_dir("a/", "a"), "a/a")); + assert_se(streq(file_in_same_dir("bar/foo", "bar"), "bar/bar")); +} + +static void test_endswith(void) { + assert_se(endswith("foobar", "bar")); + assert_se(endswith("foobar", "")); + assert_se(endswith("foobar", "foobar")); + assert_se(endswith("", "")); + + assert_se(!endswith("foobar", "foo")); + assert_se(!endswith("foobar", "foobarfoofoo")); +} + +static void test_close_nointr(void) { + char name[] = "/tmp/test-test-close_nointr.XXXXXX"; + int fd; + + fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC); + assert_se(fd >= 0); + assert_se(close_nointr(fd) >= 0); + assert_se(close_nointr(fd) < 0); + + unlink(name); +} + + +static void test_unlink_noerrno(void) { + char name[] = "/tmp/test-close_nointr.XXXXXX"; + int fd; + + fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC); + assert_se(fd >= 0); + assert_se(close_nointr(fd) >= 0); + + { + PROTECT_ERRNO; + errno = -42; + assert_se(unlink_noerrno(name) >= 0); + assert_se(errno == -42); + assert_se(unlink_noerrno(name) < 0); + assert_se(errno == -42); + } +} + +static void test_readlink_and_make_absolute(void) { + char tempdir[] = "/tmp/test-readlink_and_make_absolute"; + char name[] = "/tmp/test-readlink_and_make_absolute/original"; + char name2[] = "test-readlink_and_make_absolute/original"; + char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias"; + char *r = NULL; + + assert(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0); + assert_se(touch(name) >= 0); + + assert_se(symlink(name, name_alias) >= 0); + assert_se(readlink_and_make_absolute(name_alias, &r) >= 0); + assert_se(streq(r, name)); + free(r); + assert_se(unlink(name_alias) >= 0); + + assert_se(chdir(tempdir) >= 0); + assert_se(symlink(name2, name_alias) >= 0); + assert_se(readlink_and_make_absolute(name_alias, &r) >= 0); + assert_se(streq(r, name)); + free(r); + assert_se(unlink(name_alias) >= 0); + + assert_se(rm_rf_dangerous(tempdir, false, true, false) >= 0); +} + +static void test_read_one_char(void) { + char r; + bool need_nl; + char name[] = "/tmp/test-read_one_char.XXXXXX"; + _cleanup_close_ int fd = -1; + FILE *file; + + fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC); + assert_se(fd >= 0); + file = fdopen(fd, "r+"); + assert_se(file); + assert_se(fputs("c\n", file) >= 0); + rewind(file); + + assert_se(read_one_char(file, &r, 1000000, &need_nl) >= 0); + assert_se(!need_nl); + assert_se(r == 'c'); + assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0); + + rewind(file); + assert_se(fputs("foobar\n", file) >= 0); + rewind(file); + assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0); + + rewind(file); + assert_se(fputs("\n", file) >= 0); + rewind(file); + assert_se(read_one_char(file, &r, 1000000, &need_nl) < 0); + + unlink(name); +} + +static void test_ignore_signals(void) { + assert_se(ignore_signals(SIGINT, -1) >= 0); + assert_se(kill(getpid(), SIGINT) >= 0); + assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0); + assert_se(kill(getpid(), SIGUSR1) >= 0); + assert_se(kill(getpid(), SIGUSR2) >= 0); + assert_se(kill(getpid(), SIGTERM) >= 0); + assert_se(kill(getpid(), SIGPIPE) >= 0); + assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0); +} + +static void test_strshorten(void) { + char s[] = "foobar"; + + assert_se(strlen(strshorten(s, 6)) == 6); + assert_se(strlen(strshorten(s, 12)) == 6); + assert_se(strlen(strshorten(s, 2)) == 2); + assert_se(strlen(strshorten(s, 0)) == 0); +} + int main(int argc, char *argv[]) { log_parse_environment(); log_open(); test_streq_ptr(); + test_align_power2(); test_first_word(); test_close_many(); test_parse_boolean(); @@ -699,6 +933,19 @@ int main(int argc, char *argv[]) { test_writing_tmpfile(); test_hexdump(); test_log2i(); + test_foreach_string(); + test_filename_is_safe(); + test_ascii_strlower(); + test_files_same(); + test_is_valid_documentation_url(); + test_file_in_same_dir(); + test_endswith(); + test_close_nointr(); + test_unlink_noerrno(); + test_readlink_and_make_absolute(); + test_read_one_char(); + test_ignore_signals(); + test_strshorten(); return 0; }