1c78bfc82SJason Ling #include "version_handler.hpp"
2*abf17354SWilliam A. Kennington III #include "version_mock.hpp"
3c78bfc82SJason Ling 
4*abf17354SWilliam A. Kennington III #include <memory>
5c78bfc82SJason Ling #include <string>
6c78bfc82SJason Ling #include <vector>
7c78bfc82SJason Ling 
8c78bfc82SJason Ling #include <gtest/gtest.h>
9*abf17354SWilliam A. Kennington III 
10c78bfc82SJason Ling using ::testing::_;
11c78bfc82SJason Ling using ::testing::Return;
12*abf17354SWilliam A. Kennington III 
13c78bfc82SJason Ling namespace ipmi_flash
14c78bfc82SJason Ling {
15c78bfc82SJason Ling 
16c78bfc82SJason Ling class VersionCloseExpireBlobTest : public ::testing::Test
17c78bfc82SJason Ling {
18c78bfc82SJason Ling   protected:
19c78bfc82SJason Ling     void SetUp() override
20c78bfc82SJason Ling     {
21*abf17354SWilliam A. Kennington III         h = std::make_unique<VersionBlobHandler>(
22*abf17354SWilliam A. Kennington III             createMockVersionConfigs(blobNames, &im, &tm));
23c78bfc82SJason Ling     }
24*abf17354SWilliam A. Kennington III 
25c78bfc82SJason Ling     std::unique_ptr<blobs::GenericBlobInterface> h;
26c78bfc82SJason Ling     std::vector<std::string> blobNames{"blob0", "blob1", "blob2", "blob3"};
27c78bfc82SJason Ling     std::unordered_map<std::string, TriggerMock*> tm;
28c78bfc82SJason Ling     std::unordered_map<std::string, ImageHandlerMock*> im;
29c78bfc82SJason Ling };
30c78bfc82SJason Ling 
31c78bfc82SJason Ling TEST_F(VersionCloseExpireBlobTest, VerifyOpenThenClose)
32c78bfc82SJason Ling {
33*abf17354SWilliam A. Kennington III     EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
34c78bfc82SJason Ling     EXPECT_CALL(*tm.at("blob0"), status())
35c78bfc82SJason Ling         .WillOnce(Return(ActionStatus::success));
36c78bfc82SJason Ling     EXPECT_TRUE(h->open(0, blobs::read, "blob0"));
37c78bfc82SJason Ling     EXPECT_TRUE(h->close(0));
38c78bfc82SJason Ling }
39c78bfc82SJason Ling 
40c78bfc82SJason Ling TEST_F(VersionCloseExpireBlobTest, VerifyUnopenedBlobCloseFails)
41c78bfc82SJason Ling {
42c78bfc82SJason Ling     EXPECT_FALSE(h->close(0));
43c78bfc82SJason Ling }
44c78bfc82SJason Ling 
45c78bfc82SJason Ling TEST_F(VersionCloseExpireBlobTest, VerifyDoubleCloseFails)
46c78bfc82SJason Ling {
47*abf17354SWilliam A. Kennington III     EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
48c78bfc82SJason Ling     EXPECT_CALL(*tm.at("blob0"), status())
49c78bfc82SJason Ling         .WillOnce(Return(ActionStatus::success));
50c78bfc82SJason Ling     EXPECT_TRUE(h->open(0, blobs::read, "blob0"));
51c78bfc82SJason Ling     EXPECT_TRUE(h->close(0));
52c78bfc82SJason Ling     EXPECT_FALSE(h->close(0));
53c78bfc82SJason Ling }
54c78bfc82SJason Ling 
55c78bfc82SJason Ling TEST_F(VersionCloseExpireBlobTest, VerifyBadSessionNumberCloseFails)
56c78bfc82SJason Ling {
57*abf17354SWilliam A. Kennington III     EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
58c78bfc82SJason Ling     EXPECT_CALL(*tm.at("blob0"), status())
59c78bfc82SJason Ling         .WillOnce(Return(ActionStatus::success));
60c78bfc82SJason Ling     EXPECT_TRUE(h->open(0, blobs::read, "blob0"));
61c78bfc82SJason Ling     EXPECT_FALSE(h->close(1));
62c78bfc82SJason Ling     EXPECT_TRUE(h->close(0));
63c78bfc82SJason Ling }
64c78bfc82SJason Ling 
65c78bfc82SJason Ling TEST_F(VersionCloseExpireBlobTest, VerifyRunningActionIsAborted)
66c78bfc82SJason Ling {
67*abf17354SWilliam A. Kennington III     EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
68c78bfc82SJason Ling     EXPECT_CALL(*tm.at("blob0"), status())
69c78bfc82SJason Ling         .WillOnce(Return(ActionStatus::running));
70c78bfc82SJason Ling     EXPECT_CALL(*tm.at("blob0"), abort()).Times(1);
71c78bfc82SJason Ling     EXPECT_TRUE(h->open(0, blobs::read, "blob0"));
72c78bfc82SJason Ling     EXPECT_TRUE(h->close(0));
73c78bfc82SJason Ling }
74c78bfc82SJason Ling 
75c78bfc82SJason Ling } // namespace ipmi_flash
76