#include #include #include class Match : public ::testing::Test { protected: sdbusplus::bus::bus bus = sdbusplus::bus::new_bus(); static constexpr auto busName = "xyz.openbmc_project.sdbusplus.test.Match"; static auto matchRule() { using namespace sdbusplus::bus::match::rules; return nameOwnerChanged() + argN(0, busName); } void waitForIt(bool& triggered) { for (size_t i = 0; (i < 16) && !triggered; ++i) { bus.wait(0); bus.process_discard(); } } }; TEST_F(Match, FunctorIs_sd_bus_message_handler_t) { bool triggered = false; auto trigger = [](sd_bus_message* /*m*/, void* context, sd_bus_error* /*e*/) { *static_cast(context) = true; return 0; }; sdbusplus::bus::match_t m{bus, matchRule(), trigger, &triggered}; auto m2 = std::move(m); // ensure match is move-safe. waitForIt(triggered); ASSERT_FALSE(triggered); bus.request_name(busName); waitForIt(triggered); ASSERT_TRUE(triggered); } TEST_F(Match, FunctorIs_LambdaTakingMessage) { bool triggered = false; auto trigger = [&triggered](sdbusplus::message::message& /*m*/) { triggered = true; }; sdbusplus::bus::match_t m{bus, matchRule(), trigger}; auto m2 = std::move(m); // ensure match is move-safe. waitForIt(triggered); ASSERT_FALSE(triggered); bus.request_name(busName); waitForIt(triggered); ASSERT_TRUE(triggered); } TEST_F(Match, FunctorIs_MemberFunctionTakingMessage) { class BoolHolder { public: bool triggered = false; void callback(sdbusplus::message::message& /*m*/) { triggered = true; } }; BoolHolder b; sdbusplus::bus::match_t m{bus, matchRule(), std::bind(std::mem_fn(&BoolHolder::callback), &b, std::placeholders::_1)}; auto m2 = std::move(m); // ensure match is move-safe. waitForIt(b.triggered); ASSERT_FALSE(b.triggered); bus.request_name(busName); waitForIt(b.triggered); ASSERT_TRUE(b.triggered); }