xref: /openbmc/phosphor-ipmi-flash/tools/test/tools_updater_unittest.cpp (revision 380832ccf6d9986cd2e993a6c463da97eadf7997)
1 #include "data_interface_mock.hpp"
2 #include "updater.hpp"
3 #include "updater_mock.hpp"
4 #include "util.hpp"
5 
6 #include <blobs-ipmid/blobs.hpp>
7 #include <ipmiblob/test/blob_interface_mock.hpp>
8 #include <string>
9 
10 #include <gtest/gtest.h>
11 
12 namespace host_tool
13 {
14 
15 using ::testing::_;
16 using ::testing::Eq;
17 using ::testing::Return;
18 using ::testing::StrEq;
19 using ::testing::TypedEq;
20 
21 TEST(UpdaterTest, CheckAvailableSuccess)
22 {
23     /* Call checkAvailable directly() to make sure it works. */
24     DataInterfaceMock handlerMock;
25     ipmiblob::BlobInterfaceMock blobMock;
26 
27     ipmiblob::StatResponse statObj;
28     statObj.blob_state = ipmi_flash::FirmwareBlobHandler::UpdateFlags::ipmi |
29                          ipmi_flash::FirmwareBlobHandler::UpdateFlags::lpc;
30     statObj.size = 0;
31 
32     EXPECT_CALL(blobMock, getBlobList())
33         .WillOnce(
34             Return(std::vector<std::string>({ipmi_flash::staticLayoutBlobId})));
35     EXPECT_CALL(blobMock, getStat(TypedEq<const std::string&>(
36                               ipmi_flash::staticLayoutBlobId)))
37         .WillOnce(Return(statObj));
38 
39     EXPECT_CALL(handlerMock, supportedType())
40         .WillOnce(Return(ipmi_flash::FirmwareBlobHandler::UpdateFlags::lpc));
41 
42     UpdateHandler updater(&blobMock, &handlerMock);
43     EXPECT_TRUE(updater.checkAvailable(ipmi_flash::staticLayoutBlobId));
44 }
45 
46 TEST(UpdaterTest, SendFileSuccess)
47 {
48     /* Call sendFile to verify it does what we expect. */
49     DataInterfaceMock handlerMock;
50     ipmiblob::BlobInterfaceMock blobMock;
51 
52     std::string firmwareImage = "image.bin";
53 
54     std::uint16_t supported =
55         static_cast<std::uint16_t>(
56             ipmi_flash::FirmwareBlobHandler::UpdateFlags::lpc) |
57         static_cast<std::uint16_t>(blobs::OpenFlags::write);
58     std::uint16_t session = 0xbeef;
59 
60     EXPECT_CALL(handlerMock, supportedType())
61         .WillOnce(Return(ipmi_flash::FirmwareBlobHandler::UpdateFlags::lpc));
62 
63     EXPECT_CALL(
64         blobMock,
65         openBlob(StrEq(ipmi_flash::staticLayoutBlobId.c_str()), supported))
66         .WillOnce(Return(session));
67 
68     EXPECT_CALL(handlerMock,
69                 sendContents(StrEq(firmwareImage.c_str()), session))
70         .WillOnce(Return(true));
71 
72     EXPECT_CALL(blobMock, closeBlob(session)).Times(1);
73 
74     UpdateHandler updater(&blobMock, &handlerMock);
75     updater.sendFile(ipmi_flash::staticLayoutBlobId, firmwareImage);
76 }
77 
78 #if 0 /* TODO: fix this up. */
79 TEST(UpdaterTest, NormalWalkthroughAllHappy)
80 {
81     /* Call updaterMain and have everything respond happily. */
82     DataInterfaceMock handlerMock;
83     ipmiblob::BlobInterfaceMock blobMock;
84 
85     UpdateHandlerMock updaterMock;
86 
87     std::string firmwareImage = "image.bin";
88     std::string signatureFile = "image.sig";
89 
90     std::vector<std::string> blobList = {ipmi_flash::staticLayoutBlobId};
91     ipmiblob::StatResponse statObj;
92     statObj.blob_state = ipmi_flash::FirmwareBlobHandler::UpdateFlags::ipmi |
93                          ipmi_flash::FirmwareBlobHandler::UpdateFlags::lpc;
94     statObj.size = 0;
95     std::uint16_t supported =
96         static_cast<std::uint16_t>(
97             ipmi_flash::FirmwareBlobHandler::UpdateFlags::lpc) |
98         static_cast<std::uint16_t>(blobs::OpenFlags::write);
99     std::uint16_t session = 0xbeef;
100 
101     EXPECT_CALL(blobMock, getBlobList()).WillOnce(Return(blobList));
102 
103     EXPECT_CALL(blobMock, getStat(TypedEq<const std::string&>(ipmi_flash::staticLayoutBlobId)))
104         .WillOnce(Return(statObj));
105 
106     EXPECT_CALL(handlerMock, supportedType())
107         .WillOnce(Return(ipmi_flash::FirmwareBlobHandler::UpdateFlags::lpc));
108 
109     EXPECT_CALL(blobMock, openBlob(StrEq(ipmi_flash::staticLayoutBlobId.c_str()), Eq(supported)))
110         .WillOnce(Return(session));
111 
112     EXPECT_CALL(handlerMock,
113                 sendContents(StrEq(firmwareImage.c_str()), Eq(session)))
114         .WillOnce(Return(true));
115 
116     EXPECT_CALL(blobMock, openBlob(StrEq(blobs::hashBlobId.c_str()), Eq(supported)))
117         .WillOnce(Return(session));
118 
119     EXPECT_CALL(handlerMock,
120                 sendContents(StrEq(signatureFile.c_str()), Eq(session)))
121         .WillOnce(Return(true));
122 
123     EXPECT_CALL(blobMock,
124                 openBlob(StrEq(blobs::verifyBlobId.c_str()), Eq(supported)))
125         .WillOnce(Return(session));
126 
127     EXPECT_CALL(blobMock, commit(session, _)).WillOnce(Return());
128 
129     ipmiblob::StatResponse verificationResponse;
130     verificationResponse.blob_state = supported | blobs::StateFlags::committing;
131     verificationResponse.size = 0;
132     verificationResponse.metadata.push_back(static_cast<std::uint8_t>(
133         ipmi_flash::FirmwareBlobHandler::ActionStatus::success));
134 
135     EXPECT_CALL(blobMock, getStat(TypedEq<std::uint16_t>(session)))
136         .WillOnce(Return(verificationResponse));
137 
138     updaterMain(&blobMock, &handlerMock, firmwareImage, signatureFile);
139 }
140 #endif
141 
142 } // namespace host_tool
143