#include <fcntl.h>
#include <libpdbg.h>

#include <hei_main.hpp>
#include <test/sim-hw-access.hpp>
#include <util/pdbg.hpp>
#include <util/trace.hpp>

#include <limits>
#include <vector>

#include "gtest/gtest.h"

TEST(PDBG, PdbgDtsTest1)
{
    const char* perv1_fapi_pos_path = "/proc0/pib/perv1";
    const char* perv12_fapi_pos_path = "/proc0/pib/perv12";
    const uint32_t perv1_fapi_pos = 1;
    const uint32_t perv12_fapi_pos = 12;

    pdbg_targets_init(nullptr);

    trace::inf("retrieving fapi pos.");
    uint32_t attr = std::numeric_limits<uint32_t>::max();
    pdbg_target* trgt = pdbg_target_from_path(nullptr, perv1_fapi_pos_path);
    pdbg_target_get_attribute(trgt, "ATTR_FAPI_POS", 4, 1, &attr);
    trace::inf("perv1 fapi pos in DTS: %u", attr);
    EXPECT_EQ(attr, perv1_fapi_pos);

    attr = std::numeric_limits<uint32_t>::max();
    trgt = pdbg_target_from_path(nullptr, perv12_fapi_pos_path);
    pdbg_target_get_attribute(trgt, "ATTR_FAPI_POS", 4, 1, &attr);
    trace::inf("perv12 fapi pos in DTS: %u", attr);
    EXPECT_EQ(attr, perv12_fapi_pos);
}

TEST(PDBG, PdbgDtsTest2)
{
    const char* dimm0_path =
        "/proc0/pib/perv12/mc0/mi0/mcc0/omi0/ocmb0/mem_port0/dimm0";
    const uint32_t index = 0;
    const uint32_t fapi_pos = 0;

    pdbg_targets_init(nullptr);

    trace::inf("retrieving fapi pos.");
    uint32_t attr = std::numeric_limits<uint32_t>::max();
    pdbg_target* trgt = pdbg_target_from_path(nullptr, dimm0_path);
    pdbg_target_get_attribute(trgt, "index", 4, 1, &attr);
    trace::inf("index in DTS: %u", attr);
    EXPECT_EQ(attr, index);

    attr = std::numeric_limits<uint32_t>::max();
    pdbg_target_get_attribute(trgt, "ATTR_FAPI_POS", 4, 1, &attr);
    trace::inf("fapi pos in DTS: %u", attr);
    EXPECT_EQ(attr, fapi_pos);
}

TEST(PDBG, PdbgDtsTest3)
{
    const uint32_t chipId = 0;  // ID for proc0.
    const uint32_t fapiPos = 0; // FAPI Position for proc0.

    pdbg_targets_init(nullptr);

    // Iterate each processor.
    pdbg_target* procTrgt;
    pdbg_for_each_class_target("/proc0", procTrgt)
    {
        // Active processors only.
        if (PDBG_TARGET_ENABLED !=
            pdbg_target_probe(util::pdbg::getPibTrgt(procTrgt)))
            continue;

        // Process the PROC target.
        uint32_t attr = std::numeric_limits<uint32_t>::max();
        pdbg_target_get_attribute(procTrgt, "ATTR_CHIP_ID", 4, 1, &attr);
        trace::inf("Chip ID: %u", attr);
        EXPECT_EQ(attr, chipId);

        attr = std::numeric_limits<uint32_t>::max();
        pdbg_target_get_attribute(procTrgt, "ATTR_FAPI_POS", 4, 1, &attr);
        trace::inf("ATTR_FAPI_POS: %u", attr);
        EXPECT_EQ(attr, fapiPos);
    }
}

TEST(PDBG, PdbgDtsTest4)
{
    const uint32_t index = 1;
    const uint32_t fapi_pos = 1;
    const char* perv1_path = "/proc0/pib/perv1";

    pdbg_targets_init(nullptr);

    // Iterate each processor.
    pdbg_target* trgt;
    uint32_t attr;

    pdbg_for_each_class_target(perv1_path, trgt)
    {
        attr = std::numeric_limits<uint32_t>::max();
        pdbg_target_get_attribute(trgt, "index", 4, 1, &attr);
        trace::inf("index in DTS: %u", attr);
        EXPECT_EQ(attr, index);

        attr = std::numeric_limits<uint32_t>::max();
        pdbg_target_get_attribute(trgt, "ATTR_FAPI_POS", 4, 1, &attr);
        trace::inf("fapi pos in DTS: %u", attr);
        EXPECT_EQ(attr, fapi_pos);
    }
}

TEST(util_pdbg, getParentChip)
{
    using namespace util::pdbg;
    pdbg_targets_init(nullptr);

    auto procChip = getTrgt("/proc0");
    auto omiUnit = getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1");

    EXPECT_EQ(procChip, getParentChip(procChip)); // get self
    EXPECT_EQ(procChip, getParentChip(omiUnit));  // get unit

    auto ocmbChip = getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1/ocmb0");
    auto memPortUnit =
        getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1/ocmb0/mem_port0");

    EXPECT_EQ(ocmbChip, getParentChip(ocmbChip));    // get self
    EXPECT_EQ(ocmbChip, getParentChip(memPortUnit)); // get unit
}

