changeset 871:dbd611105f57

tests: add plugin-service test, closes #742 @3h
author David Demelier <markand@malikania.fr>
date Fri, 26 Jul 2019 21:30:00 +0000
parents 2b335166e641
children fbed78ca4a25
files libirccd-daemon/irccd/daemon/plugin_service.cpp libirccd-daemon/irccd/daemon/plugin_service.hpp tests/src/libirccd-daemon/CMakeLists.txt tests/src/libirccd-daemon/plugin-service/CMakeLists.txt tests/src/libirccd-daemon/plugin-service/main.cpp tests/src/libirccd-daemon/plugin-service/options.conf tests/src/libirccd-daemon/plugin-service/paths.conf tests/src/libirccd-daemon/plugin-service/templates.conf
diffstat 8 files changed, 228 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/libirccd-daemon/irccd/daemon/plugin_service.cpp	Fri Jul 26 11:20:19 2019 +0000
+++ b/libirccd-daemon/irccd/daemon/plugin_service.cpp	Fri Jul 26 21:30:00 2019 +0000
@@ -116,7 +116,7 @@
 
 auto plugin_service::get_templates(std::string_view id) -> plugin::map
 {
-	return to_map(bot_.get_config(), str(format("format.%1%") % id));
+	return to_map(bot_.get_config(), str(format("templates.%1%") % id));
 }
 
 auto plugin_service::get_paths(std::string_view id) -> plugin::map
