#include "serialization_tests.hpp"
#include "elog_entry.hpp"
#include "elog_serialize.hpp"

namespace phosphor
{
namespace logging
{
namespace test
{

TEST_F(TestSerialization, testProperties)
{
    auto id = 99;
    phosphor::logging::AssociationList assocations{};
    std::vector<std::string> testData{"additional", "data"};
    uint64_t timestamp{100};
    std::string message{"test error"};
    std::string fwLevel{"level42"};
    auto input = std::make_unique<Entry>(
                     bus,
                     std::string(OBJ_ENTRY) + '/' + std::to_string(id),
                     id,
                     timestamp,
                     Entry::Level::Informational,
                     std::move(message),
                     std::move(testData),
                     std::move(assocations),
                     fwLevel,
                     manager);
    auto path = serialize(*input, TestSerialization::dir);

    auto idStr = path.filename().c_str();
    id = std::stol(idStr);
    auto output = std::make_unique<Entry>(
                      bus,
                      std::string(OBJ_ENTRY) + '/' + idStr,
                      id,
                      manager);
    deserialize(path, *output);

    EXPECT_EQ(input->id(), output->id());
    EXPECT_EQ(input->severity(), output->severity());
    EXPECT_EQ(input->timestamp(), output->timestamp());
    EXPECT_EQ(input->message(), output->message());
    EXPECT_EQ(input->additionalData(), output->additionalData());
    EXPECT_EQ(input->resolved(), output->resolved());
    EXPECT_EQ(input->associations(), output->associations());
    EXPECT_EQ(input->version(), output->version());
    EXPECT_EQ(input->purpose(), output->purpose());
}

} // namespace test
} // namespace logging
} // namespace phosphor


