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>
69936c456SWilliam A. Kennington III #include <string_view>
7c78bfc82SJason Ling #include <vector>
8c78bfc82SJason Ling
9c78bfc82SJason Ling #include <gtest/gtest.h>
109936c456SWilliam A. Kennington III
11c78bfc82SJason Ling using ::testing::_;
129936c456SWilliam A. Kennington III using ::testing::DoAll;
139936c456SWilliam A. Kennington III using ::testing::ElementsAreArray;
149936c456SWilliam A. Kennington III using ::testing::Ge;
15c78bfc82SJason Ling using ::testing::IsEmpty;
16c78bfc82SJason Ling using ::testing::Return;
179936c456SWilliam A. Kennington III
18c78bfc82SJason Ling namespace ipmi_flash
19c78bfc82SJason Ling {
20c78bfc82SJason Ling
21c78bfc82SJason Ling class VersionReadBlobTest : public ::testing::Test
22c78bfc82SJason Ling {
23c78bfc82SJason Ling protected:
SetUp()24c78bfc82SJason Ling void SetUp() override
25c78bfc82SJason Ling {
26abf17354SWilliam A. Kennington III h = std::make_unique<VersionBlobHandler>(
27abf17354SWilliam A. Kennington III createMockVersionConfigs(blobNames, &im, &tm));
28c78bfc82SJason Ling }
29c78bfc82SJason Ling std::unique_ptr<blobs::GenericBlobInterface> h;
30c78bfc82SJason Ling std::vector<std::string> blobNames{"blob0", "blob1", "blob2", "blob3"};
31c78bfc82SJason Ling std::unordered_map<std::string, TriggerMock*> tm;
32c78bfc82SJason Ling std::unordered_map<std::string, ImageHandlerMock*> im;
33c78bfc82SJason Ling const std::uint16_t defaultSessionNumber{200};
34c78bfc82SJason Ling std::vector<uint8_t> vector1{0xDE, 0xAD, 0xBE, 0xEF,
35c78bfc82SJason Ling 0xBA, 0xDF, 0xEE, 0x0D};
369936c456SWilliam A. Kennington III std::vector<uint8_t> vector2{0xCE, 0xAD, 0xDE, 0xFF};
37c78bfc82SJason Ling };
38c78bfc82SJason Ling
TEST_F(VersionReadBlobTest,VerifyValidRead)39c78bfc82SJason Ling TEST_F(VersionReadBlobTest, VerifyValidRead)
40c78bfc82SJason Ling {
419936c456SWilliam A. Kennington III testing::InSequence seq;
429936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger())
439936c456SWilliam A. Kennington III .WillOnce(DoAll([&]() { tm.at("blob0")->cb(*tm.at("blob0")); },
449936c456SWilliam A. Kennington III Return(true)));
45c78bfc82SJason Ling EXPECT_CALL(*tm.at("blob0"), status())
469936c456SWilliam A. Kennington III .WillOnce(Return(ActionStatus::success));
479936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), open(_, std::ios::in)).WillOnce(Return(true));
489936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), read(0, Ge(vector1.size())))
499936c456SWilliam A. Kennington III .WillOnce(Return(vector1));
509936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), close()).Times(1);
51c78bfc82SJason Ling EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
52c78bfc82SJason Ling
539936c456SWilliam A. Kennington III std::basic_string_view<uint8_t> vectorS(vector1.data(), vector1.size());
549936c456SWilliam A. Kennington III EXPECT_THAT(h->read(defaultSessionNumber, 0, 7),
559936c456SWilliam A. Kennington III ElementsAreArray(vectorS.substr(0, 7)));
569936c456SWilliam A. Kennington III EXPECT_THAT(h->read(defaultSessionNumber, 2, 10),
579936c456SWilliam A. Kennington III ElementsAreArray(vectorS.substr(2, 6)));
589936c456SWilliam A. Kennington III EXPECT_THAT(h->read(defaultSessionNumber, 10, 0), IsEmpty());
599936c456SWilliam A. Kennington III }
609936c456SWilliam A. Kennington III
TEST_F(VersionReadBlobTest,VerifyMultipleSession)619936c456SWilliam A. Kennington III TEST_F(VersionReadBlobTest, VerifyMultipleSession)
629936c456SWilliam A. Kennington III {
639936c456SWilliam A. Kennington III testing::InSequence seq;
649936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
659936c456SWilliam A. Kennington III EXPECT_TRUE(h->open(0, blobs::read, "blob0"));
669936c456SWilliam A. Kennington III EXPECT_TRUE(h->open(1, blobs::read, "blob0"));
679936c456SWilliam A. Kennington III
689936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), status())
699936c456SWilliam A. Kennington III .WillOnce(Return(ActionStatus::success));
709936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), open(_, std::ios::in)).WillOnce(Return(true));
719936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), read(0, Ge(vector1.size())))
729936c456SWilliam A. Kennington III .WillOnce(Return(vector1));
739936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), close()).Times(1);
749936c456SWilliam A. Kennington III tm.at("blob0")->cb(*tm.at("blob0"));
759936c456SWilliam A. Kennington III
769936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
779936c456SWilliam A. Kennington III EXPECT_TRUE(h->open(2, blobs::read, "blob0"));
789936c456SWilliam A. Kennington III
799936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), status())
809936c456SWilliam A. Kennington III .WillOnce(Return(ActionStatus::success));
819936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), open(_, std::ios::in)).WillOnce(Return(true));
829936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), read(0, Ge(vector2.size())))
839936c456SWilliam A. Kennington III .WillOnce(Return(vector2));
849936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), close()).Times(1);
859936c456SWilliam A. Kennington III tm.at("blob0")->cb(*tm.at("blob0"));
869936c456SWilliam A. Kennington III
879936c456SWilliam A. Kennington III EXPECT_THAT(h->read(0, 0, 10), ElementsAreArray(vector1));
889936c456SWilliam A. Kennington III EXPECT_THAT(h->read(1, 0, 10), ElementsAreArray(vector1));
899936c456SWilliam A. Kennington III EXPECT_THAT(h->read(2, 0, 10), ElementsAreArray(vector2));
909936c456SWilliam A. Kennington III }
919936c456SWilliam A. Kennington III
TEST_F(VersionReadBlobTest,VerifyReadEarlyFails)929936c456SWilliam A. Kennington III TEST_F(VersionReadBlobTest, VerifyReadEarlyFails)
939936c456SWilliam A. Kennington III {
949936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger()).WillOnce(Return(true));
959936c456SWilliam A. Kennington III
969936c456SWilliam A. Kennington III EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
97*0674a6d7SWilliam A. Kennington III EXPECT_THROW(h->read(defaultSessionNumber, 0, 10), std::runtime_error);
98c78bfc82SJason Ling }
99c78bfc82SJason Ling
TEST_F(VersionReadBlobTest,VerifyTriggerFailureReadFails)100c78bfc82SJason Ling TEST_F(VersionReadBlobTest, VerifyTriggerFailureReadFails)
101c78bfc82SJason Ling {
1029936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger())
1039936c456SWilliam A. Kennington III .WillOnce(DoAll([&]() { tm.at("blob0")->cb(*tm.at("blob0")); },
1049936c456SWilliam A. Kennington III Return(true)));
105c78bfc82SJason Ling EXPECT_CALL(*tm.at("blob0"), status())
106c78bfc82SJason Ling .WillOnce(Return(ActionStatus::failed));
107c78bfc82SJason Ling EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
108*0674a6d7SWilliam A. Kennington III EXPECT_THROW(h->read(defaultSessionNumber, 0, 10), std::runtime_error);
109c78bfc82SJason Ling }
110c78bfc82SJason Ling
TEST_F(VersionReadBlobTest,VerifyReadFailsOnFileOpenFailure)1119936c456SWilliam A. Kennington III TEST_F(VersionReadBlobTest, VerifyReadFailsOnFileOpenFailure)
112c78bfc82SJason Ling {
1139936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger())
1149936c456SWilliam A. Kennington III .WillOnce(DoAll([&]() { tm.at("blob0")->cb(*tm.at("blob0")); },
1159936c456SWilliam A. Kennington III Return(true)));
116c78bfc82SJason Ling EXPECT_CALL(*tm.at("blob0"), status())
117c78bfc82SJason Ling .WillOnce(Return(ActionStatus::success));
1189936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), open(_, std::ios::in)).WillOnce(Return(false));
119c78bfc82SJason Ling
120c78bfc82SJason Ling EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
121*0674a6d7SWilliam A. Kennington III EXPECT_THROW(h->read(defaultSessionNumber, 0, 10), std::runtime_error);
122c78bfc82SJason Ling }
123c78bfc82SJason Ling
TEST_F(VersionReadBlobTest,VerifyReadFailsOnFileReadFailure)1249936c456SWilliam A. Kennington III TEST_F(VersionReadBlobTest, VerifyReadFailsOnFileReadFailure)
125c78bfc82SJason Ling {
1269936c456SWilliam A. Kennington III EXPECT_CALL(*tm.at("blob0"), trigger())
1279936c456SWilliam A. Kennington III .WillOnce(DoAll([&]() { tm.at("blob0")->cb(*tm.at("blob0")); },
1289936c456SWilliam A. Kennington III Return(true)));
129c78bfc82SJason Ling EXPECT_CALL(*tm.at("blob0"), status())
130c78bfc82SJason Ling .WillOnce(Return(ActionStatus::success));
1319936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), open(_, std::ios::in)).WillOnce(Return(true));
1329936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), read(_, _)).WillOnce(Return(std::nullopt));
1339936c456SWilliam A. Kennington III EXPECT_CALL(*im.at("blob0"), close()).Times(1);
134c78bfc82SJason Ling
135c78bfc82SJason Ling EXPECT_TRUE(h->open(defaultSessionNumber, blobs::read, "blob0"));
136*0674a6d7SWilliam A. Kennington III EXPECT_THROW(h->read(defaultSessionNumber, 0, 10), std::runtime_error);
137c78bfc82SJason Ling }
138c78bfc82SJason Ling
139c78bfc82SJason Ling } // namespace ipmi_flash
140