blob: 2766fd31bc551ab916dd94235e86aaf7b029c8e6 [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 Venture3ecb3502019-05-17 11:03:51 -07005#include "verification_mock.hpp"
Patrick Ventureffcc5502018-11-16 12:32:38 -08006
7#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 Venture3ecb3502019-05-17 11:03:51 -070035 /* Verify it doesn't get called by using StrictMock. */
36 std::unique_ptr<VerificationInterface> verifyMock =
37 std::make_unique<StrictMock<VerificationMock>>();
Patrick Venture4eb55952018-11-16 15:36:24 -080038
39 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture3ecb3502019-05-17 11:03:51 -070040 blobs, data, std::move(verifyMock));
Patrick Ventureffcc5502018-11-16 12:32:38 -080041
42 EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
43
44 EXPECT_TRUE(handler->open(
45 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
46
47 EXPECT_FALSE(handler->commit(0, {}));
48}
49
50TEST(FirmwareHandlerCommitTest, VerifyCannotCommitOnHashFile)
51{
52 /* Verify the hash file returns failure on this command. It's a fairly
53 * artificial test.
54 */
55 ImageHandlerMock imageMock1, imageMock2;
56 std::vector<HandlerPack> blobs = {
Patrick Venture7dad86f2019-05-17 08:52:20 -070057 {hashBlobId, &imageMock1},
Patrick Ventureffcc5502018-11-16 12:32:38 -080058 {"asdf", &imageMock2},
59 };
60
61 std::vector<DataHandlerPack> data = {
62 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
63 };
64
Patrick Venture3ecb3502019-05-17 11:03:51 -070065 /* Verify it doesn't get called by using StrictMock. */
66 std::unique_ptr<VerificationInterface> verifyMock =
67 std::make_unique<StrictMock<VerificationMock>>();
Patrick Venture4eb55952018-11-16 15:36:24 -080068
69 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture3ecb3502019-05-17 11:03:51 -070070 blobs, data, std::move(verifyMock));
Patrick Ventureffcc5502018-11-16 12:32:38 -080071
Patrick Venture7dad86f2019-05-17 08:52:20 -070072 EXPECT_CALL(imageMock1, open(StrEq(hashBlobId))).WillOnce(Return(true));
Patrick Ventureffcc5502018-11-16 12:32:38 -080073
74 EXPECT_TRUE(handler->open(
75 0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi,
Patrick Venture7dad86f2019-05-17 08:52:20 -070076 hashBlobId));
Patrick Ventureffcc5502018-11-16 12:32:38 -080077
78 EXPECT_FALSE(handler->commit(0, {}));
79}
80
81TEST(FirmwareHandlerCommitTest, VerifyCommitAcceptedOnVerifyBlob)
82{
83 /* Verify the verify blob lets you call this command, and it returns
84 * success.
85 */
86 ImageHandlerMock imageMock1, imageMock2;
87 std::vector<HandlerPack> blobs = {
Patrick Venture7dad86f2019-05-17 08:52:20 -070088 {hashBlobId, &imageMock1},
Patrick Ventureffcc5502018-11-16 12:32:38 -080089 {"asdf", &imageMock2},
90 };
91
92 std::vector<DataHandlerPack> data = {
93 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
94 };
95
Patrick Venture3ecb3502019-05-17 11:03:51 -070096 auto verifyMock = CreateVerifyMock();
97 auto verifyMockPtr = reinterpret_cast<VerificationMock*>(verifyMock.get());
Patrick Venture4eb55952018-11-16 15:36:24 -080098
99 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture3ecb3502019-05-17 11:03:51 -0700100 blobs, data, std::move(verifyMock));
Patrick Ventureffcc5502018-11-16 12:32:38 -0800101
Patrick Venture7dad86f2019-05-17 08:52:20 -0700102 EXPECT_TRUE(handler->open(0, OpenFlags::write, verifyBlobId));
Patrick Ventureffcc5502018-11-16 12:32:38 -0800103
Patrick Venture3ecb3502019-05-17 11:03:51 -0700104 EXPECT_CALL(*verifyMockPtr, triggerVerification())
105 .WillRepeatedly(Return(true));
106
Patrick Ventureffcc5502018-11-16 12:32:38 -0800107 EXPECT_TRUE(handler->commit(0, {}));
108}
109
Patrick Venturebe198702019-05-15 09:46:02 -0700110TEST(FirmwareHandlerCommitTest, VerifyCommitCanOnlyBeCalledOnceForEffect)
Patrick Ventureffcc5502018-11-16 12:32:38 -0800111{
Patrick Venturebe198702019-05-15 09:46:02 -0700112 /* Verify you cannot call the commit() command once verification is
113 * started, after which it will just return true.
Patrick Ventureffcc5502018-11-16 12:32:38 -0800114 */
115 ImageHandlerMock imageMock1, imageMock2;
116 std::vector<HandlerPack> blobs = {
Patrick Venture7dad86f2019-05-17 08:52:20 -0700117 {hashBlobId, &imageMock1},
Patrick Ventureffcc5502018-11-16 12:32:38 -0800118 {"asdf", &imageMock2},
119 };
120
121 std::vector<DataHandlerPack> data = {
122 {FirmwareBlobHandler::UpdateFlags::ipmi, nullptr},
123 };
124
Patrick Venture3ecb3502019-05-17 11:03:51 -0700125 auto verifyMock = CreateVerifyMock();
126 auto verifyMockPtr = reinterpret_cast<VerificationMock*>(verifyMock.get());
Patrick Venture4eb55952018-11-16 15:36:24 -0800127
128 auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture3ecb3502019-05-17 11:03:51 -0700129 blobs, data, std::move(verifyMock));
Patrick Ventureffcc5502018-11-16 12:32:38 -0800130
Patrick Venture7dad86f2019-05-17 08:52:20 -0700131 EXPECT_TRUE(handler->open(0, OpenFlags::write, verifyBlobId));
Patrick Ventureffcc5502018-11-16 12:32:38 -0800132
Patrick Venture3ecb3502019-05-17 11:03:51 -0700133 EXPECT_CALL(*verifyMockPtr, triggerVerification())
134 .WillRepeatedly(Return(true));
Patrick Venturecabc1172018-11-16 16:14:26 -0800135
Patrick Ventureffcc5502018-11-16 12:32:38 -0800136 EXPECT_TRUE(handler->commit(0, {}));
Patrick Venturebe198702019-05-15 09:46:02 -0700137 EXPECT_TRUE(handler->commit(0, {}));
Patrick Ventureffcc5502018-11-16 12:32:38 -0800138}
139
140} // namespace blobs