#include "dns_updater.hpp"

#include <gtest/gtest.h>

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

static constexpr auto IN_FILE = "/tmp/netif_state";
static constexpr auto OUT_FILE = "/tmp/resolv.conf";
static constexpr auto COMPARE_FILE = "/tmp/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);
}
