X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Ftest-bus-marshal.c;h=317e3a7d634613a3209d9debd3646f55db2cfc48;hp=baa269c9aa051dd1fb8118160ad64ee7fc3382e6;hb=9b55cd5665d94e2245a4ca90d2548bbcfe8c34fb;hpb=c430fee6ffda0e3736e4e2b617bef0a4c0882849 diff --git a/src/libsystemd-bus/test-bus-marshal.c b/src/libsystemd-bus/test-bus-marshal.c index baa269c9a..317e3a7d6 100644 --- a/src/libsystemd-bus/test-bus-marshal.c +++ b/src/libsystemd-bus/test-bus-marshal.c @@ -27,7 +27,9 @@ #include #endif -#include +#ifdef HAVE_DBUS +#include +#endif #include "log.h" #include "util.h" @@ -35,11 +37,35 @@ #include "sd-bus.h" #include "bus-message.h" #include "bus-util.h" +#include "bus-dump.h" + +static void test_bus_label_escape_one(const char *a, const char *b) { + _cleanup_free_ char *t = NULL, *x = NULL, *y = NULL; + + assert_se(t = sd_bus_label_escape(a)); + assert_se(streq(t, b)); + + assert_se(x = sd_bus_label_unescape(t)); + assert_se(streq(a, x)); + + assert_se(y = sd_bus_label_unescape(b)); + assert_se(streq(a, y)); +} + +static void test_bus_label_escape(void) { + test_bus_label_escape_one("foo123bar", "foo123bar"); + test_bus_label_escape_one("foo.bar", "foo_2ebar"); + test_bus_label_escape_one("foo_2ebar", "foo_5f2ebar"); + test_bus_label_escape_one("", "_"); + test_bus_label_escape_one("_", "_5f"); + test_bus_label_escape_one("1", "_31"); + test_bus_label_escape_one(":1", "_3a1"); +} int main(int argc, char *argv[]) { _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *copy = NULL; int r, boolean; - const char *x, *y, *z, *a, *b, *c, *d; + const char *x, *x2, *y, *z, *a, *b, *c, *d; uint8_t u, v; void *buffer = NULL; size_t sz; @@ -57,7 +83,7 @@ int main(int argc, char *argv[]) { assert_se(r >= 0); r = sd_bus_message_append(m, "s", NULL); - assert_se(r < 0); + assert_se(r >= 0); r = sd_bus_message_append(m, "as", 2, "string #1", "string #2"); assert_se(r >= 0); @@ -90,7 +116,10 @@ int main(int argc, char *argv[]) { r = sd_bus_message_append_array(m, 'i', integer_array, sizeof(integer_array)); assert_se(r >= 0); - r = bus_message_seal(m, 4711); + r = sd_bus_message_append_array(m, 'u', NULL, 0); + assert_se(r >= 0); + + r = bus_message_seal(m, 4711, 0); assert_se(r >= 0); bus_message_dump(m, stdout, true); @@ -126,6 +155,7 @@ int main(int argc, char *argv[]) { } #endif +#ifdef HAVE_DBUS { DBusMessage *w; DBusError error; @@ -133,15 +163,16 @@ int main(int argc, char *argv[]) { dbus_error_init(&error); w = dbus_message_demarshal(buffer, sz, &error); - if (!w) { + if (!w) log_error("%s", error.message); - } else + else dbus_message_unref(w); } +#endif m = sd_bus_message_unref(m); - r = bus_message_from_malloc(buffer, sz, NULL, 0, NULL, NULL, &m); + r = bus_message_from_malloc(NULL, buffer, sz, NULL, 0, NULL, NULL, &m); assert_se(r >= 0); bus_message_dump(m, stdout, true); @@ -156,9 +187,10 @@ int main(int argc, char *argv[]) { assert_se(sd_bus_message_rewind(m, true) >= 0); - r = sd_bus_message_read(m, "sas", &x, 2, &y, &z); + r = sd_bus_message_read(m, "ssas", &x, &x2, 2, &y, &z); assert_se(r > 0); assert_se(streq(x, "a string")); + assert_se(streq(x2, "")); assert_se(streq(y, "string #1")); assert_se(streq(z, "string #2")); @@ -205,6 +237,10 @@ int main(int argc, char *argv[]) { assert_se(sz == sizeof(integer_array)); assert_se(memcmp(integer_array, return_array, sz) == 0); + r = sd_bus_message_read_array(m, 'u', (const void**) &return_array, &sz); + assert_se(r > 0); + assert_se(sz == 0); + r = sd_bus_message_peek_type(m, NULL, NULL); assert_se(r == 0); @@ -217,7 +253,7 @@ int main(int argc, char *argv[]) { r = sd_bus_message_copy(copy, m, true); assert_se(r >= 0); - r = bus_message_seal(copy, 4712); + r = bus_message_seal(copy, 4712, 0); assert_se(r >= 0); fclose(ms); @@ -226,11 +262,62 @@ int main(int argc, char *argv[]) { fflush(ms); assert_se(!ferror(ms)); - printf("<%.*s>", (int) first_size, first); - printf("<%.*s>", (int) third_size, third); + printf("<%.*s>\n", (int) first_size, first); + printf("<%.*s>\n", (int) third_size, third); assert_se(first_size == third_size); assert_se(memcmp(first, third, third_size) == 0); + r = sd_bus_message_rewind(m, true); + assert_se(r >= 0); + + assert_se(sd_bus_message_verify_type(m, 's', NULL) > 0); + + r = sd_bus_message_skip(m, "ssas"); + assert_se(r > 0); + + assert_se(sd_bus_message_verify_type(m, 's', NULL) > 0); + + r = sd_bus_message_skip(m, "sass"); + assert_se(r >= 0); + + assert_se(sd_bus_message_verify_type(m, 'a', "{yv}") > 0); + + r = sd_bus_message_skip(m, "a{yv}"); + assert_se(r >= 0); + + assert_se(sd_bus_message_verify_type(m, 'b', NULL) > 0); + + r = sd_bus_message_read(m, "b", &boolean); + assert_se(r > 0); + assert_se(boolean); + + r = sd_bus_message_enter_container(m, 0, NULL); + assert_se(r > 0); + + r = sd_bus_message_read(m, "(ss)", &x, &y); + assert_se(r > 0); + + r = sd_bus_message_read(m, "(ss)", &a, &b); + assert_se(r > 0); + + r = sd_bus_message_read(m, "(ss)", &c, &d); + assert_se(r > 0); + + r = sd_bus_message_read(m, "(ss)", &x, &y); + assert_se(r == 0); + + r = sd_bus_message_exit_container(m); + assert_se(r >= 0); + + assert_se(streq(x, "aaa")); + assert_se(streq(y, "1")); + assert_se(streq(a, "bbb")); + assert_se(streq(b, "2")); + assert_se(streq(c, "ccc")); + assert_se(streq(d, "3")); + + test_bus_label_escape(); + return 0; }