1*ded66d0fSJason Ling #include "data_mock.hpp"
2*ded66d0fSJason Ling #include "firmware_handler.hpp"
3*ded66d0fSJason Ling #include "firmware_unittest.hpp"
4*ded66d0fSJason Ling #include "image_mock.hpp"
5*ded66d0fSJason Ling #include "triggerable_mock.hpp"
6*ded66d0fSJason Ling #include "util.hpp"
7*ded66d0fSJason Ling 
8*ded66d0fSJason Ling #include <memory>
9*ded66d0fSJason Ling #include <vector>
10*ded66d0fSJason Ling 
11*ded66d0fSJason Ling #include <gmock/gmock.h>
12*ded66d0fSJason Ling #include <gtest/gtest.h>
13*ded66d0fSJason Ling 
14*ded66d0fSJason Ling namespace ipmi_flash
15*ded66d0fSJason Ling {
16*ded66d0fSJason Ling namespace
17*ded66d0fSJason Ling {
18*ded66d0fSJason Ling 
19*ded66d0fSJason Ling using ::testing::Return;
20*ded66d0fSJason Ling using ::testing::StrEq;
21*ded66d0fSJason Ling 
22*ded66d0fSJason Ling class FirmwareHandlerCloseTest : public FakeLpcFirmwareTest
23*ded66d0fSJason Ling {};
24*ded66d0fSJason Ling 
25*ded66d0fSJason Ling TEST_F(FirmwareHandlerCloseTest, CloseSucceedsWithDataHandler)
26*ded66d0fSJason Ling {
27*ded66d0fSJason Ling     /* Boring test where you open a blob_id, then verify that when it's closed
28*ded66d0fSJason Ling      * everything looks right.
29*ded66d0fSJason Ling      */
30*ded66d0fSJason Ling     EXPECT_CALL(*dataMock, open()).WillOnce(Return(true));
31*ded66d0fSJason Ling     EXPECT_CALL(*hashImageMock, open(StrEq(hashBlobId))).WillOnce(Return(true));
32*ded66d0fSJason Ling 
33*ded66d0fSJason Ling     EXPECT_TRUE(handler->open(
34*ded66d0fSJason Ling         0, blobs::OpenFlags::write | FirmwareFlags::UpdateFlags::lpc,
35*ded66d0fSJason Ling         hashBlobId));
36*ded66d0fSJason Ling 
37*ded66d0fSJason Ling     /* The active hash blob_id was added. */
38*ded66d0fSJason Ling     auto currentBlobs = handler->getBlobIds();
39*ded66d0fSJason Ling     EXPECT_EQ(3, currentBlobs.size());
40*ded66d0fSJason Ling     EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
41*ded66d0fSJason Ling                             activeHashBlobId));
42*ded66d0fSJason Ling 
43*ded66d0fSJason Ling     /* Set up close() expectations. */
44*ded66d0fSJason Ling     EXPECT_CALL(*dataMock, close());
45*ded66d0fSJason Ling     EXPECT_CALL(*hashImageMock, close());
46*ded66d0fSJason Ling     EXPECT_TRUE(handler->close(0));
47*ded66d0fSJason Ling 
48*ded66d0fSJason Ling     /* Close does not delete the active blob id.  This indicates that there is
49*ded66d0fSJason Ling      * data queued.
50*ded66d0fSJason Ling      */
51*ded66d0fSJason Ling }
52*ded66d0fSJason Ling 
53*ded66d0fSJason Ling TEST_F(FirmwareHandlerCloseTest, CloseSucceedsWithoutDataHandler)
54*ded66d0fSJason Ling {
55*ded66d0fSJason Ling     /* Boring test where you open a blob_id using ipmi, so there's no data
56*ded66d0fSJason Ling      * handler, and it's closed and everything looks right.
57*ded66d0fSJason Ling      */
58*ded66d0fSJason Ling     EXPECT_CALL(*hashImageMock, open(StrEq(hashBlobId))).WillOnce(Return(true));
59*ded66d0fSJason Ling 
60*ded66d0fSJason Ling     EXPECT_TRUE(handler->open(
61*ded66d0fSJason Ling         0, blobs::OpenFlags::write | FirmwareFlags::UpdateFlags::ipmi,
62*ded66d0fSJason Ling         hashBlobId));
63*ded66d0fSJason Ling 
64*ded66d0fSJason Ling     /* The active hash blob_id was added. */
65*ded66d0fSJason Ling     auto currentBlobs = handler->getBlobIds();
66*ded66d0fSJason Ling     EXPECT_EQ(3, currentBlobs.size());
67*ded66d0fSJason Ling     EXPECT_EQ(1, std::count(currentBlobs.begin(), currentBlobs.end(),
68*ded66d0fSJason Ling                             activeHashBlobId));
69*ded66d0fSJason Ling 
70*ded66d0fSJason Ling     /* Set up close() expectations. */
71*ded66d0fSJason Ling     EXPECT_CALL(*hashImageMock, close());
72*ded66d0fSJason Ling     EXPECT_TRUE(handler->close(0));
73*ded66d0fSJason Ling }
74*ded66d0fSJason Ling 
75*ded66d0fSJason Ling } // namespace
76*ded66d0fSJason Ling } // namespace ipmi_flash
77