19d3ec7fbSPatrick Williams #include <sdbusplus/vtable.hpp> 295269dbcSPatrick Venture 3a14167b5SPatrick Williams #include <gtest/gtest.h> 49d3ec7fbSPatrick Williams 5127b8abeSPatrick Williams extern "C" 6127b8abeSPatrick Williams { 7127b8abeSPatrick Williams int test_handler(sd_bus_message* m, void* userdata, 8127b8abeSPatrick Williams sd_bus_error* ret_error); 9d35c8523SLei YU int test_get(sd_bus* bus, const char* path, const char* interface, 10d35c8523SLei YU const char* property, sd_bus_message* reply, void* userdata, 11d35c8523SLei YU sd_bus_error* ret_error); 12d35c8523SLei YU int test_set(sd_bus* bus, const char* path, const char* interface, 13d35c8523SLei YU const char* property, sd_bus_message* value, void* userdata, 14d35c8523SLei YU sd_bus_error* ret_error); 159d3ec7fbSPatrick Williams 169d3ec7fbSPatrick Williams extern const sd_bus_vtable example2[]; 179d3ec7fbSPatrick Williams extern const size_t example2_size; 18d35c8523SLei YU } 19d35c8523SLei YU 20a735ca5cSPatrick Williams static const sdbusplus::vtable_t example[] = { 21d35c8523SLei YU sdbusplus::vtable::start(), 22d35c8523SLei YU sdbusplus::vtable::method("1", "2", "3", &test_handler, 0), 23d35c8523SLei YU sdbusplus::vtable::signal("5", "6"), 24d35c8523SLei YU sdbusplus::vtable::property("7", "8", &test_get, 25d35c8523SLei YU sdbusplus::vtable::property_::const_), 26d35c8523SLei YU sdbusplus::vtable::property("10", "11", &test_get, &test_set), 27*da48d207SEd Tanous sdbusplus::vtable::property_o("14", "15", &test_get, 16), 28d35c8523SLei YU sdbusplus::vtable::end()}; 299d3ec7fbSPatrick Williams 30a14167b5SPatrick Williams TEST(VtableTest, SameSize) 319d3ec7fbSPatrick Williams { 32a14167b5SPatrick Williams ASSERT_EQ(sizeof(example), example2_size); 33a14167b5SPatrick Williams } 349d3ec7fbSPatrick Williams 35d35c8523SLei YU constexpr bool operator==(const sd_bus_vtable& t1, const sd_bus_vtable& t2) 36d35c8523SLei YU { 37d35c8523SLei YU if (t1.type != t2.type || t1.flags != t2.flags) 38d35c8523SLei YU { 39d35c8523SLei YU return false; 40d35c8523SLei YU } 41d35c8523SLei YU 42d35c8523SLei YU switch (t1.type) 43d35c8523SLei YU { 44d35c8523SLei YU case _SD_BUS_VTABLE_START: 45d35c8523SLei YU return t1.x.start.element_size == t2.x.start.element_size && 46d35c8523SLei YU t1.x.start.features == t2.x.start.features; 47d35c8523SLei YU // FIXME: In systemd 243, there is the new vtable_format_reference 48d35c8523SLei YU // member, but current CI is using libsystemd 242, so we can not 49d35c8523SLei YU // check it yet. 50d35c8523SLei YU // && t1.x.start.vtable_format_reference 51d35c8523SLei YU // == t2.x.start.vtable_format_reference; 52d35c8523SLei YU case _SD_BUS_VTABLE_END: 53d35c8523SLei YU { 54d35c8523SLei YU // The union x shall be all zeros for END 55d35c8523SLei YU constexpr uint8_t allZeors[sizeof(t1.x)] = {0}; 56d35c8523SLei YU return memcmp(&t1.x, allZeors, sizeof(t1.x)) == 0 && 57d35c8523SLei YU memcmp(&t2.x, allZeors, sizeof(t2.x)) == 0; 58d35c8523SLei YU } 59d35c8523SLei YU case _SD_BUS_VTABLE_METHOD: 60d35c8523SLei YU return strcmp(t1.x.method.member, t2.x.method.member) == 0 && 61d35c8523SLei YU strcmp(t1.x.method.signature, t2.x.method.signature) == 0 && 62d35c8523SLei YU strcmp(t1.x.method.result, t2.x.method.result) == 0 && 63d35c8523SLei YU t1.x.method.handler == t2.x.method.handler && 64d35c8523SLei YU t1.x.method.offset == t2.x.method.offset && 65d35c8523SLei YU strcmp(t1.x.method.names, t2.x.method.names) == 0; 66d35c8523SLei YU case _SD_BUS_VTABLE_SIGNAL: 67d35c8523SLei YU return strcmp(t1.x.signal.member, t2.x.signal.member) == 0 && 68d35c8523SLei YU strcmp(t1.x.signal.signature, t2.x.signal.signature) == 0 && 69d35c8523SLei YU strcmp(t1.x.signal.names, t2.x.signal.names) == 0; 70d35c8523SLei YU case _SD_BUS_VTABLE_PROPERTY: 71d35c8523SLei YU case _SD_BUS_VTABLE_WRITABLE_PROPERTY: 72d35c8523SLei YU return strcmp(t1.x.property.member, t2.x.property.member) == 0 && 73d35c8523SLei YU strcmp(t1.x.property.signature, t2.x.property.signature) == 74d35c8523SLei YU 0 && 75d35c8523SLei YU t1.x.property.get == t2.x.property.get && 76d35c8523SLei YU t1.x.property.set == t2.x.property.set && 77d35c8523SLei YU t1.x.property.offset == t2.x.property.offset; 78d35c8523SLei YU } 79d35c8523SLei YU return false; 80d35c8523SLei YU } 81d35c8523SLei YU 82a14167b5SPatrick Williams TEST(VtableTest, SameContent) 83a14167b5SPatrick Williams { 84d35c8523SLei YU for (size_t i = 0; i < sizeof(example) / sizeof(example[0]); ++i) 85d35c8523SLei YU { 86d35c8523SLei YU EXPECT_EQ(example[i], example2[i]); 87d35c8523SLei YU } 88a14167b5SPatrick Williams } 89