]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-bus-{vtable,introspect}: share data and test introspect_path()
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 19 Apr 2019 11:30:09 +0000 (13:30 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 23 Apr 2019 20:58:26 +0000 (22:58 +0200)
test-bus-introspect is also applied to the tables from test-bus-vtable.c.

test-bus-vtable.c is also used as C++ sources to produce test-bus-vtable-cc,
and our hashmap headers are not C++ compatible. So let's do the introspection
part only in the C version.

src/libsystemd/sd-bus/bus-objects.c
src/libsystemd/sd-bus/bus-objects.h
src/libsystemd/sd-bus/test-bus-introspect.c
src/libsystemd/sd-bus/test-bus-vtable.c
src/libsystemd/sd-bus/test-vtable-data.h [new file with mode: 0644]
src/test/meson.build

index 22db75479ce8b122f593ad3a2586ce51c539cf75..6ed7cc4860e98106f8e8a9520c4847a5a9ce16a6 100644 (file)
@@ -888,6 +888,7 @@ int introspect_path(
                 const char *path,
                 struct node *n,
                 bool require_fallback,
+                bool ignore_nodes_modified,
                 bool *found_object,
                 char **ret,
                 sd_bus_error *error) {
@@ -899,10 +900,16 @@ int introspect_path(
         bool empty;
         int r;
 
+        if (!n) {
+                n = hashmap_get(bus->nodes, path);
+                if (!n)
+                        return -ENOENT;
+        }
+
         r = get_child_nodes(bus, path, n, 0, &s, error);
         if (r < 0)
                 return r;
-        if (bus->nodes_modified)
+        if (bus->nodes_modified && !ignore_nodes_modified)
                 return 0;
 
         r = introspect_begin(&intro, bus->trusted);
@@ -922,7 +929,7 @@ int introspect_path(
                 r = node_vtable_get_userdata(bus, path, c, NULL, error);
                 if (r < 0)
                         return r;
-                if (bus->nodes_modified)
+                if (bus->nodes_modified && !ignore_nodes_modified)
                         return 0;
                 if (r == 0)
                         continue;
@@ -955,11 +962,12 @@ int introspect_path(
                 r = bus_node_exists(bus, n, path, require_fallback);
                 if (r <= 0)
                         return r;
-                if (bus->nodes_modified)
+                if (bus->nodes_modified && !ignore_nodes_modified)
                         return 0;
         }
 
-        *found_object = true;
+        if (found_object)
+                *found_object = true;
 
         r = introspect_write_child_nodes(&intro, s, path);
         if (r < 0)
@@ -989,7 +997,7 @@ static int process_introspect(
         assert(n);
         assert(found_object);
 
-        r = introspect_path(bus, m->path, n, require_fallback, found_object, &s, &error);
+        r = introspect_path(bus, m->path, n, require_fallback, false, found_object, &s, &error);
         if (r < 0)
                 return bus_maybe_reply_error(m, r, &error);
         if (r == 0)
index 7f38853da1c3998f97024472059efab7afee8a37..f650196a5439949f2bdc3a6dfdfa038ea91f8c4e 100644 (file)
@@ -14,6 +14,7 @@ int introspect_path(
                 const char *path,
                 struct node *n,
                 bool require_fallback,
+                bool ignore_nodes_modified,
                 bool *found_object,
                 char **ret,
                 sd_bus_error *error);
index 797b19f9f18e94279b21f5b6512ffa3a1ce3550e..9c8d1434b139565c8888e77832d2f6a58ae8bdcb 100644 (file)
@@ -4,33 +4,14 @@
 #include "log.h"
 #include "tests.h"
 
-static int prop_get(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
-        return -EINVAL;
-}
-
-static int prop_set(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
-        return -EINVAL;
-}
+#include "test-vtable-data.h"
 
-static const sd_bus_vtable vtable[] = {
-        SD_BUS_VTABLE_START(0),
-        SD_BUS_METHOD("Hello", "ssas", "a(uu)", NULL, 0),
-        SD_BUS_METHOD("DeprecatedHello", "", "", NULL, SD_BUS_VTABLE_DEPRECATED),
-        SD_BUS_METHOD("DeprecatedHelloNoReply", "", "", NULL, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_METHOD_NO_REPLY),
-        SD_BUS_SIGNAL("Wowza", "sss", 0),
-        SD_BUS_SIGNAL("DeprecatedWowza", "ut", SD_BUS_VTABLE_DEPRECATED),
-        SD_BUS_WRITABLE_PROPERTY("AProperty", "s", prop_get, prop_set, 0, 0),
-        SD_BUS_PROPERTY("AReadOnlyDeprecatedProperty", "(ut)", prop_get, 0, SD_BUS_VTABLE_DEPRECATED),
-        SD_BUS_PROPERTY("ChangingProperty", "t", prop_get, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-        SD_BUS_PROPERTY("Invalidating", "t", prop_get, 0, SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
-        SD_BUS_PROPERTY("Constant", "t", prop_get, 0, SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_PROPERTY_EXPLICIT),
-        SD_BUS_VTABLE_END
-};
-
-static void test_manual_introspection(void) {
+static void test_manual_introspection(const sd_bus_vtable vtable[]) {
         struct introspect intro = {};
         _cleanup_free_ char *s = NULL;
 
+        log_info("/* %s */", __func__);
+
         assert_se(introspect_begin(&intro, false) >= 0);
 
         fprintf(intro.f, " <interface name=\"org.foo\">\n");
@@ -39,12 +20,16 @@ static void test_manual_introspection(void) {
 
         assert_se(introspect_finish(&intro, &s) == 0);
         fputs(s, stdout);
+        fputs("\n", stdout);
 }
 
 int main(int argc, char *argv[]) {
         test_setup_logging(LOG_DEBUG);
 
-        test_manual_introspection();
+        test_manual_introspection(test_vtable_1);
+        test_manual_introspection(test_vtable_2);
+        test_manual_introspection(test_vtable_deprecated);
+        test_manual_introspection((const sd_bus_vtable *) vtable_format_221);
 
         return 0;
 }
index 582b050feabfecdd6ef16a56b3611aca247a7705..d69ca6ac9742179b450c4a755f3dfe203c15f15e 100644 (file)
@@ -1,3 +1,5 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
 #include <stdbool.h>
 #include <stddef.h>
 
 #undef NDEBUG
 #include <assert.h>
 #include <errno.h>
+#include <stdio.h>
 
 #include "sd-bus-vtable.h"
 
-#define DEFAULT_BUS_PATH "unix:path=/run/dbus/system_bus_socket"
-
-struct context {
-        bool quit;
-        char *something;
-        char *automatic_string_property;
-        uint32_t automatic_integer_property;
-};
-
-static int handler(sd_bus_message *m, void *userdata, sd_bus_error *error) {
-        return 1;
-}
-
-static int value_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
-        return 1;
-}
+#ifndef __cplusplus
+#  include "bus-objects.h"
+#endif
 
-static int get_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
-        return 1;
-}
+#include "test-vtable-data.h"
 
-static int set_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *error) {
-        return 1;
-}
-
-static const sd_bus_vtable vtable[] = {
-        SD_BUS_VTABLE_START(0),
-        SD_BUS_METHOD("AlterSomething", "s", "s", handler, 0),
-        SD_BUS_METHOD("Exit", "", "", handler, 0),
-        SD_BUS_METHOD_WITH_OFFSET("AlterSomething2", "s", "s", handler, 200, 0),
-        SD_BUS_METHOD_WITH_OFFSET("Exit2", "", "", handler, 200, 0),
-        SD_BUS_METHOD_WITH_NAMES_OFFSET("AlterSomething3", "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path),
-                        "s", SD_BUS_PARAM(returnstring), handler, 200, 0),
-        SD_BUS_METHOD_WITH_NAMES("Exit3", "bx", SD_BUS_PARAM(with_confirmation) SD_BUS_PARAM(after_msec),
-                        "bb", SD_BUS_PARAM(accepted) SD_BUS_PARAM(scheduled), handler, 0),
-        SD_BUS_PROPERTY("Value", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-        SD_BUS_PROPERTY("Value2", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
-        SD_BUS_PROPERTY("Value3", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("Value4", "s", value_handler, 10, 0),
-        SD_BUS_PROPERTY("AnExplicitProperty", "s", NULL, offsetof(struct context, something),
-                        SD_BUS_VTABLE_PROPERTY_EXPLICIT|SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
-        SD_BUS_WRITABLE_PROPERTY("Something", "s", get_handler, set_handler, 0, 0),
-        SD_BUS_WRITABLE_PROPERTY("AutomaticStringProperty", "s", NULL, NULL,
-                                 offsetof(struct context, automatic_string_property), 0),
-        SD_BUS_WRITABLE_PROPERTY("AutomaticIntegerProperty", "u", NULL, NULL,
-                                 offsetof(struct context, automatic_integer_property), 0),
-        SD_BUS_METHOD("NoOperation", NULL, NULL, NULL, 0),
-        SD_BUS_SIGNAL("DummySignal", "b", 0),
-        SD_BUS_SIGNAL("DummySignal2", "so", 0),
-        SD_BUS_SIGNAL_WITH_NAMES("DummySignal3", "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path), 0),
-        SD_BUS_VTABLE_END
-};
-
-struct sd_bus_vtable_221 {
-        uint8_t type:8;
-        uint64_t flags:56;
-        union {
-                struct {
-                        size_t element_size;
-                } start;
-                struct {
-                        const char *member;
-                        const char *signature;
-                        const char *result;
-                        sd_bus_message_handler_t handler;
-                        size_t offset;
-                } method;
-                struct {
-                        const char *member;
-                        const char *signature;
-                } signal;
-                struct {
-                        const char *member;
-                        const char *signature;
-                        sd_bus_property_get_t get;
-                        sd_bus_property_set_t set;
-                        size_t offset;
-                } property;
-        } x;
-};
-
-static const struct sd_bus_vtable_221 vtable_format_221[] = {
-        {
-                .type = _SD_BUS_VTABLE_START,
-                .flags = 0,
-                .x = {
-                        .start = {
-                                .element_size = sizeof(struct sd_bus_vtable_221)
-                        },
-                },
-        },
-        {
-                .type = _SD_BUS_VTABLE_METHOD,
-                .flags = 0,
-                .x = {
-                        .method = {
-                                .member = "Exit",
-                                .signature = "",
-                                .result = "",
-                                .handler = handler,
-                                .offset = 0,
-                        },
-                },
-        },
-        {
-                .type = _SD_BUS_VTABLE_END,
-                .flags = 0,
-                .x = { { 0 } },
-        }
-};
+#define DEFAULT_BUS_PATH "unix:path=/run/dbus/system_bus_socket"
 
 static void test_vtable(void) {
         sd_bus *bus = NULL;
@@ -126,16 +26,24 @@ static void test_vtable(void) {
 
         assert(sd_bus_new(&bus) >= 0);
 
-        assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable", vtable, &c) >= 0);
-        assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable2", vtable, &c) >= 0);
+        assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable", test_vtable_2, &c) >= 0);
+        assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable2", test_vtable_2, &c) >= 0);
         /* the cast on the line below is needed to test with the old version of the table */
-        assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable221", (const sd_bus_vtable *)vtable_format_221, &c) >= 0);
+        assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable221",
+                                        (const sd_bus_vtable *)vtable_format_221, &c) >= 0);
 
         assert(sd_bus_set_address(bus, DEFAULT_BUS_PATH) >= 0);
         r = sd_bus_start(bus);
         assert(r == 0 ||     /* success */
                r == -ENOENT  /* dbus is inactive */ );
 
+#ifndef __cplusplus
+        _cleanup_free_ char *s = NULL;
+
+        assert_se(introspect_path(bus, "/foo", NULL, false, true, NULL, &s, NULL) == 1);
+        fputs(s, stdout);
+#endif
+
         sd_bus_unref(bus);
 }
 
diff --git a/src/libsystemd/sd-bus/test-vtable-data.h b/src/libsystemd/sd-bus/test-vtable-data.h
new file mode 100644 (file)
index 0000000..333dbd5
--- /dev/null
@@ -0,0 +1,132 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+/* This is meant to be included in other files, hence no headers */
+
+struct context {
+        bool quit;
+        char *something;
+        char *automatic_string_property;
+        uint32_t automatic_integer_property;
+};
+
+static int handler(sd_bus_message *m, void *userdata, sd_bus_error *error) {
+        return 1;
+}
+
+static int value_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
+        return 1;
+}
+
+static int get_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
+        return 1;
+}
+
+static int set_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *error) {
+        return 1;
+}
+
+static const sd_bus_vtable test_vtable_1[] = {
+        SD_BUS_VTABLE_START(0),
+        SD_BUS_METHOD("Hello", "ssas", "a(uu)", NULL, 0),
+        SD_BUS_METHOD("DeprecatedHello", "", "", NULL, SD_BUS_VTABLE_DEPRECATED),
+        SD_BUS_METHOD("DeprecatedHelloNoReply", "", "", NULL, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_METHOD_NO_REPLY),
+        SD_BUS_SIGNAL("Wowza", "sss", 0),
+        SD_BUS_SIGNAL("DeprecatedWowza", "ut", SD_BUS_VTABLE_DEPRECATED),
+        SD_BUS_WRITABLE_PROPERTY("AProperty", "s", get_handler, set_handler, 0, 0),
+        SD_BUS_PROPERTY("AReadOnlyDeprecatedProperty", "(ut)", get_handler, 0, SD_BUS_VTABLE_DEPRECATED),
+        SD_BUS_PROPERTY("ChangingProperty", "t", get_handler, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("Invalidating", "t", get_handler, 0, SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
+        SD_BUS_PROPERTY("Constant", "t", get_handler, 0, SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_PROPERTY_EXPLICIT),
+        SD_BUS_VTABLE_END
+};
+
+static const sd_bus_vtable test_vtable_2[] = {
+        SD_BUS_VTABLE_START(0),
+        SD_BUS_METHOD("AlterSomething", "s", "s", handler, 0),
+        SD_BUS_METHOD("Exit", "", "", handler, 0),
+        SD_BUS_METHOD_WITH_OFFSET("AlterSomething2", "s", "s", handler, 200, 0),
+        SD_BUS_METHOD_WITH_OFFSET("Exit2", "", "", handler, 200, 0),
+        SD_BUS_METHOD_WITH_NAMES_OFFSET("AlterSomething3", "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path),
+                        "s", SD_BUS_PARAM(returnstring), handler, 200, 0),
+        SD_BUS_METHOD_WITH_NAMES("Exit3", "bx", SD_BUS_PARAM(with_confirmation) SD_BUS_PARAM(after_msec),
+                        "bb", SD_BUS_PARAM(accepted) SD_BUS_PARAM(scheduled), handler, 0),
+        SD_BUS_PROPERTY("Value", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("Value2", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
+        SD_BUS_PROPERTY("Value3", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("Value4", "s", value_handler, 10, 0),
+        SD_BUS_PROPERTY("AnExplicitProperty", "s", NULL, offsetof(struct context, something),
+                        SD_BUS_VTABLE_PROPERTY_EXPLICIT|SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
+        SD_BUS_WRITABLE_PROPERTY("Something", "s", get_handler, set_handler, 0, 0),
+        SD_BUS_WRITABLE_PROPERTY("AutomaticStringProperty", "s", NULL, NULL,
+                                 offsetof(struct context, automatic_string_property), 0),
+        SD_BUS_WRITABLE_PROPERTY("AutomaticIntegerProperty", "u", NULL, NULL,
+                                 offsetof(struct context, automatic_integer_property), 0),
+        SD_BUS_METHOD("NoOperation", NULL, NULL, NULL, 0),
+        SD_BUS_SIGNAL("DummySignal", "b", 0),
+        SD_BUS_SIGNAL("DummySignal2", "so", 0),
+        SD_BUS_SIGNAL_WITH_NAMES("DummySignal3", "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path), 0),
+        SD_BUS_VTABLE_END
+};
+
+static const sd_bus_vtable test_vtable_deprecated[] = {
+        SD_BUS_VTABLE_START(SD_BUS_VTABLE_DEPRECATED),
+        SD_BUS_VTABLE_END
+};
+
+struct sd_bus_vtable_221 {
+        uint8_t type:8;
+        uint64_t flags:56;
+        union {
+                struct {
+                        size_t element_size;
+                } start;
+                struct {
+                        const char *member;
+                        const char *signature;
+                        const char *result;
+                        sd_bus_message_handler_t handler;
+                        size_t offset;
+                } method;
+                struct {
+                        const char *member;
+                        const char *signature;
+                } signal;
+                struct {
+                        const char *member;
+                        const char *signature;
+                        sd_bus_property_get_t get;
+                        sd_bus_property_set_t set;
+                        size_t offset;
+                } property;
+        } x;
+};
+
+static const struct sd_bus_vtable_221 vtable_format_221[] = {
+        {
+                .type = _SD_BUS_VTABLE_START,
+                .flags = 0,
+                .x = {
+                        .start = {
+                                .element_size = sizeof(struct sd_bus_vtable_221)
+                        },
+                },
+        },
+        {
+                .type = _SD_BUS_VTABLE_METHOD,
+                .flags = 0,
+                .x = {
+                        .method = {
+                                .member = "Exit",
+                                .signature = "",
+                                .result = "",
+                                .handler = handler,
+                                .offset = 0,
+                        },
+                },
+        },
+        {
+                .type = _SD_BUS_VTABLE_END,
+                .flags = 0,
+                .x = { { 0 } },
+        }
+};
index 521985b927e4fffa82a4acd396f14fb766575a2f..e58e1cc73d3f90729f0b1ae7e7f8d1bcfb8eebcc 100644 (file)
@@ -911,7 +911,8 @@ tests += [
          [],
          [threads]],
 
-        [['src/libsystemd/sd-bus/test-bus-vtable.c'],
+        [['src/libsystemd/sd-bus/test-bus-vtable.c',
+          'src/libsystemd/sd-bus/test-vtable-data.h'],
          [],
          []],
 
@@ -934,7 +935,8 @@ tests += [
          [threads],
          '', 'manual'],
 
-        [['src/libsystemd/sd-bus/test-bus-introspect.c'],
+        [['src/libsystemd/sd-bus/test-bus-introspect.c',
+          'src/libsystemd/sd-bus/test-vtable-data.h'],
          [],
          []],