chiark / gitweb /
87197197913c23d94792604273fd70b0c6527972
[elogind.git] / src / libelogind / sd-bus / test-bus-error.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3   Copyright 2013 Lennart Poettering
4 ***/
5
6 #include "sd-bus.h"
7
8 #include "bus-common-errors.h"
9 #include "bus-error.h"
10 #include "bus-util.h"
11 #include "errno-list.h"
12
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,
18                 .message = "oh! no",
19                 ._need_free = -1
20         };
21
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);
30
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));
39
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));
46
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));
57
58         sd_bus_error_free(&error);
59         sd_bus_error_free(&second);
60
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);
71
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));
81
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);
90
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);
99
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);
108
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));
117 }
118
119 extern const sd_bus_error_map __start_BUS_ERROR_MAP[];
120 extern const sd_bus_error_map __stop_BUS_ERROR_MAP[];
121
122 static void dump_mapping_table(void) {
123         const sd_bus_error_map *m;
124
125         printf("----- errno mappings ------\n");
126         m = __start_BUS_ERROR_MAP;
127         while (m < __stop_BUS_ERROR_MAP) {
128
129                 if (m->code == BUS_ERROR_MAP_END_MARKER) {
130                         m = ALIGN8_PTR(m+1);
131                         continue;
132                 }
133
134                 printf("%s -> %i/%s\n", strna(m->name), m->code, strna(errno_to_name(m->code)));
135                 m++;
136         }
137         printf("---------------------------\n");
138 }
139
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);
145 }
146
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),
150         SD_BUS_ERROR_MAP_END
151 };
152
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),
157         SD_BUS_ERROR_MAP_END
158 };
159
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),
163         SD_BUS_ERROR_MAP_END
164 };
165
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),
169         SD_BUS_ERROR_MAP_END
170 };
171
172 static const sd_bus_error_map test_errors_bad1[] = {
173         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", 0),
174         SD_BUS_ERROR_MAP_END
175 };
176
177 static const sd_bus_error_map test_errors_bad2[] = {
178         SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", -1),
179         SD_BUS_ERROR_MAP_END
180 };
181
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);
187
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);
191
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);
197
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);
203
204 #if 0 /// UNNEEDED by elogind
205         assert_se(sd_bus_error_set(NULL, BUS_ERROR_NO_SUCH_UNIT, NULL) == -ENOENT);
206 #endif // 0
207
208         assert_se(sd_bus_error_add_map(test_errors_bad1) == -EINVAL);
209         assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL);
210 }
211
212 int main(int argc, char *argv[]) {
213         dump_mapping_table();
214
215         test_error();
216         test_errno_mapping_standard();
217         test_errno_mapping_custom();
218
219         return 0;
220 }