diff options
author | Patrick Venture <venture@google.com> | 2018-11-21 14:19:28 -0800 |
---|---|---|
committer | Patrick Venture <venture@google.com> | 2018-11-28 08:47:53 -0800 |
commit | c18e2b649691e393f0c6e0fcd9af288b68d7d9b5 (patch) | |
tree | 50b0ea97c204c1b43d32303f8a3ce0b115eaf98f /test/utils_unittest.cpp | |
parent | 2536863d32314250b94794143d6cadaf8e8c86fe (diff) | |
download | phosphor-ipmi-blobs-c18e2b649691e393f0c6e0fcd9af288b68d7d9b5.tar.gz phosphor-ipmi-blobs-c18e2b649691e393f0c6e0fcd9af288b68d7d9b5.zip |
add dynamic library interface to enable testing
Add interface defining the methods for dynamic linking to enable
testing.
Change-Id: If4d090d3cedc019b426435a1f651191803bfc1a9
Signed-off-by: Patrick Venture <venture@google.com>
Diffstat (limited to 'test/utils_unittest.cpp')
-rw-r--r-- | test/utils_unittest.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/test/utils_unittest.cpp b/test/utils_unittest.cpp new file mode 100644 index 0000000..8a0cdca --- /dev/null +++ b/test/utils_unittest.cpp @@ -0,0 +1,96 @@ +#include "dlsys_mock.hpp" +#include "fs.hpp" +#include "utils.hpp" + +#include <blobs-ipmid/test/blob_mock.hpp> +#include <blobs-ipmid/test/manager_mock.hpp> +#include <experimental/filesystem> +#include <memory> +#include <string> +#include <vector> + +#include <gtest/gtest.h> + +namespace fs = std::experimental::filesystem; + +namespace blobs +{ +using ::testing::_; +using ::testing::Return; +using ::testing::StrEq; +using ::testing::StrictMock; + +std::vector<std::string>* returnList = nullptr; + +std::vector<std::string> getLibraryList(const std::string& path, + PathMatcher check) +{ + return (returnList) ? *returnList : std::vector<std::string>(); +} + +std::unique_ptr<GenericBlobInterface> factoryReturn; + +std::unique_ptr<GenericBlobInterface> fakeFactory() +{ + return std::move(factoryReturn); +} + +TEST(UtilLoadLibraryTest, NoFilesFound) +{ + /* Verify nothing special happens when there are no files found. */ + + StrictMock<internal::InternalDlSysMock> dlsys; + StrictMock<ManagerMock> manager; + + loadLibraries(&manager, "", &dlsys); +} + +TEST(UtilLoadLibraryTest, OneFileFoundIsLibrary) +{ + /* Verify if it finds a library, and everything works, it'll regsiter it. + */ + + std::vector<std::string> files = {"this.fake"}; + returnList = &files; + + StrictMock<internal::InternalDlSysMock> dlsys; + StrictMock<ManagerMock> manager; + void* handle = reinterpret_cast<void*>(0x01); + auto blobMock = std::make_unique<BlobMock>(); + + factoryReturn = std::move(blobMock); + + EXPECT_CALL(dlsys, dlopen(_, _)).WillOnce(Return(handle)); + + EXPECT_CALL(dlsys, dlerror()).Times(2).WillRepeatedly(Return(nullptr)); + + EXPECT_CALL(dlsys, dlsym(handle, StrEq("createHandler"))) + .WillOnce(Return(reinterpret_cast<void*>(fakeFactory))); + + EXPECT_CALL(manager, registerHandler(_)); + + loadLibraries(&manager, "", &dlsys); +} + +TEST(UtilLibraryMatchTest, TestAll) +{ + struct LibraryMatch + { + std::string name; + bool expectation; + }; + + std::vector<LibraryMatch> tests = { + {"libblobcmds.0.0.1", false}, {"libblobcmds.0.0", false}, + {"libblobcmds.0", false}, {"libblobcmds.10", false}, + {"libblobcmds.a", false}, {"libcmds.so.so.0", true}, + {"libcmds.so.0", true}, {"libcmds.so.0.0", false}, + {"libcmds.so.0.0.10", false}, {"libblobs.so.1000", true}}; + + for (const auto& test : tests) + { + EXPECT_EQ(test.expectation, matchBlobHandler(test.name)); + } +} + +} // namespace blobs |