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