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