#include #include #include using TestIf = sdbusplus::server::server::Test; struct Object : public ::testing::Test { sdbusplus::bus_t bus = sdbusplus::bus::new_default(); sdbusplus::message_t msg = bus.new_method_call( "xyz.openbmc_project.sdbusplus.test.Object", "/xyz/openbmc_project/sdbusplus/test/object", "xyz.openbmc_project.sdbusplus.test.Object", "Unused"); using variant_t = std::variant; template void run_test(const T& value) { const V data = value; msg.append(data); ASSERT_EQ(0, sd_bus_message_seal(msg.get(), 0, 0)); V new_data = {}; msg.read(new_data); EXPECT_EQ(data, new_data); } template void run_test_throw_bad_enum(const T& value) { const V1 data = value; msg.append(data); ASSERT_EQ(0, sd_bus_message_seal(msg.get(), 0, 0)); V2 new_data = {}; EXPECT_THROW(msg.read(new_data), sdbusplus::exception::InvalidEnumString); } }; static_assert( sdbusplus::message::details::has_convert_from_string_v, "EnumOne does not have convert_from_string!"); static_assert( sdbusplus::message::details::has_convert_from_string_v, "EnumTwo does not have convert_from_string!"); static_assert(!sdbusplus::message::details::has_convert_from_string_v, "size_t unexpectedly has a convert_from_string!"); static_assert(sdbusplus::message::details::has_convert_from_string_v< TestIf::PropertiesVariant>, "TestIf::PropertiesVariant does not convert_from_string!"); TEST_F(Object, PlainEnumOne) { run_test(TestIf::EnumOne::OneA); } TEST_F(Object, PlainEnumTwo) { run_test(TestIf::EnumTwo::TwoB); } TEST_F(Object, EnumOneAsEnumTwoThrows) { run_test_throw_bad_enum( TestIf::EnumOne::OneA); } TEST_F(Object, EnumTwoAsEnumOneThrows) { run_test_throw_bad_enum( TestIf::EnumTwo::TwoB); } TEST_F(Object, VariantAsString) { run_test(std::string("Hello")); } TEST_F(Object, VariantAsEnumOne) { run_test(TestIf::EnumOne::OneA); } TEST_F(Object, VariantAsEnumTwo) { run_test(TestIf::EnumTwo::TwoB); }