#include "extensions/openpower-pels/private_header.hpp"
#include "pel_utils.hpp"

#include <gtest/gtest.h>

using namespace openpower::pels;

class PrivateHeaderTest : public CleanLogID
{
};

TEST_F(PrivateHeaderTest, SizeTest)
{
    EXPECT_EQ(PrivateHeader::flattenedSize(), 48);
}

TEST_F(PrivateHeaderTest, UnflattenFlattenTest)
{
    auto data = pelDataFactory(TestPELType::privateHeaderSection);

    Stream stream(data);
    PrivateHeader ph(stream);
    EXPECT_EQ(ph.valid(), true);

    EXPECT_EQ(ph.header().id, 0x5048);
    EXPECT_EQ(ph.header().size, PrivateHeader::flattenedSize());
    EXPECT_EQ(ph.header().version, 0x01);
    EXPECT_EQ(ph.header().subType, 0x02);
    EXPECT_EQ(ph.header().componentID, 0x0304);

    auto& ct = ph.createTimestamp();
    EXPECT_EQ(ct.yearMSB, 0x20);
    EXPECT_EQ(ct.yearLSB, 0x30);
    EXPECT_EQ(ct.month, 0x05);
    EXPECT_EQ(ct.day, 0x09);
    EXPECT_EQ(ct.hour, 0x11);
    EXPECT_EQ(ct.minutes, 0x1E);
    EXPECT_EQ(ct.seconds, 0x01);
    EXPECT_EQ(ct.hundredths, 0x63);

    auto& mt = ph.commitTimestamp();
    EXPECT_EQ(mt.yearMSB, 0x20);
    EXPECT_EQ(mt.yearLSB, 0x31);
    EXPECT_EQ(mt.month, 0x06);
    EXPECT_EQ(mt.day, 0x0F);
    EXPECT_EQ(mt.hour, 0x09);
    EXPECT_EQ(mt.minutes, 0x22);
    EXPECT_EQ(mt.seconds, 0x3A);
    EXPECT_EQ(mt.hundredths, 0x00);

    EXPECT_EQ(ph.creatorID(), 0xAA);
    EXPECT_EQ(ph.logType(), 0x00);
    EXPECT_EQ(ph.sectionCount(), 0x02);
    EXPECT_EQ(ph.obmcLogID(), 0x90919293);

    char expected[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x00};
    EXPECT_TRUE(memcmp(ph.creatorVersion().version, expected, 8) == 0);

    EXPECT_EQ(ph.plid(), 0x50515253);
    EXPECT_EQ(ph.id(), 0x80818283);

    // Now flatten into a vector and check that this vector
    // matches the original one.
    std::vector<uint8_t> newData;
    Stream newStream(newData);

    ph.flatten(newStream);
    EXPECT_EQ(data, newData);

    // Change a field, then flatten and unflatten again
    ph.creatorID() = 0x55;

    newStream.offset(0);
    newData.clear();
    ph.flatten(newStream);
    EXPECT_NE(data, newData);

    newStream.offset(0);
    PrivateHeader newPH(newStream);

    EXPECT_TRUE(newPH.valid());
    EXPECT_EQ(newPH.creatorID(), 0x55);
}

TEST_F(PrivateHeaderTest, ShortDataTest)
{
    auto data = pelDataFactory(TestPELType::privateHeaderSection);
    data.resize(PrivateHeader::flattenedSize() - 1);
    Stream stream(data);

    PrivateHeader ph(stream);

    EXPECT_EQ(ph.valid(), false);
}

TEST_F(PrivateHeaderTest, CorruptDataTest1)
{
    auto data = pelDataFactory(TestPELType::privateHeaderSection);
    Stream stream(data);

    data.at(0) = 0; // corrupt the section ID

    PrivateHeader ph(stream);

    EXPECT_EQ(ph.valid(), false);
}

TEST_F(PrivateHeaderTest, CorruptDataTest2)
{
    auto data = pelDataFactory(TestPELType::privateHeaderSection);
    Stream stream(data);

    data.at(4) = 0x22; // corrupt the version

    PrivateHeader ph(stream);

    EXPECT_EQ(ph.valid(), false);
}

TEST_F(PrivateHeaderTest, CorruptDataTest3)
{
    auto data = pelDataFactory(TestPELType::privateHeaderSection);
    Stream stream(data);

    data.at(27) = 1; // corrupt the section count

    PrivateHeader ph(stream);

    EXPECT_EQ(ph.valid(), false);
}

// Construct a PrivateHeader from scratch
TEST_F(PrivateHeaderTest, ConstructionTest)
{
    tm time_tm;
    time_tm.tm_year = 125;
    time_tm.tm_mon = 11;
    time_tm.tm_mday = 31;
    time_tm.tm_hour = 15;
    time_tm.tm_min = 23;
    time_tm.tm_sec = 42;
    time_tm.tm_isdst = 0;

    // Convert the above time into a uint64_t in ms since the epoch time
    auto timepoint = std::chrono::system_clock::from_time_t(mktime(&time_tm));
    auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(
                         timepoint.time_since_epoch())
                         .count();

    PrivateHeader ph(0x3300, 42, timestamp);

    EXPECT_TRUE(ph.valid());
    EXPECT_EQ(ph.header().id, 0x5048);
    EXPECT_EQ(ph.header().size, PrivateHeader::flattenedSize());
    EXPECT_EQ(ph.header().version, 0x01);
    EXPECT_EQ(ph.header().subType, 0x00);
    EXPECT_EQ(ph.header().componentID, 0x3300);

    auto& ct = ph.createTimestamp();
    EXPECT_EQ(ct.yearMSB, 0x20);
    EXPECT_EQ(ct.yearLSB, 0x25);
    EXPECT_EQ(ct.month, 0x12);
    EXPECT_EQ(ct.day, 0x31);
    EXPECT_EQ(ct.hour, 0x15);
    EXPECT_EQ(ct.minutes, 0x23);
    EXPECT_EQ(ct.seconds, 0x42);
    EXPECT_EQ(ct.hundredths, 0x00);

    EXPECT_EQ(ph.creatorID(), 'O');
    EXPECT_EQ(ph.logType(), 0x00);
    EXPECT_EQ(ph.sectionCount(), 0x01);
    EXPECT_EQ(ph.obmcLogID(), 42);

    char expected[] = {0, 0, 0, 0, 0, 0, 0, 0};
    EXPECT_TRUE(memcmp(ph.creatorVersion().version, expected, 8) == 0);

    EXPECT_EQ(ph.id(), 0x50000001);
    EXPECT_EQ(ph.id(), ph.plid());
}
