/**
 * 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/fru_identity.hpp"

#include <gtest/gtest.h>

using namespace openpower::pels;
using namespace openpower::pels::src;

// Unflatten a FRUIdentity that is a HW FRU callout
TEST(FRUIdentityTest, TestHardwareFRU)
{
    // Has PN, SN, CCIN
    std::vector<uint8_t> data{'I', 'D', 0x1C, 0x1D, // type, size, flags
                              '1', '2', '3',  '4',  // PN
                              '5', '6', '7',  0x00, 'A', 'A', 'A', 'A', // CCIN
                              '1', '2', '3',  '4',  '5', '6', '7', '8', // SN
                              '9', 'A', 'B',  'C'};

    Stream stream{data};

    FRUIdentity fru{stream};

    EXPECT_EQ(fru.failingComponentType(), FRUIdentity::hardwareFRU);
    EXPECT_EQ(fru.flattenedSize(), data.size());
    EXPECT_EQ(fru.type(), 0x4944);

    EXPECT_EQ(fru.getPN().value(), "1234567");
    EXPECT_EQ(fru.getCCIN().value(), "AAAA");
    EXPECT_EQ(fru.getSN().value(), "123456789ABC");
    EXPECT_FALSE(fru.getMaintProc());

    // Flatten
    std::vector<uint8_t> newData;
    Stream newStream{newData};
    fru.flatten(newStream);
    EXPECT_EQ(data, newData);
}

// Unflatten a FRUIdentity that is a Maintenance Procedure callout
TEST(FRUIdentityTest, TestMaintProcedure)
{
    // Only contains the maintenance procedure
    std::vector<uint8_t> data{
        0x49, 0x44, 0x0C, 0x42,                     // type, size, flags
        '1',  '2',  '3',  '4',  '5', '6', '7', 0x00 // Procedure
    };

    Stream stream{data};

    FRUIdentity fru{stream};

    EXPECT_EQ(fru.failingComponentType(), FRUIdentity::maintenanceProc);
    EXPECT_EQ(fru.flattenedSize(), data.size());

    EXPECT_EQ(fru.getMaintProc().value(), "1234567");
    EXPECT_FALSE(fru.getPN());
    EXPECT_FALSE(fru.getCCIN());
    EXPECT_FALSE(fru.getSN());

    // Flatten
    std::vector<uint8_t> newData;
    Stream newStream{newData};
    fru.flatten(newStream);
    EXPECT_EQ(data, newData);
}

// Try to unflatten garbage data
TEST(FRUIdentityTest, BadDataTest)
{
    std::vector<uint8_t> data{0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                              0xFF, 0xFF, 0xFF, 0xFF};

    Stream stream{data};

    EXPECT_THROW(FRUIdentity fru{stream}, std::out_of_range);
}

void testHWCallout(const std::string& pn, const std::string& ccin,
                   const std::string& sn, const std::string& expectedPN,
                   const std::string& expectedCCIN,
                   const std::string& expectedSN)
{
    FRUIdentity fru{pn, ccin, sn};

    EXPECT_EQ(fru.flattenedSize(), 28);
    EXPECT_EQ(fru.type(), 0x4944);
    EXPECT_EQ(fru.failingComponentType(), FRUIdentity::hardwareFRU);
    EXPECT_EQ(fru.getPN().value(), expectedPN);
    EXPECT_EQ(fru.getCCIN().value(), expectedCCIN);
    EXPECT_EQ(fru.getSN().value(), expectedSN);
    EXPECT_FALSE(fru.getMaintProc());

    // Flatten and unflatten, then compare again
    std::vector<uint8_t> data;
    Stream stream{data};
    fru.flatten(stream);

    EXPECT_EQ(data.size(), fru.flattenedSize());

    stream.offset(0);
    FRUIdentity newFRU{stream};

    EXPECT_EQ(newFRU.flattenedSize(), fru.flattenedSize());
    EXPECT_EQ(newFRU.type(), fru.type());
    EXPECT_EQ(newFRU.failingComponentType(), fru.failingComponentType());
    EXPECT_EQ(newFRU.getPN().value(), fru.getPN().value());
    EXPECT_EQ(newFRU.getCCIN().value(), fru.getCCIN().value());
    EXPECT_EQ(newFRU.getSN().value(), fru.getSN().value());
    EXPECT_FALSE(newFRU.getMaintProc());
}

// Test the constructor that takes in a PN/SN/CCIN
TEST(FRUIdentityTest, CreateHardwareCalloutTest)
{
    // The right sizes
    testHWCallout("1234567", "1234", "123456789ABC",
                  // expected
                  "1234567", "1234", "123456789ABC");

    // Too long
    testHWCallout("1234567long", "1234long", "123456789ABClong",
                  // expected
                  "1234567", "1234", "123456789ABC");
    // Too short
    testHWCallout("11", "22", "333",
                  // expected
                  "11", "22", "333");

    // empty
    testHWCallout("", "", "",
                  // expected
                  "", "", "");

    // Leading spaces in the part number will be stripped
    testHWCallout("    567", "1234", "123456789ABC",
                  // expected
                  "567", "1234", "123456789ABC");

    // All spaces in the part number
    testHWCallout("       ", "1234", "123456789ABC",
                  // expected
                  "", "1234", "123456789ABC");
}

// Test the constructor that takes in a maint procedure
TEST(FRUIdentityTest, CreateProcedureCalloutTest)
{
    {
        FRUIdentity fru{"bmc_code"};

        EXPECT_EQ(fru.flattenedSize(), 12);
        EXPECT_EQ(fru.type(), 0x4944);
        EXPECT_EQ(fru.failingComponentType(), FRUIdentity::maintenanceProc);
        EXPECT_EQ(fru.getMaintProc().value(), "BMC0001");
        EXPECT_FALSE(fru.getPN());
        EXPECT_FALSE(fru.getCCIN());
        EXPECT_FALSE(fru.getSN());

        // Flatten and unflatten, then compare again
        std::vector<uint8_t> data;
        Stream stream{data};
        fru.flatten(stream);

        EXPECT_EQ(data.size(), fru.flattenedSize());

        stream.offset(0);
        FRUIdentity newFRU{stream};

        EXPECT_EQ(newFRU.flattenedSize(), 12);
        EXPECT_EQ(newFRU.type(), 0x4944);
        EXPECT_EQ(newFRU.failingComponentType(), FRUIdentity::maintenanceProc);
        EXPECT_EQ(newFRU.getMaintProc().value(), "BMC0001");
        EXPECT_FALSE(newFRU.getPN());
        EXPECT_FALSE(newFRU.getCCIN());
        EXPECT_FALSE(newFRU.getSN());
    }

    {
        // Invalid maintenance procedure
        FRUIdentity fru{"invalid"};

        EXPECT_EQ(fru.flattenedSize(), 12);
        EXPECT_EQ(fru.type(), 0x4944);
        EXPECT_EQ(fru.failingComponentType(), FRUIdentity::maintenanceProc);
        EXPECT_EQ(fru.getMaintProc().value(), "INVALID");
        EXPECT_FALSE(fru.getPN());
        EXPECT_FALSE(fru.getCCIN());
        EXPECT_FALSE(fru.getSN());
    }

    {
        // Raw maintenance procedure
        FRUIdentity fru{"BMCXXXXLONG", CalloutValueType::raw};
        EXPECT_EQ(fru.getMaintProc().value(), "BMCXXXX");
    }
}

// Test the constructor that takes in a symbolic FRU.
TEST(FRUIdentityTest, CreateSymbolicFRUCalloutTest)
{
    // Symbolic FRU (not trusted)
    {
        FRUIdentity fru{"service_docs", false};

        EXPECT_EQ(fru.flattenedSize(), 12);
        EXPECT_EQ(fru.type(), 0x4944);
        EXPECT_EQ(fru.failingComponentType(), FRUIdentity::symbolicFRU);
        EXPECT_EQ(fru.getPN().value(), "SVCDOCS");
        EXPECT_FALSE(fru.getMaintProc());
        EXPECT_FALSE(fru.getCCIN());
        EXPECT_FALSE(fru.getSN());

        // Flatten and unflatten, then compare again
        std::vector<uint8_t> data;
        Stream stream{data};
        fru.flatten(stream);

        EXPECT_EQ(data.size(), fru.flattenedSize());

        stream.offset(0);
        FRUIdentity newFRU{stream};

        EXPECT_EQ(newFRU.flattenedSize(), 12);
        EXPECT_EQ(newFRU.type(), 0x4944);
        EXPECT_EQ(newFRU.failingComponentType(), FRUIdentity::symbolicFRU);
        EXPECT_EQ(newFRU.getPN().value(), "SVCDOCS");
        EXPECT_FALSE(newFRU.getMaintProc());
        EXPECT_FALSE(newFRU.getCCIN());
        EXPECT_FALSE(newFRU.getSN());
    }

    // Trusted symbolic FRU
    {
        FRUIdentity fru{"service_docs", true};

        EXPECT_EQ(fru.flattenedSize(), 12);
        EXPECT_EQ(fru.type(), 0x4944);
        EXPECT_EQ(fru.failingComponentType(),
                  FRUIdentity::symbolicFRUTrustedLocCode);
        EXPECT_EQ(fru.getPN().value(), "SVCDOCS");
        EXPECT_FALSE(fru.getMaintProc());
        EXPECT_FALSE(fru.getCCIN());
        EXPECT_FALSE(fru.getSN());
    }

    // Invalid symbolic FRU
    {
        FRUIdentity fru{"garbage", false};

        EXPECT_EQ(fru.flattenedSize(), 12);
        EXPECT_EQ(fru.type(), 0x4944);
        EXPECT_EQ(fru.failingComponentType(), FRUIdentity::symbolicFRU);
        EXPECT_EQ(fru.getPN().value(), "INVALID");
        EXPECT_FALSE(fru.getMaintProc());
        EXPECT_FALSE(fru.getCCIN());
        EXPECT_FALSE(fru.getSN());
    }

    // Raw symbolic FRU
    {
        FRUIdentity fru{"SOMEFRULONG", CalloutValueType::raw, false};

        EXPECT_EQ(fru.getPN().value(), "SOMEFRU");
    }
}
