184bff8beSJason Ling #include "create_action_map.hpp"
2ded66d0fSJason Ling #include "data_mock.hpp"
3ded66d0fSJason Ling #include "firmware_handler.hpp"
4ded66d0fSJason Ling #include "flags.hpp"
5ded66d0fSJason Ling #include "image_mock.hpp"
6ded66d0fSJason Ling #include "util.hpp"
7ded66d0fSJason Ling 
8ded66d0fSJason Ling #include <memory>
9ded66d0fSJason Ling #include <vector>
10ded66d0fSJason Ling 
11ded66d0fSJason Ling #include <gtest/gtest.h>
12ded66d0fSJason Ling 
13ded66d0fSJason Ling namespace ipmi_flash
14ded66d0fSJason Ling {
15ded66d0fSJason Ling namespace
16ded66d0fSJason Ling {
17ded66d0fSJason Ling 
18ded66d0fSJason Ling using ::testing::Return;
19ded66d0fSJason Ling using ::testing::StrEq;
20ded66d0fSJason Ling 
21ded66d0fSJason Ling class FirmwareHandlerCommitTest : public ::testing::Test
22ded66d0fSJason Ling {
23ded66d0fSJason Ling   protected:
24ded66d0fSJason Ling     ImageHandlerMock *imageMock1, *imageMock2;
25ded66d0fSJason Ling     std::vector<HandlerPack> blobs;
26ded66d0fSJason Ling     std::vector<DataHandlerPack> data;
27ded66d0fSJason Ling 
SetUp()28ded66d0fSJason Ling     void SetUp() override
29ded66d0fSJason Ling     {
30ded66d0fSJason Ling         std::unique_ptr<ImageHandlerInterface> image =
31ded66d0fSJason Ling             std::make_unique<ImageHandlerMock>();
32ded66d0fSJason Ling         imageMock1 = reinterpret_cast<ImageHandlerMock*>(image.get());
33ded66d0fSJason Ling         blobs.emplace_back(hashBlobId, std::move(image));
34ded66d0fSJason Ling 
35ded66d0fSJason Ling         image = std::make_unique<ImageHandlerMock>();
36ded66d0fSJason Ling         imageMock2 = reinterpret_cast<ImageHandlerMock*>(image.get());
37ded66d0fSJason Ling         blobs.emplace_back("asdf", std::move(image));
38ded66d0fSJason Ling 
39ded66d0fSJason Ling         data.emplace_back(FirmwareFlags::UpdateFlags::ipmi, nullptr);
40ded66d0fSJason Ling     }
41ded66d0fSJason Ling };
42ded66d0fSJason Ling 
TEST_F(FirmwareHandlerCommitTest,VerifyCannotCommitOnFlashImage)43ded66d0fSJason Ling TEST_F(FirmwareHandlerCommitTest, VerifyCannotCommitOnFlashImage)
44ded66d0fSJason Ling {
45ded66d0fSJason Ling     /* Verify the flash image returns failure on this command.  It's a fairly
46ded66d0fSJason Ling      * artificial test.
47ded66d0fSJason Ling      */
48ded66d0fSJason Ling     auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
49ded66d0fSJason Ling         std::move(blobs), std::move(data), CreateActionMap("asdf"));
50ded66d0fSJason Ling 
5156a2273fSJason Ling     EXPECT_CALL(*imageMock2, open("asdf", std::ios::out))
5256a2273fSJason Ling         .WillOnce(Return(true));
53ded66d0fSJason Ling 
54*b487eb47SWilly Tu     EXPECT_TRUE(
55*b487eb47SWilly Tu         handler->open(0,
56*b487eb47SWilly Tu                       static_cast<std::uint16_t>(blobs::OpenFlags::write) |
57*b487eb47SWilly Tu                           FirmwareFlags::UpdateFlags::ipmi,
58*b487eb47SWilly Tu                       "asdf"));
59ded66d0fSJason Ling 
60ded66d0fSJason Ling     EXPECT_FALSE(handler->commit(0, {}));
61ded66d0fSJason Ling }
62ded66d0fSJason Ling 
TEST_F(FirmwareHandlerCommitTest,VerifyCannotCommitOnHashFile)63ded66d0fSJason Ling TEST_F(FirmwareHandlerCommitTest, VerifyCannotCommitOnHashFile)
64ded66d0fSJason Ling {
65ded66d0fSJason Ling     /* Verify the hash file returns failure on this command.  It's a fairly
66ded66d0fSJason Ling      * artificial test.
67ded66d0fSJason Ling      */
68ded66d0fSJason Ling     auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
69ded66d0fSJason Ling         std::move(blobs), std::move(data), CreateActionMap("asdf"));
70ded66d0fSJason Ling 
7156a2273fSJason Ling     EXPECT_CALL(*imageMock1, open(StrEq(hashBlobId), std::ios::out))
7256a2273fSJason Ling         .WillOnce(Return(true));
73ded66d0fSJason Ling 
74*b487eb47SWilly Tu     EXPECT_TRUE(
75*b487eb47SWilly Tu         handler->open(0,
76*b487eb47SWilly Tu                       static_cast<std::uint16_t>(blobs::OpenFlags::write) |
77*b487eb47SWilly Tu                           FirmwareFlags::UpdateFlags::ipmi,
78ded66d0fSJason Ling                       hashBlobId));
79ded66d0fSJason Ling 
80ded66d0fSJason Ling     EXPECT_FALSE(handler->commit(0, {}));
81ded66d0fSJason Ling }
82ded66d0fSJason Ling 
83ded66d0fSJason Ling } // namespace
84ded66d0fSJason Ling } // namespace ipmi_flash
85