#include "snmp_client.hpp"
#include "snmp_conf_manager.hpp"
#include "snmp_serialize.hpp"

#include <netinet/in.h>

#include <experimental/filesystem>
#include <fstream>

#include <gtest/gtest.h>

namespace phosphor
{
namespace network
{
namespace snmp
{

constexpr auto clientObjPath = "/xyz/openbmc_test/snmp/client";
namespace fs = std::experimental::filesystem;

class TestSerialize : public testing::Test
{
  public:
    sdbusplus::bus::bus bus;
    ConfManager manager;
    TestSerialize() :
        bus(sdbusplus::bus::new_default()),
        manager(bus, "/xyz/openbmc_test/snmp/manager")
    {
        char tmp[] = "/tmp/snmpManager.XXXXXX";
        std::string confDir = mkdtemp(tmp);
        manager.dbusPersistentLocation = confDir;
    }
    ~TestSerialize()
    {
        std::error_code ec;
        fs::remove_all(manager.dbusPersistentLocation, ec);
    }
};

TEST_F(TestSerialize, serialize)
{
    std::string objPath = clientObjPath;
    objPath += "/" + std::to_string(1);
    std::string objPath2 = clientObjPath;
    objPath2 += "/" + std::to_string(2);

    Client client(bus, objPath.c_str(), manager, "1.1.1.1", 23);

    auto path = serialize(1, client, manager.dbusPersistentLocation);
    Client restoreClient(bus, objPath2.c_str(), manager);

    deserialize(path, restoreClient);

    EXPECT_EQ("1.1.1.1", restoreClient.address());
    EXPECT_EQ(23, restoreClient.port());
}

TEST_F(TestSerialize, deserialize_non_existent_file)
{
    std::string objPath = clientObjPath;
    objPath += "/" + std::to_string(1);

    Client client(bus, objPath.c_str(), manager);
    fs::path path = manager.dbusPersistentLocation;
    path /= "1";

    auto ret = deserialize(path, client);

    EXPECT_EQ(false, ret);
}

TEST_F(TestSerialize, deserialize_empty_file)
{
    std::string objPath = clientObjPath;
    objPath += "/" + std::to_string(1);

    Client restoreClient(bus, objPath.c_str(), manager);

    std::fstream file;

    fs::path path = manager.dbusPersistentLocation;
    path /= "1";

    file.open(path.string(), std::ofstream::out);
    file.close();
    // deserialize the object with empty file
    auto ret = deserialize(path, restoreClient);
    EXPECT_EQ(false, ret);
}

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