blob: 6b97289427b529122b8bddbfdf19b98f2d9ff715 [file] [log] [blame]
Patrick Venture1361a122019-05-20 07:36:05 -07001#pragma once
2
3#include "data_mock.hpp"
4#include "firmware_handler.hpp"
Patrick Venture84778b82019-06-26 20:11:09 -07005#include "flags.hpp"
Patrick Venture1361a122019-05-20 07:36:05 -07006#include "image_mock.hpp"
Patrick Venture1d66fe62019-06-03 14:57:27 -07007#include "triggerable_mock.hpp"
Patrick Venture1361a122019-05-20 07:36:05 -07008
9#include <memory>
Patrick Venture9a69f732019-06-17 14:05:13 -070010#include <string>
Patrick Venture1361a122019-05-20 07:36:05 -070011#include <vector>
12
13#include <gmock/gmock.h>
14#include <gtest/gtest.h>
15
Patrick Venture1d5a31c2019-05-20 11:38:22 -070016namespace ipmi_flash
Patrick Venture1361a122019-05-20 07:36:05 -070017{
Patrick Venture16ab2a12019-05-31 08:52:51 -070018namespace
19{
20
21using ::testing::Return;
Patrick Venture1361a122019-05-20 07:36:05 -070022
Patrick Venture8a4f2aa2019-05-23 08:40:21 -070023class IpmiOnlyFirmwareStaticTest : public ::testing::Test
24{
25 protected:
Patrick Venture8a4f2aa2019-05-23 08:40:21 -070026 void SetUp() override
27 {
28 blobs = {
29 {hashBlobId, &imageMock},
30 {staticLayoutBlobId, &imageMock},
31 };
Patrick Venture19044e12019-05-23 19:30:28 -070032
Patrick Venture6d7735d2019-06-21 10:03:19 -070033 std::unique_ptr<TriggerableActionInterface> prepareMock =
34 std::make_unique<TriggerMock>();
35 prepareMockPtr = reinterpret_cast<TriggerMock*>(prepareMock.get());
36
Patrick Venture1d66fe62019-06-03 14:57:27 -070037 std::unique_ptr<TriggerableActionInterface> verifyMock =
38 std::make_unique<TriggerMock>();
39 verifyMockPtr = reinterpret_cast<TriggerMock*>(verifyMock.get());
Patrick Venture19044e12019-05-23 19:30:28 -070040
Patrick Venture1d66fe62019-06-03 14:57:27 -070041 std::unique_ptr<TriggerableActionInterface> updateMock =
42 std::make_unique<TriggerMock>();
43 updateMockPtr = reinterpret_cast<TriggerMock*>(updateMock.get());
Patrick Venture1a406fe2019-05-31 07:29:56 -070044
Patrick Venture8a4f2aa2019-05-23 08:40:21 -070045 handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture6d7735d2019-06-21 10:03:19 -070046 blobs, data, std::move(prepareMock), std::move(verifyMock),
47 std::move(updateMock));
Patrick Venture8a4f2aa2019-05-23 08:40:21 -070048 }
Patrick Venture19044e12019-05-23 19:30:28 -070049
Patrick Venture6fdd02e2019-05-28 13:02:04 -070050 void expectedState(FirmwareBlobHandler::UpdateState state)
51 {
52 auto realHandler = dynamic_cast<FirmwareBlobHandler*>(handler.get());
53 EXPECT_EQ(state, realHandler->getCurrentState());
54 }
55
Patrick Venture16ab2a12019-05-31 08:52:51 -070056 void openToInProgress(const std::string& blobId)
57 {
58 EXPECT_CALL(imageMock, open(blobId)).WillOnce(Return(true));
Patrick Venture6d7735d2019-06-21 10:03:19 -070059 EXPECT_CALL(*prepareMockPtr, trigger()).WillOnce(Return(true));
Patrick Venture16ab2a12019-05-31 08:52:51 -070060 EXPECT_TRUE(handler->open(session, flags, blobId));
61 expectedState(FirmwareBlobHandler::UpdateState::uploadInProgress);
62 }
63
64 void getToVerificationPending(const std::string& blobId)
65 {
66 openToInProgress(blobId);
67
68 EXPECT_CALL(imageMock, close()).WillRepeatedly(Return());
69 handler->close(session);
70 expectedState(FirmwareBlobHandler::UpdateState::verificationPending);
71 }
72
73 void getToVerificationStarted(const std::string& blobId)
74 {
75 getToVerificationPending(blobId);
76
77 EXPECT_TRUE(handler->open(session, flags, verifyBlobId));
Patrick Venture1d66fe62019-06-03 14:57:27 -070078 EXPECT_CALL(*verifyMockPtr, trigger()).WillOnce(Return(true));
Patrick Venture16ab2a12019-05-31 08:52:51 -070079
80 EXPECT_TRUE(handler->commit(session, {}));
81 expectedState(FirmwareBlobHandler::UpdateState::verificationStarted);
82 }
83
Patrick Ventureda66fd82019-06-03 11:11:24 -070084 void getToVerificationCompleted(ActionStatus checkResponse)
Patrick Venture16ab2a12019-05-31 08:52:51 -070085 {
86 getToVerificationStarted(staticLayoutBlobId);
87
Patrick Venturef1f0f652019-06-03 09:10:19 -070088 EXPECT_CALL(*verifyMockPtr, status()).WillOnce(Return(checkResponse));
Patrick Venture16ab2a12019-05-31 08:52:51 -070089 blobs::BlobMeta meta;
90 EXPECT_TRUE(handler->stat(session, &meta));
91 expectedState(FirmwareBlobHandler::UpdateState::verificationCompleted);
92 }
93
94 void getToUpdatePending()
95 {
Patrick Ventureda66fd82019-06-03 11:11:24 -070096 getToVerificationCompleted(ActionStatus::success);
Patrick Venture16ab2a12019-05-31 08:52:51 -070097
98 handler->close(session);
99 expectedState(FirmwareBlobHandler::UpdateState::updatePending);
100 }
101
102 void getToUpdateStarted()
103 {
104 getToUpdatePending();
105 EXPECT_TRUE(handler->open(session, flags, updateBlobId));
106
Patrick Venture1d66fe62019-06-03 14:57:27 -0700107 EXPECT_CALL(*updateMockPtr, trigger()).WillOnce(Return(true));
Patrick Venture16ab2a12019-05-31 08:52:51 -0700108 EXPECT_TRUE(handler->commit(session, {}));
109 expectedState(FirmwareBlobHandler::UpdateState::updateStarted);
110 }
111
Patrick Ventureda66fd82019-06-03 11:11:24 -0700112 void getToUpdateCompleted(ActionStatus result)
Patrick Ventureab1e9622019-06-03 10:45:06 -0700113 {
114 getToUpdateStarted();
115 EXPECT_CALL(*updateMockPtr, status()).WillOnce(Return(result));
116
117 blobs::BlobMeta meta;
118 EXPECT_TRUE(handler->stat(session, &meta));
119 expectedState(FirmwareBlobHandler::UpdateState::updateCompleted);
120 }
121
Patrick Venture19044e12019-05-23 19:30:28 -0700122 ImageHandlerMock imageMock;
123 std::vector<HandlerPack> blobs;
124 std::vector<DataHandlerPack> data = {
Patrick Venture84778b82019-06-26 20:11:09 -0700125 {FirmwareFlags::UpdateFlags::ipmi, nullptr}};
Patrick Venture19044e12019-05-23 19:30:28 -0700126 std::unique_ptr<blobs::GenericBlobInterface> handler;
Patrick Venture6d7735d2019-06-21 10:03:19 -0700127 TriggerMock* prepareMockPtr;
Patrick Venture1d66fe62019-06-03 14:57:27 -0700128 TriggerMock* verifyMockPtr;
129 TriggerMock* updateMockPtr;
Patrick Venture16ab2a12019-05-31 08:52:51 -0700130
131 std::uint16_t session = 1;
132 std::uint16_t flags =
Patrick Venture84778b82019-06-26 20:11:09 -0700133 blobs::OpenFlags::write | FirmwareFlags::UpdateFlags::ipmi;
Patrick Venture9a69f732019-06-17 14:05:13 -0700134
135 std::vector<std::string> startingBlobs = {staticLayoutBlobId, hashBlobId};
Patrick Venture8a4f2aa2019-05-23 08:40:21 -0700136};
137
Patrick Venture1361a122019-05-20 07:36:05 -0700138class IpmiOnlyFirmwareTest : public ::testing::Test
139{
140 protected:
141 ImageHandlerMock imageMock;
142 std::vector<HandlerPack> blobs;
143 std::vector<DataHandlerPack> data = {
Patrick Venture84778b82019-06-26 20:11:09 -0700144 {FirmwareFlags::UpdateFlags::ipmi, nullptr}};
Patrick Venture1d5a31c2019-05-20 11:38:22 -0700145 std::unique_ptr<blobs::GenericBlobInterface> handler;
Patrick Venture1361a122019-05-20 07:36:05 -0700146
147 void SetUp() override
148 {
149 blobs = {
150 {hashBlobId, &imageMock},
151 {"asdf", &imageMock},
152 };
153 handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture6d7735d2019-06-21 10:03:19 -0700154 blobs, data, CreateTriggerMock(), CreateTriggerMock(),
155 CreateTriggerMock());
Patrick Venture1361a122019-05-20 07:36:05 -0700156 }
157};
158
159class FakeLpcFirmwareTest : public ::testing::Test
160{
161 protected:
162 DataHandlerMock dataMock;
163 ImageHandlerMock imageMock;
164 std::vector<HandlerPack> blobs;
165 std::vector<DataHandlerPack> data;
Patrick Venture1d5a31c2019-05-20 11:38:22 -0700166 std::unique_ptr<blobs::GenericBlobInterface> handler;
Patrick Venture1361a122019-05-20 07:36:05 -0700167
168 void SetUp() override
169 {
170 blobs = {
171 {hashBlobId, &imageMock},
172 {"asdf", &imageMock},
173 };
174 data = {
Patrick Venture84778b82019-06-26 20:11:09 -0700175 {FirmwareFlags::UpdateFlags::ipmi, nullptr},
176 {FirmwareFlags::UpdateFlags::lpc, &dataMock},
Patrick Venture1361a122019-05-20 07:36:05 -0700177 };
178 handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
Patrick Venture6d7735d2019-06-21 10:03:19 -0700179 blobs, data, CreateTriggerMock(), CreateTriggerMock(),
180 CreateTriggerMock());
Patrick Venture1361a122019-05-20 07:36:05 -0700181 }
182};
183
Patrick Venture16ab2a12019-05-31 08:52:51 -0700184} // namespace
Patrick Venture1d5a31c2019-05-20 11:38:22 -0700185} // namespace ipmi_flash