--- a/libirccd-daemon/irccd/daemon/plugin_service.hpp	Fri Jul 26 11:20:19 2019 +0000
+++ b/libirccd-daemon/irccd/daemon/plugin_service.hpp	Fri Jul 26 21:30:00 2019 +0000
@@ -156,8 +156,8 @@
 	/**
 	 * Generic function for opening the plugin at the given path.
 	 *
-	 * This function will search for every pluginLoader and call open() on it,
-	 * the first one that success will be returned.
+	 * This function will search for every plugin_loader and call open() on
+	 * it the first one that success will be returned.
 	 *
 	 * \param id the plugin id
 	 * \param path the path to the file
--- a/tests/src/libirccd-daemon/CMakeLists.txt	Fri Jul 26 11:20:19 2019 +0000
+++ b/tests/src/libirccd-daemon/CMakeLists.txt	Fri Jul 26 21:30:00 2019 +0000
@@ -47,9 +47,10 @@
 add_subdirectory(dynlib-plugin)
 add_subdirectory(irc)
 add_subdirectory(logger)
+add_subdirectory(plugin-service)
+add_subdirectory(rule-service)
 add_subdirectory(rule-util)
 add_subdirectory(server)
 add_subdirectory(server-util)
 add_subdirectory(server-service)
-add_subdirectory(rule-service)
 add_subdirectory(transports)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/src/libirccd-daemon/plugin-service/CMakeLists.txt	Fri Jul 26 21:30:00 2019 +0000
@@ -0,0 +1,23 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2019 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+irccd_define_test(
+	NAME plugin-service
+	SOURCES main.cpp
+	LIBRARIES libirccd-daemon
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/src/libirccd-daemon/plugin-service/main.cpp	Fri Jul 26 21:30:00 2019 +0000
@@ -0,0 +1,178 @@
+/*
+ * main.cpp -- test plugin_service object
+ *
+ * Copyright (c) 2013-2019 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#define BOOST_TEST_MODULE "plugin_service"
+#include <boost/test/unit_test.hpp>
+
+#include <irccd/daemon/dynlib_plugin.hpp>
+#include <irccd/daemon/plugin_service.hpp>
+
+#include <irccd/test/irccd_fixture.hpp>
+#include <irccd/test/mock_plugin.hpp>
+#include <irccd/test/test_plugin_loader.hpp>
+
+namespace test = irccd::test;
+
+namespace irccd::daemon {
+
+namespace {
+
+BOOST_FIXTURE_TEST_SUITE(plugin_test_suite, test::irccd_fixture)
+
+BOOST_AUTO_TEST_CASE(add)
+{
+	bot_.get_plugins().add(std::make_shared<test::mock_plugin>("p1"));
+	bot_.get_plugins().add(std::make_shared<test::mock_plugin>("p2"));
+
+	BOOST_TEST(bot_.get_plugins().list().size() == 2U);
+	BOOST_TEST(bot_.get_plugins().list()[0]->get_id() == "p1");
+	BOOST_TEST(bot_.get_plugins().list()[1]->get_id() == "p2");
+}
+
+BOOST_AUTO_TEST_CASE(get)
+{
+	bot_.get_plugins().add(std::make_shared<test::mock_plugin>("p1"));
+	bot_.get_plugins().add(std::make_shared<test::mock_plugin>("p2"));
+
+	BOOST_TEST(bot_.get_plugins().get("p1"));
+	BOOST_TEST(bot_.get_plugins().get("p2"));
+	BOOST_TEST(!bot_.get_plugins().get("none"));
+}
+
+BOOST_AUTO_TEST_CASE(require)
+{
+	bot_.get_plugins().add(std::make_shared<test::mock_plugin>("p1"));
+	bot_.get_plugins().add(std::make_shared<test::mock_plugin>("p2"));
+
+	BOOST_TEST(bot_.get_plugins().require("p1"));
+	BOOST_TEST(bot_.get_plugins().require("p2"));
+	BOOST_REQUIRE_THROW(bot_.get_plugins().require("none"), plugin_error);
+}
+
+BOOST_AUTO_TEST_CASE(get_options)
+{
+	bot_.set_config(config{CMAKE_CURRENT_SOURCE_DIR "/options.conf"});
+
+	BOOST_TEST(bot_.get_plugins().get_options("p1").size() == 1U);
+	BOOST_TEST(bot_.get_plugins().get_options("p1")["difficulty"] == "extreme");
+}
+
+BOOST_AUTO_TEST_CASE(get_templates)
+{
+	bot_.set_config(config{CMAKE_CURRENT_SOURCE_DIR "/templates.conf"});
+
+	BOOST_TEST(bot_.get_plugins().get_templates("p1").size() == 1U);
+	BOOST_TEST(bot_.get_plugins().get_templates("p1")["win"] == "congratulations, you've won");
+}
+
+BOOST_AUTO_TEST_CASE(get_paths)
+{
+	bot_.set_config(config{CMAKE_CURRENT_SOURCE_DIR "/paths.conf"});
+
+	BOOST_TEST(bot_.get_plugins().get_paths("p1").size() == 3U);
+	BOOST_TEST(bot_.get_plugins().get_paths("p1")["cache"] == "/var/super-cache");
+	BOOST_TEST(bot_.get_plugins().get_paths("p1")["config"] == "/etc/plugin/p1");
+	BOOST_TEST(bot_.get_plugins().get_paths("p1")["data"] == "/share/plugin/p1");
+
+	BOOST_TEST(bot_.get_plugins().get_paths("p2").size() == 3U);
+	BOOST_TEST(bot_.get_plugins().get_paths("p2")["cache"] == "/var/cache/plugin/p2");
+	BOOST_TEST(bot_.get_plugins().get_paths("p2")["config"] == "/super-etc");
+	BOOST_TEST(bot_.get_plugins().get_paths("p2")["data"] == "/share/plugin/p2");
+
+	BOOST_TEST(bot_.get_plugins().get_paths("p3").size() == 3U);
+	BOOST_TEST(bot_.get_plugins().get_paths("p3")["cache"] == "/var/cache/plugin/p3");
+	BOOST_TEST(bot_.get_plugins().get_paths("p3")["config"] == "/etc/plugin/p3");
+	BOOST_TEST(bot_.get_plugins().get_paths("p3")["data"] == "/super-share");
+
+	BOOST_TEST(bot_.get_plugins().get_paths("all").size() == 3U);
+	BOOST_TEST(bot_.get_plugins().get_paths("all")["cache"] == "/var/super-cache");
+	BOOST_TEST(bot_.get_plugins().get_paths("all")["config"] == "/super-etc");
+	BOOST_TEST(bot_.get_plugins().get_paths("all")["data"] == "/super-share");
+}
+
+BOOST_AUTO_TEST_CASE(open)
+{
+	bot_.get_plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
+	bot_.get_plugins().add_loader(std::make_unique<test::test_plugin_loader>());
+
+	BOOST_TEST(bot_.get_plugins().open("mock", ""));
+}
+
+BOOST_AUTO_TEST_CASE(load)
+{
+	bot_.get_plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
+	bot_.get_plugins().add_loader(std::make_unique<test::test_plugin_loader>());
+	bot_.get_plugins().load("mock", "");
+
+	BOOST_TEST(bot_.get_plugins().list().size() == 1U);
+
+	const auto mock = std::dynamic_pointer_cast<test::mock_plugin>(bot_.get_plugins().get("mock"));
+
+	BOOST_TEST(mock);
+	BOOST_TEST(mock->find("handle_load").size() == 1U);
+}
+
+BOOST_AUTO_TEST_CASE(unload)
+{
+	bot_.get_plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
+	bot_.get_plugins().add_loader(std::make_unique<test::test_plugin_loader>());
+	bot_.get_plugins().load("mock", "");
+
+	const auto mock = std::dynamic_pointer_cast<test::mock_plugin>(bot_.get_plugins().get("mock"));
+
+	bot_.get_plugins().unload("mock");
+
+	BOOST_TEST(bot_.get_plugins().list().empty());
+	BOOST_TEST(mock);
+	BOOST_TEST(mock->find("handle_unload").size() == 1U);
+}
+
+BOOST_AUTO_TEST_CASE(reload)
+{
+	bot_.get_plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
+	bot_.get_plugins().add_loader(std::make_unique<test::test_plugin_loader>());
+	bot_.get_plugins().load("mock", "");
+	bot_.get_plugins().reload("mock");
+
+	BOOST_TEST(bot_.get_plugins().list().size() == 1U);
+
+	const auto mock = std::dynamic_pointer_cast<test::mock_plugin>(bot_.get_plugins().get("mock"));
+
+	BOOST_TEST(mock);
+	BOOST_TEST(mock->find("handle_reload").size() == 1U);
+}
+
+BOOST_AUTO_TEST_CASE(clear)
+{
+	auto m1 = std::make_shared<test::mock_plugin>("m1");
+	auto m2 = std::make_shared<test::mock_plugin>("m2");
+
+	bot_.get_plugins().add(m1);
+	bot_.get_plugins().add(m2);
+	bot_.get_plugins().clear();
+
+	BOOST_TEST(bot_.get_plugins().list().empty());
+	BOOST_TEST(m1->find("handle_unload").size() == 1U);
+	BOOST_TEST(m2->find("handle_unload").size() == 1U);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // !namespace
+
+} // !irccd::daemon
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/src/libirccd-daemon/plugin-service/options.conf	Fri Jul 26 21:30:00 2019 +0000
@@ -0,0 +1,2 @@
+[plugin.p1]
+difficulty = "extreme"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/src/libirccd-daemon/plugin-service/paths.conf	Fri Jul 26 21:30:00 2019 +0000
@@ -0,0 +1,18 @@
+[paths]
+cache = "/var/cache"
+data = "/share"
+config = "/etc"
+
+[paths.p1]
+cache = "/var/super-cache"
+
+[paths.p2]
+config = "/super-etc"
+
+[paths.p3]
+data = "/super-share"
+
+[paths.all]
+cache = "/var/super-cache"
+config = "/super-etc"
+data = "/super-share"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/src/libirccd-daemon/plugin-service/templates.conf	Fri Jul 26 21:30:00 2019 +0000
@@ -0,0 +1,2 @@
+[templates.p1]
+win = "congratulations, you've won"