#include "ipmi.hpp"

#include <blobs-ipmid/test/manager_mock.hpp>
#include <cstring>
#include <vector>

#include <gtest/gtest.h>

namespace blobs
{

using ::testing::Return;

// ipmid.hpp isn't installed where we can grab it and this value is per BMC
// SoC.
#define MAX_IPMI_BUFFER 64

TEST(BlobReadTest, ManagerReturnsNoData)
{
    // Verify that if no data is returned the IPMI command reply has no
    // payload.  The manager, in all failures, will just return 0 bytes.

    ManagerMock mgr;
    size_t dataLen;
    uint8_t request[MAX_IPMI_BUFFER] = {0};
    uint8_t reply[MAX_IPMI_BUFFER] = {0};
    auto req = reinterpret_cast<struct BmcBlobReadTx*>(request);

    req->cmd = BlobOEMCommands::bmcBlobRead;
    req->crc = 0;
    req->sessionId = 0x54;
    req->offset = 0x100;
    req->requestedSize = 0x10;

    dataLen = sizeof(struct BmcBlobReadTx);

    std::vector<uint8_t> data;

    EXPECT_CALL(mgr, read(req->sessionId, req->offset, req->requestedSize))
        .WillOnce(Return(data));

    EXPECT_EQ(IPMI_CC_OK, readBlob(&mgr, request, reply, &dataLen));
    EXPECT_EQ(sizeof(struct BmcBlobReadRx), dataLen);
}

TEST(BlobReadTest, ManagerReturnsData)
{
    // Verify that if data is returned, it's placed in the expected location.

    ManagerMock mgr;
    size_t dataLen;
    uint8_t request[MAX_IPMI_BUFFER] = {0};
    uint8_t reply[MAX_IPMI_BUFFER] = {0};
    auto req = reinterpret_cast<struct BmcBlobReadTx*>(request);

    req->cmd = BlobOEMCommands::bmcBlobRead;
    req->crc = 0;
    req->sessionId = 0x54;
    req->offset = 0x100;
    req->requestedSize = 0x10;

    dataLen = sizeof(struct BmcBlobReadTx);

    std::vector<uint8_t> data = {0x02, 0x03, 0x05, 0x06};

    EXPECT_CALL(mgr, read(req->sessionId, req->offset, req->requestedSize))
        .WillOnce(Return(data));

    EXPECT_EQ(IPMI_CC_OK, readBlob(&mgr, request, reply, &dataLen));
    EXPECT_EQ(sizeof(struct BmcBlobReadRx) + data.size(), dataLen);
    EXPECT_EQ(0, std::memcmp(&reply[sizeof(struct BmcBlobReadRx)], data.data(),
                             data.size()));
}

/* TODO(venture): We need a test that handles other checks such as if the size
 * requested won't fit into a packet response.
 */
} // namespace blobs
