#include "snmp_conf_manager.hpp"

#include "xyz/openbmc_project/Common/error.hpp"

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

namespace phosphor
{
namespace network
{
namespace snmp
{

class TestSNMPConfManager : public testing::Test
{
  public:
    sdbusplus::bus::bus bus;
    ConfManager manager;
    std::string confDir;
    TestSNMPConfManager() :
        bus(sdbusplus::bus::new_default()), manager(bus, ""){};

    ~TestSNMPConfManager()
    {
    }

    void createSNMPClient(std::string ipaddress, uint16_t port)
    {
        manager.client(ipaddress, port);
    }

    ClientList &getSNMPClients()
    {
        return manager.clients;
    }

    void deleteSNMPClient(std::string ipaddress)
    {
        if (manager.clients.find(ipaddress) != manager.clients.end())
        {
            auto &it = manager.clients[ipaddress];
            it->delete_();
        }
    }
};

// Add single SNMP client
TEST_F(TestSNMPConfManager, AddSNMPClient)
{
    using namespace sdbusplus::xyz::openbmc_project::Common::Error;

    createSNMPClient("192.168.1.1", 24);

    auto &clients = getSNMPClients();
    EXPECT_EQ(1, clients.size());
    EXPECT_EQ(true, clients.find("192.168.1.1") != clients.end());
}

// Add multiple SNMP client
TEST_F(TestSNMPConfManager, AddMultipleSNMPClient)
{
    using namespace sdbusplus::xyz::openbmc_project::Common::Error;

    createSNMPClient("192.168.1.1", 24);
    createSNMPClient("192.168.1.2", 24);

    auto &clients = getSNMPClients();
    EXPECT_EQ(2, clients.size());
    EXPECT_EQ(true, clients.find("192.168.1.1") != clients.end());
    EXPECT_EQ(true, clients.find("192.168.1.2") != clients.end());
}

// Delete SNMP client
TEST_F(TestSNMPConfManager, DeleteSNMPClient)
{
    using namespace sdbusplus::xyz::openbmc_project::Common::Error;

    createSNMPClient("192.168.1.1", 24);
    createSNMPClient("192.168.1.2", 24);

    auto &clients = getSNMPClients();
    EXPECT_EQ(2, clients.size());
    deleteSNMPClient("192.168.1.1");
    EXPECT_EQ(1, clients.size());
    EXPECT_EQ(true, clients.find("192.168.1.2") != clients.end());
}

} // namespace snmp
} // namespce network
} // namespace phosphor
