summaryrefslogtreecommitdiffstats
path: root/test/ipmi_read_unittest.cpp
blob: 8d1b55fc3ff8ced3bbdc1ae11dcacf1e06f8e59e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "ipmi.hpp"
#include "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 = static_cast<std::uint8_t>(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 = static_cast<std::uint8_t>(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
OpenPOWER on IntegriCloud