]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
c1b9d935 | 2 | |
349cc4a5 | 3 | #if HAVE_GLIB |
c1b9d935 LP |
4 | #include <glib.h> |
5 | #endif | |
6 | ||
c1b9d935 | 7 | #include "sd-bus.h" |
07630cea | 8 | |
b5efdb8a | 9 | #include "alloc-util.h" |
07630cea | 10 | #include "bus-dump.h" |
c1b9d935 | 11 | #include "bus-gvariant.h" |
c1b9d935 LP |
12 | #include "bus-internal.h" |
13 | #include "bus-message.h" | |
07630cea | 14 | #include "macro.h" |
6d7c4033 | 15 | #include "tests.h" |
07630cea | 16 | #include "util.h" |
c1b9d935 LP |
17 | |
18 | static void test_bus_gvariant_is_fixed_size(void) { | |
10a7ec96 ZJS |
19 | log_info("/* %s */", __func__); |
20 | ||
0c0cdb06 | 21 | assert_se(bus_gvariant_is_fixed_size("") > 0); |
ec6bda56 | 22 | assert_se(bus_gvariant_is_fixed_size("()") == -EINVAL); |
0c0cdb06 RC |
23 | assert_se(bus_gvariant_is_fixed_size("y") > 0); |
24 | assert_se(bus_gvariant_is_fixed_size("u") > 0); | |
25 | assert_se(bus_gvariant_is_fixed_size("b") > 0); | |
26 | assert_se(bus_gvariant_is_fixed_size("n") > 0); | |
27 | assert_se(bus_gvariant_is_fixed_size("q") > 0); | |
28 | assert_se(bus_gvariant_is_fixed_size("i") > 0); | |
29 | assert_se(bus_gvariant_is_fixed_size("t") > 0); | |
30 | assert_se(bus_gvariant_is_fixed_size("d") > 0); | |
31 | assert_se(bus_gvariant_is_fixed_size("s") == 0); | |
32 | assert_se(bus_gvariant_is_fixed_size("o") == 0); | |
33 | assert_se(bus_gvariant_is_fixed_size("g") == 0); | |
34 | assert_se(bus_gvariant_is_fixed_size("h") > 0); | |
35 | assert_se(bus_gvariant_is_fixed_size("ay") == 0); | |
36 | assert_se(bus_gvariant_is_fixed_size("v") == 0); | |
37 | assert_se(bus_gvariant_is_fixed_size("(u)") > 0); | |
38 | assert_se(bus_gvariant_is_fixed_size("(uuuuy)") > 0); | |
39 | assert_se(bus_gvariant_is_fixed_size("(uusuuy)") == 0); | |
40 | assert_se(bus_gvariant_is_fixed_size("a{ss}") == 0); | |
41 | assert_se(bus_gvariant_is_fixed_size("((u)yyy(b(iiii)))") > 0); | |
42 | assert_se(bus_gvariant_is_fixed_size("((u)yyy(b(iiivi)))") == 0); | |
c1b9d935 LP |
43 | } |
44 | ||
6647dc66 | 45 | static void test_bus_gvariant_get_size(void) { |
10a7ec96 ZJS |
46 | log_info("/* %s */", __func__); |
47 | ||
0c0cdb06 | 48 | assert_se(bus_gvariant_get_size("") == 0); |
ec6bda56 | 49 | assert_se(bus_gvariant_get_size("()") == -EINVAL); |
0c0cdb06 RC |
50 | assert_se(bus_gvariant_get_size("y") == 1); |
51 | assert_se(bus_gvariant_get_size("u") == 4); | |
52 | assert_se(bus_gvariant_get_size("b") == 1); | |
53 | assert_se(bus_gvariant_get_size("n") == 2); | |
54 | assert_se(bus_gvariant_get_size("q") == 2); | |
55 | assert_se(bus_gvariant_get_size("i") == 4); | |
56 | assert_se(bus_gvariant_get_size("t") == 8); | |
57 | assert_se(bus_gvariant_get_size("d") == 8); | |
58 | assert_se(bus_gvariant_get_size("s") < 0); | |
59 | assert_se(bus_gvariant_get_size("o") < 0); | |
60 | assert_se(bus_gvariant_get_size("g") < 0); | |
61 | assert_se(bus_gvariant_get_size("h") == 4); | |
62 | assert_se(bus_gvariant_get_size("ay") < 0); | |
63 | assert_se(bus_gvariant_get_size("v") < 0); | |
64 | assert_se(bus_gvariant_get_size("(u)") == 4); | |
65 | assert_se(bus_gvariant_get_size("(uuuuy)") == 20); | |
66 | assert_se(bus_gvariant_get_size("(uusuuy)") < 0); | |
67 | assert_se(bus_gvariant_get_size("a{ss}") < 0); | |
68 | assert_se(bus_gvariant_get_size("((u)yyy(b(iiii)))") == 28); | |
69 | assert_se(bus_gvariant_get_size("((u)yyy(b(iiivi)))") < 0); | |
70 | assert_se(bus_gvariant_get_size("((b)(t))") == 16); | |
71 | assert_se(bus_gvariant_get_size("((b)(b)(t))") == 16); | |
72 | assert_se(bus_gvariant_get_size("(bt)") == 16); | |
73 | assert_se(bus_gvariant_get_size("((t)(b))") == 16); | |
74 | assert_se(bus_gvariant_get_size("(tb)") == 16); | |
75 | assert_se(bus_gvariant_get_size("((b)(b))") == 2); | |
76 | assert_se(bus_gvariant_get_size("((t)(t))") == 16); | |
6647dc66 LP |
77 | } |
78 | ||
c1b9d935 | 79 | static void test_bus_gvariant_get_alignment(void) { |
10a7ec96 ZJS |
80 | log_info("/* %s */", __func__); |
81 | ||
0c0cdb06 | 82 | assert_se(bus_gvariant_get_alignment("") == 1); |
ec6bda56 | 83 | assert_se(bus_gvariant_get_alignment("()") == -EINVAL); |
0c0cdb06 RC |
84 | assert_se(bus_gvariant_get_alignment("y") == 1); |
85 | assert_se(bus_gvariant_get_alignment("b") == 1); | |
86 | assert_se(bus_gvariant_get_alignment("u") == 4); | |
87 | assert_se(bus_gvariant_get_alignment("s") == 1); | |
88 | assert_se(bus_gvariant_get_alignment("o") == 1); | |
89 | assert_se(bus_gvariant_get_alignment("g") == 1); | |
90 | assert_se(bus_gvariant_get_alignment("v") == 8); | |
91 | assert_se(bus_gvariant_get_alignment("h") == 4); | |
92 | assert_se(bus_gvariant_get_alignment("i") == 4); | |
93 | assert_se(bus_gvariant_get_alignment("t") == 8); | |
94 | assert_se(bus_gvariant_get_alignment("x") == 8); | |
95 | assert_se(bus_gvariant_get_alignment("q") == 2); | |
96 | assert_se(bus_gvariant_get_alignment("n") == 2); | |
97 | assert_se(bus_gvariant_get_alignment("d") == 8); | |
98 | assert_se(bus_gvariant_get_alignment("ay") == 1); | |
99 | assert_se(bus_gvariant_get_alignment("as") == 1); | |
100 | assert_se(bus_gvariant_get_alignment("au") == 4); | |
101 | assert_se(bus_gvariant_get_alignment("an") == 2); | |
102 | assert_se(bus_gvariant_get_alignment("ans") == 2); | |
103 | assert_se(bus_gvariant_get_alignment("ant") == 8); | |
104 | assert_se(bus_gvariant_get_alignment("(ss)") == 1); | |
105 | assert_se(bus_gvariant_get_alignment("(ssu)") == 4); | |
106 | assert_se(bus_gvariant_get_alignment("a(ssu)") == 4); | |
107 | assert_se(bus_gvariant_get_alignment("(u)") == 4); | |
108 | assert_se(bus_gvariant_get_alignment("(uuuuy)") == 4); | |
109 | assert_se(bus_gvariant_get_alignment("(uusuuy)") == 4); | |
110 | assert_se(bus_gvariant_get_alignment("a{ss}") == 1); | |
111 | assert_se(bus_gvariant_get_alignment("((u)yyy(b(iiii)))") == 4); | |
112 | assert_se(bus_gvariant_get_alignment("((u)yyy(b(iiivi)))") == 8); | |
113 | assert_se(bus_gvariant_get_alignment("((b)(t))") == 8); | |
114 | assert_se(bus_gvariant_get_alignment("((b)(b)(t))") == 8); | |
115 | assert_se(bus_gvariant_get_alignment("(bt)") == 8); | |
116 | assert_se(bus_gvariant_get_alignment("((t)(b))") == 8); | |
117 | assert_se(bus_gvariant_get_alignment("(tb)") == 8); | |
118 | assert_se(bus_gvariant_get_alignment("((b)(b))") == 1); | |
119 | assert_se(bus_gvariant_get_alignment("((t)(t))") == 8); | |
c1b9d935 LP |
120 | } |
121 | ||
730d989a | 122 | static int test_marshal(void) { |
4afd3348 LP |
123 | _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *n = NULL; |
124 | _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; | |
730d989a | 125 | _cleanup_free_ void *blob = NULL; |
6647dc66 | 126 | size_t sz; |
2a0958d2 LP |
127 | int r; |
128 | ||
6349cda2 | 129 | r = sd_bus_open_user(&bus); |
f9c8c01f YW |
130 | if (r < 0) |
131 | r = sd_bus_open_system(&bus); | |
730d989a ZJS |
132 | if (r < 0) |
133 | return log_tests_skipped_errno(r, "Failed to connect to bus"); | |
c1b9d935 | 134 | |
ad67ef27 | 135 | bus->message_version = 2; /* dirty hack to enable gvariant */ |
c1b9d935 | 136 | |
10a7ec96 ZJS |
137 | r = sd_bus_message_new_method_call(bus, &m, "a.service.name", |
138 | "/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", | |
139 | "an.interface.name", "AMethodName"); | |
140 | assert_se(r >= 0); | |
c1b9d935 | 141 | |
2ac7c17f LP |
142 | assert_cc(sizeof(struct bus_header) == 16); |
143 | ||
c1b9d935 | 144 | assert_se(sd_bus_message_append(m, |
8f19720d | 145 | "a(usv)", 3, |
c1b9d935 | 146 | 4711, "first-string-parameter", "(st)", "X", (uint64_t) 1111, |
8f19720d LP |
147 | 4712, "second-string-parameter", "(a(si))", 2, "Y", 5, "Z", 6, |
148 | 4713, "third-string-parameter", "(uu)", 1, 2) >= 0); | |
c1b9d935 | 149 | |
75bcbcf2 | 150 | assert_se(sd_bus_message_seal(m, 4711, 0) >= 0); |
c1b9d935 | 151 | |
349cc4a5 | 152 | #if HAVE_GLIB |
c1b9d935 LP |
153 | { |
154 | GVariant *v; | |
155 | char *t; | |
156 | ||
157 | #if !defined(GLIB_VERSION_2_36) | |
158 | g_type_init(); | |
159 | #endif | |
160 | ||
2ac7c17f LP |
161 | v = g_variant_new_from_data(G_VARIANT_TYPE("(yyyyuta{tv})"), m->header, sizeof(struct bus_header) + m->fields_size, false, NULL, NULL); |
162 | assert_se(g_variant_is_normal_form(v)); | |
c1b9d935 LP |
163 | t = g_variant_print(v, TRUE); |
164 | printf("%s\n", t); | |
165 | g_free(t); | |
166 | g_variant_unref(v); | |
167 | ||
2ac7c17f LP |
168 | v = g_variant_new_from_data(G_VARIANT_TYPE("(a(usv))"), m->body.data, m->user_body_size, false, NULL, NULL); |
169 | assert_se(g_variant_is_normal_form(v)); | |
c1b9d935 LP |
170 | t = g_variant_print(v, TRUE); |
171 | printf("%s\n", t); | |
172 | g_free(t); | |
173 | g_variant_unref(v); | |
174 | } | |
175 | #endif | |
176 | ||
2b4a65b6 | 177 | assert_se(sd_bus_message_dump(m, NULL, SD_BUS_MESSAGE_DUMP_WITH_HEADER) >= 0); |
6647dc66 LP |
178 | |
179 | assert_se(bus_message_get_blob(m, &blob, &sz) >= 0); | |
180 | ||
349cc4a5 | 181 | #if HAVE_GLIB |
2ac7c17f LP |
182 | { |
183 | GVariant *v; | |
184 | char *t; | |
185 | ||
186 | v = g_variant_new_from_data(G_VARIANT_TYPE("(yyyyuta{tv}v)"), blob, sz, false, NULL, NULL); | |
187 | assert_se(g_variant_is_normal_form(v)); | |
188 | t = g_variant_print(v, TRUE); | |
189 | printf("%s\n", t); | |
190 | g_free(t); | |
191 | g_variant_unref(v); | |
192 | } | |
193 | #endif | |
194 | ||
aa0d0ed6 | 195 | assert_se(bus_message_from_malloc(bus, blob, sz, NULL, 0, NULL, &n) >= 0); |
6647dc66 LP |
196 | blob = NULL; |
197 | ||
2b4a65b6 | 198 | assert_se(sd_bus_message_dump(n, NULL, SD_BUS_MESSAGE_DUMP_WITH_HEADER) >= 0); |
5877dc5a LP |
199 | |
200 | m = sd_bus_message_unref(m); | |
201 | ||
151b9b96 | 202 | assert_se(sd_bus_message_new_method_call(bus, &m, "a.x", "/a/x", "a.x", "Ax") >= 0); |
5877dc5a LP |
203 | |
204 | assert_se(sd_bus_message_append(m, "as", 0) >= 0); | |
205 | ||
75bcbcf2 | 206 | assert_se(sd_bus_message_seal(m, 4712, 0) >= 0); |
2b4a65b6 | 207 | assert_se(sd_bus_message_dump(m, NULL, SD_BUS_MESSAGE_DUMP_WITH_HEADER) >= 0); |
730d989a ZJS |
208 | |
209 | return EXIT_SUCCESS; | |
c1b9d935 LP |
210 | } |
211 | ||
212 | int main(int argc, char *argv[]) { | |
10a7ec96 | 213 | test_setup_logging(LOG_DEBUG); |
c1b9d935 LP |
214 | |
215 | test_bus_gvariant_is_fixed_size(); | |
6647dc66 | 216 | test_bus_gvariant_get_size(); |
c1b9d935 | 217 | test_bus_gvariant_get_alignment(); |
c1b9d935 | 218 | |
730d989a | 219 | return test_marshal(); |
c1b9d935 | 220 | } |