1 #include "version_handler.hpp"
2 #include "version_mock.hpp"
3
4 #include <memory>
5 #include <string>
6 #include <unordered_map>
7 #include <vector>
8
9 #include <gtest/gtest.h>
10
11 using ::testing::Return;
12
13 namespace ipmi_flash
14 {
15
16 class VersionOpenBlobTest : public ::testing::Test
17 {
18 protected:
SetUp()19 void SetUp() override
20 {
21 h = std::make_unique<VersionBlobHandler>(
22 createMockVersionConfigs(blobNames, &im, &tm));
23 }
24
25 std::unique_ptr<blobs::GenericBlobInterface> h;
26 std::vector<std::string> blobNames{"blob0", "blob1", "blob2", "blob3"};
27 std::unordered_map<std::string, TriggerMock*> tm;
28 std::unordered_map<std::string, ImageHandlerMock*> im;
29 const std::uint16_t defaultSessionNumber{0};
30 };
31
TEST_F(VersionOpenBlobTest,VerifySingleBlobOpen)32 TEST_F(VersionOpenBlobTest, VerifySingleBlobOpen)
33 {
34 EXPECT_CALL(*tm.at("blob0"), trigger()).Times(1).WillOnce(Return(true));
35 EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
36 }
37
TEST_F(VersionOpenBlobTest,VerifyMultipleBlobOpens)38 TEST_F(VersionOpenBlobTest, VerifyMultipleBlobOpens)
39 {
40 for (const auto& [_, val] : tm)
41 {
42 /* set the expectation that every onOpen will be triggered */
43 EXPECT_CALL(*val, trigger()).WillOnce(Return(true));
44 }
45 int i{defaultSessionNumber};
46 for (const auto& blob : blobNames)
47 {
48 EXPECT_TRUE(h->open(i++, blobs::read, blob));
49 }
50 }
51
TEST_F(VersionOpenBlobTest,VerifyOpenAfterClose)52 TEST_F(VersionOpenBlobTest, VerifyOpenAfterClose)
53 {
54 EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
55 EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
56
57 EXPECT_CALL(*tm.at("blob0"), abort()).Times(1);
58 EXPECT_TRUE(h->close(defaultSessionNumber));
59
60 EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
61 EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
62 }
63
TEST_F(VersionOpenBlobTest,VerifyMultiOpenWorks)64 TEST_F(VersionOpenBlobTest, VerifyMultiOpenWorks)
65 {
66 EXPECT_CALL(*tm.at("blob1"), trigger()).WillOnce(Return(true));
67 EXPECT_TRUE(h->open(0, blobs::read, "blob1"));
68 EXPECT_TRUE(h->open(1, blobs::read, "blob1"));
69 EXPECT_TRUE(h->open(2, blobs::read, "blob1"));
70 }
71
TEST_F(VersionOpenBlobTest,VerifyFailedTriggerFails)72 TEST_F(VersionOpenBlobTest, VerifyFailedTriggerFails)
73 {
74 EXPECT_CALL(*tm.at("blob1"), trigger()).WillOnce(Return(false));
75 EXPECT_FALSE(h->open(0, blobs::read, "blob1"));
76 EXPECT_CALL(*tm.at("blob1"), trigger()).WillOnce(Return(true));
77 EXPECT_TRUE(h->open(0, blobs::read, "blob1"));
78 }
79
TEST_F(VersionOpenBlobTest,VerifyUnsupportedOpenFlagsFails)80 TEST_F(VersionOpenBlobTest, VerifyUnsupportedOpenFlagsFails)
81 {
82 EXPECT_FALSE(h->open(0, blobs::write, "blob1"));
83 EXPECT_CALL(*tm.at("blob1"), trigger()).WillOnce(Return(true));
84 EXPECT_TRUE(h->open(0, blobs::read, "blob1"));
85 }
86
87 } // namespace ipmi_flash
88