chiark / gitweb /
tests: more tests for util.c
[elogind.git] / src / test / test-util.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2010 Lennart Poettering
7   Copyright 2013 Thomas H.P. Andersen
8
9   systemd is free software; you can redistribute it and/or modify it
10   under the terms of the GNU Lesser General Public License as published by
11   the Free Software Foundation; either version 2.1 of the License, or
12   (at your option) any later version.
13
14   systemd is distributed in the hope that it will be useful, but
15   WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   Lesser General Public License for more details.
18
19   You should have received a copy of the GNU Lesser General Public License
20   along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 ***/
22
23 #include <string.h>
24
25 #include "util.h"
26
27 static void test_streq_ptr(void) {
28         assert_se(streq_ptr(NULL, NULL));
29         assert_se(!streq_ptr("abc", "cdef"));
30 }
31
32 static void test_first_word(void) {
33         assert_se(first_word("Hello", ""));
34         assert_se(first_word("Hello", "Hello"));
35         assert_se(first_word("Hello world", "Hello"));
36         assert_se(first_word("Hello\tworld", "Hello"));
37         assert_se(first_word("Hello\nworld", "Hello"));
38         assert_se(first_word("Hello\rworld", "Hello"));
39         assert_se(first_word("Hello ", "Hello"));
40
41         assert_se(!first_word("Hello", "Hellooo"));
42         assert_se(!first_word("Hello", "xxxxx"));
43         assert_se(!first_word("Hellooo", "Hello"));
44 }
45
46 static void test_parse_boolean(void) {
47         assert_se(parse_boolean("1") == 1);
48         assert_se(parse_boolean("y") == 1);
49         assert_se(parse_boolean("Y") == 1);
50         assert_se(parse_boolean("yes") == 1);
51         assert_se(parse_boolean("YES") == 1);
52         assert_se(parse_boolean("true") == 1);
53         assert_se(parse_boolean("TRUE") == 1);
54         assert_se(parse_boolean("on") == 1);
55         assert_se(parse_boolean("ON") == 1);
56
57         assert_se(parse_boolean("0") == 0);
58         assert_se(parse_boolean("n") == 0);
59         assert_se(parse_boolean("N") == 0);
60         assert_se(parse_boolean("no") == 0);
61         assert_se(parse_boolean("NO") == 0);
62         assert_se(parse_boolean("false") == 0);
63         assert_se(parse_boolean("FALSE") == 0);
64         assert_se(parse_boolean("off") == 0);
65         assert_se(parse_boolean("OFF") == 0);
66
67         assert_se(parse_boolean("garbage") < 0);
68         assert_se(parse_boolean("") < 0);
69 }
70
71 static void test_parse_pid(void) {
72         int r;
73         pid_t pid;
74
75         r = parse_pid("100", &pid);
76         assert_se(r == 0);
77         assert_se(pid == 100);
78
79         r = parse_pid("0x7FFFFFFF", &pid);
80         assert_se(r == 0);
81         assert_se(pid == 2147483647);
82
83         pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
84         r = parse_pid("0", &pid);
85         assert_se(r == -ERANGE);
86         assert_se(pid == 65);
87
88         pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
89         r = parse_pid("-100", &pid);
90         assert_se(r == -ERANGE);
91         assert_se(pid == 65);
92
93         pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
94         r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
95         assert(r == -ERANGE);
96         assert_se(pid == 65);
97 }
98
99 static void test_parse_uid(void) {
100         int r;
101         uid_t uid;
102
103         r = parse_uid("100", &uid);
104         assert_se(r == 0);
105         assert_se(uid == 100);
106 }
107
108 static void test_safe_atolli(void) {
109         int r;
110         long long l;
111
112         r = safe_atolli("12345", &l);
113         assert_se(r == 0);
114         assert_se(l == 12345);
115
116         r = safe_atolli("junk", &l);
117         assert_se(r == -EINVAL);
118 }
119
120 static void test_safe_atod(void) {
121         int r;
122         double d;
123
124         r = safe_atod("0.2244", &d);
125         assert_se(r == 0);
126         assert_se(abs(d - 0.2244) < 0.000001);
127
128         r = safe_atod("junk", &d);
129         assert_se(r == -EINVAL);
130 }
131
132 static void test_foreach_word_quoted(void) {
133         char *w, *state;
134         size_t l;
135         const char test[] = "test a b c 'd' e '' '' hhh '' ''";
136         printf("<%s>\n", test);
137         FOREACH_WORD_QUOTED(w, l, test, state) {
138                 char *t;
139
140                 assert_se(t = strndup(w, l));
141                 printf("<%s>\n", t);
142                 free(t);
143         }
144 }
145
146 static void test_default_term_for_tty(void) {
147         puts(default_term_for_tty("/dev/tty23"));
148         puts(default_term_for_tty("/dev/ttyS23"));
149         puts(default_term_for_tty("/dev/tty0"));
150         puts(default_term_for_tty("/dev/pty0"));
151         puts(default_term_for_tty("/dev/pts/0"));
152         puts(default_term_for_tty("/dev/console"));
153         puts(default_term_for_tty("tty23"));
154         puts(default_term_for_tty("ttyS23"));
155         puts(default_term_for_tty("tty0"));
156         puts(default_term_for_tty("pty0"));
157         puts(default_term_for_tty("pts/0"));
158         puts(default_term_for_tty("console"));
159 }
160
161 static void test_memdup_multiply(void) {
162         int org[] = {1, 2, 3};
163         int *dup;
164
165         dup = (int*)memdup_multiply(org, sizeof(int), 3);
166
167         assert_se(dup);
168         assert_se(dup[0] == 1);
169         assert_se(dup[1] == 2);
170         assert_se(dup[2] == 3);
171         free(dup);
172 }
173
174 int main(int argc, char *argv[]) {
175         test_streq_ptr();
176         test_first_word();
177         test_parse_boolean();
178         test_default_term_for_tty();
179         test_parse_pid();
180         test_parse_uid();
181         test_safe_atolli();
182         test_safe_atod();
183         test_foreach_word_quoted();
184         test_memdup_multiply();
185
186         return 0;
187 }