text: #include <sdbusplus/bus.hpp>
  #include <sdbusplus/bus/match.hpp>
  
  #include <gtest/gtest.h>
  
  class Match : public ::testing::Test
  {
    protected:
      sdbusplus::bus_t 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<bool*>(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_t& /*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_t& /*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);
  }
  