#include "oem/ibm/host-bmc/host_lamp_test.hpp"
#include "pldmd/dbus_impl_requester.hpp"
#include "test/test_instance_id.hpp"

#include <string.h>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

using namespace pldm::led;
using ::testing::DoAll;
using ::testing::Return;
using ::testing::SetArgPointee;

class MockLampTest : public HostLampTest
{
  public:
    MockLampTest(sdbusplus::bus_t& bus, const std::string& objPath,
                 uint8_t mctp_eid, pldm::InstanceIdDb& instanceIdDb,
                 pldm_pdr* repo,
                 pldm::requester::Handler<pldm::requester::Request>* handler) :
        HostLampTest(bus, objPath, mctp_eid, instanceIdDb, repo, handler)
    {}

    MOCK_METHOD(uint16_t, getEffecterID, (), (override));
    MOCK_METHOD(uint8_t, setHostStateEffecter, (uint16_t effecterId),
                (override));
};

TEST(TestLamp, Asserted)
{
    sdbusplus::bus_t bus = sdbusplus::bus::new_default();
    TestInstanceIdDb instanceIdDb;

    MockLampTest lampTest(bus, "/xyz/openbmc_project/led/groups/host_lamp_test",
                          0, instanceIdDb, nullptr, nullptr);

    lampTest.asserted(false);
    EXPECT_EQ(lampTest.asserted(), false);

    EXPECT_CALL(lampTest, getEffecterID())
        .Times(2)
        .WillOnce(Return(0))
        .WillOnce(Return(1));
    EXPECT_CALL(lampTest, setHostStateEffecter(1)).Times(1).WillOnce(Return(0));

    ASSERT_THROW(lampTest.asserted(true), sdbusplus::exception::SdBusError);

    lampTest.asserted(true);
    EXPECT_EQ(lampTest.asserted(), true);
}