// SPDX-License-Identifier: Apache-2.0
#include <cstdlib>
#include <dump_serialize.hpp>
#include <exception>
#include <filesystem>
#include <set>
#include <string>

#include <gtest/gtest.h>

namespace fs = std::filesystem;

class TestDumpSerial : public ::testing::Test
{
  public:
    TestDumpSerial()
    {
    }

    void SetUp()
    {
        char tmpdir[] = "/tmp/dump.XXXXXX";
        auto dirPtr = mkdtemp(tmpdir);
        if (dirPtr == NULL)
        {
            throw std::bad_alloc();
        }
        dumpDir = std::string(dirPtr);
        fs::create_directories(dumpDir);
        dumpFile = dumpDir;
        dumpFile /= "elogid";
    }
    void TearDown()
    {
        fs::remove_all(dumpDir);
    }

    std::string dumpDir;
    fs::path dumpFile;
};

TEST_F(TestDumpSerial, Serialization)
{
    using ElogList = std::set<uint32_t>;
    ElogList e;
    e.insert(1);
    e.insert(2);
    e.insert(3);
    phosphor::dump::elog::serialize(e, dumpFile.c_str());
    bool value = phosphor::dump::elog::deserialize(dumpFile.c_str(), e);
    EXPECT_EQ(value, true);
}

TEST_F(TestDumpSerial, DeserializationFalseCase)
{
    using ElogList = std::set<uint32_t>;
    ElogList e;
    e.insert(1);
    bool value = phosphor::dump::elog::deserialize(dumpFile.c_str(), e);
    EXPECT_EQ(value, false);
}

TEST(DumpDeSerialPath, DeserializationFalsePath)
{
    using ElogList = std::set<uint32_t>;
    ElogList e;
    e.insert(1);
    // Providing dummy path
    bool value = phosphor::dump::elog::deserialize("/tmp/Fake/serial", e);
    EXPECT_EQ(value, false);
}
