]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-bus/test-bus-error.c
Merge pull request #2267 from gdamjan/dont-drop-critical
[thirdparty/systemd.git] / src / libsystemd / sd-bus / test-bus-error.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2013 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include "sd-bus.h"
23
24 #include "bus-common-errors.h"
25 #include "bus-error.h"
26 #include "bus-util.h"
27 #include "errno-list.h"
28
29 static void test_error(void) {
30 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL, second = SD_BUS_ERROR_NULL;
31 const sd_bus_error const_error = SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FILE_EXISTS, "const error");
32 const sd_bus_error temporarily_const_error = {
33 .name = SD_BUS_ERROR_ACCESS_DENIED,
34 .message = "oh! no",
35 ._need_free = -1
36 };
37
38 assert_se(!sd_bus_error_is_set(&error));
39 assert_se(sd_bus_error_set(&error, SD_BUS_ERROR_NOT_SUPPORTED, "xxx") == -EOPNOTSUPP);
40 assert_se(streq(error.name, SD_BUS_ERROR_NOT_SUPPORTED));
41 assert_se(streq(error.message, "xxx"));
42 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_NOT_SUPPORTED));
43 assert_se(sd_bus_error_get_errno(&error) == EOPNOTSUPP);
44 assert_se(sd_bus_error_is_set(&error));
45 sd_bus_error_free(&error);
46
47 /* Check with no error */
48 assert_se(!sd_bus_error_is_set(&error));
49 assert_se(sd_bus_error_setf(&error, NULL, "yyy %i", -1) == 0);
50 assert_se(error.name == NULL);
51 assert_se(error.message == NULL);
52 assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
53 assert_se(sd_bus_error_get_errno(&error) == 0);
54 assert_se(!sd_bus_error_is_set(&error));
55
56 assert_se(sd_bus_error_setf(&error, SD_BUS_ERROR_FILE_NOT_FOUND, "yyy %i", -1) == -ENOENT);
57 assert_se(streq(error.name, SD_BUS_ERROR_FILE_NOT_FOUND));
58 assert_se(streq(error.message, "yyy -1"));
59 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
60 assert_se(sd_bus_error_get_errno(&error) == ENOENT);
61 assert_se(sd_bus_error_is_set(&error));
62
63 assert_se(!sd_bus_error_is_set(&second));
64 assert_se(second._need_free == 0);
65 assert_se(error._need_free > 0);
66 assert_se(sd_bus_error_copy(&second, &error) == -ENOENT);
67 assert_se(second._need_free > 0);
68 assert_se(streq(error.name, second.name));
69 assert_se(streq(error.message, second.message));
70 assert_se(sd_bus_error_get_errno(&second) == ENOENT);
71 assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_NOT_FOUND));
72 assert_se(sd_bus_error_is_set(&second));
73
74 sd_bus_error_free(&error);
75 sd_bus_error_free(&second);
76
77 assert_se(!sd_bus_error_is_set(&second));
78 assert_se(const_error._need_free == 0);
79 assert_se(sd_bus_error_copy(&second, &const_error) == -EEXIST);
80 assert_se(second._need_free == 0);
81 assert_se(streq(const_error.name, second.name));
82 assert_se(streq(const_error.message, second.message));
83 assert_se(sd_bus_error_get_errno(&second) == EEXIST);
84 assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_EXISTS));
85 assert_se(sd_bus_error_is_set(&second));
86 sd_bus_error_free(&second);
87
88 assert_se(!sd_bus_error_is_set(&second));
89 assert_se(temporarily_const_error._need_free < 0);
90 assert_se(sd_bus_error_copy(&second, &temporarily_const_error) == -EACCES);
91 assert_se(second._need_free > 0);
92 assert_se(streq(temporarily_const_error.name, second.name));
93 assert_se(streq(temporarily_const_error.message, second.message));
94 assert_se(sd_bus_error_get_errno(&second) == EACCES);
95 assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_ACCESS_DENIED));
96 assert_se(sd_bus_error_is_set(&second));
97
98 assert_se(!sd_bus_error_is_set(&error));
99 assert_se(sd_bus_error_set_const(&error, "System.Error.EUCLEAN", "Hallo") == -EUCLEAN);
100 assert_se(streq(error.name, "System.Error.EUCLEAN"));
101 assert_se(streq(error.message, "Hallo"));
102 assert_se(sd_bus_error_has_name(&error, "System.Error.EUCLEAN"));
103 assert_se(sd_bus_error_get_errno(&error) == EUCLEAN);
104 assert_se(sd_bus_error_is_set(&error));
105 sd_bus_error_free(&error);
106
107 assert_se(!sd_bus_error_is_set(&error));
108 assert_se(sd_bus_error_set_errno(&error, EBUSY) == -EBUSY);
109 assert_se(streq(error.name, "System.Error.EBUSY"));
110 assert_se(streq(error.message, strerror(EBUSY)));
111 assert_se(sd_bus_error_has_name(&error, "System.Error.EBUSY"));
112 assert_se(sd_bus_error_get_errno(&error) == EBUSY);
113 assert_se(sd_bus_error_is_set(&error));
114 sd_bus_error_free(&error);
115
116 assert_se(!sd_bus_error_is_set(&error));
117 assert_se(sd_bus_error_set_errnof(&error, EIO, "Waldi %c", 'X') == -EIO);
118 assert_se(streq(error.name, SD_BUS_ERROR_IO_ERROR));
119 assert_se(streq(error.message, "Waldi X"));
120 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
121 assert_se(sd_bus_error_get_errno(&error) == EIO);
122 assert_se(sd_bus_error_is_set(&error));
123 sd_bus_error_free(&error);
124
125 /* Check with no error */
126 assert_se(!sd_bus_error_is_set(&error));
127 assert_se(sd_bus_error_set_errnof(&error, 0, "Waldi %c", 'X') == 0);
128 assert_se(error.name == NULL);
129 assert_se(error.message == NULL);
130 assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
131 assert_se(sd_bus_error_get_errno(&error) == 0);
132 assert_se(!sd_bus_error_is_set(&error));
133 }
134
135 extern const sd_bus_error_map __start_BUS_ERROR_MAP[];
136 extern const sd_bus_error_map __stop_BUS_ERROR_MAP[];
137
138 static void dump_mapping_table(void) {
139 const sd_bus_error_map *m;
140
141 printf("----- errno mappings ------\n");
142 m = __start_BUS_ERROR_MAP;
143 while (m < __stop_BUS_ERROR_MAP) {
144
145 if (m->code == BUS_ERROR_MAP_END_MARKER) {
146 m = ALIGN8_PTR(m+1);
147 continue;
148 }
149
150 printf("%s -> %i/%s\n", strna(m->name), m->code, strna(errno_to_name(m->code)));
151 m ++;
152 }
153 printf("---------------------------\n");
154 }
155
156 static void test_errno_mapping_standard(void) {
157 assert_se(sd_bus_error_set(NULL, "System.Error.EUCLEAN", NULL) == -EUCLEAN);
158 assert_se(sd_bus_error_set(NULL, "System.Error.EBUSY", NULL) == -EBUSY);
159 assert_se(sd_bus_error_set(NULL, "System.Error.EINVAL", NULL) == -EINVAL);
160 assert_se(sd_bus_error_set(NULL, "System.Error.WHATSIT", NULL) == -EIO);
161 }
162
163 BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors[] = {
164 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error", 5),
165 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-2", 52),
166 SD_BUS_ERROR_MAP_END
167 };
168
169 BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors2[] = {
170 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-3", 33),
171 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-4", 44),
172 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-33", 333),
173 SD_BUS_ERROR_MAP_END
174 };
175
176 static const sd_bus_error_map test_errors3[] = {
177 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-88", 888),
178 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-99", 999),
179 SD_BUS_ERROR_MAP_END
180 };
181
182 static const sd_bus_error_map test_errors4[] = {
183 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-77", 777),
184 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-78", 778),
185 SD_BUS_ERROR_MAP_END
186 };
187
188 static const sd_bus_error_map test_errors_bad1[] = {
189 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", 0),
190 SD_BUS_ERROR_MAP_END
191 };
192
193 static const sd_bus_error_map test_errors_bad2[] = {
194 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", -1),
195 SD_BUS_ERROR_MAP_END
196 };
197
198 static void test_errno_mapping_custom(void) {
199 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error", NULL) == -5);
200 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
201 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-x", NULL) == -EIO);
202 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-33", NULL) == -333);
203
204 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -EIO);
205 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -EIO);
206 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -EIO);
207
208 assert_se(sd_bus_error_add_map(test_errors3) > 0);
209 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -888);
210 assert_se(sd_bus_error_add_map(test_errors4) > 0);
211 assert_se(sd_bus_error_add_map(test_errors4) == 0);
212 assert_se(sd_bus_error_add_map(test_errors3) == 0);
213
214 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -999);
215 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -777);
216 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-78", NULL) == -778);
217 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
218 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-y", NULL) == -EIO);
219
220 assert_se(sd_bus_error_set(NULL, BUS_ERROR_NO_SUCH_UNIT, NULL) == -ENOENT);
221
222 assert_se(sd_bus_error_add_map(test_errors_bad1) == -EINVAL);
223 assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL);
224 }
225
226 int main(int argc, char *argv[]) {
227 dump_mapping_table();
228
229 test_error();
230 test_errno_mapping_standard();
231 test_errno_mapping_custom();
232
233 return 0;
234 }