1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
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.
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.
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/>.
31 #include <dbus/dbus.h>
38 #include "bus-message.h"
42 static void test_bus_label_escape_one(const char *a, const char *b) {
43 _cleanup_free_ char *t = NULL, *x = NULL, *y = NULL;
45 assert_se(t = sd_bus_label_escape(a));
46 assert_se(streq(t, b));
48 assert_se(x = sd_bus_label_unescape(t));
49 assert_se(streq(a, x));
51 assert_se(y = sd_bus_label_unescape(b));
52 assert_se(streq(a, y));
55 static void test_bus_label_escape(void) {
56 test_bus_label_escape_one("foo123bar", "foo123bar");
57 test_bus_label_escape_one("foo.bar", "foo_2ebar");
58 test_bus_label_escape_one("foo_2ebar", "foo_5f2ebar");
59 test_bus_label_escape_one("", "_");
60 test_bus_label_escape_one("_", "_5f");
61 test_bus_label_escape_one("1", "_31");
62 test_bus_label_escape_one(":1", "_3a1");
65 int main(int argc, char *argv[]) {
66 _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *copy = NULL;
68 const char *x, *x2, *y, *z, *a, *b, *c, *d, *a_signature;
73 const int32_t integer_array[] = { -1, -2, 0, 1, 2 }, *return_array;
75 _cleanup_free_ char *first = NULL, *second = NULL, *third = NULL;
76 _cleanup_fclose_ FILE *ms = NULL;
77 size_t first_size = 0, second_size = 0, third_size = 0;
79 r = sd_bus_message_new_method_call(NULL, &m, "foobar.waldo", "/", "foobar.waldo", "Piep");
82 r = sd_bus_message_append(m, "");
85 r = sd_bus_message_append(m, "s", "a string");
88 r = sd_bus_message_append(m, "s", NULL);
91 r = sd_bus_message_append(m, "asg", 2, "string #1", "string #2", "sba(tt)ss");
94 r = sd_bus_message_append(m, "sass", "foobar", 5, "foo", "bar", "waldo", "piep", "pap", "after");
97 r = sd_bus_message_append(m, "a{yv}", 2, 3, "s", "foo", 5, "s", "waldo");
100 r = sd_bus_message_append(m, "ba(ss)", 255, 3, "aaa", "1", "bbb", "2", "ccc", "3");
103 r = sd_bus_message_open_container(m, 'a', "s");
106 r = sd_bus_message_append_basic(m, 's', "foobar");
109 r = sd_bus_message_append_basic(m, 's', "waldo");
112 r = sd_bus_message_close_container(m);
115 r = sd_bus_message_append_string_space(m, 5, &s);
119 r = sd_bus_message_append_array(m, 'i', integer_array, sizeof(integer_array));
122 r = sd_bus_message_append_array(m, 'u', NULL, 0);
125 r = bus_message_seal(m, 4711, 0);
128 bus_message_dump(m, stdout, true);
130 ms = open_memstream(&first, &first_size);
131 bus_message_dump(m, ms, false);
133 assert_se(!ferror(ms));
135 r = bus_message_get_blob(m, &buffer, &sz);
138 h = hexmem(buffer, sz);
141 log_info("message size = %lu, contents =\n%s", (unsigned long) sz, h);
149 #if !defined(GLIB_VERSION_2_36)
153 g = g_dbus_message_new_from_blob(buffer, sz, 0, NULL);
154 p = g_dbus_message_print(g, 0);
166 dbus_error_init(&error);
168 w = dbus_message_demarshal(buffer, sz, &error);
170 log_error("%s", error.message);
172 dbus_message_unref(w);
176 m = sd_bus_message_unref(m);
178 r = bus_message_from_malloc(NULL, buffer, sz, NULL, 0, NULL, NULL, &m);
181 bus_message_dump(m, stdout, true);
184 ms = open_memstream(&second, &second_size);
185 bus_message_dump(m, ms, false);
187 assert_se(!ferror(ms));
188 assert_se(first_size == second_size);
189 assert_se(memcmp(first, second, first_size) == 0);
191 assert_se(sd_bus_message_rewind(m, true) >= 0);
193 r = sd_bus_message_read(m, "ssasg", &x, &x2, 2, &y, &z, &a_signature);
195 assert_se(streq(x, "a string"));
196 assert_se(streq(x2, ""));
197 assert_se(streq(y, "string #1"));
198 assert_se(streq(z, "string #2"));
199 assert_se(streq(a_signature, "sba(tt)ss"));
201 r = sd_bus_message_read(m, "sass", &x, 5, &y, &z, &a, &b, &c, &d);
203 assert_se(streq(x, "foobar"));
204 assert_se(streq(y, "foo"));
205 assert_se(streq(z, "bar"));
206 assert_se(streq(a, "waldo"));
207 assert_se(streq(b, "piep"));
208 assert_se(streq(c, "pap"));
209 assert_se(streq(d, "after"));
211 r = sd_bus_message_read(m, "a{yv}", 2, &u, "s", &x, &v, "s", &y);
214 assert_se(streq(x, "foo"));
216 assert_se(streq(y, "waldo"));
218 r = sd_bus_message_read(m, "ba(ss)", &boolean, 3, &x, &y, &a, &b, &c, &d);
221 assert_se(streq(x, "aaa"));
222 assert_se(streq(y, "1"));
223 assert_se(streq(a, "bbb"));
224 assert_se(streq(b, "2"));
225 assert_se(streq(c, "ccc"));
226 assert_se(streq(d, "3"));
228 assert_se(sd_bus_message_verify_type(m, 'a', "s") > 0);
230 r = sd_bus_message_read(m, "as", 2, &x, &y);
232 assert_se(streq(x, "foobar"));
233 assert_se(streq(y, "waldo"));
235 r = sd_bus_message_read_basic(m, 's', &s);
237 assert_se(streq(s, "hallo"));
239 r = sd_bus_message_read_array(m, 'i', (const void**) &return_array, &sz);
241 assert_se(sz == sizeof(integer_array));
242 assert_se(memcmp(integer_array, return_array, sz) == 0);
244 r = sd_bus_message_read_array(m, 'u', (const void**) &return_array, &sz);
248 r = sd_bus_message_peek_type(m, NULL, NULL);
251 r = sd_bus_message_new_method_call(NULL, ©, "foobar.waldo", "/", "foobar.waldo", "Piep");
254 r = sd_bus_message_rewind(m, true);
257 r = sd_bus_message_copy(copy, m, true);
260 r = bus_message_seal(copy, 4712, 0);
264 ms = open_memstream(&third, &third_size);
265 bus_message_dump(copy, ms, false);
267 assert_se(!ferror(ms));
269 printf("<%.*s>\n", (int) first_size, first);
270 printf("<%.*s>\n", (int) third_size, third);
272 assert_se(first_size == third_size);
273 assert_se(memcmp(first, third, third_size) == 0);
275 r = sd_bus_message_rewind(m, true);
278 assert_se(sd_bus_message_verify_type(m, 's', NULL) > 0);
280 r = sd_bus_message_skip(m, "ssasg");
283 assert_se(sd_bus_message_verify_type(m, 's', NULL) > 0);
285 r = sd_bus_message_skip(m, "sass");
288 assert_se(sd_bus_message_verify_type(m, 'a', "{yv}") > 0);
290 r = sd_bus_message_skip(m, "a{yv}");
293 assert_se(sd_bus_message_verify_type(m, 'b', NULL) > 0);
295 r = sd_bus_message_read(m, "b", &boolean);
299 r = sd_bus_message_enter_container(m, 0, NULL);
302 r = sd_bus_message_read(m, "(ss)", &x, &y);
305 r = sd_bus_message_read(m, "(ss)", &a, &b);
308 r = sd_bus_message_read(m, "(ss)", &c, &d);
311 r = sd_bus_message_read(m, "(ss)", &x, &y);
314 r = sd_bus_message_exit_container(m);
317 assert_se(streq(x, "aaa"));
318 assert_se(streq(y, "1"));
319 assert_se(streq(a, "bbb"));
320 assert_se(streq(b, "2"));
321 assert_se(streq(c, "ccc"));
322 assert_se(streq(d, "3"));
324 test_bus_label_escape();