]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-bus/test-bus-gvariant.c
util-lib: split out allocation calls into alloc-util.[ch]
[thirdparty/systemd.git] / src / libsystemd / sd-bus / test-bus-gvariant.c
CommitLineData
c1b9d935
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
22#ifdef HAVE_GLIB
23#include <glib.h>
24#endif
25
c1b9d935 26#include "sd-bus.h"
07630cea 27
b5efdb8a 28#include "alloc-util.h"
07630cea 29#include "bus-dump.h"
c1b9d935 30#include "bus-gvariant.h"
c1b9d935
LP
31#include "bus-internal.h"
32#include "bus-message.h"
07630cea
LP
33#include "bus-util.h"
34#include "macro.h"
35#include "util.h"
c1b9d935
LP
36
37static void test_bus_gvariant_is_fixed_size(void) {
0c0cdb06
RC
38 assert_se(bus_gvariant_is_fixed_size("") > 0);
39 assert_se(bus_gvariant_is_fixed_size("()") > 0);
40 assert_se(bus_gvariant_is_fixed_size("y") > 0);
41 assert_se(bus_gvariant_is_fixed_size("u") > 0);
42 assert_se(bus_gvariant_is_fixed_size("b") > 0);
43 assert_se(bus_gvariant_is_fixed_size("n") > 0);
44 assert_se(bus_gvariant_is_fixed_size("q") > 0);
45 assert_se(bus_gvariant_is_fixed_size("i") > 0);
46 assert_se(bus_gvariant_is_fixed_size("t") > 0);
47 assert_se(bus_gvariant_is_fixed_size("d") > 0);
48 assert_se(bus_gvariant_is_fixed_size("s") == 0);
49 assert_se(bus_gvariant_is_fixed_size("o") == 0);
50 assert_se(bus_gvariant_is_fixed_size("g") == 0);
51 assert_se(bus_gvariant_is_fixed_size("h") > 0);
52 assert_se(bus_gvariant_is_fixed_size("ay") == 0);
53 assert_se(bus_gvariant_is_fixed_size("v") == 0);
54 assert_se(bus_gvariant_is_fixed_size("(u)") > 0);
55 assert_se(bus_gvariant_is_fixed_size("(uuuuy)") > 0);
56 assert_se(bus_gvariant_is_fixed_size("(uusuuy)") == 0);
57 assert_se(bus_gvariant_is_fixed_size("a{ss}") == 0);
58 assert_se(bus_gvariant_is_fixed_size("((u)yyy(b(iiii)))") > 0);
59 assert_se(bus_gvariant_is_fixed_size("((u)yyy(b(iiivi)))") == 0);
c1b9d935
LP
60}
61
6647dc66 62static void test_bus_gvariant_get_size(void) {
0c0cdb06 63 assert_se(bus_gvariant_get_size("") == 0);
e53d21d0 64 assert_se(bus_gvariant_get_size("()") == 1);
0c0cdb06
RC
65 assert_se(bus_gvariant_get_size("y") == 1);
66 assert_se(bus_gvariant_get_size("u") == 4);
67 assert_se(bus_gvariant_get_size("b") == 1);
68 assert_se(bus_gvariant_get_size("n") == 2);
69 assert_se(bus_gvariant_get_size("q") == 2);
70 assert_se(bus_gvariant_get_size("i") == 4);
71 assert_se(bus_gvariant_get_size("t") == 8);
72 assert_se(bus_gvariant_get_size("d") == 8);
73 assert_se(bus_gvariant_get_size("s") < 0);
74 assert_se(bus_gvariant_get_size("o") < 0);
75 assert_se(bus_gvariant_get_size("g") < 0);
76 assert_se(bus_gvariant_get_size("h") == 4);
77 assert_se(bus_gvariant_get_size("ay") < 0);
78 assert_se(bus_gvariant_get_size("v") < 0);
79 assert_se(bus_gvariant_get_size("(u)") == 4);
80 assert_se(bus_gvariant_get_size("(uuuuy)") == 20);
81 assert_se(bus_gvariant_get_size("(uusuuy)") < 0);
82 assert_se(bus_gvariant_get_size("a{ss}") < 0);
83 assert_se(bus_gvariant_get_size("((u)yyy(b(iiii)))") == 28);
84 assert_se(bus_gvariant_get_size("((u)yyy(b(iiivi)))") < 0);
85 assert_se(bus_gvariant_get_size("((b)(t))") == 16);
86 assert_se(bus_gvariant_get_size("((b)(b)(t))") == 16);
87 assert_se(bus_gvariant_get_size("(bt)") == 16);
88 assert_se(bus_gvariant_get_size("((t)(b))") == 16);
89 assert_se(bus_gvariant_get_size("(tb)") == 16);
90 assert_se(bus_gvariant_get_size("((b)(b))") == 2);
91 assert_se(bus_gvariant_get_size("((t)(t))") == 16);
6647dc66
LP
92}
93
c1b9d935 94static void test_bus_gvariant_get_alignment(void) {
0c0cdb06
RC
95 assert_se(bus_gvariant_get_alignment("") == 1);
96 assert_se(bus_gvariant_get_alignment("()") == 1);
97 assert_se(bus_gvariant_get_alignment("y") == 1);
98 assert_se(bus_gvariant_get_alignment("b") == 1);
99 assert_se(bus_gvariant_get_alignment("u") == 4);
100 assert_se(bus_gvariant_get_alignment("s") == 1);
101 assert_se(bus_gvariant_get_alignment("o") == 1);
102 assert_se(bus_gvariant_get_alignment("g") == 1);
103 assert_se(bus_gvariant_get_alignment("v") == 8);
104 assert_se(bus_gvariant_get_alignment("h") == 4);
105 assert_se(bus_gvariant_get_alignment("i") == 4);
106 assert_se(bus_gvariant_get_alignment("t") == 8);
107 assert_se(bus_gvariant_get_alignment("x") == 8);
108 assert_se(bus_gvariant_get_alignment("q") == 2);
109 assert_se(bus_gvariant_get_alignment("n") == 2);
110 assert_se(bus_gvariant_get_alignment("d") == 8);
111 assert_se(bus_gvariant_get_alignment("ay") == 1);
112 assert_se(bus_gvariant_get_alignment("as") == 1);
113 assert_se(bus_gvariant_get_alignment("au") == 4);
114 assert_se(bus_gvariant_get_alignment("an") == 2);
115 assert_se(bus_gvariant_get_alignment("ans") == 2);
116 assert_se(bus_gvariant_get_alignment("ant") == 8);
117 assert_se(bus_gvariant_get_alignment("(ss)") == 1);
118 assert_se(bus_gvariant_get_alignment("(ssu)") == 4);
119 assert_se(bus_gvariant_get_alignment("a(ssu)") == 4);
120 assert_se(bus_gvariant_get_alignment("(u)") == 4);
121 assert_se(bus_gvariant_get_alignment("(uuuuy)") == 4);
122 assert_se(bus_gvariant_get_alignment("(uusuuy)") == 4);
123 assert_se(bus_gvariant_get_alignment("a{ss}") == 1);
124 assert_se(bus_gvariant_get_alignment("((u)yyy(b(iiii)))") == 4);
125 assert_se(bus_gvariant_get_alignment("((u)yyy(b(iiivi)))") == 8);
126 assert_se(bus_gvariant_get_alignment("((b)(t))") == 8);
127 assert_se(bus_gvariant_get_alignment("((b)(b)(t))") == 8);
128 assert_se(bus_gvariant_get_alignment("(bt)") == 8);
129 assert_se(bus_gvariant_get_alignment("((t)(b))") == 8);
130 assert_se(bus_gvariant_get_alignment("(tb)") == 8);
131 assert_se(bus_gvariant_get_alignment("((b)(b))") == 1);
132 assert_se(bus_gvariant_get_alignment("((t)(t))") == 8);
c1b9d935
LP
133}
134
135static void test_marshal(void) {
6647dc66 136 _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *n = NULL;
03976f7b 137 _cleanup_bus_flush_close_unref_ sd_bus *bus = NULL;
6647dc66
LP
138 _cleanup_free_ void *blob;
139 size_t sz;
2a0958d2
LP
140 int r;
141
142 r = sd_bus_open_system(&bus);
143 if (r < 0)
144 exit(EXIT_TEST_SKIP);
c1b9d935 145
ad67ef27 146 bus->message_version = 2; /* dirty hack to enable gvariant */
c1b9d935 147
151b9b96 148 assert_se(sd_bus_message_new_method_call(bus, &m, "a.service.name", "/an/object/path/which/is/really/really/long/so/that/we/hit/the/eight/bit/boundary/by/quite/some/margin/to/test/this/stuff/that/it/really/works", "an.interface.name", "AMethodName") >= 0);
c1b9d935 149
2ac7c17f
LP
150 assert_cc(sizeof(struct bus_header) == 16);
151
c1b9d935 152 assert_se(sd_bus_message_append(m,
8f19720d 153 "a(usv)", 3,
c1b9d935 154 4711, "first-string-parameter", "(st)", "X", (uint64_t) 1111,
8f19720d
LP
155 4712, "second-string-parameter", "(a(si))", 2, "Y", 5, "Z", 6,
156 4713, "third-string-parameter", "(uu)", 1, 2) >= 0);
c1b9d935 157
3df7a7e6 158 assert_se(bus_message_seal(m, 4711, 0) >= 0);
c1b9d935
LP
159
160#ifdef HAVE_GLIB
161 {
162 GVariant *v;
163 char *t;
164
165#if !defined(GLIB_VERSION_2_36)
166 g_type_init();
167#endif
168
2ac7c17f
LP
169 v = g_variant_new_from_data(G_VARIANT_TYPE("(yyyyuta{tv})"), m->header, sizeof(struct bus_header) + m->fields_size, false, NULL, NULL);
170 assert_se(g_variant_is_normal_form(v));
c1b9d935
LP
171 t = g_variant_print(v, TRUE);
172 printf("%s\n", t);
173 g_free(t);
174 g_variant_unref(v);
175
2ac7c17f
LP
176 v = g_variant_new_from_data(G_VARIANT_TYPE("(a(usv))"), m->body.data, m->user_body_size, false, NULL, NULL);
177 assert_se(g_variant_is_normal_form(v));
c1b9d935
LP
178 t = g_variant_print(v, TRUE);
179 printf("%s\n", t);
180 g_free(t);
181 g_variant_unref(v);
182 }
183#endif
184
d55192ad 185 assert_se(bus_message_dump(m, NULL, BUS_MESSAGE_DUMP_WITH_HEADER) >= 0);
6647dc66
LP
186
187 assert_se(bus_message_get_blob(m, &blob, &sz) >= 0);
188
2ac7c17f
LP
189#ifdef HAVE_GLIB
190 {
191 GVariant *v;
192 char *t;
193
194 v = g_variant_new_from_data(G_VARIANT_TYPE("(yyyyuta{tv}v)"), blob, sz, false, NULL, NULL);
195 assert_se(g_variant_is_normal_form(v));
196 t = g_variant_print(v, TRUE);
197 printf("%s\n", t);
198 g_free(t);
199 g_variant_unref(v);
200 }
201#endif
202
aa0d0ed6 203 assert_se(bus_message_from_malloc(bus, blob, sz, NULL, 0, NULL, &n) >= 0);
6647dc66
LP
204 blob = NULL;
205
d55192ad 206 assert_se(bus_message_dump(n, NULL, BUS_MESSAGE_DUMP_WITH_HEADER) >= 0);
5877dc5a
LP
207
208 m = sd_bus_message_unref(m);
209
151b9b96 210 assert_se(sd_bus_message_new_method_call(bus, &m, "a.x", "/a/x", "a.x", "Ax") >= 0);
5877dc5a
LP
211
212 assert_se(sd_bus_message_append(m, "as", 0) >= 0);
213
3df7a7e6 214 assert_se(bus_message_seal(m, 4712, 0) >= 0);
d55192ad 215 assert_se(bus_message_dump(m, NULL, BUS_MESSAGE_DUMP_WITH_HEADER) >= 0);
c1b9d935
LP
216}
217
218int main(int argc, char *argv[]) {
219
220 test_bus_gvariant_is_fixed_size();
6647dc66 221 test_bus_gvariant_get_size();
c1b9d935
LP
222 test_bus_gvariant_get_alignment();
223 test_marshal();
224
225 return 0;
226}