]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-bus/test-bus-kernel.c
tmpfiles: accurately report creation results
[thirdparty/systemd.git] / src / libsystemd / sd-bus / test-bus-kernel.c
CommitLineData
dd418b9a
LP
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
9097fe29
LP
22#include <fcntl.h>
23
dd418b9a 24#include "util.h"
fd8d62d9 25#include "log.h"
dd418b9a
LP
26
27#include "sd-bus.h"
28#include "bus-message.h"
29#include "bus-error.h"
30#include "bus-kernel.h"
40ca29a1 31#include "bus-util.h"
2b5c5383 32#include "bus-dump.h"
dd418b9a
LP
33
34int main(int argc, char *argv[]) {
35 _cleanup_close_ int bus_ref = -1;
3acc1daf 36 _cleanup_free_ char *name = NULL, *bus_name = NULL, *address = NULL, *bname = NULL;
e9a967f9 37 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
a43b9ca3 38 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
e9a967f9 39 const char *ua = NULL, *ub = NULL, *the_string = NULL;
dd418b9a 40 sd_bus *a, *b;
9097fe29 41 int r, pipe_fds[2];
5972fe95 42 const char *nn;
dd418b9a 43
fd8d62d9
LP
44 log_set_max_level(LOG_DEBUG);
45
79ccff06
ZJS
46 assert_se(asprintf(&name, "deine-mutter-%u", (unsigned) getpid()) >= 0);
47
1a299299
LP
48 bus_kernel_fix_attach_mask();
49
79ccff06 50 bus_ref = bus_kernel_create_bus(name, false, &bus_name);
4e3431bc
LP
51 if (bus_ref == -ENOENT)
52 return EXIT_TEST_SKIP;
53
dd418b9a
LP
54 assert_se(bus_ref >= 0);
55
296f3c53 56 address = strappend("kernel:path=", bus_name);
dd418b9a
LP
57 assert_se(address);
58
59 r = sd_bus_new(&a);
60 assert_se(r >= 0);
61
62 r = sd_bus_new(&b);
63 assert_se(r >= 0);
64
455971c1 65 r = sd_bus_set_description(a, "a");
5972fe95
LP
66 assert_se(r >= 0);
67
dd418b9a
LP
68 r = sd_bus_set_address(a, address);
69 assert_se(r >= 0);
70
71 r = sd_bus_set_address(b, address);
72 assert_se(r >= 0);
73
4fc31988 74 assert_se(sd_bus_negotiate_timestamp(a, 1) >= 0);
b5dae4c7 75 assert_se(sd_bus_negotiate_creds(a, true, _SD_BUS_CREDS_ALL) >= 0);
264ad849 76
b5dae4c7
LP
77 assert_se(sd_bus_negotiate_timestamp(b, 0) >= 0);
78 assert_se(sd_bus_negotiate_creds(b, true, 0) >= 0);
264ad849 79
dd418b9a
LP
80 r = sd_bus_start(a);
81 assert_se(r >= 0);
82
83 r = sd_bus_start(b);
84 assert_se(r >= 0);
85
b5dae4c7
LP
86 assert_se(sd_bus_negotiate_timestamp(b, 1) >= 0);
87 assert_se(sd_bus_negotiate_creds(b, true, _SD_BUS_CREDS_ALL) >= 0);
88
dd418b9a
LP
89 r = sd_bus_get_unique_name(a, &ua);
90 assert_se(r >= 0);
296f3c53 91 printf("unique a: %s\n", ua);
dd418b9a 92
455971c1 93 r = sd_bus_get_description(a, &nn);
dd418b9a 94 assert_se(r >= 0);
5972fe95 95 printf("name of a: %s\n", nn);
dd418b9a 96
5972fe95
LP
97 r = sd_bus_get_unique_name(b, &ub);
98 assert_se(r >= 0);
296f3c53
LP
99 printf("unique b: %s\n", ub);
100
455971c1 101 r = sd_bus_get_description(b, &nn);
5972fe95
LP
102 assert_se(r >= 0);
103 printf("name of b: %s\n", nn);
104
3acc1daf
LP
105 assert_se(bus_kernel_get_bus_name(b, &bname) >= 0);
106 assert_se(endswith(bname, name));
107
a43b9ca3
LP
108 r = sd_bus_call_method(a, "this.doesnt.exist", "/foo", "meh.mah", "muh", &error, NULL, "s", "yayayay");
109 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_SERVICE_UNKNOWN));
110 assert_se(r == -EHOSTUNREACH);
111
19befb2d 112 r = sd_bus_add_match(b, NULL, "interface='waldo.com',member='Piep'", NULL, NULL);
86312ab8 113 assert_se(r >= 0);
b030d1f8 114
a56f19c4 115 r = sd_bus_emit_signal(a, "/foo/bar/waldo", "waldo.com", "Piep", "sss", "I am a string", "/this/is/a/path", "and.this.a.domain.name");
e9a967f9
LP
116 assert_se(r >= 0);
117
ae095f86
LP
118 r = sd_bus_try_close(b);
119 assert_se(r == -EBUSY);
120
766c5809
LP
121 r = sd_bus_process_priority(b, -10, &m);
122 assert_se(r == -ENOMSG);
123
e9a967f9
LP
124 r = sd_bus_process(b, &m);
125 assert_se(r > 0);
126 assert_se(m);
127
d55192ad 128 bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
f9be01f3
LP
129 assert_se(sd_bus_message_rewind(m, true) >= 0);
130
e9a967f9
LP
131 r = sd_bus_message_read(m, "s", &the_string);
132 assert_se(r >= 0);
133 assert_se(streq(the_string, "I am a string"));
134
3583882c
LP
135 sd_bus_message_unref(m);
136 m = NULL;
137
ed7d0b22 138 r = sd_bus_request_name(a, "net.x0pointer.foobar", 0);
f08838da
LP
139 assert_se(r >= 0);
140
151b9b96 141 r = sd_bus_message_new_method_call(b, &m, "net.x0pointer.foobar", "/a/path", "an.inter.face", "AMethod");
3583882c
LP
142 assert_se(r >= 0);
143
9097fe29
LP
144 assert_se(pipe2(pipe_fds, O_CLOEXEC) >= 0);
145
146 assert_se(write(pipe_fds[1], "x", 1) == 1);
147
03e334a1 148 pipe_fds[1] = safe_close(pipe_fds[1]);
9097fe29
LP
149
150 r = sd_bus_message_append(m, "h", pipe_fds[0]);
151 assert_se(r >= 0);
152
03e334a1 153 pipe_fds[0] = safe_close(pipe_fds[0]);
9097fe29 154
3583882c
LP
155 r = sd_bus_send(b, m, NULL);
156 assert_se(r >= 0);
157
158 for (;;) {
159 sd_bus_message_unref(m);
160 m = NULL;
161 r = sd_bus_process(a, &m);
162 assert_se(r > 0);
163 assert_se(m);
164
d55192ad 165 bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
3583882c 166 assert_se(sd_bus_message_rewind(m, true) >= 0);
2da833ac 167
9097fe29
LP
168 if (sd_bus_message_is_method_call(m, "an.inter.face", "AMethod")) {
169 int fd;
170 char x;
171
172 r = sd_bus_message_read(m, "h", &fd);
173 assert_se(r >= 0);
174
175 assert_se(read(fd, &x, 1) == 1);
176 assert_se(x == 'x');
2da833ac 177 break;
9097fe29 178 }
3583882c
LP
179 }
180
ed7d0b22 181 r = sd_bus_release_name(a, "net.x0pointer.foobar");
f08838da
LP
182 assert_se(r >= 0);
183
ed7d0b22 184 r = sd_bus_release_name(a, "net.x0pointer.foobar");
01f6c9d4 185 assert_se(r == -ESRCH);
f08838da 186
ae095f86
LP
187 r = sd_bus_try_close(a);
188 assert_se(r >= 0);
189
296f3c53
LP
190 sd_bus_unref(a);
191 sd_bus_unref(b);
dd418b9a
LP
192
193 return 0;
194}