blob: 009f1581932f78b25db35e833547b10d81233d77 [file] [log] [blame]
Patrick Ventureffcc5502018-11-16 12:32:38 -08001#include "data_mock.hpp"
2#include "firmware_handler.hpp"
3#include "image_mock.hpp"
Patrick Venture7dad86f2019-05-17 08:52:20 -07004#include "util.hpp"
Patrick Ventureffcc5502018-11-16 12:32:38 -08005
Patrick Venture4eb55952018-11-16 15:36:24 -08006#include <sdbusplus/test/sdbus_mock.hpp>
Patrick Ventureffcc5502018-11-16 12:32:38 -08007#include <vector>
8
9#include <gtest/gtest.h>
10
11namespace blobs
12{
Patrick Venturecabc1172018-11-16 16:14:26 -080013using ::testing::_;
14using ::testing::IsNull;
15using ::testing::NotNull;
Patrick Ventureffcc5502018-11-16 12:32:38 -080016using ::testing::Return;
Patrick Venturecabc1172018-11-16 16:14:26 -080017using ::testing::StrEq;
18using ::testing::StrictMock;
Patrick Ventureffcc5502018-11-16 12:32:38 -080019
20TEST(FirmwareHandlerCommitTest, VerifyCannotCommitOnFlashImage)
21{
22 /* Verify the flash image returns failure on this command. It's a fairly
23 * artificial test.
24 */
25 ImageHandlerMock imageMock1, imageMock2;
26 std::vector<HandlerPack> blobs = {
Patrick Venture7dad86f2019-05-17 08:52:20 -070027 {hashBlobId, &imageMock1},
Patrick Ventureffcc5502018-11-16 12:32:38 -080028 {"asdf", &imageMock2},
29 };
30
31 std::vector<DataHandlerPack> data = {
32 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
33 };
34
Patrick Venture4eb55952018-11-16 15:36:24 -080035 sdbusplus::SdBusMock sdbus_mock;
36 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
37
38 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture74059d62019-05-17 10:40:26 -070039 std::move(bus_mock), blobs, data, "");
Patrick Ventureffcc5502018-11-16 12:32:38 -080040
41 EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
42
43 EXPECT_TRUE(handler->open(
44 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
45
46 EXPECT_FALSE(handler->commit(0, {}));
47}
48
49TEST(FirmwareHandlerCommitTest, VerifyCannotCommitOnHashFile)
50{
51 /* Verify the hash file returns failure on this command. It's a fairly
52 * artificial test.
53 */
54 ImageHandlerMock imageMock1, imageMock2;
55 std::vector<HandlerPack> blobs = {
Patrick Venture7dad86f2019-05-17 08:52:20 -070056 {hashBlobId, &imageMock1},
Patrick Ventureffcc5502018-11-16 12:32:38 -080057 {"asdf", &imageMock2},
58 };
59
60 std::vector<DataHandlerPack> data = {
61 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
62 };
63
Patrick Venture4eb55952018-11-16 15:36:24 -080064 sdbusplus::SdBusMock sdbus_mock;
65 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
66
67 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture74059d62019-05-17 10:40:26 -070068 std::move(bus_mock), blobs, data, "");
Patrick Ventureffcc5502018-11-16 12:32:38 -080069
Patrick Venture7dad86f2019-05-17 08:52:20 -070070 EXPECT_CALL(imageMock1, open(StrEq(hashBlobId))).WillOnce(Return(true));
Patrick Ventureffcc5502018-11-16 12:32:38 -080071
72 EXPECT_TRUE(handler->open(
73 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
Patrick Venture7dad86f2019-05-17 08:52:20 -070074 hashBlobId));
Patrick Ventureffcc5502018-11-16 12:32:38 -080075
76 EXPECT_FALSE(handler->commit(0, {}));
77}
78
79TEST(FirmwareHandlerCommitTest, VerifyCommitAcceptedOnVerifyBlob)
80{
81 /* Verify the verify blob lets you call this command, and it returns
82 * success.
83 */
84 ImageHandlerMock imageMock1, imageMock2;
85 std::vector<HandlerPack> blobs = {
Patrick Venture7dad86f2019-05-17 08:52:20 -070086 {hashBlobId, &imageMock1},
Patrick Ventureffcc5502018-11-16 12:32:38 -080087 {"asdf", &imageMock2},
88 };
89
90 std::vector<DataHandlerPack> data = {
91 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
92 };
93
Patrick Venture4eb55952018-11-16 15:36:24 -080094 sdbusplus::SdBusMock sdbus_mock;
95 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
96
97 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture74059d62019-05-17 10:40:26 -070098 std::move(bus_mock), blobs, data, "");
Patrick Ventureffcc5502018-11-16 12:32:38 -080099
Patrick Venture7dad86f2019-05-17 08:52:20 -0700100 EXPECT_TRUE(handler->open(0, OpenFlags::write, verifyBlobId));
Patrick Ventureffcc5502018-11-16 12:32:38 -0800101
102 EXPECT_TRUE(handler->commit(0, {}));
103}
104
Patrick Venturebe198702019-05-15 09:46:02 -0700105TEST(FirmwareHandlerCommitTest, VerifyCommitCanOnlyBeCalledOnceForEffect)
Patrick Ventureffcc5502018-11-16 12:32:38 -0800106{
Patrick Venturebe198702019-05-15 09:46:02 -0700107 /* Verify you cannot call the commit() command once verification is
108 * started, after which it will just return true.
Patrick Ventureffcc5502018-11-16 12:32:38 -0800109 */
110 ImageHandlerMock imageMock1, imageMock2;
111 std::vector<HandlerPack> blobs = {
Patrick Venture7dad86f2019-05-17 08:52:20 -0700112 {hashBlobId, &imageMock1},
Patrick Ventureffcc5502018-11-16 12:32:38 -0800113 {"asdf", &imageMock2},
114 };
115
116 std::vector<DataHandlerPack> data = {
117 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
118 };
119
Patrick Venturecabc1172018-11-16 16:14:26 -0800120 StrictMock<sdbusplus::SdBusMock> sdbus_mock;
Patrick Venture4eb55952018-11-16 15:36:24 -0800121 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
122
123 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture74059d62019-05-17 10:40:26 -0700124 std::move(bus_mock), blobs, data, "");
Patrick Ventureffcc5502018-11-16 12:32:38 -0800125
Patrick Venture7dad86f2019-05-17 08:52:20 -0700126 EXPECT_TRUE(handler->open(0, OpenFlags::write, verifyBlobId));
Patrick Ventureffcc5502018-11-16 12:32:38 -0800127
Patrick Venturecabc1172018-11-16 16:14:26 -0800128 /* Note: I used StrictMock<> here to just catch all the calls. However, the
129 * unit-tests pass if we don't use StrictMock and ignore the calls.
130 */
131 EXPECT_CALL(sdbus_mock,
132 sd_bus_message_new_method_call(
133 IsNull(), NotNull(), StrEq("org.freedesktop.systemd1"),
134 StrEq("/org/freedesktop/systemd1"),
135 StrEq("org.freedesktop.systemd1.Manager"),
136 StrEq("StartUnit")))
137 .WillOnce(Return(0));
138 EXPECT_CALL(sdbus_mock,
139 sd_bus_message_append_basic(IsNull(), 's', NotNull()))
140 .Times(2)
141 .WillRepeatedly(Return(0));
142 EXPECT_CALL(sdbus_mock, sd_bus_call(_, _, _, _, _)).WillOnce(Return(0));
143
Patrick Ventureffcc5502018-11-16 12:32:38 -0800144 EXPECT_TRUE(handler->commit(0, {}));
Patrick Venturebe198702019-05-15 09:46:02 -0700145 EXPECT_TRUE(handler->commit(0, {}));
Patrick Ventureffcc5502018-11-16 12:32:38 -0800146}
147
148} // namespace blobs