1 /**
2 * The goal of these tests is to verify the behavior of all blob commands given
3 * the current state is notYetStarted. The initial state.
4 */
5 #include "firmware_handler.hpp"
6 #include "firmware_unittest.hpp"
7
8 #include <cstdint>
9 #include <string>
10 #include <vector>
11
12 #include <gtest/gtest.h>
13
14 namespace ipmi_flash
15 {
16 namespace
17 {
18
19 using ::testing::Return;
20 using ::testing::UnorderedElementsAreArray;
21
22 class FirmwareHandlerNotYetStartedTest : public IpmiOnlyFirmwareStaticTest
23 {};
24
25 /*
26 * There are the following calls (parameters may vary):
27 * Note: you cannot have a session yet, so only commands that don't take a
28 * session parameter are valid. Once you open() from this state, we will vary
29 * you transition out of this state (ensuring the above is true). Technically
30 * the firmware handler receives the session number with open(), but the blob
31 * manager is providing this normally.
32 *
33 * canHandleBlob
34 * getBlobIds
35 * deleteBlob
36 * stat
37 * open
38 *
39 * canHandleBlob is just a count check (or something similar) against what is
40 * returned by getBlobIds. It is tested in firmware_canhandle_unittest
41 */
42
43 /*
44 * deleteBlob()
45 */
TEST_F(FirmwareHandlerNotYetStartedTest,DeleteBlobInStateReturnsFalse)46 TEST_F(FirmwareHandlerNotYetStartedTest, DeleteBlobInStateReturnsFalse)
47 {
48 auto blobs = handler->getBlobIds();
49 for (const auto& b : blobs)
50 {
51 EXPECT_FALSE(handler->deleteBlob(b));
52 }
53 }
54
55 /* canHandleBlob, getBlobIds */
TEST_F(FirmwareHandlerNotYetStartedTest,GetBlobListValidateListContents)56 TEST_F(FirmwareHandlerNotYetStartedTest, GetBlobListValidateListContents)
57 {
58 /* By only checking that the hash and static blob ids are present to start
59 * with, we're also verifying others aren't.
60 */
61 EXPECT_THAT(handler->getBlobIds(),
62 UnorderedElementsAreArray(startingBlobs));
63
64 /* Verify canHandleBlob is reading from the same list (basically) */
65 for (const auto& blob : startingBlobs)
66 {
67 EXPECT_TRUE(handler->canHandleBlob(blob));
68 }
69 }
70
71 /* stat(blob_id) */
TEST_F(FirmwareHandlerNotYetStartedTest,StatEachBlobIdVerifyResults)72 TEST_F(FirmwareHandlerNotYetStartedTest, StatEachBlobIdVerifyResults)
73 {
74 /* In this original state, calling stat() on the blob ids will return the
75 * idle status
76 */
77
78 auto blobs = handler->getBlobIds();
79 for (const auto& blob : blobs)
80 {
81 blobs::BlobMeta meta = {};
82 EXPECT_TRUE(handler->stat(blob, &meta));
83 EXPECT_EQ(expectedIdleMeta, meta);
84 }
85 }
86
87 /* open(each blob id) (verifyblobid will no longer be available at this state.
88 */
TEST_F(FirmwareHandlerNotYetStartedTest,OpenStaticImageFileVerifyStateChange)89 TEST_F(FirmwareHandlerNotYetStartedTest, OpenStaticImageFileVerifyStateChange)
90 {
91 EXPECT_CALL(*imageMock2, open(staticLayoutBlobId, std::ios::out))
92 .WillOnce(Return(true));
93 EXPECT_CALL(*prepareMockPtr, trigger()).WillOnce(Return(true));
94
95 EXPECT_TRUE(handler->open(session, flags, staticLayoutBlobId));
96
97 expectedState(FirmwareBlobHandler::UpdateState::uploadInProgress);
98
99 EXPECT_TRUE(handler->canHandleBlob(activeImageBlobId));
100 }
101
TEST_F(FirmwareHandlerNotYetStartedTest,OpenHashFileVerifyStateChange)102 TEST_F(FirmwareHandlerNotYetStartedTest, OpenHashFileVerifyStateChange)
103 {
104 EXPECT_CALL(*hashImageMock, open(hashBlobId, std::ios::out))
105 .WillOnce(Return(true));
106 /* Opening the hash blob id doesn't trigger a preparation, only a firmware
107 * blob.
108 */
109 EXPECT_CALL(*prepareMockPtr, trigger()).Times(0);
110
111 EXPECT_TRUE(handler->open(session, flags, hashBlobId));
112
113 expectedState(FirmwareBlobHandler::UpdateState::uploadInProgress);
114
115 EXPECT_TRUE(handler->canHandleBlob(activeHashBlobId));
116 }
117
118 /*
119 * expire(session)
120 */
TEST_F(FirmwareHandlerNotYetStartedTest,ExpireOnNotYetStartedAbortsProcess)121 TEST_F(FirmwareHandlerNotYetStartedTest, ExpireOnNotYetStartedAbortsProcess)
122 {
123 ASSERT_TRUE(handler->expire(session));
124
125 EXPECT_THAT(handler->getBlobIds(),
126 UnorderedElementsAreArray(startingBlobs));
127
128 expectedState(FirmwareBlobHandler::UpdateState::notYetStarted);
129 }
130
131 } // namespace
132 } // namespace ipmi_flash
133