X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Ftest-bus-zero-copy.c;h=92a7398a78639360d4a765cc52e9df52bd42cb2a;hp=024a0bfddf9a15014511e5bd12b31250b31071d7;hb=9bd37b40fac198fee2ff4eabc8793f1a7f2770fe;hpb=453a0c2946da620f99825d39db335e9ea9861829;ds=sidebyside diff --git a/src/libsystemd-bus/test-bus-zero-copy.c b/src/libsystemd-bus/test-bus-zero-copy.c index 024a0bfdd..92a7398a7 100644 --- a/src/libsystemd-bus/test-bus-zero-copy.c +++ b/src/libsystemd-bus/test-bus-zero-copy.c @@ -30,18 +30,28 @@ #include "bus-message.h" #include "bus-error.h" #include "bus-kernel.h" +#include "bus-dump.h" + +#define FIRST_ARRAY 17 +#define SECOND_ARRAY 33 + +#define STRING_SIZE 123 int main(int argc, char *argv[]) { _cleanup_free_ char *bus_name = NULL, *address = NULL; - void *p; + uint8_t *p; sd_bus *a, *b; int r, bus_ref; sd_bus_message *m; sd_memfd *f; + uint64_t sz; + uint32_t u32; + size_t i, l; + char *s; log_set_max_level(LOG_DEBUG); - bus_ref = bus_kernel_create("deine-mutter", &bus_name); + bus_ref = bus_kernel_create_bus("deine-mutter", &bus_name); if (bus_ref == -ENOENT) return EXIT_TEST_SKIP; @@ -71,42 +81,104 @@ int main(int argc, char *argv[]) { r = sd_bus_message_new_method_call(b, ":1.1", "/a/path", "an.inter.face", "AMethod", &m); assert_se(r >= 0); - r = sd_bus_message_open_container(m, 'r', "ayay"); + r = sd_bus_message_open_container(m, 'r', "aysay"); assert_se(r >= 0); - r = sd_bus_message_append_array_space(m, 'y', 32, &p); + r = sd_bus_message_append_array_space(m, 'y', FIRST_ARRAY, (void**) &p); assert_se(r >= 0); - memset(p, 'L', 32); + memset(p, 'L', FIRST_ARRAY); - r = sd_memfd_new_and_map(&f, 32, &p); + r = sd_memfd_new_and_map(&f, STRING_SIZE, (void**) &s); assert_se(r >= 0); - memset(p, 'P', 32); - munmap(p, 32); + for (i = 0; i < STRING_SIZE-1; i++) + s[i] = '0' + (i % 10); + + s[STRING_SIZE-1] = 0; + munmap(s, STRING_SIZE); + + r = sd_memfd_get_size(f, &sz); + assert_se(r >= 0); + assert_se(sz == STRING_SIZE); - r = sd_memfd_set_size(f, 32); + r = sd_bus_message_append_string_memfd(m, f); assert_se(r >= 0); + sd_memfd_free(f); + + r = sd_memfd_new_and_map(&f, SECOND_ARRAY, (void**) &p); + assert_se(r >= 0); + + memset(p, 'P', SECOND_ARRAY); + munmap(p, SECOND_ARRAY); + + r = sd_memfd_get_size(f, &sz); + assert_se(r >= 0); + assert_se(sz == SECOND_ARRAY); + r = sd_bus_message_append_array_memfd(m, 'y', f); assert_se(r >= 0); + sd_memfd_free(f); + r = sd_bus_message_close_container(m); assert_se(r >= 0); + r = sd_bus_message_append(m, "u", 4711); + assert_se(r >= 0); + r = bus_message_seal(m, 55); assert_se(r >= 0); - bus_message_dump(m); + bus_message_dump(m, stdout, true); r = sd_bus_send(b, m, NULL); assert_se(r >= 0); sd_bus_message_unref(m); + r = sd_bus_process(a, &m); + assert_se(r > 0); + + bus_message_dump(m, stdout, true); + sd_bus_message_rewind(m, true); + + r = sd_bus_message_enter_container(m, 'r', "aysay"); + assert_se(r > 0); + + r = sd_bus_message_read_array(m, 'y', (const void**) &p, &l); + assert_se(r > 0); + assert_se(l == FIRST_ARRAY); + + for (i = 0; i < l; i++) + assert_se(p[i] == 'L'); + + r = sd_bus_message_read(m, "s", &s); + assert_se(r > 0); + + for (i = 0; i < STRING_SIZE-1; i++) + assert_se(s[i] == (char) ('0' + (i % 10))); + assert_se(s[STRING_SIZE-1] == 0); + + r = sd_bus_message_read_array(m, 'y', (const void**) &p, &l); + assert_se(r > 0); + assert_se(l == SECOND_ARRAY); + + for (i = 0; i < l; i++) + assert_se(p[i] == 'P'); + + r = sd_bus_message_exit_container(m); + assert_se(r > 0); + + r = sd_bus_message_read(m, "u", &u32); + assert_se(r > 0); + assert_se(u32 == 4711); + + sd_bus_message_unref(m); + sd_bus_unref(a); sd_bus_unref(b); - sd_memfd_free(f); return 0; }