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

class Match : public ::testing::Test
{
    protected:
        decltype(sdbusplus::bus::new_default()) bus =
                sdbusplus::bus::new_default();

        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().c_str(), 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().c_str(), 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().c_str(),
                              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);
}
