#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>

#include <gtest/gtest.h>

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<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);
}
