blob: d2c601ae458cd417c345f86f2320cccf43fca23a [file] [log] [blame]
Patrick Venture72388d72018-11-07 15:06:36 -08001#include "data_mock.hpp"
2#include "firmware_handler.hpp"
3#include "image_mock.hpp"
4
Patrick Venture72388d72018-11-07 15:06:36 -08005#include <vector>
6
7#include <gmock/gmock.h>
8#include <gtest/gtest.h>
9
10namespace blobs
11{
Patrick Venture21c62c12018-11-09 17:46:58 -080012using ::testing::Eq;
Patrick Venture72388d72018-11-07 15:06:36 -080013using ::testing::Return;
14
15TEST(FirmwareHandlerOpenTest, OpenWithEverythingValid)
16{
17 /* The client passes write set, and a transport that's supported, and a
18 * firmware image blob_id that's supported. */
19
20 ImageHandlerMock imageMock;
21
22 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -080023 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -080024 {"asdf", &imageMock},
25 };
26 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -080027 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -080028 };
29
30 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
31
32 EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(true));
33
34 EXPECT_TRUE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -080035 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venture21c62c12018-11-09 17:46:58 -080036
37 /* The active image blob_id was added. */
38 auto currentBlobs = handler->getBlobIds();
39 EXPECT_EQ(3, currentBlobs.size());
40 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
41 FirmwareBlobHandler::activeImageBlobID));
42}
43
44TEST(FirmwareHandlerOpenTest, OpenWithEverythingValidHashFile)
45{
46 /* Open the hash file by blob_id. */
47 ImageHandlerMock imageMock;
48
49 std::vector<HandlerPack> blobs = {
50 {FirmwareBlobHandler::hashBlobID, &imageMock},
51 {"asdf", &imageMock},
52 };
53 std::vector<DataHandlerPack> data = {
54 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
55 };
56
57 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
58
59 EXPECT_CALL(imageMock, open(Eq(FirmwareBlobHandler::hashBlobID)))
60 .WillOnce(Return(true));
61
62 EXPECT_TRUE(handler->open(
63 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
64 FirmwareBlobHandler::hashBlobID));
65
66 /* The active hash blob_id was added. */
67 auto currentBlobs = handler->getBlobIds();
68 EXPECT_EQ(3, currentBlobs.size());
69 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
70 FirmwareBlobHandler::activeHashBlobID));
71}
72
Patrick Venture6e307a72018-11-09 18:21:17 -080073TEST(FirmwareHandlerOpenTest, OpenWithDataHandlerAllSucceeds)
74{
75 /* Attempting to open a file that has an active handler, and use that active
76 * handler method.
77 */
78 DataHandlerMock dataMock;
79 ImageHandlerMock imageMock;
80
81 std::vector<HandlerPack> blobs = {
82 {FirmwareBlobHandler::hashBlobID, &imageMock},
83 {"asdf", &imageMock},
84 };
85 std::vector<DataHandlerPack> data = {
86 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
87 {FirmwareBlobHandler::UpdateFlags::lpc, &dataMock},
88 };
89
90 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
91
92 EXPECT_CALL(dataMock, open()).WillOnce(Return(true));
93 EXPECT_CALL(imageMock, open(Eq(FirmwareBlobHandler::hashBlobID)))
94 .WillOnce(Return(true));
95
96 EXPECT_TRUE(handler->open(
97 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::lpc,
98 FirmwareBlobHandler::hashBlobID));
99
100 /* The active hash blob_id was added. */
101 auto currentBlobs = handler->getBlobIds();
102 EXPECT_EQ(3, currentBlobs.size());
103 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
104 FirmwareBlobHandler::activeHashBlobID));
105}
106
107TEST(FirmwareHandlerOpenTest, OpenWithDataHandlerReturnsFailure)
108{
109 /* The data handler call returns failure on open, therefore open fails. */
110 DataHandlerMock dataMock;
111 ImageHandlerMock imageMock;
112
113 std::vector<HandlerPack> blobs = {
114 {FirmwareBlobHandler::hashBlobID, &imageMock},
115 {"asdf", &imageMock},
116 };
117 std::vector<DataHandlerPack> data = {
118 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
119 {FirmwareBlobHandler::UpdateFlags::lpc, &dataMock},
120 };
121
122 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
123
124 EXPECT_CALL(dataMock, open()).WillOnce(Return(false));
125
126 EXPECT_FALSE(handler->open(
127 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::lpc,
128 FirmwareBlobHandler::hashBlobID));
129
130 /* The active hash blob_id was added. */
131 auto currentBlobs = handler->getBlobIds();
132 EXPECT_EQ(2, currentBlobs.size());
133}
134
Patrick Venture21c62c12018-11-09 17:46:58 -0800135TEST(FirmwareHandlerOpenTest, OpenEverythingSucceedsOpenActiveFails)
136{
137 /* Attempting to open the active image blob, when it's present will fail.
138 *
139 * TODO: We'll need another test that closes first because you can only have
140 * one file open at a time.
141 */
142 ImageHandlerMock imageMock;
143
144 std::vector<HandlerPack> blobs = {
145 {FirmwareBlobHandler::hashBlobID, &imageMock},
146 {"asdf", &imageMock},
147 };
148 std::vector<DataHandlerPack> data = {
149 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
150 };
151
152 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
153
154 EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(true));
155
156 EXPECT_TRUE(handler->open(
157 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
158
159 /* The active image blob_id was added. */
160 auto currentBlobs = handler->getBlobIds();
161 EXPECT_EQ(3, currentBlobs.size());
162 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
163 FirmwareBlobHandler::activeImageBlobID));
164
165 EXPECT_FALSE(handler->open(
166 1, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
167 FirmwareBlobHandler::activeImageBlobID));
Patrick Venture72388d72018-11-07 15:06:36 -0800168}
169
170TEST(FirmwareHandlerOpenTest, OpenWithEverythingValidImageHandlerFails)
171{
172 /* The image handler for a specific type of image is allowed to return
173 * failure on open. let's simulate that. */
174
175 ImageHandlerMock imageMock;
176
177 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800178 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800179 {"asdf", &imageMock},
180 };
181 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800182 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800183 };
184
185 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
186
187 EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(false));
188
189 EXPECT_FALSE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -0800190 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venturedb253bf2018-11-09 19:36:03 -0800191
192 /* Verify blob_id list doesn't grow. */
193 auto currentBlobs = handler->getBlobIds();
194 EXPECT_EQ(2, currentBlobs.size());
Patrick Venture72388d72018-11-07 15:06:36 -0800195}
196
197TEST(FirmwareHandlerOpenTest, OpenWithoutWriteFails)
198{
199 /* The client must set the file write bit. */
200
201 ImageHandlerMock imageMock;
202
203 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800204 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800205 {"asdf", &imageMock},
206 };
207 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800208 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800209 };
210
211 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
212
Patrick Venture05abf7e2018-11-09 11:02:56 -0800213 EXPECT_FALSE(
214 handler->open(0, FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800215}
216
217TEST(FirmwareHandlerOpenTest, OpenWithInvalidTransportBit)
218{
219 /* The client sends a request with a transport mechanism not supported. */
220
221 ImageHandlerMock imageMock;
222
223 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800224 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800225 {"asdf", &imageMock},
226 };
227 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800228 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800229 };
230
231 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
232
Patrick Venture05abf7e2018-11-09 11:02:56 -0800233 EXPECT_FALSE(
234 handler->open(0, FirmwareBlobHandler::UpdateFlags::lpc, "asdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800235}
236
237TEST(FirmwareHandlerOpenTest, OpenWithInvalidImageBlobId)
238{
239 /* The client sends a request with an invalid image blob_id. */
240
241 ImageHandlerMock imageMock;
242
243 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800244 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800245 {"asdf", &imageMock},
246 };
247 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800248 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800249 };
250
251 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
252
253 EXPECT_FALSE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -0800254 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "bcdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800255}
256
257/* TODO: The client sends a request during verification. */
258/* TODO: The client sends a second request to open when there is already an open
259 * file.
260 */
261/* TODO: The client sends a request to open active image. */
262/* TODO: The client sends a request to open active hash. */
263
264} // namespace blobs