chiark / gitweb /
tests: add a few more tests to test-util.c
[elogind.git] / src / test / test-util.c
index ebbdcfc6de454e22c99577ee53a35e1f09c5b957..c15f19df8edfa4e542394d098416a787e78994d1 100644 (file)
 #include "util.h"
 
 static void test_streq_ptr(void) {
-        assert(streq_ptr(NULL, NULL));
-        assert(!streq_ptr("abc", "cdef"));
+        assert_se(streq_ptr(NULL, NULL));
+        assert_se(!streq_ptr("abc", "cdef"));
 }
 
 static void test_first_word(void) {
-        assert(first_word("Hello", ""));
-        assert(first_word("Hello", "Hello"));
-        assert(first_word("Hello world", "Hello"));
-        assert(first_word("Hello\tworld", "Hello"));
-        assert(first_word("Hello\nworld", "Hello"));
-        assert(first_word("Hello\rworld", "Hello"));
-        assert(first_word("Hello ", "Hello"));
-
-        assert(!first_word("Hello", "Hellooo"));
-        assert(!first_word("Hello", "xxxxx"));
-        assert(!first_word("Hellooo", "Hello"));
+        assert_se(first_word("Hello", ""));
+        assert_se(first_word("Hello", "Hello"));
+        assert_se(first_word("Hello world", "Hello"));
+        assert_se(first_word("Hello\tworld", "Hello"));
+        assert_se(first_word("Hello\nworld", "Hello"));
+        assert_se(first_word("Hello\rworld", "Hello"));
+        assert_se(first_word("Hello ", "Hello"));
+
+        assert_se(!first_word("Hello", "Hellooo"));
+        assert_se(!first_word("Hello", "xxxxx"));
+        assert_se(!first_word("Hellooo", "Hello"));
+}
+
+static void test_parse_boolean(void) {
+        assert_se(parse_boolean("1") == 1);
+        assert_se(parse_boolean("y") == 1);
+        assert_se(parse_boolean("Y") == 1);
+        assert_se(parse_boolean("yes") == 1);
+        assert_se(parse_boolean("YES") == 1);
+        assert_se(parse_boolean("true") == 1);
+        assert_se(parse_boolean("TRUE") == 1);
+        assert_se(parse_boolean("on") == 1);
+        assert_se(parse_boolean("ON") == 1);
+
+        assert_se(parse_boolean("0") == 0);
+        assert_se(parse_boolean("n") == 0);
+        assert_se(parse_boolean("N") == 0);
+        assert_se(parse_boolean("no") == 0);
+        assert_se(parse_boolean("NO") == 0);
+        assert_se(parse_boolean("false") == 0);
+        assert_se(parse_boolean("FALSE") == 0);
+        assert_se(parse_boolean("off") == 0);
+        assert_se(parse_boolean("OFF") == 0);
+
+        assert_se(parse_boolean("garbage") < 0);
+        assert_se(parse_boolean("") < 0);
+}
+
+static void test_parse_pid(void) {
+        int r;
+        pid_t pid;
+
+        r = parse_pid("100", &pid);
+        assert_se(r == 0);
+        assert_se(pid == 100);
+
+        r = parse_pid("0x7FFFFFFF", &pid);
+        assert_se(r == 0);
+        assert_se(pid == 2147483647);
+
+        pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
+        r = parse_pid("0", &pid);
+        assert_se(r == -ERANGE);
+        assert_se(pid == 65);
+
+        pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
+        r = parse_pid("-100", &pid);
+        assert_se(r == -ERANGE);
+        assert_se(pid == 65);
+
+        pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
+        r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
+        assert(r == -ERANGE);
+        assert_se(pid == 65);
+}
+
+static void test_parse_uid(void) {
+        int r;
+        uid_t uid;
+
+        r = parse_uid("100", &uid);
+        assert_se(r == 0);
+        assert_se(uid == 100);
+}
+
+static void test_safe_atolli(void) {
+        int r;
+        long long l;
+
+        r = safe_atolli("12345", &l);
+        assert_se(r == 0);
+        assert_se(l == 12345);
+
+        r = safe_atolli("junk", &l);
+        assert_se(r == -EINVAL);
+}
+
+static void test_safe_atod(void) {
+        int r;
+        double d;
+
+        r = safe_atod("0.2244", &d);
+        assert_se(r == 0);
+        assert_se(abs(d - 0.2244) < 0.000001);
+
+        r = safe_atod("junk", &d);
+        assert_se(r == -EINVAL);
+}
+
+static void test_strstrip(void) {
+       char *r;
+       char input[] = "   hello, waldo.   ";
+
+       r = strstrip(input);
+       assert_se(streq(r, "hello, waldo."));
+
+}
+
+static void test_delete_chars(void) {
+       char *r;
+       char input[] = "   hello, waldo.   abc";
+
+       r = delete_chars(input, WHITESPACE);
+       assert_se(streq(r, "hello,waldo.abc"));
+}
+
+static void test_in_charset(void) {
+      assert_se(in_charset("dddaaabbbcccc", "abcd"));
+      assert_se(!in_charset("dddaaabbbcccc", "abc f"));
+}
+
+static void test_foreach_word(void) {
+        char *w, *state;
+        size_t l;
+        int i = 0;
+        const char test[] = "test abc d\te   f   ";
+        const char * const expected[] = {
+                "test",
+                "abc",
+                "d",
+                "e",
+                "f",
+                "",
+                NULL
+        };
+
+        FOREACH_WORD(w, l, test, state) {
+                assert_se(strneq(expected[i++], w, l));
+        }
 }
 
 static void test_foreach_word_quoted(void) {
         char *w, *state;
         size_t l;
-        const char test[] = "test a b c 'd' e '' '' hhh '' ''";
+        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);
         FOREACH_WORD_QUOTED(w, l, test, state) {
-                char *t;
+                _cleanup_free_ char *t = NULL;
 
                 assert_se(t = strndup(w, l));
+                assert_se(strneq(expected[i++], w, l));
                 printf("<%s>\n", t);
-                free(t);
         }
 }
 
@@ -72,11 +217,34 @@ static void test_default_term_for_tty(void) {
         puts(default_term_for_tty("console"));
 }
 
+static void test_memdup_multiply(void) {
+        int org[] = {1, 2, 3};
+        int *dup;
+
+        dup = (int*)memdup_multiply(org, sizeof(int), 3);
+
+        assert_se(dup);
+        assert_se(dup[0] == 1);
+        assert_se(dup[1] == 2);
+        assert_se(dup[2] == 3);
+        free(dup);
+}
+
 int main(int argc, char *argv[]) {
         test_streq_ptr();
         test_first_word();
-        test_default_term_for_tty();
+        test_parse_boolean();
+        test_parse_pid();
+        test_parse_uid();
+        test_safe_atolli();
+        test_safe_atod();
+        test_strstrip();
+        test_delete_chars();
+        test_in_charset();
+        test_foreach_word();
         test_foreach_word_quoted();
+        test_default_term_for_tty();
+        test_memdup_multiply();
 
         return 0;
 }