blob: 78c5d691a182c600ef840340bbc7e10da79cbbe2 [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;
Patrick Venture991910a2018-11-09 19:43:48 -080014using ::testing::StrEq;
Patrick Venture72388d72018-11-07 15:06:36 -080015
16TEST(FirmwareHandlerOpenTest, OpenWithEverythingValid)
17{
18 /* The client passes write set, and a transport that's supported, and a
19 * firmware image blob_id that's supported. */
20
21 ImageHandlerMock imageMock;
22
23 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -080024 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -080025 {"asdf", &imageMock},
26 };
27 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -080028 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -080029 };
30
31 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
32
33 EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(true));
34
35 EXPECT_TRUE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -080036 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venture21c62c12018-11-09 17:46:58 -080037
38 /* The active image blob_id was added. */
39 auto currentBlobs = handler->getBlobIds();
40 EXPECT_EQ(3, currentBlobs.size());
41 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
42 FirmwareBlobHandler::activeImageBlobID));
43}
44
45TEST(FirmwareHandlerOpenTest, OpenWithEverythingValidHashFile)
46{
47 /* Open the hash file by blob_id. */
48 ImageHandlerMock imageMock;
49
50 std::vector<HandlerPack> blobs = {
51 {FirmwareBlobHandler::hashBlobID, &imageMock},
52 {"asdf", &imageMock},
53 };
54 std::vector<DataHandlerPack> data = {
55 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
56 };
57
58 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
59
60 EXPECT_CALL(imageMock, open(Eq(FirmwareBlobHandler::hashBlobID)))
61 .WillOnce(Return(true));
62
63 EXPECT_TRUE(handler->open(
64 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
65 FirmwareBlobHandler::hashBlobID));
66
67 /* The active hash blob_id was added. */
68 auto currentBlobs = handler->getBlobIds();
69 EXPECT_EQ(3, currentBlobs.size());
70 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
71 FirmwareBlobHandler::activeHashBlobID));
72}
73
Patrick Venture6e307a72018-11-09 18:21:17 -080074TEST(FirmwareHandlerOpenTest, OpenWithDataHandlerAllSucceeds)
75{
76 /* Attempting to open a file that has an active handler, and use that active
77 * handler method.
78 */
79 DataHandlerMock dataMock;
80 ImageHandlerMock imageMock;
81
82 std::vector<HandlerPack> blobs = {
83 {FirmwareBlobHandler::hashBlobID, &imageMock},
84 {"asdf", &imageMock},
85 };
86 std::vector<DataHandlerPack> data = {
87 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
88 {FirmwareBlobHandler::UpdateFlags::lpc, &dataMock},
89 };
90
91 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
92
93 EXPECT_CALL(dataMock, open()).WillOnce(Return(true));
94 EXPECT_CALL(imageMock, open(Eq(FirmwareBlobHandler::hashBlobID)))
95 .WillOnce(Return(true));
96
97 EXPECT_TRUE(handler->open(
98 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::lpc,
99 FirmwareBlobHandler::hashBlobID));
100
101 /* The active hash blob_id was added. */
102 auto currentBlobs = handler->getBlobIds();
103 EXPECT_EQ(3, currentBlobs.size());
104 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
105 FirmwareBlobHandler::activeHashBlobID));
106}
107
108TEST(FirmwareHandlerOpenTest, OpenWithDataHandlerReturnsFailure)
109{
110 /* The data handler call returns failure on open, therefore open fails. */
111 DataHandlerMock dataMock;
112 ImageHandlerMock imageMock;
113
114 std::vector<HandlerPack> blobs = {
115 {FirmwareBlobHandler::hashBlobID, &imageMock},
116 {"asdf", &imageMock},
117 };
118 std::vector<DataHandlerPack> data = {
119 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
120 {FirmwareBlobHandler::UpdateFlags::lpc, &dataMock},
121 };
122
123 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
124
125 EXPECT_CALL(dataMock, open()).WillOnce(Return(false));
126
127 EXPECT_FALSE(handler->open(
128 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::lpc,
129 FirmwareBlobHandler::hashBlobID));
130
131 /* The active hash blob_id was added. */
132 auto currentBlobs = handler->getBlobIds();
133 EXPECT_EQ(2, currentBlobs.size());
134}
135
Patrick Venture991910a2018-11-09 19:43:48 -0800136TEST(FirmwareHandlerOpenTest, OpenEverythingSucceedsVerifyOpenFileCheck)
137{
138 /* Verify only one file can be open at a time by opening a file, trying
139 * again, then closing, and trying again.
140 */
141 ImageHandlerMock imageMock1, imageMock2;
142
143 std::vector<HandlerPack> blobs = {
144 {FirmwareBlobHandler::hashBlobID, &imageMock1},
145 {"asdf", &imageMock2},
146 };
147 std::vector<DataHandlerPack> data = {
148 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
149 };
150
151 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
152
153 EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
154
155 EXPECT_TRUE(handler->open(
156 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
157
158 /* The active image blob_id was added. */
159 auto currentBlobs = handler->getBlobIds();
160 EXPECT_EQ(3, currentBlobs.size());
161 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
162 FirmwareBlobHandler::activeImageBlobID));
163
164 /* Open the hash file (since we opened an image file). */
165 EXPECT_FALSE(handler->open(
166 1, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
167 FirmwareBlobHandler::hashBlobID));
168
169 /* Close the file, currently ignoring its return value. */
170 handler->close(0);
171
172 EXPECT_CALL(imageMock1, open(StrEq(FirmwareBlobHandler::hashBlobID)))
173 .WillOnce(Return(true));
174
175 EXPECT_TRUE(handler->open(
176 1, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
177 FirmwareBlobHandler::hashBlobID));
178}
179
Patrick Venture21c62c12018-11-09 17:46:58 -0800180TEST(FirmwareHandlerOpenTest, OpenEverythingSucceedsOpenActiveFails)
181{
182 /* Attempting to open the active image blob, when it's present will fail.
183 *
184 * TODO: We'll need another test that closes first because you can only have
185 * one file open at a time.
186 */
187 ImageHandlerMock imageMock;
188
189 std::vector<HandlerPack> blobs = {
190 {FirmwareBlobHandler::hashBlobID, &imageMock},
191 {"asdf", &imageMock},
192 };
193 std::vector<DataHandlerPack> data = {
194 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
195 };
196
197 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
198
199 EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(true));
200
201 EXPECT_TRUE(handler->open(
202 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
203
204 /* The active image blob_id was added. */
205 auto currentBlobs = handler->getBlobIds();
206 EXPECT_EQ(3, currentBlobs.size());
207 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
208 FirmwareBlobHandler::activeImageBlobID));
209
Patrick Venture991910a2018-11-09 19:43:48 -0800210 /* Close only active session, to verify it's failing on attempt to open a
211 * specific blob_id.
212 */
213 handler->close(0);
214
Patrick Venture21c62c12018-11-09 17:46:58 -0800215 EXPECT_FALSE(handler->open(
216 1, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
217 FirmwareBlobHandler::activeImageBlobID));
Patrick Venture72388d72018-11-07 15:06:36 -0800218}
219
220TEST(FirmwareHandlerOpenTest, OpenWithEverythingValidImageHandlerFails)
221{
222 /* The image handler for a specific type of image is allowed to return
223 * failure on open. let's simulate that. */
224
225 ImageHandlerMock imageMock;
226
227 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800228 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800229 {"asdf", &imageMock},
230 };
231 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800232 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800233 };
234
235 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
236
237 EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(false));
238
239 EXPECT_FALSE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -0800240 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venturedb253bf2018-11-09 19:36:03 -0800241
242 /* Verify blob_id list doesn't grow. */
243 auto currentBlobs = handler->getBlobIds();
244 EXPECT_EQ(2, currentBlobs.size());
Patrick Venture72388d72018-11-07 15:06:36 -0800245}
246
247TEST(FirmwareHandlerOpenTest, OpenWithoutWriteFails)
248{
249 /* The client must set the file write bit. */
250
251 ImageHandlerMock imageMock;
252
253 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800254 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800255 {"asdf", &imageMock},
256 };
257 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800258 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800259 };
260
261 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
262
Patrick Venture05abf7e2018-11-09 11:02:56 -0800263 EXPECT_FALSE(
264 handler->open(0, FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800265}
266
267TEST(FirmwareHandlerOpenTest, OpenWithInvalidTransportBit)
268{
269 /* The client sends a request with a transport mechanism not supported. */
270
271 ImageHandlerMock imageMock;
272
273 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800274 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800275 {"asdf", &imageMock},
276 };
277 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800278 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800279 };
280
281 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
282
Patrick Venture05abf7e2018-11-09 11:02:56 -0800283 EXPECT_FALSE(
284 handler->open(0, FirmwareBlobHandler::UpdateFlags::lpc, "asdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800285}
286
287TEST(FirmwareHandlerOpenTest, OpenWithInvalidImageBlobId)
288{
289 /* The client sends a request with an invalid image blob_id. */
290
291 ImageHandlerMock imageMock;
292
293 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800294 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800295 {"asdf", &imageMock},
296 };
297 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800298 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800299 };
300
301 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
302
303 EXPECT_FALSE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -0800304 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "bcdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800305}
306
307/* TODO: The client sends a request during verification. */
308/* TODO: The client sends a second request to open when there is already an open
309 * file.
310 */
311/* TODO: The client sends a request to open active image. */
312/* TODO: The client sends a request to open active hash. */
313
314} // namespace blobs