X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftest%2Ftest-util.c;h=1602aa63937c68bdcf3699e011a4db0557ea7d19;hb=0e707326fcecd3968efa7dc827123032f1b2cb61;hp=4d9b28f9c8e7b82aca0440a0b2c56c8d86b06789;hpb=684fc8927e0f83496d4384ac434e265f7cd7a87b;p=elogind.git diff --git a/src/test/test-util.c b/src/test/test-util.c index 4d9b28f9c..1602aa639 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -94,6 +94,54 @@ static void test_max(void) { assert_cc(MAXSIZE(char[3], uint16_t) == 3); assert_cc(MAXSIZE(char[3], uint32_t) == 4); assert_cc(MAXSIZE(char, long) == sizeof(long)); + + assert_se(MAX(-5, 5) == 5); + assert_se(MAX(5, 5) == 5); + assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5); + assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3); + assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5); + assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2); + assert_se(LESS_BY(8, 4) == 4); + assert_se(LESS_BY(8, 8) == 0); + assert_se(LESS_BY(4, 8) == 0); + assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12); + assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0); + assert_se(CLAMP(-5, 0, 1) == 0); + assert_se(CLAMP(5, 0, 1) == 1); + assert_se(CLAMP(5, -10, 1) == 1); + assert_se(CLAMP(5, -10, 10) == 5); + assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10); +} + +static void test_container_of(void) { + struct mytype { + uint8_t pad1[3]; + uint64_t v1; + uint8_t pad2[2]; + uint32_t v2; + } _packed_ myval = { }; + + assert_cc(sizeof(myval) == 17); + assert_se(container_of(&myval.v1, struct mytype, v1) == &myval); + assert_se(container_of(&myval.v2, struct mytype, v2) == &myval); + assert_se(container_of(&container_of(&myval.v2, + struct mytype, + v2)->v1, + struct mytype, + v1) == &myval); +} + +static void test_alloca(void) { + static const uint8_t zero[997] = { }; + char *t; + + t = alloca_align(17, 512); + assert_se(!((uintptr_t)t & 0xff)); + memzero(t, 17); + + t = alloca0_align(997, 1024); + assert_se(!((uintptr_t)t & 0x1ff)); + assert_se(!memcmp(t, zero, 997)); } static void test_first_word(void) { @@ -183,7 +231,7 @@ static void test_parse_pid(void) { pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */ r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid); - assert(r == -ERANGE); + assert_se(r == -ERANGE); assert_se(pid == 65); } @@ -386,7 +434,7 @@ static void test_foreach_word_quoted(void) { assert_se(strneq(expected[i++], word, l)); printf("<%s>\n", t); } - assert(isempty(state)); + assert_se(isempty(state)); } static void test_default_term_for_tty(void) { @@ -418,37 +466,39 @@ static void test_memdup_multiply(void) { } static void test_hostname_is_valid(void) { - assert(hostname_is_valid("foobar")); - assert(hostname_is_valid("foobar.com")); - assert(!hostname_is_valid("fööbar")); - assert(!hostname_is_valid("")); - assert(!hostname_is_valid(".")); - assert(!hostname_is_valid("..")); - assert(!hostname_is_valid("foobar.")); - assert(!hostname_is_valid(".foobar")); - assert(!hostname_is_valid("foo..bar")); - assert(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")); + assert_se(hostname_is_valid("foobar")); + assert_se(hostname_is_valid("foobar.com")); + assert_se(!hostname_is_valid("fööbar")); + assert_se(!hostname_is_valid("")); + assert_se(!hostname_is_valid(".")); + assert_se(!hostname_is_valid("..")); + assert_se(!hostname_is_valid("foobar.")); + assert_se(!hostname_is_valid(".foobar")); + assert_se(!hostname_is_valid("foo..bar")); + assert_se(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")); } static void test_u64log2(void) { - assert(u64log2(0) == 0); - assert(u64log2(8) == 3); - assert(u64log2(9) == 3); - assert(u64log2(15) == 3); - assert(u64log2(16) == 4); - assert(u64log2(1024*1024) == 20); - assert(u64log2(1024*1024+5) == 20); + assert_se(u64log2(0) == 0); + assert_se(u64log2(8) == 3); + assert_se(u64log2(9) == 3); + assert_se(u64log2(15) == 3); + assert_se(u64log2(16) == 4); + assert_se(u64log2(1024*1024) == 20); + assert_se(u64log2(1024*1024+5) == 20); } static void test_get_process_comm(void) { struct stat st; - _cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = NULL; + _cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = NULL, *cwd = NULL, *root = NULL; + _cleanup_free_ char *env = NULL; unsigned long long b; pid_t e; uid_t u; gid_t g; dev_t h; int r; + pid_t me; if (stat("/proc/1/comm", &st) == 0) { assert_se(get_process_comm(1, &a) >= 0); @@ -484,7 +534,21 @@ static void test_get_process_comm(void) { log_info("pid1 gid: "GID_FMT, g); assert_se(g == 0); - assert(get_ctty_devnr(1, &h) == -ENOENT); + me = getpid(); + + r = get_process_cwd(me, &cwd); + assert_se(r >= 0 || r == -EACCES); + log_info("pid1 cwd: '%s'", cwd); + + r = get_process_root(me, &root); + assert_se(r >= 0 || r == -EACCES); + log_info("pid1 root: '%s'", root); + + r = get_process_environ(me, &env); + assert_se(r >= 0 || r == -EACCES); + log_info("self strlen(environ): '%zd'", strlen(env)); + + assert_se(get_ctty_devnr(1, &h) == -ENOENT); getenv_for_pid(1, "PATH", &i); log_info("pid1 $PATH: '%s'", strna(i)); @@ -496,7 +560,7 @@ static void test_protect_errno(void) { PROTECT_ERRNO; errno = 11; } - assert(errno == 12); + assert_se(errno == 12); } static void test_parse_size(void) { @@ -681,12 +745,12 @@ static void test_writing_tmpfile(void) { printf("tmpfile: %s", name); r = writev(fd, iov, 3); - assert(r >= 0); + assert_se(r >= 0); r = read_full_file(name, &contents, &size); - assert(r == 0); + assert_se(r == 0); printf("contents: %s", contents); - assert(streq(contents, "abc\n" ALPHANUMERICAL "\n")); + assert_se(streq(contents, "abc\n" ALPHANUMERICAL "\n")); unlink(name); } @@ -808,11 +872,27 @@ static void test_is_valid_documentation_url(void) { } 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")); + char *t; + + t = file_in_same_dir("/", "a"); + assert_se(streq(t, "/a")); + free(t); + + t = file_in_same_dir("/", "/a"); + assert_se(streq(t, "/a")); + free(t); + + t = file_in_same_dir("", "a"); + assert_se(streq(t, "a")); + free(t); + + t = file_in_same_dir("a/", "a"); + assert_se(streq(t, "a/a")); + free(t); + + t = file_in_same_dir("bar/foo", "bar"); + assert_se(streq(t, "bar/bar")); + free(t); } static void test_endswith(void) { @@ -883,11 +963,11 @@ static void test_readlink_and_make_absolute(void) { } static void test_read_one_char(void) { + _cleanup_fclose_ FILE *file = NULL; char r; bool need_nl; char name[] = "/tmp/test-read_one_char.XXXXXX"; - _cleanup_close_ int fd = -1; - FILE *file; + int fd; fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); @@ -1109,51 +1189,61 @@ static void test_unquote_first_word(void) { char *t; p = original = "foobar waldo"; - assert_se(unquote_first_word(&p, &t) > 0); + assert_se(unquote_first_word(&p, &t, false) > 0); assert_se(streq(t, "foobar")); free(t); assert_se(p == original + 7); - assert_se(unquote_first_word(&p, &t) > 0); + assert_se(unquote_first_word(&p, &t, false) > 0); assert_se(streq(t, "waldo")); free(t); assert_se(p == original + 12); - assert_se(unquote_first_word(&p, &t) == 0); + assert_se(unquote_first_word(&p, &t, false) == 0); assert_se(!t); assert_se(p == original + 12); p = original = "\"foobar\" \'waldo\'"; - assert_se(unquote_first_word(&p, &t) > 0); + assert_se(unquote_first_word(&p, &t, false) > 0); assert_se(streq(t, "foobar")); free(t); assert_se(p == original + 9); - assert_se(unquote_first_word(&p, &t) > 0); + assert_se(unquote_first_word(&p, &t, false) > 0); assert_se(streq(t, "waldo")); free(t); assert_se(p == original + 16); - assert_se(unquote_first_word(&p, &t) == 0); + assert_se(unquote_first_word(&p, &t, false) == 0); assert_se(!t); assert_se(p == original + 16); p = original = "\""; - assert_se(unquote_first_word(&p, &t) == -EINVAL); + assert_se(unquote_first_word(&p, &t, false) == -EINVAL); assert_se(p == original + 1); p = original = "\'"; - assert_se(unquote_first_word(&p, &t) == -EINVAL); + assert_se(unquote_first_word(&p, &t, false) == -EINVAL); assert_se(p == original + 1); + p = original = "\'fooo"; + assert_se(unquote_first_word(&p, &t, false) == -EINVAL); + assert_se(p == original + 5); + + p = original = "\'fooo"; + assert_se(unquote_first_word(&p, &t, true) > 0); + assert_se(streq(t, "fooo")); + free(t); + assert_se(p == original + 5); + p = original = "yay\'foo\'bar"; - assert_se(unquote_first_word(&p, &t) > 0); + assert_se(unquote_first_word(&p, &t, false) > 0); assert_se(streq(t, "yayfoobar")); free(t); assert_se(p == original + 11); p = original = " foobar "; - assert_se(unquote_first_word(&p, &t) > 0); + assert_se(unquote_first_word(&p, &t, false) > 0); assert_se(streq(t, "foobar")); free(t); assert_se(p == original + 12); @@ -1204,11 +1294,24 @@ static void test_unquote_many_words(void) { assert_se(unquote_many_words(&p, &a, NULL) == 1); assert_se(p == original+7); assert_se(streq_ptr(a, "foobar")); + free(a); p = original = " foobar "; assert_se(unquote_many_words(&p, &a, NULL) == 1); assert_se(p == original+15); assert_se(streq_ptr(a, "foobar")); + free(a); +} + +static int parse_item(const char *key, const char *value) { + assert_se(key); + + log_info("kernel cmdline option <%s> = <%s>", key, strna(value)); + return 0; +} + +static void test_parse_proc_cmdline(void) { + assert_se(parse_proc_cmdline(parse_item) >= 0); } int main(int argc, char *argv[]) { @@ -1218,6 +1321,8 @@ int main(int argc, char *argv[]) { test_streq_ptr(); test_align_power2(); test_max(); + test_container_of(); + test_alloca(); test_first_word(); test_close_many(); test_parse_boolean(); @@ -1280,6 +1385,7 @@ int main(int argc, char *argv[]) { test_execute_directory(); test_unquote_first_word(); test_unquote_many_words(); + test_parse_proc_cmdline(); return 0; }