1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2013 Lennart Poettering
8 #include "bus-common-errors.h"
11 #include "errno-list.h"
13 static void test_error(void) {
14 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL, second = SD_BUS_ERROR_NULL;
15 const sd_bus_error const_error = SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FILE_EXISTS, "const error");
16 const sd_bus_error temporarily_const_error = {
17 .name = SD_BUS_ERROR_ACCESS_DENIED,
22 assert_se(!sd_bus_error_is_set(&error));
23 assert_se(sd_bus_error_set(&error, SD_BUS_ERROR_NOT_SUPPORTED, "xxx") == -EOPNOTSUPP);
24 assert_se(streq(error.name, SD_BUS_ERROR_NOT_SUPPORTED));
25 assert_se(streq(error.message, "xxx"));
26 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_NOT_SUPPORTED));
27 assert_se(sd_bus_error_get_errno(&error) == EOPNOTSUPP);
28 assert_se(sd_bus_error_is_set(&error));
29 sd_bus_error_free(&error);
31 /* Check with no error */
32 assert_se(!sd_bus_error_is_set(&error));
33 assert_se(sd_bus_error_setf(&error, NULL, "yyy %i", -1) == 0);
34 assert_se(error.name == NULL);
35 assert_se(error.message == NULL);
36 assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
37 assert_se(sd_bus_error_get_errno(&error) == 0);
38 assert_se(!sd_bus_error_is_set(&error));
40 assert_se(sd_bus_error_setf(&error, SD_BUS_ERROR_FILE_NOT_FOUND, "yyy %i", -1) == -ENOENT);
41 assert_se(streq(error.name, SD_BUS_ERROR_FILE_NOT_FOUND));
42 assert_se(streq(error.message, "yyy -1"));
43 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
44 assert_se(sd_bus_error_get_errno(&error) == ENOENT);
45 assert_se(sd_bus_error_is_set(&error));
47 assert_se(!sd_bus_error_is_set(&second));
48 assert_se(second._need_free == 0);
49 assert_se(error._need_free > 0);
50 assert_se(sd_bus_error_copy(&second, &error) == -ENOENT);
51 assert_se(second._need_free > 0);
52 assert_se(streq(error.name, second.name));
53 assert_se(streq(error.message, second.message));
54 assert_se(sd_bus_error_get_errno(&second) == ENOENT);
55 assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_NOT_FOUND));
56 assert_se(sd_bus_error_is_set(&second));
58 sd_bus_error_free(&error);
59 sd_bus_error_free(&second);
61 assert_se(!sd_bus_error_is_set(&second));
62 assert_se(const_error._need_free == 0);
63 assert_se(sd_bus_error_copy(&second, &const_error) == -EEXIST);
64 assert_se(second._need_free == 0);
65 assert_se(streq(const_error.name, second.name));
66 assert_se(streq(const_error.message, second.message));
67 assert_se(sd_bus_error_get_errno(&second) == EEXIST);
68 assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_EXISTS));
69 assert_se(sd_bus_error_is_set(&second));
70 sd_bus_error_free(&second);
72 assert_se(!sd_bus_error_is_set(&second));
73 assert_se(temporarily_const_error._need_free < 0);
74 assert_se(sd_bus_error_copy(&second, &temporarily_const_error) == -EACCES);
75 assert_se(second._need_free > 0);
76 assert_se(streq(temporarily_const_error.name, second.name));
77 assert_se(streq(temporarily_const_error.message, second.message));
78 assert_se(sd_bus_error_get_errno(&second) == EACCES);
79 assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_ACCESS_DENIED));
80 assert_se(sd_bus_error_is_set(&second));
82 assert_se(!sd_bus_error_is_set(&error));
83 assert_se(sd_bus_error_set_const(&error, "System.Error.EUCLEAN", "Hallo") == -EUCLEAN);
84 assert_se(streq(error.name, "System.Error.EUCLEAN"));
85 assert_se(streq(error.message, "Hallo"));
86 assert_se(sd_bus_error_has_name(&error, "System.Error.EUCLEAN"));
87 assert_se(sd_bus_error_get_errno(&error) == EUCLEAN);
88 assert_se(sd_bus_error_is_set(&error));
89 sd_bus_error_free(&error);
91 assert_se(!sd_bus_error_is_set(&error));
92 assert_se(sd_bus_error_set_errno(&error, EBUSY) == -EBUSY);
93 assert_se(streq(error.name, "System.Error.EBUSY"));
94 assert_se(streq(error.message, strerror(EBUSY)));
95 assert_se(sd_bus_error_has_name(&error, "System.Error.EBUSY"));
96 assert_se(sd_bus_error_get_errno(&error) == EBUSY);
97 assert_se(sd_bus_error_is_set(&error));
98 sd_bus_error_free(&error);
100 assert_se(!sd_bus_error_is_set(&error));
101 assert_se(sd_bus_error_set_errnof(&error, EIO, "Waldi %c", 'X') == -EIO);
102 assert_se(streq(error.name, SD_BUS_ERROR_IO_ERROR));
103 assert_se(streq(error.message, "Waldi X"));
104 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
105 assert_se(sd_bus_error_get_errno(&error) == EIO);
106 assert_se(sd_bus_error_is_set(&error));
107 sd_bus_error_free(&error);
109 /* Check with no error */
110 assert_se(!sd_bus_error_is_set(&error));
111 assert_se(sd_bus_error_set_errnof(&error, 0, "Waldi %c", 'X') == 0);
112 assert_se(error.name == NULL);
113 assert_se(error.message == NULL);
114 assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
115 assert_se(sd_bus_error_get_errno(&error) == 0);
116 assert_se(!sd_bus_error_is_set(&error));
119 extern const sd_bus_error_map __start_BUS_ERROR_MAP[];
120 extern const sd_bus_error_map __stop_BUS_ERROR_MAP[];
122 static void dump_mapping_table(void) {
123 const sd_bus_error_map *m;
125 printf("----- errno mappings ------\n");
126 m = __start_BUS_ERROR_MAP;
127 while (m < __stop_BUS_ERROR_MAP) {
129 if (m->code == BUS_ERROR_MAP_END_MARKER) {
134 printf("%s -> %i/%s\n", strna(m->name), m->code, strna(errno_to_name(m->code)));
137 printf("---------------------------\n");
140 static void test_errno_mapping_standard(void) {
141 assert_se(sd_bus_error_set(NULL, "System.Error.EUCLEAN", NULL) == -EUCLEAN);
142 assert_se(sd_bus_error_set(NULL, "System.Error.EBUSY", NULL) == -EBUSY);
143 assert_se(sd_bus_error_set(NULL, "System.Error.EINVAL", NULL) == -EINVAL);
144 assert_se(sd_bus_error_set(NULL, "System.Error.WHATSIT", NULL) == -EIO);
147 BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors[] = {
148 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error", 5),
149 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-2", 52),
153 BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors2[] = {
154 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-3", 33),
155 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-4", 44),
156 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-33", 333),
160 static const sd_bus_error_map test_errors3[] = {
161 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-88", 888),
162 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-99", 999),
166 static const sd_bus_error_map test_errors4[] = {
167 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-77", 777),
168 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-78", 778),
172 static const sd_bus_error_map test_errors_bad1[] = {
173 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", 0),
177 static const sd_bus_error_map test_errors_bad2[] = {
178 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", -1),
182 static void test_errno_mapping_custom(void) {
183 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error", NULL) == -5);
184 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
185 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-x", NULL) == -EIO);
186 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-33", NULL) == -333);
188 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -EIO);
189 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -EIO);
190 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -EIO);
192 assert_se(sd_bus_error_add_map(test_errors3) > 0);
193 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -888);
194 assert_se(sd_bus_error_add_map(test_errors4) > 0);
195 assert_se(sd_bus_error_add_map(test_errors4) == 0);
196 assert_se(sd_bus_error_add_map(test_errors3) == 0);
198 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -999);
199 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -777);
200 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-78", NULL) == -778);
201 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
202 assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-y", NULL) == -EIO);
204 #if 0 /// UNNEEDED by elogind
205 assert_se(sd_bus_error_set(NULL, BUS_ERROR_NO_SUCH_UNIT, NULL) == -ENOENT);
208 assert_se(sd_bus_error_add_map(test_errors_bad1) == -EINVAL);
209 assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL);
212 int main(int argc, char *argv[]) {
213 dump_mapping_table();
216 test_errno_mapping_standard();
217 test_errno_mapping_custom();