1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Lennart Poettering
10 #include "bus-common-errors.h"
11 #include "bus-error.h"
13 #include "errno-list.h"
15 static void test_error(void) {
16 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
, second
= SD_BUS_ERROR_NULL
;
17 const sd_bus_error const_error
= SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FILE_EXISTS
, "const error");
18 const sd_bus_error temporarily_const_error
= {
19 .name
= SD_BUS_ERROR_ACCESS_DENIED
,
24 assert_se(!sd_bus_error_is_set(&error
));
25 assert_se(sd_bus_error_set(&error
, SD_BUS_ERROR_NOT_SUPPORTED
, "xxx") == -EOPNOTSUPP
);
26 assert_se(streq(error
.name
, SD_BUS_ERROR_NOT_SUPPORTED
));
27 assert_se(streq(error
.message
, "xxx"));
28 assert_se(sd_bus_error_has_name(&error
, SD_BUS_ERROR_NOT_SUPPORTED
));
29 assert_se(sd_bus_error_get_errno(&error
) == EOPNOTSUPP
);
30 assert_se(sd_bus_error_is_set(&error
));
31 sd_bus_error_free(&error
);
33 /* Check with no error */
34 assert_se(!sd_bus_error_is_set(&error
));
35 assert_se(sd_bus_error_setf(&error
, NULL
, "yyy %i", -1) == 0);
36 assert_se(error
.name
== NULL
);
37 assert_se(error
.message
== NULL
);
38 assert_se(!sd_bus_error_has_name(&error
, SD_BUS_ERROR_FILE_NOT_FOUND
));
39 assert_se(sd_bus_error_get_errno(&error
) == 0);
40 assert_se(!sd_bus_error_is_set(&error
));
42 assert_se(sd_bus_error_setf(&error
, SD_BUS_ERROR_FILE_NOT_FOUND
, "yyy %i", -1) == -ENOENT
);
43 assert_se(streq(error
.name
, SD_BUS_ERROR_FILE_NOT_FOUND
));
44 assert_se(streq(error
.message
, "yyy -1"));
45 assert_se(sd_bus_error_has_name(&error
, SD_BUS_ERROR_FILE_NOT_FOUND
));
46 assert_se(sd_bus_error_get_errno(&error
) == ENOENT
);
47 assert_se(sd_bus_error_is_set(&error
));
49 assert_se(!sd_bus_error_is_set(&second
));
50 assert_se(second
._need_free
== 0);
51 assert_se(error
._need_free
> 0);
52 assert_se(sd_bus_error_copy(&second
, &error
) == -ENOENT
);
53 assert_se(second
._need_free
> 0);
54 assert_se(streq(error
.name
, second
.name
));
55 assert_se(streq(error
.message
, second
.message
));
56 assert_se(sd_bus_error_get_errno(&second
) == ENOENT
);
57 assert_se(sd_bus_error_has_name(&second
, SD_BUS_ERROR_FILE_NOT_FOUND
));
58 assert_se(sd_bus_error_is_set(&second
));
60 sd_bus_error_free(&error
);
61 sd_bus_error_free(&second
);
63 assert_se(!sd_bus_error_is_set(&second
));
64 assert_se(const_error
._need_free
== 0);
65 assert_se(sd_bus_error_copy(&second
, &const_error
) == -EEXIST
);
66 assert_se(second
._need_free
== 0);
67 assert_se(streq(const_error
.name
, second
.name
));
68 assert_se(streq(const_error
.message
, second
.message
));
69 assert_se(sd_bus_error_get_errno(&second
) == EEXIST
);
70 assert_se(sd_bus_error_has_name(&second
, SD_BUS_ERROR_FILE_EXISTS
));
71 assert_se(sd_bus_error_is_set(&second
));
72 sd_bus_error_free(&second
);
74 assert_se(!sd_bus_error_is_set(&second
));
75 assert_se(temporarily_const_error
._need_free
< 0);
76 assert_se(sd_bus_error_copy(&second
, &temporarily_const_error
) == -EACCES
);
77 assert_se(second
._need_free
> 0);
78 assert_se(streq(temporarily_const_error
.name
, second
.name
));
79 assert_se(streq(temporarily_const_error
.message
, second
.message
));
80 assert_se(sd_bus_error_get_errno(&second
) == EACCES
);
81 assert_se(sd_bus_error_has_name(&second
, SD_BUS_ERROR_ACCESS_DENIED
));
82 assert_se(sd_bus_error_is_set(&second
));
84 assert_se(!sd_bus_error_is_set(&error
));
85 assert_se(sd_bus_error_set_const(&error
, "System.Error.EUCLEAN", "Hallo") == -EUCLEAN
);
86 assert_se(streq(error
.name
, "System.Error.EUCLEAN"));
87 assert_se(streq(error
.message
, "Hallo"));
88 assert_se(sd_bus_error_has_name(&error
, "System.Error.EUCLEAN"));
89 assert_se(sd_bus_error_get_errno(&error
) == EUCLEAN
);
90 assert_se(sd_bus_error_is_set(&error
));
91 sd_bus_error_free(&error
);
93 assert_se(!sd_bus_error_is_set(&error
));
94 assert_se(sd_bus_error_set_errno(&error
, EBUSY
) == -EBUSY
);
95 assert_se(streq(error
.name
, "System.Error.EBUSY"));
96 assert_se(streq(error
.message
, strerror(EBUSY
)));
97 assert_se(sd_bus_error_has_name(&error
, "System.Error.EBUSY"));
98 assert_se(sd_bus_error_get_errno(&error
) == EBUSY
);
99 assert_se(sd_bus_error_is_set(&error
));
100 sd_bus_error_free(&error
);
102 assert_se(!sd_bus_error_is_set(&error
));
103 assert_se(sd_bus_error_set_errnof(&error
, EIO
, "Waldi %c", 'X') == -EIO
);
104 assert_se(streq(error
.name
, SD_BUS_ERROR_IO_ERROR
));
105 assert_se(streq(error
.message
, "Waldi X"));
106 assert_se(sd_bus_error_has_name(&error
, SD_BUS_ERROR_IO_ERROR
));
107 assert_se(sd_bus_error_get_errno(&error
) == EIO
);
108 assert_se(sd_bus_error_is_set(&error
));
109 sd_bus_error_free(&error
);
111 /* Check with no error */
112 assert_se(!sd_bus_error_is_set(&error
));
113 assert_se(sd_bus_error_set_errnof(&error
, 0, "Waldi %c", 'X') == 0);
114 assert_se(error
.name
== NULL
);
115 assert_se(error
.message
== NULL
);
116 assert_se(!sd_bus_error_has_name(&error
, SD_BUS_ERROR_IO_ERROR
));
117 assert_se(sd_bus_error_get_errno(&error
) == 0);
118 assert_se(!sd_bus_error_is_set(&error
));
121 extern const sd_bus_error_map __start_BUS_ERROR_MAP
[];
122 extern const sd_bus_error_map __stop_BUS_ERROR_MAP
[];
124 static void dump_mapping_table(void) {
125 const sd_bus_error_map
*m
;
127 printf("----- errno mappings ------\n");
128 m
= __start_BUS_ERROR_MAP
;
129 while (m
< __stop_BUS_ERROR_MAP
) {
131 if (m
->code
== BUS_ERROR_MAP_END_MARKER
) {
136 printf("%s -> %i/%s\n", strna(m
->name
), m
->code
, strna(errno_to_name(m
->code
)));
139 printf("---------------------------\n");
142 static void test_errno_mapping_standard(void) {
143 assert_se(sd_bus_error_set(NULL
, "System.Error.EUCLEAN", NULL
) == -EUCLEAN
);
144 assert_se(sd_bus_error_set(NULL
, "System.Error.EBUSY", NULL
) == -EBUSY
);
145 assert_se(sd_bus_error_set(NULL
, "System.Error.EINVAL", NULL
) == -EINVAL
);
146 assert_se(sd_bus_error_set(NULL
, "System.Error.WHATSIT", NULL
) == -EIO
);
149 BUS_ERROR_MAP_ELF_REGISTER
const sd_bus_error_map test_errors
[] = {
150 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error", 5),
151 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-2", 52),
155 BUS_ERROR_MAP_ELF_REGISTER
const sd_bus_error_map test_errors2
[] = {
156 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-3", 33),
157 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-4", 44),
158 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-33", 333),
162 static const sd_bus_error_map test_errors3
[] = {
163 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-88", 888),
164 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-99", 999),
168 static const sd_bus_error_map test_errors4
[] = {
169 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-77", 777),
170 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-78", 778),
174 static const sd_bus_error_map test_errors_bad1
[] = {
175 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", 0),
179 static const sd_bus_error_map test_errors_bad2
[] = {
180 SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", -1),
184 static void test_errno_mapping_custom(void) {
185 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error", NULL
) == -5);
186 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-2", NULL
) == -52);
187 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-x", NULL
) == -EIO
);
188 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-33", NULL
) == -333);
190 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-88", NULL
) == -EIO
);
191 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-99", NULL
) == -EIO
);
192 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-77", NULL
) == -EIO
);
194 assert_se(sd_bus_error_add_map(test_errors3
) > 0);
195 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-88", NULL
) == -888);
196 assert_se(sd_bus_error_add_map(test_errors4
) > 0);
197 assert_se(sd_bus_error_add_map(test_errors4
) == 0);
198 assert_se(sd_bus_error_add_map(test_errors3
) == 0);
200 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-99", NULL
) == -999);
201 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-77", NULL
) == -777);
202 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-78", NULL
) == -778);
203 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-2", NULL
) == -52);
204 assert_se(sd_bus_error_set(NULL
, "org.freedesktop.custom-dbus-error-y", NULL
) == -EIO
);
206 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();