blob: e8bd1037b5bc7b7aba89d667c27b507399987238 [file] [log] [blame]
Patrick Venture16ab2a12019-05-31 08:52:51 -07001/* The goal of these tests is to verify the behavior of all blob commands given
2 * the current state is updateStarted. This state is achieved as an exit from
3 * updatePending.
4 */
5#include "firmware_handler.hpp"
6#include "firmware_unittest.hpp"
7#include "status.hpp"
8#include "util.hpp"
9
10#include <cstdint>
11#include <string>
12#include <vector>
13
14#include <gtest/gtest.h>
15
16namespace ipmi_flash
17{
18namespace
19{
20
Patrick Venture73e2bdf2019-05-31 11:21:52 -070021using ::testing::IsEmpty;
Patrick Venture16ab2a12019-05-31 08:52:51 -070022using ::testing::Return;
Patrick Ventured9a95782019-05-31 10:46:56 -070023using ::testing::UnorderedElementsAreArray;
Patrick Venture16ab2a12019-05-31 08:52:51 -070024
25/*
26 * There are the following calls (parameters may vary):
27 * canHandleBlob(blob)
28 * getBlobIds
29 * deleteBlob(blob)
30 * stat(blob)
31 * stat(session)
32 * open(blob)
33 * close(session)
34 * writemeta(session)
35 * write(session)
36 * read(session)
37 * commit(session)
38 */
39
40class FirmwareHandlerUpdateStartedTest : public IpmiOnlyFirmwareStaticTest
41{
42};
43
Patrick Venturef515b9c2019-05-31 10:38:16 -070044/*
45 * open(blob)
46 */
47TEST_F(FirmwareHandlerUpdateStartedTest, AttemptToOpenFilesReturnsFailure)
48{
49 /* In state updateStarted a file is open, which means no others can be. */
50 getToUpdateStarted();
51
52 auto blobsToOpen = handler->getBlobIds();
53 for (const auto& blob : blobsToOpen)
54 {
55 EXPECT_FALSE(handler->open(session + 1, flags, blob));
56 }
57}
58
Patrick Venture16ab2a12019-05-31 08:52:51 -070059/* canHandleBlob(blob)
60 * getBlobIds
61 */
Patrick Ventured9a95782019-05-31 10:46:56 -070062TEST_F(FirmwareHandlerUpdateStartedTest, VerifyListOfBlobs)
63{
64 getToUpdateStarted();
65
66 std::vector<std::string> expected = {updateBlobId, hashBlobId,
67 activeImageBlobId, staticLayoutBlobId};
68 EXPECT_THAT(handler->getBlobIds(), UnorderedElementsAreArray(expected));
69}
Patrick Venture16ab2a12019-05-31 08:52:51 -070070
71/*
Patrick Venturebcc0c772019-06-17 10:42:06 -070072 * deleteBlob(blob)
Patrick Venture16ab2a12019-05-31 08:52:51 -070073 */
Patrick Venturebcc0c772019-06-17 10:42:06 -070074TEST_F(FirmwareHandlerUpdateStartedTest, DeleteBlobReturnsFalse)
75{
76 /* Try deleting all blobs, it doesn't really matter which though because you
77 * cannot close out an open session, therefore you must fail to delete
78 * anything unless everything is closed.
79 */
80 getToUpdateStarted();
81 auto blobs = handler->getBlobIds();
82 for (const auto& b : blobs)
83 {
84 EXPECT_FALSE(handler->deleteBlob(b));
85 }
86}
Patrick Venture16ab2a12019-05-31 08:52:51 -070087
88/*
89 * stat(blob)
90 */
Patrick Venturefc34cfa2019-05-31 11:02:51 -070091TEST_F(FirmwareHandlerUpdateStartedTest, StatOnActiveImageReturnsFailure)
92{
93 getToUpdateStarted();
94
95 ASSERT_TRUE(handler->canHandleBlob(activeImageBlobId));
96
97 blobs::BlobMeta meta;
98 EXPECT_FALSE(handler->stat(activeImageBlobId, &meta));
99}
100
101TEST_F(FirmwareHandlerUpdateStartedTest, StatOnUpdateBlobReturnsFailure)
102{
103 getToUpdateStarted();
104
105 ASSERT_TRUE(handler->canHandleBlob(updateBlobId));
106
107 blobs::BlobMeta meta;
108 EXPECT_FALSE(handler->stat(updateBlobId, &meta));
109}
110
111TEST_F(FirmwareHandlerUpdateStartedTest, StatOnNormalBlobsReturnsSuccess)
112{
113 getToUpdateStarted();
114
115 blobs::BlobMeta expected;
116 expected.blobState = FirmwareBlobHandler::UpdateFlags::ipmi;
117 expected.size = 0;
118
119 std::vector<std::string> testBlobs = {staticLayoutBlobId, hashBlobId};
120 for (const auto& blob : testBlobs)
121 {
122 ASSERT_TRUE(handler->canHandleBlob(blob));
123
124 blobs::BlobMeta meta = {};
125 EXPECT_TRUE(handler->stat(blob, &meta));
126 EXPECT_EQ(expected, meta);
127 }
128}
Patrick Venture16ab2a12019-05-31 08:52:51 -0700129
130/*
Patrick Venture16ab2a12019-05-31 08:52:51 -0700131 * writemeta(session)
132 */
Patrick Ventureb6ce52b2019-05-31 11:16:41 -0700133TEST_F(FirmwareHandlerUpdateStartedTest, WriteMetaToUpdateBlobReturnsFailure)
134{
135 getToUpdateStarted();
136 EXPECT_FALSE(handler->writeMeta(session, 0, {0x01}));
137}
Patrick Venture16ab2a12019-05-31 08:52:51 -0700138
139/*
140 * write(session)
141 */
Patrick Venture575118d2019-05-31 11:20:35 -0700142TEST_F(FirmwareHandlerUpdateStartedTest, WriteToUpdateBlobReturnsFailure)
143{
144 getToUpdateStarted();
145 EXPECT_FALSE(handler->write(session, 0, {0x01}));
146}
Patrick Venture16ab2a12019-05-31 08:52:51 -0700147
148/*
149 * read(session)
150 */
Patrick Venture73e2bdf2019-05-31 11:21:52 -0700151TEST_F(FirmwareHandlerUpdateStartedTest, ReadFromUpdateBlobReturnsEmpty)
152{
153 getToUpdateStarted();
154 EXPECT_THAT(handler->read(session, 0, 1), IsEmpty());
155}
Patrick Venture16ab2a12019-05-31 08:52:51 -0700156
157/*
Patrick Venture0079d892019-05-31 11:27:44 -0700158 * commit(session)
159 */
160TEST_F(FirmwareHandlerUpdateStartedTest,
161 CallingCommitShouldReturnTrueAndHaveNoEffect)
162{
163 getToUpdateStarted();
Patrick Venture1d66fe62019-06-03 14:57:27 -0700164 EXPECT_CALL(*updateMockPtr, trigger()).Times(0);
Patrick Venture0079d892019-05-31 11:27:44 -0700165
166 EXPECT_TRUE(handler->commit(session, {}));
167 expectedState(FirmwareBlobHandler::UpdateState::updateStarted);
168}
169
170/*
Patrick Ventureb6ce52b2019-05-31 11:16:41 -0700171 * stat(session) - this will trigger a check, and the state may change.
172 */
Patrick Venturef1f0f652019-06-03 09:10:19 -0700173TEST_F(FirmwareHandlerUpdateStartedTest,
Patrick Ventureda66fd82019-06-03 11:11:24 -0700174 CallStatChecksActionStatusReturnsRunningDoesNotChangeState)
Patrick Venturef1f0f652019-06-03 09:10:19 -0700175{
176 getToUpdateStarted();
177 EXPECT_CALL(*updateMockPtr, status())
Patrick Ventureda66fd82019-06-03 11:11:24 -0700178 .WillOnce(Return(ActionStatus::running));
Patrick Venturef1f0f652019-06-03 09:10:19 -0700179
180 blobs::BlobMeta meta, expectedMeta = {};
181 expectedMeta.size = 0;
182 expectedMeta.blobState = flags | blobs::StateFlags::committing;
183 expectedMeta.metadata.push_back(
Patrick Ventureda66fd82019-06-03 11:11:24 -0700184 static_cast<std::uint8_t>(ActionStatus::running));
Patrick Venturef1f0f652019-06-03 09:10:19 -0700185
186 EXPECT_TRUE(handler->stat(session, &meta));
187 EXPECT_EQ(expectedMeta, meta);
188 expectedState(FirmwareBlobHandler::UpdateState::updateStarted);
189}
190
191TEST_F(FirmwareHandlerUpdateStartedTest,
Patrick Ventureda66fd82019-06-03 11:11:24 -0700192 CallStatChecksActionStatusReturnsFailedChangesStateToCompleted)
Patrick Venturef1f0f652019-06-03 09:10:19 -0700193{
194 getToUpdateStarted();
195 EXPECT_CALL(*updateMockPtr, status())
Patrick Ventureda66fd82019-06-03 11:11:24 -0700196 .WillOnce(Return(ActionStatus::failed));
Patrick Venturef1f0f652019-06-03 09:10:19 -0700197
198 blobs::BlobMeta meta, expectedMeta = {};
199 expectedMeta.size = 0;
200 expectedMeta.blobState = flags | blobs::StateFlags::commit_error;
201 expectedMeta.metadata.push_back(
Patrick Ventureda66fd82019-06-03 11:11:24 -0700202 static_cast<std::uint8_t>(ActionStatus::failed));
Patrick Venturef1f0f652019-06-03 09:10:19 -0700203
204 EXPECT_TRUE(handler->stat(session, &meta));
205 EXPECT_EQ(expectedMeta, meta);
206 expectedState(FirmwareBlobHandler::UpdateState::updateCompleted);
207}
208
209TEST_F(FirmwareHandlerUpdateStartedTest,
Patrick Ventureda66fd82019-06-03 11:11:24 -0700210 CallStatChecksActionStatusReturnsSuccessChangesStateToCompleted)
Patrick Venturef1f0f652019-06-03 09:10:19 -0700211{
212 getToUpdateStarted();
213 EXPECT_CALL(*updateMockPtr, status())
Patrick Ventureda66fd82019-06-03 11:11:24 -0700214 .WillOnce(Return(ActionStatus::success));
Patrick Venturef1f0f652019-06-03 09:10:19 -0700215
216 blobs::BlobMeta meta, expectedMeta = {};
217 expectedMeta.size = 0;
218 expectedMeta.blobState = flags | blobs::StateFlags::committed;
219 expectedMeta.metadata.push_back(
Patrick Ventureda66fd82019-06-03 11:11:24 -0700220 static_cast<std::uint8_t>(ActionStatus::success));
Patrick Venturef1f0f652019-06-03 09:10:19 -0700221
222 EXPECT_TRUE(handler->stat(session, &meta));
223 EXPECT_EQ(expectedMeta, meta);
224 expectedState(FirmwareBlobHandler::UpdateState::updateCompleted);
225}
Patrick Ventureb6ce52b2019-05-31 11:16:41 -0700226
227/*
Patrick Venture49731712019-06-17 10:04:02 -0700228 * close(session) - this will abort.
Patrick Ventureb6ce52b2019-05-31 11:16:41 -0700229 */
Patrick Venture49731712019-06-17 10:04:02 -0700230TEST_F(FirmwareHandlerUpdateStartedTest, CloseOnUpdateDuringUpdateAbortsProcess)
231{
232 getToUpdateStarted();
233 EXPECT_CALL(*updateMockPtr, abort()).Times(1);
234
235 EXPECT_TRUE(handler->close(session));
236
237 std::vector<std::string> expectedBlobs = {staticLayoutBlobId, hashBlobId};
238
239 EXPECT_THAT(handler->getBlobIds(),
240 UnorderedElementsAreArray(expectedBlobs));
241
242 expectedState(FirmwareBlobHandler::UpdateState::notYetStarted);
243}
Patrick Ventureb6ce52b2019-05-31 11:16:41 -0700244
Patrick Venture16ab2a12019-05-31 08:52:51 -0700245} // namespace
246} // namespace ipmi_flash