#include "dns_updater.hpp"

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

#include <gtest/gtest.h>

static constexpr auto IN_FILE = "/tmp/" __BASE_FILE__ "netif_state";
static constexpr auto OUT_FILE = "/tmp/" __BASE_FILE__ "resolv.conf";
static constexpr auto COMPARE_FILE =
    "/tmp/" __BASE_FILE__ "resolv_compare.conf";
static constexpr auto DNS_ENTRY_1 = "DNS=1.2.3.4\n";
static constexpr auto DNS_ENTRY_2 = "DNS=5.6.7.8\n";

namespace fs = std::experimental::filesystem;

class DnsUpdateTest : public ::testing::Test
{
  public:
    // Gets called as part of each TEST_F construction
    DnsUpdateTest()
    {
        // Create a file containing DNS entries like in netif/state
        std::ofstream file(IN_FILE);
        file << DNS_ENTRY_1;
        file << DNS_ENTRY_2;

        // Create a file to compare the results against
        std::ofstream compare(COMPARE_FILE);
        compare << "### Generated by phosphor-networkd ###\n";
        compare << "nameserver 1.2.3.4\n";
        compare << "nameserver 5.6.7.8\n";
    }

    // Gets called as part of each TEST_F destruction
    ~DnsUpdateTest()
    {
        if (fs::exists(IN_FILE))
        {
            fs::remove(IN_FILE);
        }
        if (fs::exists(OUT_FILE))
        {
            fs::remove(OUT_FILE);
        }
        if (fs::exists(COMPARE_FILE))
        {
            fs::remove(COMPARE_FILE);
        }
    }
};

/** @brief Makes outfile is updated with right contents
 */
TEST_F(DnsUpdateTest, validateOutFile)
{
    phosphor::network::dns::updater::updateDNSEntries(IN_FILE, OUT_FILE);

    // Read files and compare
    std::ifstream resolv(OUT_FILE);
    std::ifstream compare(COMPARE_FILE);

    // From actual file
    std::string resolvEntry{};
    std::string resolvContent{};
    while (std::getline(resolv, resolvEntry))
    {
        resolvContent += resolvEntry;
    }

    // From compare file
    std::string compareEntry{};
    std::string compareContent{};
    while (std::getline(compare, compareEntry))
    {
        compareContent += compareEntry;
    }
    EXPECT_EQ(resolvContent, compareContent);
}
