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=d862149fa83927fc7685afc6f133fadd3ae802b5;hp=fe54586eeedc252b6c735c40ed1b894622196cda;hb=4968105790c65af58d4ab42bffa2a4bedc0be8ee;hpb=0eb3cc88504b5d8f740764047ac5162b67992386;ds=sidebyside diff --git a/src/test/test-util.c b/src/test/test-util.c index fe54586ee..d862149fa 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -145,6 +145,39 @@ static void test_alloca(void) { assert_se(!memcmp(t, zero, 997)); } +static void test_div_round_up(void) { + int div; + + /* basic tests */ + assert_se(DIV_ROUND_UP(0, 8) == 0); + assert_se(DIV_ROUND_UP(1, 8) == 1); + assert_se(DIV_ROUND_UP(8, 8) == 1); + assert_se(DIV_ROUND_UP(12, 8) == 2); + assert_se(DIV_ROUND_UP(16, 8) == 2); + + /* test multiple evaluation */ + div = 0; + assert_se(DIV_ROUND_UP(div++, 8) == 0 && div == 1); + assert_se(DIV_ROUND_UP(++div, 8) == 1 && div == 2); + assert_se(DIV_ROUND_UP(8, div++) == 4 && div == 3); + assert_se(DIV_ROUND_UP(8, ++div) == 2 && div == 4); + + /* overflow test with exact division */ + assert_se(sizeof(0U) == 4); + assert_se(0xfffffffaU % 10U == 0U); + assert_se(0xfffffffaU / 10U == 429496729U); + assert_se(DIV_ROUND_UP(0xfffffffaU, 10U) == 429496729U); + assert_se((0xfffffffaU + 10U - 1U) / 10U == 0U); + assert_se(0xfffffffaU / 10U + !!(0xfffffffaU % 10U) == 429496729U); + + /* overflow test with rounded division */ + assert_se(0xfffffffdU % 10U == 3U); + assert_se(0xfffffffdU / 10U == 429496729U); + assert_se(DIV_ROUND_UP(0xfffffffdU, 10U) == 429496730U); + assert_se((0xfffffffdU + 10U - 1U) / 10U == 0U); + assert_se(0xfffffffdU / 10U + !!(0xfffffffdU % 10U) == 429496730U); +} + static void test_first_word(void) { assert_se(first_word("Hello", "")); assert_se(first_word("Hello", "Hello")); @@ -406,28 +439,12 @@ static void test_foreach_word(void) { assert_se(strneq(expected[i++], word, l)); } -static void test_foreach_word_quoted(void) { +static void check(const char *test, char** expected, bool trailing) { const char *word, *state; size_t l; int i = 0; - const char test[] = "test a b c 'd' e '' '' hhh '' '' \"a b c\""; - const char * const expected[] = { - "test", - "a", - "b", - "c", - "d", - "e", - "", - "", - "hhh", - "", - "", - "a b c", - NULL - }; - printf("<%s>\n", test); + printf("<<<%s>>>\n", test); FOREACH_WORD_QUOTED(word, l, test, state) { _cleanup_free_ char *t = NULL; @@ -435,7 +452,34 @@ static void test_foreach_word_quoted(void) { assert_se(strneq(expected[i++], word, l)); printf("<%s>\n", t); } - assert_se(isempty(state)); + printf("<<<%s>>>\n", state); + assert_se(expected[i] == NULL); + assert_se(isempty(state) == !trailing); +} + +static void test_foreach_word_quoted(void) { + check("test a b c 'd' e '' '' hhh '' '' \"a b c\"", + STRV_MAKE("test", + "a", + "b", + "c", + "d", + "e", + "", + "", + "hhh", + "", + "", + "a b c"), + false); + + check("test \"xxx", + STRV_MAKE("test"), + true); + + check("test\\", + STRV_MAKE_EMPTY, + true); } static void test_default_term_for_tty(void) { @@ -802,24 +846,24 @@ static void test_foreach_string(void) { assert_se(streq(x, "zzz")); } -static void test_filename_is_safe(void) { +static void test_filename_is_valid(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("..")); + assert_se(!filename_is_valid("")); + assert_se(!filename_is_valid("/bar/foo")); + assert_se(!filename_is_valid("/")); + assert_se(!filename_is_valid(".")); + assert_se(!filename_is_valid("..")); for (i=0; i= 0); - execute_directory(tempdir, NULL, DEFAULT_TIMEOUT_USEC, NULL); + execute_directory(tempdir, DEFAULT_TIMEOUT_USEC, NULL); assert_se(access("/tmp/test-execute_directory/it_works", F_OK) >= 0); assert_se(access("/tmp/test-execute_directory/it_works2", F_OK) >= 0); @@ -1312,6 +1356,74 @@ static void test_parse_proc_cmdline(void) { assert_se(parse_proc_cmdline(parse_item) >= 0); } +static void test_raw_clone(void) { + pid_t parent, pid, pid2; + + parent = getpid(); + log_info("before clone: getpid()→"PID_FMT, parent); + assert_se(raw_getpid() == parent); + + pid = raw_clone(0, NULL); + assert_se(pid >= 0); + + pid2 = raw_getpid(); + log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT, + pid, getpid(), pid2); + if (pid == 0) { + assert_se(pid2 != parent); + _exit(EXIT_SUCCESS); + } else { + int status; + + assert_se(pid2 == parent); + waitpid(pid, &status, __WCLONE); + assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS); + } +} + +static void test_same_fd(void) { + _cleanup_close_pair_ int p[2] = { -1, -1 }; + _cleanup_close_ int a = -1, b = -1, c = -1; + + assert_se(pipe2(p, O_CLOEXEC) >= 0); + assert_se((a = dup(p[0])) >= 0); + assert_se((b = open("/dev/null", O_RDONLY|O_CLOEXEC)) >= 0); + assert_se((c = dup(a)) >= 0); + + assert_se(same_fd(p[0], p[0]) > 0); + assert_se(same_fd(p[1], p[1]) > 0); + assert_se(same_fd(a, a) > 0); + assert_se(same_fd(b, b) > 0); + + assert_se(same_fd(a, p[0]) > 0); + assert_se(same_fd(p[0], a) > 0); + assert_se(same_fd(c, p[0]) > 0); + assert_se(same_fd(p[0], c) > 0); + assert_se(same_fd(a, c) > 0); + assert_se(same_fd(c, a) > 0); + + assert_se(same_fd(p[0], p[1]) == 0); + assert_se(same_fd(p[1], p[0]) == 0); + assert_se(same_fd(p[0], b) == 0); + assert_se(same_fd(b, p[0]) == 0); + assert_se(same_fd(p[1], a) == 0); + assert_se(same_fd(a, p[1]) == 0); + assert_se(same_fd(p[1], b) == 0); + assert_se(same_fd(b, p[1]) == 0); + + assert_se(same_fd(a, b) == 0); + assert_se(same_fd(b, a) == 0); +} + +static void test_uid_ptr(void) { + + assert_se(UID_TO_PTR(0) != NULL); + assert_se(UID_TO_PTR(1000) != NULL); + + assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0); + assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000); +} + int main(int argc, char *argv[]) { log_parse_environment(); log_open(); @@ -1321,6 +1433,7 @@ int main(int argc, char *argv[]) { test_max(); test_container_of(); test_alloca(); + test_div_round_up(); test_first_word(); test_close_many(); test_parse_boolean(); @@ -1360,7 +1473,7 @@ int main(int argc, char *argv[]) { test_hexdump(); test_log2i(); test_foreach_string(); - test_filename_is_safe(); + test_filename_is_valid(); test_string_has_cc(); test_ascii_strlower(); test_files_same(); @@ -1384,6 +1497,9 @@ int main(int argc, char *argv[]) { test_unquote_first_word(); test_unquote_many_words(); test_parse_proc_cmdline(); + test_raw_clone(); + test_same_fd(); + test_uid_ptr(); return 0; }