/**
 * Copyright © 2019 IBM Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#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(), 0x4F);
    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.setID(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.id(), 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());
}
