plugin_loader_unit.cpp
Go to the documentation of this file.
1 
28 #include <gtest/gtest.h>
30 
31 #include <boost_plugin_loader/plugin_loader.hpp>
32 #include <boost_plugin_loader/utils.h>
33 #include "test_plugin_base.h"
34 
35 TEST(TesseractClassLoaderUnit, parseEnvironmentVariableListUnit) // NOLINT
36 {
37 #ifndef _WIN32
38  std::string env_var = "UNITTESTENV=a:b:c";
39 #else
40  std::string env_var = "UNITTESTENV=a;b;c";
41 #endif
42  putenv(env_var.data());
43  std::set<std::string> s = boost_plugin_loader::parseEnvironmentVariableList("UNITTESTENV");
44  std::vector<std::string> v(s.begin(), s.end());
45  EXPECT_EQ(v[0], "a");
46  EXPECT_EQ(v[1], "b");
47  EXPECT_EQ(v[2], "c");
48 }
49 
50 TEST(TesseractClassLoaderUnit, LoadTestPlugin) // NOLINT
51 {
53  const std::string lib_name = "tesseract_common_test_plugin_multiply";
54  const std::string lib_dir = std::string(TEST_PLUGIN_DIR);
55  const std::string symbol_name = "plugin";
56 
57  // Load the library
58  const std::optional<boost::dll::shared_library> lib_opt =
59  boost_plugin_loader::loadLibrary(boost::filesystem::path(lib_dir) / lib_name);
60  EXPECT_TRUE(lib_opt.has_value());
61  const boost::dll::shared_library& lib = lib_opt.value(); // NOLINT
62 
63  {
64  std::vector<std::string> sections = boost_plugin_loader::getAllAvailableSections(lib);
65  EXPECT_EQ(sections.size(), 1);
66  EXPECT_EQ(sections.at(0), "TestBase");
67 
68  sections = boost_plugin_loader::getAllAvailableSections(lib, true);
69  EXPECT_TRUE(sections.size() > 1);
70  }
71 
72  {
73  std::vector<std::string> symbols = boost_plugin_loader::getAllAvailableSymbols(lib, "TestBase");
74  EXPECT_EQ(symbols.size(), 1);
75  EXPECT_EQ(symbols.at(0), symbol_name);
76  }
77 
78  {
79  // NOLINTNEXTLINE
80  EXPECT_ANY_THROW(boost_plugin_loader::createSharedInstance<TestPluginBase>(lib, "does_not_exist"));
81  }
82 }
83 
84 TEST(TesseractPluginLoaderUnit, LoadTestPlugin) // NOLINT
85 {
86  using boost_plugin_loader::PluginLoader;
88 
89  {
90  PluginLoader plugin_loader;
91  plugin_loader.search_paths.insert(std::string(TEST_PLUGIN_DIR));
92  plugin_loader.search_libraries.insert("tesseract_common_test_plugin_multiply");
93 
94  EXPECT_TRUE(plugin_loader.isPluginAvailable("plugin"));
95  auto plugin = plugin_loader.createInstance<TestPluginBase>("plugin");
96  EXPECT_TRUE(plugin != nullptr);
97  EXPECT_NEAR(plugin->multiply(5, 5), 25, 1e-8);
98 
99  std::vector<std::string> sections = plugin_loader.getAvailableSections();
100  EXPECT_EQ(sections.size(), 1);
101  EXPECT_EQ(sections.at(0), "TestBase");
102 
103  sections = plugin_loader.getAvailableSections(true);
104  EXPECT_TRUE(sections.size() > 1);
105 
106  std::vector<std::string> symbols = plugin_loader.getAvailablePlugins<TestPluginBase>();
107  EXPECT_EQ(symbols.size(), 1);
108  EXPECT_EQ(symbols.at(0), "plugin");
109 
110  symbols = plugin_loader.getAvailablePlugins("TestBase");
111  EXPECT_EQ(symbols.size(), 1);
112  EXPECT_EQ(symbols.at(0), "plugin");
113  }
114 
115  // For some reason on Ubuntu 18.04 it does not search the current directory when only the library name is provided
116  // #if BOOST_VERSION > 106800 && !__APPLE__
117  // {
118  // PluginLoader plugin_loader;
119  // plugin_loader.search_paths.insert(".");
120  // plugin_loader.search_libraries.insert("tesseract_common_test_plugin_multiply");
121 
122  // EXPECT_TRUE(plugin_loader.isPluginAvailable("plugin"));
123  // auto plugin = plugin_loader.createInstance<TestPluginBase>("plugin");
124  // EXPECT_TRUE(plugin != nullptr);
125  // EXPECT_NEAR(plugin->multiply(5, 5), 25, 1e-8);
126  // }
127  // #endif
128 
129  {
130  PluginLoader plugin_loader;
131  plugin_loader.search_system_folders = false;
132  plugin_loader.search_paths.insert("does_not_exist");
133  plugin_loader.search_libraries.insert("tesseract_common_test_plugin_multiply");
134 
135  {
136  EXPECT_FALSE(plugin_loader.isPluginAvailable("plugin"));
137  EXPECT_ANY_THROW(plugin_loader.createInstance<TestPluginBase>("plugin")); // NOLINT
138  }
139  }
140 
141  {
142  PluginLoader plugin_loader;
143  plugin_loader.search_system_folders = false;
144  plugin_loader.search_libraries.insert("tesseract_common_test_plugin_multiply");
145 
146  {
147  EXPECT_FALSE(plugin_loader.isPluginAvailable("does_not_exist"));
148  EXPECT_ANY_THROW(plugin_loader.createInstance<TestPluginBase>("does_not_exist")); // NOLINT
149  }
150 
151  plugin_loader.search_system_folders = true;
152 
153  {
154  EXPECT_FALSE(plugin_loader.isPluginAvailable("does_not_exist"));
155  EXPECT_ANY_THROW(plugin_loader.createInstance<TestPluginBase>("does_not_exist")); // NOLINT
156  }
157  }
158 
159  {
160  PluginLoader plugin_loader;
161  plugin_loader.search_system_folders = false;
162  plugin_loader.search_libraries.insert("does_not_exist");
163 
164  {
165  EXPECT_FALSE(plugin_loader.isPluginAvailable("plugin"));
166  EXPECT_ANY_THROW(plugin_loader.createInstance<TestPluginBase>("plugin")); // NOLINT
167  }
168 
169  plugin_loader.search_system_folders = true;
170 
171  {
172  EXPECT_FALSE(plugin_loader.isPluginAvailable("plugin"));
173  EXPECT_ANY_THROW(plugin_loader.createInstance<TestPluginBase>("plugin")); // NOLINT
174  }
175  }
176 
177  {
178  PluginLoader plugin_loader;
179  EXPECT_ANY_THROW(plugin_loader.isPluginAvailable("plugin")); // NOLINT
180  EXPECT_ANY_THROW(plugin_loader.createInstance<TestPluginBase>("plugin")); // NOLINT
181  }
182 
183  {
184  PluginLoader plugin_loader;
185  plugin_loader.search_system_folders = false;
186  EXPECT_ANY_THROW(plugin_loader.isPluginAvailable("plugin")); // NOLINT
187  EXPECT_ANY_THROW(plugin_loader.createInstance<TestPluginBase>("plugin")); // NOLINT
188  }
189 }
190 
191 int main(int argc, char** argv)
192 {
193  testing::InitGoogleTest(&argc, argv);
194 
195  return RUN_ALL_TESTS();
196 }
macros.h
Common Tesseract Macros.
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
Definition: macros.h:71
test_plugin_base.h
Plugin Test plugin base class.
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: macros.h:72
TEST
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH TESSERACT_COMMON_IGNORE_WARNINGS_POP TEST(TesseractClassLoaderUnit, parseEnvironmentVariableListUnit)
Definition: plugin_loader_unit.cpp:35
main
int main(int argc, char **argv)
Definition: plugin_loader_unit.cpp:191
tesseract_common::TestPluginBase
Definition: test_plugin_base.h:34


tesseract_common
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:40