Mercurial > irccd
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"