blob: 967f79280a7e8a2e728a200b1635bc7495eb3151 [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
73TEST(FirmwareHandlerOpenTest, OpenEverythingSucceedsOpenActiveFails)
74{
75 /* Attempting to open the active image blob, when it's present will fail.
76 *
77 * TODO: We'll need another test that closes first because you can only have
78 * one file open at a time.
79 */
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 };
89
90 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
91
92 EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(true));
93
94 EXPECT_TRUE(handler->open(
95 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
96
97 /* The active image blob_id was added. */
98 auto currentBlobs = handler->getBlobIds();
99 EXPECT_EQ(3, currentBlobs.size());
100 EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
101 FirmwareBlobHandler::activeImageBlobID));
102
103 EXPECT_FALSE(handler->open(
104 1, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
105 FirmwareBlobHandler::activeImageBlobID));
Patrick Venture72388d72018-11-07 15:06:36 -0800106}
107
108TEST(FirmwareHandlerOpenTest, OpenWithEverythingValidImageHandlerFails)
109{
110 /* The image handler for a specific type of image is allowed to return
111 * failure on open. let's simulate that. */
112
113 ImageHandlerMock imageMock;
114
115 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800116 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800117 {"asdf", &imageMock},
118 };
119 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800120 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800121 };
122
123 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
124
125 EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(false));
126
127 EXPECT_FALSE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -0800128 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venturedb253bf2018-11-09 19:36:03 -0800129
130 /* Verify blob_id list doesn't grow. */
131 auto currentBlobs = handler->getBlobIds();
132 EXPECT_EQ(2, currentBlobs.size());
Patrick Venture72388d72018-11-07 15:06:36 -0800133}
134
135TEST(FirmwareHandlerOpenTest, OpenWithoutWriteFails)
136{
137 /* The client must set the file write bit. */
138
139 ImageHandlerMock imageMock;
140
141 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800142 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800143 {"asdf", &imageMock},
144 };
145 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800146 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800147 };
148
149 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
150
Patrick Venture05abf7e2018-11-09 11:02:56 -0800151 EXPECT_FALSE(
152 handler->open(0, FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800153}
154
155TEST(FirmwareHandlerOpenTest, OpenWithInvalidTransportBit)
156{
157 /* The client sends a request with a transport mechanism not supported. */
158
159 ImageHandlerMock imageMock;
160
161 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800162 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800163 {"asdf", &imageMock},
164 };
165 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800166 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800167 };
168
169 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
170
Patrick Venture05abf7e2018-11-09 11:02:56 -0800171 EXPECT_FALSE(
172 handler->open(0, FirmwareBlobHandler::UpdateFlags::lpc, "asdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800173}
174
175TEST(FirmwareHandlerOpenTest, OpenWithInvalidImageBlobId)
176{
177 /* The client sends a request with an invalid image blob_id. */
178
179 ImageHandlerMock imageMock;
180
181 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800182 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800183 {"asdf", &imageMock},
184 };
185 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800186 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800187 };
188
189 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
190
191 EXPECT_FALSE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -0800192 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "bcdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800193}
194
195/* TODO: The client sends a request during verification. */
196/* TODO: The client sends a second request to open when there is already an open
197 * file.
198 */
199/* TODO: The client sends a request to open active image. */
200/* TODO: The client sends a request to open active hash. */
201
202} // namespace blobs