TEST(util_pdbg, getChipUnit)
{
    using namespace util::pdbg;
    pdbg_targets_init(nullptr);

    auto procChip = getTrgt("/proc0");
    auto omiUnit = getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1");
    auto omiUnitPos = 5;

    // Get the unit and verify.
    EXPECT_EQ(omiUnit, getChipUnit(procChip, TYPE_OMI, omiUnitPos));

    // Expect an exception when passing a unit instead of a chip.
    EXPECT_THROW(getChipUnit(omiUnit, TYPE_OMI, omiUnitPos), std::logic_error);

    // Expect an exception when passing a chip type.
    EXPECT_THROW(getChipUnit(procChip, TYPE_PROC, omiUnitPos),
                 std::out_of_range);

    // Expect an exception when passing a unit type not on the target chip.
    EXPECT_THROW(getChipUnit(procChip, TYPE_MEM_PORT, omiUnitPos),
                 std::out_of_range);

    // Expect a nullptr if the target is not found.
    EXPECT_EQ(nullptr, getChipUnit(procChip, TYPE_OMI, 100));

    auto ocmbChip = getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1/ocmb0");
    auto memPortUnit =
        getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1/ocmb0/mem_port0");
    auto memPortUnitPos = 0;

    // Get the unit and verify.
    EXPECT_EQ(memPortUnit,
              getChipUnit(ocmbChip, TYPE_MEM_PORT, memPortUnitPos));
}

TEST(util_pdbg, getScom)
{
    using namespace util::pdbg;
    pdbg_targets_init(nullptr);

    auto procChip = getTrgt("/proc0");
    auto ocmbChip = getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1/ocmb0");
    auto omiUnit = getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1");

    sim::ScomAccess& scom = sim::ScomAccess::getSingleton();
    scom.flush();
    scom.add(procChip, 0x11111111, 0x0011223344556677);
    scom.error(ocmbChip, 0x22222222);

    int rc = 0;
    uint64_t val = 0;

    // Test good path.
    rc = getScom(procChip, 0x11111111, val);
    EXPECT_EQ(0, rc);
    EXPECT_EQ(0x0011223344556677, val);

    // Test address that has not been added to ScomAccess.
    rc = getScom(procChip, 0x33333333, val);
    EXPECT_EQ(0, rc);
    EXPECT_EQ(0, val);

    // Test SCOM error.
    rc = getScom(ocmbChip, 0x22222222, val);
    EXPECT_EQ(1, rc);

    // Test non-chip target.
    EXPECT_DEATH({ getScom(omiUnit, 0x11111111, val); }, "");
}

TEST(util_pdbg, getCfam)
{
    using namespace util::pdbg;
    pdbg_targets_init(nullptr);

    auto procChip = getTrgt("/proc0");
    auto omiUnit = getTrgt("/proc0/pib/perv13/mc1/mi0/mcc0/omi1");

    sim::CfamAccess& cfam = sim::CfamAccess::getSingleton();
    cfam.flush();
    cfam.add(procChip, 0x11111111, 0x00112233);
    cfam.error(procChip, 0x22222222);

    int rc = 0;
    uint32_t val = 0;

    // Test good path.
    rc = getCfam(procChip, 0x11111111, val);
    EXPECT_EQ(0, rc);
    EXPECT_EQ(0x00112233, val);

    // Test address that has not been added to CfamAccess.
    rc = getCfam(procChip, 0x33333333, val);
    EXPECT_EQ(0, rc);
    EXPECT_EQ(0, val);

    // Test CFAM error.
    rc = getCfam(procChip, 0x22222222, val);
    EXPECT_EQ(1, rc);

    // Test non-chip target.
    EXPECT_DEATH({ getCfam(omiUnit, 0x11111111, val); }, "");
}

TEST(util_pdbg, getActiveChips)
{
    using namespace util::pdbg;
    using namespace libhei;
    pdbg_targets_init(nullptr);

    std::vector<libhei::Chip> chips;
    getActiveChips(chips);

    trace::inf("chips size: %u", chips.size());
    EXPECT_EQ(2, chips.size());

    /* TODO: There is an issue with the getActiveChips() function that only
     *       seems to exist in simulation. For some reason, the OCMBs do not
     *       show up as PDBG_TARGET_ENABLED. If we remove that check, this test
     *       case works as expected. However, we don't want to do that in
     *       production code.  Instead, we'll need to determine why the OCMBs
     *       are not enabled in CI test and then reenable this test case.
    auto proc0 = getTrgt("/proc0");
    auto proc1 = getTrgt("/proc1");

    sim::ScomAccess& scom = sim::ScomAccess::getSingleton();
    scom.flush();

    // Mask off proc0 mcc0 channel 1. The connected OCMB should be removed from
    // the list.
    scom.add(proc0, 0x0C010D03, 0x0f00000000000000);

    // Mask off one or two attentions, but not all, on proc0 mcc2. None of the
    // connected OCMBs should be removed from the list.
    scom.add(proc0, 0x0D010D03, 0xA500000000000000);

    // Mask off proc1 mcc7 channel 0. The connected OCMB should be removed from
    // the list.
    scom.add(proc1, 0x0F010D43, 0xf000000000000000);

    // Mask off proc1 mcc5 channels 0 and 1. Both the connected OCMBs should be
    // removed from the list.
    scom.add(proc1, 0x0E010D43, 0xff00000000000000);

    std::vector<libhei::Chip> chips;
    getActiveChips(chips);

    // In total there should be 14 chips with 2 processors, 7 OCMBs on proc0,
    // and 5 OCMBs on proc1.

    trace::inf("chips size: %u", chips.size());
    EXPECT_EQ(14, chips.size());
    */
}
