blob: 317911c40e675b80fa533d13c949fa268f0bd71d [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 Venture72388d72018-11-07 15:06:36 -0800129}
130
131TEST(FirmwareHandlerOpenTest, OpenWithoutWriteFails)
132{
133 /* The client must set the file write bit. */
134
135 ImageHandlerMock imageMock;
136
137 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800138 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800139 {"asdf", &imageMock},
140 };
141 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800142 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800143 };
144
145 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
146
Patrick Venture05abf7e2018-11-09 11:02:56 -0800147 EXPECT_FALSE(
148 handler->open(0, FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800149}
150
151TEST(FirmwareHandlerOpenTest, OpenWithInvalidTransportBit)
152{
153 /* The client sends a request with a transport mechanism not supported. */
154
155 ImageHandlerMock imageMock;
156
157 std::vector<HandlerPack> blobs = {
Patrick Venture18235e62018-11-08 10:21:09 -0800158 {FirmwareBlobHandler::hashBlobID, &imageMock},
Patrick Venture72388d72018-11-07 15:06:36 -0800159 {"asdf", &imageMock},
160 };
161 std::vector<DataHandlerPack> data = {
Patrick Venture05abf7e2018-11-09 11:02:56 -0800162 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
Patrick Venture72388d72018-11-07 15:06:36 -0800163 };
164
165 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(blobs, data);
166
Patrick Venture05abf7e2018-11-09 11:02:56 -0800167 EXPECT_FALSE(
168 handler->open(0, FirmwareBlobHandler::UpdateFlags::lpc, "asdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800169}
170
171TEST(FirmwareHandlerOpenTest, OpenWithInvalidImageBlobId)
172{
173 /* The client sends a request with an invalid image blob_id. */
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_FALSE(handler->open(
Patrick Venture05abf7e2018-11-09 11:02:56 -0800188 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "bcdf"));
Patrick Venture72388d72018-11-07 15:06:36 -0800189}
190
191/* TODO: The client sends a request during verification. */
192/* TODO: The client sends a second request to open when there is already an open
193 * file.
194 */
195/* TODO: The client sends a request to open active image. */
196/* TODO: The client sends a request to open active hash. */
197
198} // namespace blobs