1+ /* SPDX-License-Identifier: LGPL-2.1+ */
2+
13#include <stdbool.h>
24#include <stddef.h>
35
46/* We use system assert.h here, because we don't want to keep macro.h and log.h C++ compatible */
57#undef NDEBUG
68#include <assert.h>
79#include <errno.h>
10+ #include <stdio.h>
811
912#include "sd-bus-vtable.h"
1013
11- #define DEFAULT_BUS_PATH "unix:path=/run/dbus/system_bus_socket"
12-
13- struct context {
14- bool quit ;
15- char * something ;
16- char * automatic_string_property ;
17- uint32_t automatic_integer_property ;
18- };
19-
20- static int handler (sd_bus_message * m , void * userdata , sd_bus_error * error ) {
21- return 1 ;
22- }
23-
24- 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 ) {
25- return 1 ;
26- }
14+ #ifndef __cplusplus
15+ # include "bus-objects.h"
16+ #endif
2717
28- 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 ) {
29- return 1 ;
30- }
18+ #include "test-vtable-data.h"
3119
32- 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 ) {
33- return 1 ;
34- }
35-
36- static const sd_bus_vtable vtable [] = {
37- SD_BUS_VTABLE_START (0 ),
38- SD_BUS_METHOD ("AlterSomething" , "s" , "s" , handler , 0 ),
39- SD_BUS_METHOD ("Exit" , "" , "" , handler , 0 ),
40- SD_BUS_METHOD_WITH_OFFSET ("AlterSomething2" , "s" , "s" , handler , 200 , 0 ),
41- SD_BUS_METHOD_WITH_OFFSET ("Exit2" , "" , "" , handler , 200 , 0 ),
42- SD_BUS_METHOD_WITH_NAMES_OFFSET ("AlterSomething3" , "so" , SD_BUS_PARAM (string ) SD_BUS_PARAM (path ),
43- "s" , SD_BUS_PARAM (returnstring ), handler , 200 , 0 ),
44- SD_BUS_METHOD_WITH_NAMES ("Exit3" , "bx" , SD_BUS_PARAM (with_confirmation ) SD_BUS_PARAM (after_msec ),
45- "bb" , SD_BUS_PARAM (accepted ) SD_BUS_PARAM (scheduled ), handler , 0 ),
46- SD_BUS_PROPERTY ("Value" , "s" , value_handler , 10 , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ),
47- SD_BUS_PROPERTY ("Value2" , "s" , value_handler , 10 , SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION ),
48- SD_BUS_PROPERTY ("Value3" , "s" , value_handler , 10 , SD_BUS_VTABLE_PROPERTY_CONST ),
49- SD_BUS_PROPERTY ("Value4" , "s" , value_handler , 10 , 0 ),
50- SD_BUS_PROPERTY ("AnExplicitProperty" , "s" , NULL , offsetof(struct context , something ),
51- SD_BUS_VTABLE_PROPERTY_EXPLICIT |SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION ),
52- SD_BUS_WRITABLE_PROPERTY ("Something" , "s" , get_handler , set_handler , 0 , 0 ),
53- SD_BUS_WRITABLE_PROPERTY ("AutomaticStringProperty" , "s" , NULL , NULL ,
54- offsetof(struct context , automatic_string_property ), 0 ),
55- SD_BUS_WRITABLE_PROPERTY ("AutomaticIntegerProperty" , "u" , NULL , NULL ,
56- offsetof(struct context , automatic_integer_property ), 0 ),
57- SD_BUS_METHOD ("NoOperation" , NULL , NULL , NULL , 0 ),
58- SD_BUS_SIGNAL ("DummySignal" , "b" , 0 ),
59- SD_BUS_SIGNAL ("DummySignal2" , "so" , 0 ),
60- SD_BUS_SIGNAL_WITH_NAMES ("DummySignal3" , "so" , SD_BUS_PARAM (string ) SD_BUS_PARAM (path ), 0 ),
61- SD_BUS_VTABLE_END
62- };
63-
64- struct sd_bus_vtable_221 {
65- uint8_t type :8 ;
66- uint64_t flags :56 ;
67- union {
68- struct {
69- size_t element_size ;
70- } start ;
71- struct {
72- const char * member ;
73- const char * signature ;
74- const char * result ;
75- sd_bus_message_handler_t handler ;
76- size_t offset ;
77- } method ;
78- struct {
79- const char * member ;
80- const char * signature ;
81- } signal ;
82- struct {
83- const char * member ;
84- const char * signature ;
85- sd_bus_property_get_t get ;
86- sd_bus_property_set_t set ;
87- size_t offset ;
88- } property ;
89- } x ;
90- };
91-
92- static const struct sd_bus_vtable_221 vtable_format_221 [] = {
93- {
94- .type = _SD_BUS_VTABLE_START ,
95- .flags = 0 ,
96- .x = {
97- .start = {
98- .element_size = sizeof (struct sd_bus_vtable_221 )
99- },
100- },
101- },
102- {
103- .type = _SD_BUS_VTABLE_METHOD ,
104- .flags = 0 ,
105- .x = {
106- .method = {
107- .member = "Exit" ,
108- .signature = "" ,
109- .result = "" ,
110- .handler = handler ,
111- .offset = 0 ,
112- },
113- },
114- },
115- {
116- .type = _SD_BUS_VTABLE_END ,
117- .flags = 0 ,
118- .x = { { 0 } },
119- }
120- };
20+ #define DEFAULT_BUS_PATH "unix:path=/run/dbus/system_bus_socket"
12121
12222static void test_vtable (void ) {
12323 sd_bus * bus = NULL ;
@@ -126,16 +26,24 @@ static void test_vtable(void) {
12626
12727 assert (sd_bus_new (& bus ) >= 0 );
12828
129- assert (sd_bus_add_object_vtable (bus , NULL , "/foo" , "org.freedesktop.systemd.testVtable" , vtable , & c ) >= 0 );
130- assert (sd_bus_add_object_vtable (bus , NULL , "/foo" , "org.freedesktop.systemd.testVtable2" , vtable , & c ) >= 0 );
29+ assert (sd_bus_add_object_vtable (bus , NULL , "/foo" , "org.freedesktop.systemd.testVtable" , test_vtable_2 , & c ) >= 0 );
30+ assert (sd_bus_add_object_vtable (bus , NULL , "/foo" , "org.freedesktop.systemd.testVtable2" , test_vtable_2 , & c ) >= 0 );
13131 /* the cast on the line below is needed to test with the old version of the table */
132- assert (sd_bus_add_object_vtable (bus , NULL , "/foo" , "org.freedesktop.systemd.testVtable221" , (const sd_bus_vtable * )vtable_format_221 , & c ) >= 0 );
32+ assert (sd_bus_add_object_vtable (bus , NULL , "/foo" , "org.freedesktop.systemd.testVtable221" ,
33+ (const sd_bus_vtable * )vtable_format_221 , & c ) >= 0 );
13334
13435 assert (sd_bus_set_address (bus , DEFAULT_BUS_PATH ) >= 0 );
13536 r = sd_bus_start (bus );
13637 assert (r == 0 || /* success */
13738 r == - ENOENT /* dbus is inactive */ );
13839
40+ #ifndef __cplusplus
41+ _cleanup_free_ char * s = NULL ;
42+
43+ assert_se (introspect_path (bus , "/foo" , NULL , false, true, NULL , & s , NULL ) == 1 );
44+ fputs (s , stdout );
45+ #endif
46+
13947 sd_bus_unref (bus );
14048}
14149
0 commit comments