chiark / gitweb /
bus: append unique and well known names to all messages unconditionally
[elogind.git] / src / libsystemd-bus / test-bus-zero-copy.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2013 Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <fcntl.h>
23 #include <sys/mman.h>
24
25 #include "util.h"
26 #include "log.h"
27
28 #include "sd-bus.h"
29 #include "sd-memfd.h"
30 #include "bus-message.h"
31 #include "bus-error.h"
32 #include "bus-kernel.h"
33 #include "bus-dump.h"
34
35 #define FIRST_ARRAY 17
36 #define SECOND_ARRAY 33
37
38 #define STRING_SIZE 123
39
40 int main(int argc, char *argv[]) {
41         _cleanup_free_ char *bus_name = NULL, *address = NULL;
42         uint8_t *p;
43         sd_bus *a, *b;
44         int r, bus_ref;
45         sd_bus_message *m;
46         sd_memfd *f;
47         uint64_t sz;
48         uint32_t u32;
49         size_t i, l;
50         char *s;
51
52         log_set_max_level(LOG_DEBUG);
53
54         bus_ref = bus_kernel_create("deine-mutter", &bus_name);
55         if (bus_ref == -ENOENT)
56                 return EXIT_TEST_SKIP;
57
58         assert_se(bus_ref >= 0);
59
60         address = strappend("kernel:path=", bus_name);
61         assert_se(address);
62
63         r = sd_bus_new(&a);
64         assert_se(r >= 0);
65
66         r = sd_bus_new(&b);
67         assert_se(r >= 0);
68
69         r = sd_bus_set_address(a, address);
70         assert_se(r >= 0);
71
72         r = sd_bus_set_address(b, address);
73         assert_se(r >= 0);
74
75         r = sd_bus_start(a);
76         assert_se(r >= 0);
77
78         r = sd_bus_start(b);
79         assert_se(r >= 0);
80
81         r = sd_bus_message_new_method_call(b, ":1.1", "/a/path", "an.inter.face", "AMethod", &m);
82         assert_se(r >= 0);
83
84         r = sd_bus_message_open_container(m, 'r', "aysay");
85         assert_se(r >= 0);
86
87         r = sd_bus_message_append_array_space(m, 'y', FIRST_ARRAY, (void**) &p);
88         assert_se(r >= 0);
89
90         memset(p, 'L', FIRST_ARRAY);
91
92         r = sd_memfd_new_and_map(&f, STRING_SIZE, (void**) &s);
93         assert_se(r >= 0);
94
95         for (i = 0; i < STRING_SIZE-1; i++)
96                 s[i] = '0' + (i % 10);
97
98         s[STRING_SIZE-1] = 0;
99         munmap(s, STRING_SIZE);
100
101         r = sd_memfd_get_size(f, &sz);
102         assert_se(r >= 0);
103         assert_se(sz == STRING_SIZE);
104
105         r = sd_bus_message_append_string_memfd(m, f);
106         assert_se(r >= 0);
107
108         sd_memfd_free(f);
109
110         r = sd_memfd_new_and_map(&f, SECOND_ARRAY, (void**) &p);
111         assert_se(r >= 0);
112
113         memset(p, 'P', SECOND_ARRAY);
114         munmap(p, SECOND_ARRAY);
115
116         r = sd_memfd_get_size(f, &sz);
117         assert_se(r >= 0);
118         assert_se(sz == SECOND_ARRAY);
119
120         r = sd_bus_message_append_array_memfd(m, 'y', f);
121         assert_se(r >= 0);
122
123         sd_memfd_free(f);
124
125         r = sd_bus_message_close_container(m);
126         assert_se(r >= 0);
127
128         r = sd_bus_message_append(m, "u", 4711);
129         assert_se(r >= 0);
130
131         r = bus_message_seal(m, 55);
132         assert_se(r >= 0);
133
134         bus_message_dump(m, stdout, true);
135
136         r = sd_bus_send(b, m, NULL);
137         assert_se(r >= 0);
138
139         sd_bus_message_unref(m);
140
141         r = sd_bus_process(a, &m);
142         assert_se(r > 0);
143
144         bus_message_dump(m, stdout, true);
145         sd_bus_message_rewind(m, true);
146
147         r = sd_bus_message_enter_container(m, 'r', "aysay");
148         assert_se(r > 0);
149
150         r = sd_bus_message_read_array(m, 'y', (const void**) &p, &l);
151         assert_se(r > 0);
152         assert_se(l == FIRST_ARRAY);
153
154         for (i = 0; i < l; i++)
155                 assert_se(p[i] == 'L');
156
157         r = sd_bus_message_read(m, "s", &s);
158         assert_se(r > 0);
159
160         for (i = 0; i < STRING_SIZE-1; i++)
161                 assert_se(s[i] == (char) ('0' + (i % 10)));
162         assert_se(s[STRING_SIZE-1] == 0);
163
164         r = sd_bus_message_read_array(m, 'y', (const void**) &p, &l);
165         assert_se(r > 0);
166         assert_se(l == SECOND_ARRAY);
167
168         for (i = 0; i < l; i++)
169                 assert_se(p[i] == 'P');
170
171         r = sd_bus_message_exit_container(m);
172         assert_se(r > 0);
173
174         r = sd_bus_message_read(m, "u", &u32);
175         assert_se(r > 0);
176         assert_se(u32 == 4711);
177
178         sd_bus_message_unref(m);
179
180         sd_bus_unref(a);
181         sd_bus_unref(b);
182
183         return 0;
184 }