Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include "sd-bus.h"
4 : :
5 : : #include "bus-common-errors.h"
6 : : #include "bus-error.h"
7 : : #include "bus-util.h"
8 : : #include "errno-list.h"
9 : : #include "errno-util.h"
10 : :
11 : 4 : static void test_error(void) {
12 : 4 : _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL, second = SD_BUS_ERROR_NULL;
13 : 4 : const sd_bus_error const_error = SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FILE_EXISTS, "const error");
14 : 4 : const sd_bus_error temporarily_const_error = {
15 : : .name = SD_BUS_ERROR_ACCESS_DENIED,
16 : : .message = "oh! no",
17 : : ._need_free = -1
18 : : };
19 : :
20 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&error));
21 [ - + ]: 4 : assert_se(sd_bus_error_set(&error, SD_BUS_ERROR_NOT_SUPPORTED, "xxx") == -EOPNOTSUPP);
22 [ - + ]: 4 : assert_se(streq(error.name, SD_BUS_ERROR_NOT_SUPPORTED));
23 [ - + ]: 4 : assert_se(streq(error.message, "xxx"));
24 [ - + ]: 4 : assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_NOT_SUPPORTED));
25 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&error) == EOPNOTSUPP);
26 [ - + ]: 4 : assert_se(sd_bus_error_is_set(&error));
27 : 4 : sd_bus_error_free(&error);
28 : :
29 : : /* Check with no error */
30 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&error));
31 [ - + ]: 4 : assert_se(sd_bus_error_setf(&error, NULL, "yyy %i", -1) == 0);
32 [ - + ]: 4 : assert_se(error.name == NULL);
33 [ - + ]: 4 : assert_se(error.message == NULL);
34 [ - + ]: 4 : assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
35 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&error) == 0);
36 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&error));
37 : :
38 [ - + ]: 4 : assert_se(sd_bus_error_setf(&error, SD_BUS_ERROR_FILE_NOT_FOUND, "yyy %i", -1) == -ENOENT);
39 [ - + ]: 4 : assert_se(streq(error.name, SD_BUS_ERROR_FILE_NOT_FOUND));
40 [ - + ]: 4 : assert_se(streq(error.message, "yyy -1"));
41 [ - + ]: 4 : assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
42 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&error) == ENOENT);
43 [ - + ]: 4 : assert_se(sd_bus_error_is_set(&error));
44 : :
45 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&second));
46 [ - + ]: 4 : assert_se(second._need_free == 0);
47 [ - + ]: 4 : assert_se(error._need_free > 0);
48 [ - + ]: 4 : assert_se(sd_bus_error_copy(&second, &error) == -ENOENT);
49 [ - + ]: 4 : assert_se(second._need_free > 0);
50 [ - + ]: 4 : assert_se(streq(error.name, second.name));
51 [ - + ]: 4 : assert_se(streq(error.message, second.message));
52 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&second) == ENOENT);
53 [ - + ]: 4 : assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_NOT_FOUND));
54 [ - + ]: 4 : assert_se(sd_bus_error_is_set(&second));
55 : :
56 : 4 : sd_bus_error_free(&error);
57 : 4 : sd_bus_error_free(&second);
58 : :
59 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&second));
60 [ - + ]: 4 : assert_se(const_error._need_free == 0);
61 [ - + ]: 4 : assert_se(sd_bus_error_copy(&second, &const_error) == -EEXIST);
62 [ - + ]: 4 : assert_se(second._need_free == 0);
63 [ - + ]: 4 : assert_se(streq(const_error.name, second.name));
64 [ - + ]: 4 : assert_se(streq(const_error.message, second.message));
65 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&second) == EEXIST);
66 [ - + ]: 4 : assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_EXISTS));
67 [ - + ]: 4 : assert_se(sd_bus_error_is_set(&second));
68 : 4 : sd_bus_error_free(&second);
69 : :
70 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&second));
71 [ - + ]: 4 : assert_se(temporarily_const_error._need_free < 0);
72 [ - + ]: 4 : assert_se(sd_bus_error_copy(&second, &temporarily_const_error) == -EACCES);
73 [ - + ]: 4 : assert_se(second._need_free > 0);
74 [ - + ]: 4 : assert_se(streq(temporarily_const_error.name, second.name));
75 [ - + ]: 4 : assert_se(streq(temporarily_const_error.message, second.message));
76 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&second) == EACCES);
77 [ - + ]: 4 : assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_ACCESS_DENIED));
78 [ - + ]: 4 : assert_se(sd_bus_error_is_set(&second));
79 : :
80 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&error));
81 [ - + ]: 4 : assert_se(sd_bus_error_set_const(&error, "System.Error.EUCLEAN", "Hallo") == -EUCLEAN);
82 [ - + ]: 4 : assert_se(streq(error.name, "System.Error.EUCLEAN"));
83 [ - + ]: 4 : assert_se(streq(error.message, "Hallo"));
84 [ - + ]: 4 : assert_se(sd_bus_error_has_name(&error, "System.Error.EUCLEAN"));
85 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&error) == EUCLEAN);
86 [ - + ]: 4 : assert_se(sd_bus_error_is_set(&error));
87 : 4 : sd_bus_error_free(&error);
88 : :
89 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&error));
90 [ - + ]: 4 : assert_se(sd_bus_error_set_errno(&error, EBUSY) == -EBUSY);
91 [ - + ]: 4 : assert_se(streq(error.name, "System.Error.EBUSY"));
92 [ - + ]: 4 : assert_se(streq(error.message, strerror_safe(EBUSY)));
93 [ - + ]: 4 : assert_se(sd_bus_error_has_name(&error, "System.Error.EBUSY"));
94 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&error) == EBUSY);
95 [ - + ]: 4 : assert_se(sd_bus_error_is_set(&error));
96 : 4 : sd_bus_error_free(&error);
97 : :
98 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&error));
99 [ - + ]: 4 : assert_se(sd_bus_error_set_errnof(&error, EIO, "Waldi %c", 'X') == -EIO);
100 [ - + ]: 4 : assert_se(streq(error.name, SD_BUS_ERROR_IO_ERROR));
101 [ - + ]: 4 : assert_se(streq(error.message, "Waldi X"));
102 [ - + ]: 4 : assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
103 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&error) == EIO);
104 [ - + ]: 4 : assert_se(sd_bus_error_is_set(&error));
105 : 4 : sd_bus_error_free(&error);
106 : :
107 : : /* Check with no error */
108 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&error));
109 [ - + ]: 4 : assert_se(sd_bus_error_set_errnof(&error, 0, "Waldi %c", 'X') == 0);
110 [ - + ]: 4 : assert_se(error.name == NULL);
111 [ - + ]: 4 : assert_se(error.message == NULL);
112 [ - + ]: 4 : assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_IO_ERROR));
113 [ - + ]: 4 : assert_se(sd_bus_error_get_errno(&error) == 0);
114 [ - + ]: 4 : assert_se(!sd_bus_error_is_set(&error));
115 : 4 : }
116 : :
117 : : extern const sd_bus_error_map __start_SYSTEMD_BUS_ERROR_MAP[];
118 : : extern const sd_bus_error_map __stop_SYSTEMD_BUS_ERROR_MAP[];
119 : :
120 : 4 : static void dump_mapping_table(void) {
121 : : const sd_bus_error_map *m;
122 : :
123 : 4 : printf("----- errno mappings ------\n");
124 : 4 : m = ALIGN_TO_PTR(__start_SYSTEMD_BUS_ERROR_MAP, sizeof(void*));
125 [ + + ]: 516 : while (m < __stop_SYSTEMD_BUS_ERROR_MAP) {
126 : :
127 [ + + ]: 512 : if (m->code == BUS_ERROR_MAP_END_MARKER) {
128 : 16 : m = ALIGN_TO_PTR(m + 1, sizeof(void*));
129 : 16 : continue;
130 : : }
131 : :
132 : 496 : printf("%s -> %i/%s\n", strna(m->name), m->code, strna(errno_to_name(m->code)));
133 : 496 : m++;
134 : : }
135 : 4 : printf("---------------------------\n");
136 : 4 : }
137 : :
138 : 4 : static void test_errno_mapping_standard(void) {
139 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "System.Error.EUCLEAN", NULL) == -EUCLEAN);
140 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "System.Error.EBUSY", NULL) == -EBUSY);
141 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "System.Error.EINVAL", NULL) == -EINVAL);
142 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "System.Error.WHATSIT", NULL) == -EIO);
143 : 4 : }
144 : :
145 : : BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors[] = {
146 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error", 5),
147 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-2", 52),
148 : : SD_BUS_ERROR_MAP_END
149 : : };
150 : :
151 : : BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors2[] = {
152 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-3", 33),
153 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-4", 44),
154 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-33", 333),
155 : : SD_BUS_ERROR_MAP_END
156 : : };
157 : :
158 : : static const sd_bus_error_map test_errors3[] = {
159 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-88", 888),
160 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-99", 999),
161 : : SD_BUS_ERROR_MAP_END
162 : : };
163 : :
164 : : static const sd_bus_error_map test_errors4[] = {
165 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-77", 777),
166 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-78", 778),
167 : : SD_BUS_ERROR_MAP_END
168 : : };
169 : :
170 : : static const sd_bus_error_map test_errors_bad1[] = {
171 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", 0),
172 : : SD_BUS_ERROR_MAP_END
173 : : };
174 : :
175 : : static const sd_bus_error_map test_errors_bad2[] = {
176 : : SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", -1),
177 : : SD_BUS_ERROR_MAP_END
178 : : };
179 : :
180 : 4 : static void test_errno_mapping_custom(void) {
181 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error", NULL) == -5);
182 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
183 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-x", NULL) == -EIO);
184 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-33", NULL) == -333);
185 : :
186 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -EIO);
187 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -EIO);
188 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -EIO);
189 : :
190 [ - + ]: 4 : assert_se(sd_bus_error_add_map(test_errors3) > 0);
191 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-88", NULL) == -888);
192 [ - + ]: 4 : assert_se(sd_bus_error_add_map(test_errors4) > 0);
193 [ - + ]: 4 : assert_se(sd_bus_error_add_map(test_errors4) == 0);
194 [ - + ]: 4 : assert_se(sd_bus_error_add_map(test_errors3) == 0);
195 : :
196 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-99", NULL) == -999);
197 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-77", NULL) == -777);
198 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-78", NULL) == -778);
199 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
200 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-y", NULL) == -EIO);
201 : :
202 [ - + ]: 4 : assert_se(sd_bus_error_set(NULL, BUS_ERROR_NO_SUCH_UNIT, NULL) == -ENOENT);
203 : :
204 [ - + ]: 4 : assert_se(sd_bus_error_add_map(test_errors_bad1) == -EINVAL);
205 [ - + ]: 4 : assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL);
206 : 4 : }
207 : :
208 : 4 : int main(int argc, char *argv[]) {
209 : 4 : dump_mapping_table();
210 : :
211 : 4 : test_error();
212 : 4 : test_errno_mapping_standard();
213 : 4 : test_errno_mapping_custom();
214 : :
215 : 4 : return 0;
216 : : }
|