#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

// the request here is only the subcommand byte and therefore there's no invalid
// length check, etc to handle within the method.

TEST(BlobCountTest, ReturnsZeroBlobs)
{
    // Calling BmcBlobGetCount if there are no handlers registered should just
    // return that there are 0 blobs.

    ManagerMock mgr;
    size_t dataLen;
    uint8_t reply[MAX_IPMI_BUFFER] = {0};
    struct BmcBlobCountTx req;
    struct BmcBlobCountRx rep;
    uint8_t* request = reinterpret_cast<uint8_t*>(&req);

    req.cmd = BlobOEMCommands::bmcBlobGetCount;
    dataLen = sizeof(req);

    rep.crc = 0;
    rep.blobCount = 0;

    EXPECT_CALL(mgr, buildBlobList()).WillOnce(Return(0));

    EXPECT_EQ(IPMI_CC_OK, getBlobCount(&mgr, request, reply, &dataLen));

    EXPECT_EQ(sizeof(rep), dataLen);
    EXPECT_EQ(0, std::memcmp(reply, &rep, sizeof(rep)));
}

TEST(BlobCountTest, ReturnsTwoBlobs)
{
    // Calling BmcBlobGetCount with one handler registered that knows of two
    // blobs will return that it found two blobs.

    ManagerMock mgr;
    size_t dataLen;
    uint8_t reply[MAX_IPMI_BUFFER] = {0};
    struct BmcBlobCountTx req;
    struct BmcBlobCountRx rep;
    uint8_t* request = reinterpret_cast<uint8_t*>(&req);

    req.cmd = BlobOEMCommands::bmcBlobGetCount;
    dataLen = sizeof(req);

    rep.crc = 0;
    rep.blobCount = 2;

    EXPECT_CALL(mgr, buildBlobList()).WillOnce(Return(2));

    EXPECT_EQ(IPMI_CC_OK, getBlobCount(&mgr, request, reply, &dataLen));

    EXPECT_EQ(sizeof(rep), dataLen);
    EXPECT_EQ(0, std::memcmp(reply, &rep, sizeof(rep)));
}
} // namespace blobs
