1c78bfc82SJason Ling #include "version_handler.hpp"
2abf17354SWilliam A. Kennington III #include "version_mock.hpp"
3c78bfc82SJason Ling
4abf17354SWilliam A. Kennington III #include <memory>
5c78bfc82SJason Ling #include <string>
6abf17354SWilliam A. Kennington III #include <unordered_map>
7c78bfc82SJason Ling #include <vector>
8c78bfc82SJason Ling
9c78bfc82SJason Ling #include <gtest/gtest.h>
10abf17354SWilliam A. Kennington III
11c78bfc82SJason Ling using ::testing::Return;
12abf17354SWilliam A. Kennington III
13c78bfc82SJason Ling namespace ipmi_flash
14c78bfc82SJason Ling {
15c78bfc82SJason Ling
16c78bfc82SJason Ling class VersionOpenBlobTest : public ::testing::Test
17c78bfc82SJason Ling {
18c78bfc82SJason Ling protected:
SetUp()19c78bfc82SJason Ling void SetUp() override
20c78bfc82SJason Ling {
21abf17354SWilliam A. Kennington III h = std::make_unique<VersionBlobHandler>(
22abf17354SWilliam A. Kennington III createMockVersionConfigs(blobNames, &im, &tm));
23c78bfc82SJason Ling }
24abf17354SWilliam 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 const std::uint16_t defaultSessionNumber{0};
30c78bfc82SJason Ling };
31c78bfc82SJason Ling
TEST_F(VersionOpenBlobTest,VerifySingleBlobOpen)32c78bfc82SJason Ling TEST_F(VersionOpenBlobTest, VerifySingleBlobOpen)
33c78bfc82SJason Ling {
34c78bfc82SJason Ling EXPECT_CALL(*tm.at("blob0"), trigger()).Times(1).WillOnce(Return(true));
35c78bfc82SJason Ling EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
36c78bfc82SJason Ling }
37c78bfc82SJason Ling
TEST_F(VersionOpenBlobTest,VerifyMultipleBlobOpens)38c78bfc82SJason Ling TEST_F(VersionOpenBlobTest, VerifyMultipleBlobOpens)
39c78bfc82SJason Ling {
40007c0166SWilliam A. Kennington III for (const auto& [_, val] : tm)
41c78bfc82SJason Ling {
42c78bfc82SJason Ling /* set the expectation that every onOpen will be triggered */
43007c0166SWilliam A. Kennington III EXPECT_CALL(*val, trigger()).WillOnce(Return(true));
44c78bfc82SJason Ling }
45c78bfc82SJason Ling int i{defaultSessionNumber};
46c78bfc82SJason Ling for (const auto& blob : blobNames)
47c78bfc82SJason Ling {
48c78bfc82SJason Ling EXPECT_TRUE(h->open(i++, blobs::read, blob));
49c78bfc82SJason Ling }
50c78bfc82SJason Ling }
51c78bfc82SJason Ling
TEST_F(VersionOpenBlobTest,VerifyOpenAfterClose)52c78bfc82SJason Ling TEST_F(VersionOpenBlobTest, VerifyOpenAfterClose)
53c78bfc82SJason Ling {
54007c0166SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
55c78bfc82SJason Ling EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
56007c0166SWilliam A. Kennington III
57007c0166SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), abort()).Times(1);
58c78bfc82SJason Ling EXPECT_TRUE(h->close(defaultSessionNumber));
59007c0166SWilliam A. Kennington III
60007c0166SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
61c78bfc82SJason Ling EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
62c78bfc82SJason Ling }
63c78bfc82SJason Ling
TEST_F(VersionOpenBlobTest,VerifyMultiOpenWorks)64*9936c456SWilliam A. Kennington III TEST_F(VersionOpenBlobTest, VerifyMultiOpenWorks)
65c78bfc82SJason Ling {
66007c0166SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob1"), trigger()).WillOnce(Return(true));
67c78bfc82SJason Ling EXPECT_TRUE(h->open(0, blobs::read, "blob1"));
68*9936c456SWilliam A. Kennington III EXPECT_TRUE(h->open(1, blobs::read, "blob1"));
69*9936c456SWilliam A. Kennington III EXPECT_TRUE(h->open(2, blobs::read, "blob1"));
70c78bfc82SJason Ling }
71c78bfc82SJason Ling
TEST_F(VersionOpenBlobTest,VerifyFailedTriggerFails)72c78bfc82SJason Ling TEST_F(VersionOpenBlobTest, VerifyFailedTriggerFails)
73c78bfc82SJason Ling {
74007c0166SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob1"), trigger()).WillOnce(Return(false));
75c78bfc82SJason Ling EXPECT_FALSE(h->open(0, blobs::read, "blob1"));
76007c0166SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob1"), trigger()).WillOnce(Return(true));
77c78bfc82SJason Ling EXPECT_TRUE(h->open(0, blobs::read, "blob1"));
78c78bfc82SJason Ling }
79c78bfc82SJason Ling
TEST_F(VersionOpenBlobTest,VerifyUnsupportedOpenFlagsFails)80c78bfc82SJason Ling TEST_F(VersionOpenBlobTest, VerifyUnsupportedOpenFlagsFails)
81c78bfc82SJason Ling {
82c78bfc82SJason Ling EXPECT_FALSE(h->open(0, blobs::write, "blob1"));
83007c0166SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob1"), trigger()).WillOnce(Return(true));
84c78bfc82SJason Ling EXPECT_TRUE(h->open(0, blobs::read, "blob1"));
85c78bfc82SJason Ling }
86c78bfc82SJason Ling
87c78bfc82SJason Ling } // namespace ipmi_flash
88