blob: a53a32c1b35f6806a5bcfe8bac39d853a71326dd [file] [log] [blame]
Patrick Venture18235e62018-11-08 10:21:09 -08001#include "data_mock.hpp"
2#include "firmware_handler.hpp"
3#include "image_mock.hpp"
4
5#include <cstdint>
6#include <cstring>
7#include <vector>
8
9#include <gtest/gtest.h>
10
11namespace blobs
12{
Patrick Venture18235e62018-11-08 10:21:09 -080013using ::testing::Eq;
14using ::testing::Return;
15
16TEST(FirmwareHandlerWriteTest, DataTypeIpmiWriteSuccess)
17{
18 /* Verify if data type ipmi, it calls write with the bytes. */
19
20 ImageHandlerMock imageMock1, imageMock2;
21 std::vector<HandlerPack> blobs = {
22 {FirmwareBlobHandler::hashBlobID, &imageMock1},
23 {"asdf", &imageMock2},
24 };
25
26 std::vector<DataHandlerPack> data = {
27 {FirmwareBlobHandler::FirmwareUpdateFlags::ipmi, nullptr},
28 };
29
30 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
31
32 EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
33
34 EXPECT_TRUE(handler->open(
35 0, OpenFlags::write | FirmwareBlobHandler::FirmwareUpdateFlags::ipmi,
36 "asdf"));
37
38 std::vector<std::uint8_t> bytes = {0xaa, 0x55};
39
40 EXPECT_CALL(imageMock2, write(0, Eq(bytes))).WillOnce(Return(true));
41 EXPECT_TRUE(handler->write(0, 0, bytes));
42}
43
44TEST(FirmwareHandlerWriteTest, DataTypeNonIpmiWriteSuccess)
45{
46 /* Verify if data type non-ipmi, it calls write with the length. */
47
48 ImageHandlerMock imageMock1, imageMock2;
49 std::vector<HandlerPack> blobs = {
50 {FirmwareBlobHandler::hashBlobID, &imageMock1},
51 {"asdf", &imageMock2},
52 };
53
54 DataHandlerMock dataMock;
55
56 std::vector<DataHandlerPack> data = {
57 {FirmwareBlobHandler::FirmwareUpdateFlags::ipmi, nullptr},
58 {FirmwareBlobHandler::FirmwareUpdateFlags::lpc, &dataMock},
59 };
60
61 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
62
63 EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
64
65 EXPECT_TRUE(handler->open(
66 0, OpenFlags::write | FirmwareBlobHandler::FirmwareUpdateFlags::lpc,
67 "asdf"));
68
69 struct ExtChunkHdr request;
70 request.length = 4; /* number of bytes to read. */
71 std::vector<std::uint8_t> ipmiRequest;
72 ipmiRequest.resize(sizeof(request));
73 std::memcpy(ipmiRequest.data(), &request, sizeof(request));
74
75 std::vector<std::uint8_t> bytes = {0x01, 0x02, 0x03, 0x04};
76
77 EXPECT_CALL(dataMock, copyFrom(request.length)).WillOnce(Return(bytes));
78 EXPECT_CALL(imageMock2, write(0, Eq(bytes))).WillOnce(Return(true));
79 EXPECT_TRUE(handler->write(0, 0, ipmiRequest));
80}
81
82TEST(FirmwareHandlerWriteTest, DataTypeNonIpmiWriteFailsBadRequest)
83{
84 /* Verify the data type non-ipmi, if the request's structure doesn't match,
85 * return failure. */
86
87 ImageHandlerMock imageMock1, imageMock2;
88 std::vector<HandlerPack> blobs = {
89 {FirmwareBlobHandler::hashBlobID, &imageMock1},
90 {"asdf", &imageMock2},
91 };
92
93 DataHandlerMock dataMock;
94
95 std::vector<DataHandlerPack> data = {
96 {FirmwareBlobHandler::FirmwareUpdateFlags::ipmi, nullptr},
97 {FirmwareBlobHandler::FirmwareUpdateFlags::lpc, &dataMock},
98 };
99
100 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
101
102 EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
103
104 EXPECT_TRUE(handler->open(
105 0, OpenFlags::write | FirmwareBlobHandler::FirmwareUpdateFlags::lpc,
106 "asdf"));
107
108 struct ExtChunkHdr request;
109 request.length = 4; /* number of bytes to read. */
110
111 std::vector<std::uint8_t> ipmiRequest;
112 ipmiRequest.resize(sizeof(request));
113 std::memcpy(ipmiRequest.data(), &request, sizeof(request));
114 ipmiRequest.push_back(1);
115
116 /* ipmiRequest is too large by one byte. */
117 EXPECT_FALSE(handler->write(0, 0, ipmiRequest));
118}
119
120} // namespace blobs