xref: /openbmc/sdbusplus/test/bus/match.cpp (revision 6db88387ecd17feca151a86304741ab462c13cd0)
1faa89f27SPatrick Williams #include <sdbusplus/bus.hpp>
2faa89f27SPatrick Williams #include <sdbusplus/bus/match.hpp>
3faa89f27SPatrick Williams 
495269dbcSPatrick Venture #include <gtest/gtest.h>
595269dbcSPatrick Venture 
6faa89f27SPatrick Williams class Match : public ::testing::Test
7faa89f27SPatrick Williams {
8faa89f27SPatrick Williams   protected:
90f282c48SPatrick Williams     sdbusplus::bus_t bus = sdbusplus::bus::new_bus();
10faa89f27SPatrick Williams 
11072da3eaSAndrew Geissler     static constexpr auto busName = "xyz.openbmc_project.sdbusplus.test.Match";
12a85fdffbSPatrick Williams 
matchRule()13a85fdffbSPatrick Williams     static auto matchRule()
14a85fdffbSPatrick Williams     {
15a85fdffbSPatrick Williams         using namespace sdbusplus::bus::match::rules;
16a85fdffbSPatrick Williams         return nameOwnerChanged() + argN(0, busName);
17a85fdffbSPatrick Williams     }
18faa89f27SPatrick Williams 
waitForIt(bool & triggered)19faa89f27SPatrick Williams     void waitForIt(bool& triggered)
20faa89f27SPatrick Williams     {
21faa89f27SPatrick Williams         for (size_t i = 0; (i < 16) && !triggered; ++i)
22faa89f27SPatrick Williams         {
23faa89f27SPatrick Williams             bus.wait(0);
24faa89f27SPatrick Williams             bus.process_discard();
25faa89f27SPatrick Williams         }
26faa89f27SPatrick Williams     }
27faa89f27SPatrick Williams };
28faa89f27SPatrick Williams 
TEST_F(Match,FunctorIs_sd_bus_message_handler_t)29faa89f27SPatrick Williams TEST_F(Match, FunctorIs_sd_bus_message_handler_t)
30faa89f27SPatrick Williams {
31faa89f27SPatrick Williams     bool triggered = false;
32*6db88387SPatrick Williams     auto trigger = [](sd_bus_message* /*m*/, void* context,
33*6db88387SPatrick Williams                       sd_bus_error* /*e*/) {
34faa89f27SPatrick Williams         *static_cast<bool*>(context) = true;
35faa89f27SPatrick Williams         return 0;
36faa89f27SPatrick Williams     };
37faa89f27SPatrick Williams 
38da25f342SPatrick Williams     sdbusplus::bus::match_t m{bus, matchRule(), trigger, &triggered};
39faa89f27SPatrick Williams     auto m2 = std::move(m); // ensure match is move-safe.
40faa89f27SPatrick Williams 
41faa89f27SPatrick Williams     waitForIt(triggered);
42faa89f27SPatrick Williams     ASSERT_FALSE(triggered);
43faa89f27SPatrick Williams 
44faa89f27SPatrick Williams     bus.request_name(busName);
45faa89f27SPatrick Williams 
46faa89f27SPatrick Williams     waitForIt(triggered);
47faa89f27SPatrick Williams     ASSERT_TRUE(triggered);
48faa89f27SPatrick Williams }
492f7c8875SPatrick Williams 
TEST_F(Match,FunctorIs_LambdaTakingMessage)502f7c8875SPatrick Williams TEST_F(Match, FunctorIs_LambdaTakingMessage)
512f7c8875SPatrick Williams {
522f7c8875SPatrick Williams     bool triggered = false;
5310d7aa12SPatrick Williams     auto trigger = [&triggered](sdbusplus::message_t& /*m*/) {
542f7c8875SPatrick Williams         triggered = true;
552f7c8875SPatrick Williams     };
562f7c8875SPatrick Williams 
57da25f342SPatrick Williams     sdbusplus::bus::match_t m{bus, matchRule(), trigger};
582f7c8875SPatrick Williams     auto m2 = std::move(m); // ensure match is move-safe.
592f7c8875SPatrick Williams 
602f7c8875SPatrick Williams     waitForIt(triggered);
612f7c8875SPatrick Williams     ASSERT_FALSE(triggered);
622f7c8875SPatrick Williams 
632f7c8875SPatrick Williams     bus.request_name(busName);
642f7c8875SPatrick Williams 
652f7c8875SPatrick Williams     waitForIt(triggered);
662f7c8875SPatrick Williams     ASSERT_TRUE(triggered);
672f7c8875SPatrick Williams }
682f7c8875SPatrick Williams 
TEST_F(Match,FunctorIs_MemberFunctionTakingMessage)692f7c8875SPatrick Williams TEST_F(Match, FunctorIs_MemberFunctionTakingMessage)
702f7c8875SPatrick Williams {
712f7c8875SPatrick Williams     class BoolHolder
722f7c8875SPatrick Williams     {
732f7c8875SPatrick Williams       public:
742f7c8875SPatrick Williams         bool triggered = false;
752f7c8875SPatrick Williams 
7610d7aa12SPatrick Williams         void callback(sdbusplus::message_t& /*m*/)
772f7c8875SPatrick Williams         {
782f7c8875SPatrick Williams             triggered = true;
792f7c8875SPatrick Williams         }
802f7c8875SPatrick Williams     };
812f7c8875SPatrick Williams     BoolHolder b;
822f7c8875SPatrick Williams 
83da25f342SPatrick Williams     sdbusplus::bus::match_t m{bus, matchRule(),
84072da3eaSAndrew Geissler                               std::bind(std::mem_fn(&BoolHolder::callback), &b,
85072da3eaSAndrew Geissler                                         std::placeholders::_1)};
862f7c8875SPatrick Williams     auto m2 = std::move(m); // ensure match is move-safe.
872f7c8875SPatrick Williams 
882f7c8875SPatrick Williams     waitForIt(b.triggered);
892f7c8875SPatrick Williams     ASSERT_FALSE(b.triggered);
902f7c8875SPatrick Williams 
912f7c8875SPatrick Williams     bus.request_name(busName);
922f7c8875SPatrick Williams 
932f7c8875SPatrick Williams     waitForIt(b.triggered);
942f7c8875SPatrick Williams     ASSERT_TRUE(b.triggered);
952f7c8875SPatrick Williams }
96