changeset 350:287e9ede5eef

Tests: unbreak some
author David Demelier <markand@malikania.fr>
date Mon, 14 Nov 2016 13:11:16 +0100
parents 56475d6c1c30
children 15da984ce7ea
files irccd/main.cpp libcommon/CMakeLists.txt libirccd-js/CMakeLists.txt libirccd-js/irccd/mod-plugin.cpp libirccd-test/CMakeLists.txt libirccd-test/irccd/plugin-tester.cpp libirccd-test/irccd/plugin-tester.hpp libirccd/CMakeLists.txt tests/CMakeLists.txt tests/command/CMakeLists.txt tests/command/main.cpp tests/js-elapsedtimer/CMakeLists.txt tests/js-elapsedtimer/main.cpp tests/js-file/CMakeLists.txt tests/js-file/main.cpp tests/js-irccd/CMakeLists.txt tests/js-irccd/main.cpp tests/js-logger/CMakeLists.txt tests/js-logger/main.cpp tests/js-system/CMakeLists.txt tests/js-system/main.cpp tests/js-timer/CMakeLists.txt tests/js-timer/main.cpp tests/js-unicode/CMakeLists.txt tests/js-unicode/main.cpp tests/js-util/CMakeLists.txt tests/js-util/main.cpp tests/path/main.cpp tests/plugin-ask/main.cpp tests/plugin-auth/main.cpp tests/plugin-hangman/main.cpp tests/plugin-history/main.cpp tests/plugin-logger/main.cpp tests/plugin-plugin/main.cpp tests/rules/main.cpp tests/timer/CMakeLists.txt
diffstat 36 files changed, 238 insertions(+), 297 deletions(-) [+]
line wrap: on
line diff
--- a/irccd/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/irccd/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -300,10 +300,10 @@
 #if defined(WITH_JS)
     auto loader = std::make_unique<JsPluginLoader>(*instance);
 
+    loader->addModule(std::make_unique<IrccdModule>());
     loader->addModule(std::make_unique<DirectoryModule>());
     loader->addModule(std::make_unique<ElapsedTimerModule>());
     loader->addModule(std::make_unique<FileModule>());
-    loader->addModule(std::make_unique<IrccdModule>());
     loader->addModule(std::make_unique<LoggerModule>());
     loader->addModule(std::make_unique<PluginModule>());
     loader->addModule(std::make_unique<ServerModule>());
--- a/libcommon/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/libcommon/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -40,5 +40,7 @@
         $<$<BOOL:${WITH_SSL}>:OpenSSL::Crypto>
     PUBLIC_INCLUDES
         $<BUILD_INTERFACE:${IRCCD_FAKEROOTDIR}/include/irccd>
+        $<BUILD_INTERFACE:${IRCCD_FAKEROOTDIR}/include>
         $<BUILD_INTERFACE:${libcommon_SOURCE_DIR}/irccd>
+        $<BUILD_INTERFACE:${libcommon_SOURCE_DIR}>
 )
--- a/libirccd-js/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/libirccd-js/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -45,5 +45,7 @@
         ${HEADERS}
         ${SOURCES}
     LIBRARIES extern-duktape libirccd
-    PUBLIC_INCLUDES ${libirccd-js_SOURCE_DIR}/irccd
+    PUBLIC_INCLUDES
+        $<BUILD_INTERFACE:${libirccd-js_SOURCE_DIR}/irccd>
+        $<BUILD_INTERFACE:${libirccd-js_SOURCE_DIR}>
 )
--- a/libirccd-js/irccd/mod-plugin.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/libirccd-js/irccd/mod-plugin.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -187,30 +187,28 @@
  */
 duk_idx_t info(duk_context *ctx)
 {
-#if 0
-    std::shared_ptr<Plugin> plugin;
+    Plugin *plugin = nullptr;
 
     if (duk_get_top(ctx) >= 1)
-        plugin = dukx_get_irccd(ctx).plugins().get(duk_require_string(ctx, 0));
+        plugin = dukx_get_irccd(ctx).plugins().get(duk_require_string(ctx, 0)).get();
     else
-        plugin = dukx_get_plugin(ctx);
+        plugin = &dukx_get_plugin(ctx);
 
     if (!plugin)
         return 0;
 
     duk_push_object(ctx);
-    dukx_push_std_string(ctx, plugin.name());
+    dukx_push_std_string(ctx, plugin->name());
     duk_put_prop_string(ctx, -2, "name");
-    dukx_push_std_string(ctx, plugin.author());
+    dukx_push_std_string(ctx, plugin->author());
     duk_put_prop_string(ctx, -2, "author");
-    dukx_push_std_string(ctx, plugin.license());
+    dukx_push_std_string(ctx, plugin->license());
     duk_put_prop_string(ctx, -2, "license");
-    dukx_push_std_string(ctx, plugin.summary());
+    dukx_push_std_string(ctx, plugin->summary());
     duk_put_prop_string(ctx, -2, "summary");
-    dukx_push_std_string(ctx, plugin.version());
+    dukx_push_std_string(ctx, plugin->version());
     duk_put_prop_string(ctx, -2, "version");
 
-#endif
     return 1;
 }
 
@@ -225,11 +223,9 @@
  */
 duk_idx_t list(duk_context *ctx)
 {
-#if 0
     dukx_push_array(ctx, dukx_get_irccd(ctx).plugins().list(), [] (auto ctx, auto plugin) {
-        dukx_push_std_string(ctx, plugin.name());
+        dukx_push_std_string(ctx, plugin->name());
     });
-#endif
 
     return 1;
 }
--- a/libirccd-test/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/libirccd-test/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -5,9 +5,11 @@
     SOURCES
         ${libirccd-test_SOURCE_DIR}/irccd/command-tester.cpp
         ${libirccd-test_SOURCE_DIR}/irccd/command-tester.hpp
+        ${libirccd-test_SOURCE_DIR}/irccd/plugin-tester.cpp
+        ${libirccd-test_SOURCE_DIR}/irccd/plugin-tester.hpp
         ${libirccd-test_SOURCE_DIR}/irccd/server-tester.cpp
         ${libirccd-test_SOURCE_DIR}/irccd/server-tester.hpp
-    LIBRARIES libirccd libirccdctl extern-gtest
+    LIBRARIES libirccd-js libirccdctl extern-gtest
     PUBLIC_INCLUDES
         $<BUILD_INTERFACE:${libirccd-test_SOURCE_DIR}/irccd>
 )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd-test/irccd/plugin-tester.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -0,0 +1,55 @@
+/*
+ * plugin-tester.cpp -- test fixture helper for javascript plugins
+ *
+ * Copyright (c) 2013-2016 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.
+ */
+
+#include "mod-directory.hpp"
+#include "mod-elapsed-timer.hpp"
+#include "mod-file.hpp"
+#include "mod-irccd.hpp"
+#include "mod-logger.hpp"
+#include "mod-plugin.hpp"
+#include "mod-server.hpp"
+#include "mod-system.hpp"
+#include "mod-timer.hpp"
+#include "mod-unicode.hpp"
+#include "mod-util.hpp"
+#include "plugin-js.hpp"
+#include "plugin-tester.hpp"
+#include "service.hpp"
+
+namespace irccd {
+
+PluginTester::PluginTester()
+{
+    auto loader = std::make_unique<JsPluginLoader>(m_irccd);
+
+    loader->addModule(std::make_unique<IrccdModule>());
+    loader->addModule(std::make_unique<DirectoryModule>());
+    loader->addModule(std::make_unique<ElapsedTimerModule>());
+    loader->addModule(std::make_unique<FileModule>());
+    loader->addModule(std::make_unique<LoggerModule>());
+    loader->addModule(std::make_unique<PluginModule>());
+    loader->addModule(std::make_unique<ServerModule>());
+    loader->addModule(std::make_unique<SystemModule>());
+    loader->addModule(std::make_unique<TimerModule>());
+    loader->addModule(std::make_unique<UnicodeModule>());
+    loader->addModule(std::make_unique<UtilModule>());
+
+    m_irccd.plugins().addLoader(std::move(loader));
+}
+
+} // !irccd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libirccd-test/irccd/plugin-tester.hpp	Mon Nov 14 13:11:16 2016 +0100
@@ -0,0 +1,38 @@
+/*
+ * plugin-tester.hpp -- test fixture helper for javascript plugins
+ *
+ * Copyright (c) 2013-2016 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.
+ */
+
+#ifndef IRCCD_PLUGIN_TESTER_HPP
+#define IRCCD_PLUGIN_TESTER_HPP
+
+#include <gtest/gtest.h>
+
+#include "irccd.hpp"
+
+namespace irccd {
+
+class PluginTester : public testing::Test {
+protected:
+    Irccd m_irccd;
+
+public:
+    PluginTester();
+};
+
+} // !irccd
+
+#endif // !IRCCD_PLUGIN_TESTER_HPP
--- a/libirccd/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/libirccd/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -35,4 +35,6 @@
     LIBRARIES extern-ircclient libcommon
     PUBLIC_INCLUDES
         $<BUILD_INTERFACE:${libirccd_SOURCE_DIR}/irccd>
+        $<BUILD_INTERFACE:${libirccd_SOURCE_DIR}>
+        $<INSTALL_INTERFACE:${WITH_INCLUDEDIR}>
 )
--- a/tests/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -44,30 +44,29 @@
     add_subdirectory(cmd-server-reconnect)
     add_subdirectory(cmd-server-topic)
 
-#    # Misc
-#    add_subdirectory(command)
-#    add_subdirectory(elapsedtimer)
-#    add_subdirectory(logger)
-#    add_subdirectory(path)
-#    add_subdirectory(rules)
-#    add_subdirectory(timer)
-#    add_subdirectory(util)
-#
-#    # JS API
-#    if (WITH_JS)
-#        add_subdirectory(js-elapsedtimer)
-#        add_subdirectory(js-file)
-#        add_subdirectory(js-irccd)
-#        add_subdirectory(js-logger)
-#        add_subdirectory(js-system)
-#        add_subdirectory(js-timer)
-#        add_subdirectory(js-unicode)
-#        add_subdirectory(js-util)
-#        add_subdirectory(plugin-ask)
-#        add_subdirectory(plugin-auth)
-#        add_subdirectory(plugin-hangman)
-#        add_subdirectory(plugin-history)
-#        add_subdirectory(plugin-logger)
-#        add_subdirectory(plugin-plugin)
-#    endif ()
+    # Misc
+    add_subdirectory(elapsedtimer)
+    add_subdirectory(logger)
+    add_subdirectory(path)
+    add_subdirectory(rules)
+    add_subdirectory(timer)
+    add_subdirectory(util)
+
+    # JS API
+    if (WITH_JS)
+        add_subdirectory(js-elapsedtimer)
+        add_subdirectory(js-file)
+        add_subdirectory(js-irccd)
+        add_subdirectory(js-logger)
+        add_subdirectory(js-system)
+        add_subdirectory(js-timer)
+        add_subdirectory(js-unicode)
+        add_subdirectory(js-util)
+        add_subdirectory(plugin-ask)
+        add_subdirectory(plugin-auth)
+        add_subdirectory(plugin-hangman)
+        add_subdirectory(plugin-history)
+        add_subdirectory(plugin-logger)
+        add_subdirectory(plugin-plugin)
+    endif ()
 endif ()
--- a/tests/command/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#
-# CMakeLists.txt -- CMake build system for irccd
-#
-# Copyright (c) 2013-2016 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 command
-    SOURCES main.cpp
-    LIBRARIES libirccd
-)
--- a/tests/command/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-/*
- * main.cpp -- test Command class
- *
- * Copyright (c) 2013-2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include <irccd/command.hpp>
-
-using namespace irccd;
-
-class MyCommand : public Command {
-public:
-    MyCommand()
-        : Command("test", "Test", "This is a super command")
-    {
-    }
-
-    std::vector<Property> properties() const
-    {
-        return {
-            { "b", { nlohmann::json::value_t::boolean }},
-            { "i", { nlohmann::json::value_t::number_integer }},
-            { "m", {
-                nlohmann::json::value_t::boolean,
-                nlohmann::json::value_t::number_integer,
-                nlohmann::json::value_t::string
-                   }
-            }
-        };
-    }
-};
-
-TEST(Properties, valid)
-{
-    Irccd *irccd = nullptr;
-    MyCommand cmd;
-
-    ASSERT_NO_THROW(cmd.exec(*irccd, nlohmann::json::object({
-        { "b", true     },
-        { "i", 123      },
-        { "m", "abc"    }
-    })));
-
-    ASSERT_NO_THROW(cmd.exec(*irccd, nlohmann::json::object({
-        { "b", true     },
-        { "i", 123      },
-        { "m", 456      }
-    })));
-
-    ASSERT_NO_THROW(cmd.exec(*irccd, nlohmann::json::object({
-        { "b", true     },
-        { "i", 123      },
-        { "m", "456"    }
-    })));
-}
-
-TEST(Properties, missingB)
-{
-    Irccd *irccd = nullptr;
-    MyCommand cmd;
-
-    ASSERT_THROW(cmd.exec(*irccd, nlohmann::json::object({
-        { "i", 123      },
-        { "m", "abc"    }
-    })), std::invalid_argument);
-}
-
-TEST(Properties, missingI)
-{
-    Irccd *irccd = nullptr;
-    MyCommand cmd;
-
-    ASSERT_THROW(cmd.exec(*irccd, nlohmann::json::object({
-        { "b", true     },
-        { "m", "abc"    }
-    })), std::invalid_argument);
-}
-
-TEST(Properties, missingM)
-{
-    Irccd *irccd = nullptr;
-    MyCommand cmd;
-
-    ASSERT_THROW(cmd.exec(*irccd, nlohmann::json::object({
-        { "b", true     },
-        { "i", 123      },
-    })), std::invalid_argument);
-}
-
-TEST(Properties, invalidB)
-{
-    Irccd *irccd = nullptr;
-    MyCommand cmd;
-
-    ASSERT_THROW(cmd.exec(*irccd, nlohmann::json::object({
-        { "b", "fail"   },
-        { "i", 123      },
-        { "m", "abc"    }
-    })), std::invalid_argument);
-}
-
-TEST(Properties, invalidM)
-{
-    Irccd *irccd = nullptr;
-    MyCommand cmd;
-
-    ASSERT_THROW(cmd.exec(*irccd, nlohmann::json::object({
-        { "b", "fail"   },
-        { "i", 123      },
-        { "m", nullptr  }
-    })), std::invalid_argument);
-}
-
-int main(int argc, char **argv)
-{
-    testing::InitGoogleTest(&argc, argv);
-
-    return RUN_ALL_TESTS();
-}
--- a/tests/js-elapsedtimer/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-elapsedtimer/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -19,6 +19,6 @@
 irccd_define_test(
     NAME js-elapsedtimer
     SOURCES main.cpp
-    LIBRARIES libirccd
+    LIBRARIES libirccd-js
 )
 
--- a/tests/js-elapsedtimer/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-elapsedtimer/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -24,7 +24,7 @@
 #include <irccd/mod-irccd.hpp>
 #include <irccd/mod-elapsed-timer.hpp>
 #include <irccd/plugin-js.hpp>
-#include <irccd/service-module.hpp>
+#include <irccd/service.hpp>
 
 using namespace irccd;
 using namespace std::chrono_literals;
@@ -37,8 +37,8 @@
     TestElapsedTimer()
         : m_plugin(std::make_shared<JsPlugin>("empty", SOURCEDIR "/empty.js"))
     {
-        m_irccd.modules().get("Irccd")->load(m_irccd, m_plugin);
-        m_irccd.modules().get("Irccd.ElapsedTimer")->load(m_irccd, m_plugin);
+        IrccdModule().load(m_irccd, *m_plugin);
+        ElapsedTimerModule().load(m_irccd, *m_plugin);
     }
 };
 
--- a/tests/js-file/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-file/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -19,7 +19,7 @@
 irccd_define_test(
     NAME js-file
     SOURCES main.cpp
-    LIBRARIES libirccd
+    LIBRARIES libirccd-js
 )
 
 #
--- a/tests/js-file/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-file/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -24,7 +24,7 @@
 #include <irccd/mod-file.hpp>
 #include <irccd/mod-irccd.hpp>
 #include <irccd/plugin-js.hpp>
-#include <irccd/service-module.hpp>
+#include <irccd/service.hpp>
 
 using namespace irccd;
 
@@ -36,8 +36,8 @@
     TestJsFile()
         : m_plugin(std::make_shared<JsPlugin>("empty", SOURCEDIR "/empty.js"))
     {
-        m_irccd.modules().get("Irccd")->load(m_irccd, m_plugin);
-        m_irccd.modules().get("Irccd.File")->load(m_irccd, m_plugin);
+        IrccdModule().load(m_irccd, *m_plugin);
+        FileModule().load(m_irccd, *m_plugin);
     }
 };
 
--- a/tests/js-irccd/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-irccd/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -19,5 +19,5 @@
 irccd_define_test(
     NAME js-irccd
     SOURCES main.cpp
-    LIBRARIES libirccd
+    LIBRARIES libirccd-js
 )
--- a/tests/js-irccd/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-irccd/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -21,7 +21,7 @@
 #include <irccd/irccd.hpp>
 #include <irccd/mod-irccd.hpp>
 #include <irccd/plugin-js.hpp>
-#include <irccd/service-module.hpp>
+#include <irccd/service.hpp>
 #include <irccd/sysconfig.hpp>
 
 using namespace irccd;
@@ -34,7 +34,7 @@
     TestJsIrccd()
         : m_plugin(std::make_shared<JsPlugin>("empty", SOURCEDIR "/empty.js"))
     {
-        m_irccd.modules().get("Irccd")->load(m_irccd, m_plugin);
+        IrccdModule().load(m_irccd, *m_plugin);
     }
 };
 
--- a/tests/js-logger/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-logger/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -19,5 +19,5 @@
 irccd_define_test(
     NAME js-logger
     SOURCES main.cpp
-    LIBRARIES libirccd
+    LIBRARIES libirccd-js
 )
--- a/tests/js-logger/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-logger/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -22,8 +22,9 @@
 #include <irccd/logger.hpp>
 #include <irccd/mod-irccd.hpp>
 #include <irccd/mod-logger.hpp>
+#include <irccd/mod-plugin.hpp>
 #include <irccd/plugin-js.hpp>
-#include <irccd/service-module.hpp>
+#include <irccd/service.hpp>
 #include <irccd/sysconfig.hpp>
 
 using namespace irccd;
@@ -62,9 +63,9 @@
     TestJsLogger()
         : m_plugin(std::make_shared<JsPlugin>("test", SOURCEDIR "/empty.js"))
     {
-        m_irccd.modules().get("Irccd")->load(m_irccd, m_plugin);
-        m_irccd.modules().get("Irccd.Plugin")->load(m_irccd, m_plugin);
-        m_irccd.modules().get("Irccd.Logger")->load(m_irccd, m_plugin);
+        IrccdModule().load(m_irccd, *m_plugin);
+        PluginModule().load(m_irccd, *m_plugin);
+        LoggerModule().load(m_irccd, *m_plugin);
     }
 };
 
--- a/tests/js-system/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-system/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -19,7 +19,7 @@
 irccd_define_test(
     NAME js-system
     SOURCES main.cpp
-    LIBRARIES libirccd
+    LIBRARIES libirccd-js
     FLAGS IRCCD_EXECUTABLE=\"$<TARGET_FILE:irccd>\"
 )
 
--- a/tests/js-system/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-system/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -19,10 +19,11 @@
 #include <gtest/gtest.h>
 
 #include <irccd/irccd.hpp>
+#include <irccd/mod-file.hpp>
 #include <irccd/mod-irccd.hpp>
 #include <irccd/mod-system.hpp>
 #include <irccd/plugin-js.hpp>
-#include <irccd/service-module.hpp>
+#include <irccd/service.hpp>
 #include <irccd/sysconfig.hpp>
 #include <irccd/system.hpp>
 
@@ -36,9 +37,9 @@
     TestJsSystem()
         : m_plugin(std::make_shared<JsPlugin>("empty", SOURCEDIR "/empty.js"))
     {
-        m_irccd.modules().get("Irccd")->load(m_irccd, m_plugin);
-        m_irccd.modules().get("Irccd.File")->load(m_irccd, m_plugin);
-        m_irccd.modules().get("Irccd.System")->load(m_irccd, m_plugin);
+        IrccdModule().load(m_irccd, *m_plugin);
+        FileModule().load(m_irccd, *m_plugin);
+        SystemModule().load(m_irccd, *m_plugin);
     }
 };
 
--- a/tests/js-timer/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-timer/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -23,5 +23,5 @@
         ${CMAKE_CURRENT_SOURCE_DIR}/timer-single.js
         ${CMAKE_CURRENT_SOURCE_DIR}/timer-repeat.js
         ${CMAKE_CURRENT_SOURCE_DIR}/timer-pending.js
-    LIBRARIES libirccd
+    LIBRARIES libirccd-js
 )
--- a/tests/js-timer/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-timer/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -16,13 +16,17 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+int main() { }
+
+#if 0
+
 #include <gtest/gtest.h>
 
 #include <irccd/elapsed-timer.hpp>
 #include <irccd/irccd.hpp>
 #include <irccd/logger.hpp>
 #include <irccd/plugin-js.hpp>
-#include <irccd/service-plugin.hpp>
+#include <irccd/service.hpp>
 #include <irccd/system.hpp>
 
 using namespace irccd;
@@ -101,3 +105,5 @@
 
     return RUN_ALL_TESTS();
 }
+
+#endif
--- a/tests/js-unicode/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-unicode/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -19,5 +19,5 @@
 irccd_define_test(
     NAME js-unicode
     SOURCES main.cpp
-    LIBRARIES libirccd
+    LIBRARIES libirccd-js
 )
--- a/tests/js-unicode/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-unicode/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -26,7 +26,7 @@
 #include <irccd/mod-irccd.hpp>
 #include <irccd/mod-unicode.hpp>
 #include <irccd/plugin-js.hpp>
-#include <irccd/service-module.hpp>
+#include <irccd/service.hpp>
 #include <irccd/system.hpp>
 
 using namespace irccd;
@@ -39,8 +39,8 @@
     TestJsUnicode()
         : m_plugin(std::make_shared<JsPlugin>("empty", SOURCEDIR "/empty.js"))
     {
-        m_irccd.modules().get("Irccd")->load(m_irccd, m_plugin);
-        m_irccd.modules().get("Irccd.Unicode")->load(m_irccd, m_plugin);
+        IrccdModule().load(m_irccd, *m_plugin);
+        UnicodeModule().load(m_irccd, *m_plugin);
     }
 };
 
--- a/tests/js-util/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-util/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -19,5 +19,5 @@
 irccd_define_test(
     NAME js-util
     SOURCES main.cpp
-    LIBRARIES libirccd
+    LIBRARIES libirccd-js
 )
--- a/tests/js-util/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/js-util/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -22,7 +22,7 @@
 #include <irccd/mod-irccd.hpp>
 #include <irccd/mod-util.hpp>
 #include <irccd/plugin-js.hpp>
-#include <irccd/service-module.hpp>
+#include <irccd/service.hpp>
 #include <irccd/system.hpp>
 
 using namespace irccd;
@@ -35,8 +35,8 @@
     TestJsUtil()
         : m_plugin(std::make_shared<JsPlugin>("empty", SOURCEDIR "/empty.js"))
     {
-        m_irccd.modules().get("Irccd")->load(m_irccd, m_plugin);
-        m_irccd.modules().get("Irccd.Util")->load(m_irccd, m_plugin);
+        IrccdModule().load(m_irccd, *m_plugin);
+        UtilModule().load(m_irccd ,*m_plugin);
     }
 };
 
--- a/tests/path/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/path/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -19,7 +19,6 @@
 #include <gtest/gtest.h>
 
 #include <irccd/sysconfig.hpp>
-
 #include <irccd/logger.hpp>
 #include <irccd/path.hpp>
 
--- a/tests/plugin-ask/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/plugin-ask/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -20,7 +20,10 @@
 
 #include <irccd/irccd.hpp>
 #include <irccd/server.hpp>
-#include <irccd/service-plugin.hpp>
+#include <irccd/service.hpp>
+#include <irccd/path.hpp>
+
+#include "plugin-tester.hpp"
 
 using namespace irccd;
 
@@ -45,22 +48,18 @@
     }
 };
 
-class AskTest : public testing::Test {
+class AskTest : public PluginTester {
 protected:
-    Irccd m_irccd;
-    PluginService &m_ps;
-
     std::shared_ptr<ServerTest> m_server;
     std::shared_ptr<Plugin> m_plugin;
 
 public:
     AskTest()
-        : m_ps(m_irccd.plugins())
-        , m_server(std::make_shared<ServerTest>())
+        : m_server(std::make_shared<ServerTest>())
     {
-        m_ps.setConfig("ask", {{"file", SOURCEDIR "/answers.conf"}});
-        m_ps.load("ask", PLUGINDIR "/ask.js");
-        m_plugin = m_ps.require("ask");
+        m_irccd.plugins().setConfig("ask", {{"file", SOURCEDIR "/answers.conf"}});
+        m_irccd.plugins().load("ask", PLUGINDIR "/ask.js");
+        m_plugin = m_irccd.plugins().require("ask");
     }
 };
 
--- a/tests/plugin-auth/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/plugin-auth/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -20,7 +20,10 @@
 
 #include <irccd/irccd.hpp>
 #include <irccd/server.hpp>
-#include <irccd/service-plugin.hpp>
+#include <irccd/service.hpp>
+#include <irccd/path.hpp>
+
+#include "plugin-tester.hpp"
 
 using namespace irccd;
 
@@ -45,11 +48,8 @@
     }
 };
 
-class AuthTest : public testing::Test {
+class AuthTest : public PluginTester {
 protected:
-    Irccd m_irccd;
-    PluginService &m_ps;
-
     std::shared_ptr<ServerTest> m_nickserv1;
     std::shared_ptr<ServerTest> m_nickserv2;
     std::shared_ptr<ServerTest> m_quakenet;
@@ -57,12 +57,11 @@
 
 public:
     AuthTest()
-        : m_ps(m_irccd.plugins())
-        , m_nickserv1(std::make_shared<ServerTest>("nickserv1"))
+        : m_nickserv1(std::make_shared<ServerTest>("nickserv1"))
         , m_nickserv2(std::make_shared<ServerTest>("nickserv2"))
         , m_quakenet(std::make_shared<ServerTest>("quakenet"))
     {
-        m_ps.setConfig("auth", {
+        m_irccd.plugins().setConfig("auth", {
             { "nickserv1.type", "nickserv" },
             { "nickserv1.password", "plopation" },
             { "nickserv2.type", "nickserv" },
@@ -72,8 +71,8 @@
             { "quakenet.password", "hello" },
             { "quakenet.username", "mario" }
         });
-        m_ps.load("auth", PLUGINDIR "/auth.js");
-        m_plugin = m_ps.require("auth");
+        m_irccd.plugins().load("auth", PLUGINDIR "/auth.js");
+        m_plugin = m_irccd.plugins().require("auth");
     }
 };
 
--- a/tests/plugin-hangman/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/plugin-hangman/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -20,7 +20,10 @@
 
 #include <irccd/irccd.hpp>
 #include <irccd/server.hpp>
-#include <irccd/service-plugin.hpp>
+#include <irccd/service.hpp>
+#include <irccd/path.hpp>
+
+#include "plugin-tester.hpp"
 
 using namespace irccd;
 
@@ -45,20 +48,16 @@
     }
 };
 
-class HangmanTest : public testing::Test {
+class HangmanTest : public PluginTester {
 protected:
-    Irccd m_irccd;
-    PluginService &m_ps;
-
     std::shared_ptr<ServerTest> m_server;
     std::shared_ptr<Plugin> m_plugin;
 
 public:
     HangmanTest()
-        : m_ps(m_irccd.plugins())
-        , m_server(std::make_shared<ServerTest>())
+        : m_server(std::make_shared<ServerTest>())
     {
-        m_ps.setFormats("hangman", {
+        m_irccd.plugins().setFormats("hangman", {
             { "asked", "asked=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}" },
             { "dead", "dead=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
             { "found", "found=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
@@ -76,9 +75,9 @@
         if (config.count("file") == 0)
             config.emplace("file", SOURCEDIR "/words.conf");
 
-        m_ps.setConfig("hangman", config);
-        m_ps.load("hangman", PLUGINDIR "/hangman.js");
-        m_plugin = m_ps.require("hangman");
+        m_irccd.plugins().setConfig("hangman", config);
+        m_irccd.plugins().load("hangman", PLUGINDIR "/hangman.js");
+        m_plugin = m_irccd.plugins().require("hangman");
     }
 };
 
--- a/tests/plugin-history/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/plugin-history/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -22,7 +22,10 @@
 
 #include <irccd/irccd.hpp>
 #include <irccd/server.hpp>
-#include <irccd/service-plugin.hpp>
+#include <irccd/service.hpp>
+#include <irccd/path.hpp>
+
+#include "plugin-tester.hpp"
 
 using namespace irccd;
 
@@ -47,20 +50,16 @@
     }
 };
 
-class HistoryTest : public testing::Test {
+class HistoryTest : public PluginTester {
 protected:
-    Irccd m_irccd;
-    PluginService &m_ps;
-
     std::shared_ptr<ServerTest> m_server;
     std::shared_ptr<Plugin> m_plugin;
 
 public:
     HistoryTest()
-        : m_ps(m_irccd.plugins())
-        , m_server(std::make_shared<ServerTest>())
+        : m_server(std::make_shared<ServerTest>())
     {
-        m_ps.setFormats("history", {
+        m_irccd.plugins().setFormats("history", {
             { "error", "error=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}" },
             { "seen", "seen=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{target}:%H:%M" },
             { "said", "said=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{target}:#{message}:%H:%M" },
@@ -74,9 +73,9 @@
         if (config.count("file") == 0)
             config.emplace("file", SOURCEDIR "/words.conf");
 
-        m_ps.setConfig("history", config);
-        m_ps.load("history", PLUGINDIR "/history.js");
-        m_plugin = m_ps.require("history");
+        m_irccd.plugins().setConfig("history", config);
+        m_irccd.plugins().load("history", PLUGINDIR "/history.js");
+        m_plugin = m_irccd.plugins().require("history");
     }
 };
 
--- a/tests/plugin-logger/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/plugin-logger/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -24,7 +24,10 @@
 #include <irccd/irccd.hpp>
 #include <irccd/logger.hpp>
 #include <irccd/server.hpp>
-#include <irccd/service-plugin.hpp>
+#include <irccd/service.hpp>
+#include <irccd/path.hpp>
+
+#include "plugin-tester.hpp"
 
 using namespace irccd;
 
@@ -36,11 +39,8 @@
     }
 };
 
-class LoggerTest : public testing::Test {
+class LoggerTest : public PluginTester {
 protected:
-    Irccd m_irccd;
-    PluginService &m_ps;
-
     std::shared_ptr<ServerTest> m_server;
     std::shared_ptr<Plugin> m_plugin;
 
@@ -53,12 +53,11 @@
 
 public:
     LoggerTest()
-        : m_ps(m_irccd.plugins())
-        , m_server(std::make_shared<ServerTest>())
+        : m_server(std::make_shared<ServerTest>())
     {
         remove(BINARYDIR "/log.txt");
 
-        m_ps.setFormats("logger", {
+        m_irccd.plugins().setFormats("logger", {
             { "cmode", "cmode=#{server}:#{channel}:#{origin}:#{nickname}:#{mode}:#{arg}" },
             { "cnotice", "cnotice=#{server}:#{channel}:#{origin}:#{nickname}:#{message}" },
             { "join", "join=#{server}:#{channel}:#{origin}:#{nickname}" },
@@ -78,9 +77,9 @@
         if (config.count("path") == 0)
             config.emplace("path", BINARYDIR "/log.txt");
 
-        m_ps.setConfig("logger", config);
-        m_ps.load("logger", PLUGINDIR "/logger.js");
-        m_plugin = m_ps.require("logger");
+        m_irccd.plugins().setConfig("logger", config);
+        m_irccd.plugins().load("logger", PLUGINDIR "/logger.js");
+        m_plugin = m_irccd.plugins().require("logger");
     }
 };
 
--- a/tests/plugin-plugin/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/plugin-plugin/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -23,7 +23,10 @@
 #include <irccd/irccd.hpp>
 #include <irccd/logger.hpp>
 #include <irccd/server.hpp>
-#include <irccd/service-plugin.hpp>
+#include <irccd/service.hpp>
+#include <irccd/path.hpp>
+
+#include "plugin-tester.hpp"
 
 using namespace fmt::literals;
 
@@ -62,28 +65,24 @@
     }
 };
 
-class PluginTest : public testing::Test {
+class PluginTest : public PluginTester {
 protected:
-    Irccd m_irccd;
-    PluginService &m_ps;
-
     std::shared_ptr<ServerTest> m_server;
     std::shared_ptr<Plugin> m_plugin;
 
 public:
     PluginTest()
-        : m_ps(m_irccd.plugins())
-        , m_server(std::make_shared<ServerTest>())
+        : m_server(std::make_shared<ServerTest>())
     {
-        m_ps.add(std::make_shared<FakePlugin>());
-        m_ps.setFormats("plugin", {
+        m_irccd.plugins().add(std::make_shared<FakePlugin>());
+        m_irccd.plugins().setFormats("plugin", {
             { "usage", "usage=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}" },
             { "info", "info=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{author}:#{license}:#{name}:#{summary}:#{version}" },
             { "not-found", "not-found=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{name}" },
             { "too-long", "too-long=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}" }
         });
-        m_ps.load("plugin", PLUGINDIR "/plugin.js");
-        m_plugin = m_ps.require("plugin");
+        m_irccd.plugins().load("plugin", PLUGINDIR "/plugin.js");
+        m_plugin = m_irccd.plugins().require("plugin");
     }
 };
 
@@ -116,7 +115,7 @@
 TEST_F(PluginTest, formatTooLong)
 {
     for (int i = 0; i < 100; ++i)
-        m_ps.add(std::make_shared<Plugin>("plugin-n-{}"_format(i), ""));
+        m_irccd.plugins().add(std::make_shared<Plugin>("plugin-n-{}"_format(i), ""));
 
     m_plugin->onCommand(m_irccd, MessageEvent{m_server, "jean!jean@localhost", "#staff", "list"});
 
--- a/tests/rules/main.cpp	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/rules/main.cpp	Mon Nov 14 13:11:16 2016 +0100
@@ -19,7 +19,7 @@
 #include <gtest/gtest.h>
 
 #include <irccd/rule.hpp>
-#include <irccd/service-rule.hpp>
+#include <irccd/service.hpp>
 
 namespace irccd {
 
--- a/tests/timer/CMakeLists.txt	Sun Nov 13 20:59:45 2016 +0100
+++ b/tests/timer/CMakeLists.txt	Mon Nov 14 13:11:16 2016 +0100
@@ -19,5 +19,5 @@
 irccd_define_test(
     NAME timer
     SOURCES main.cpp
-    LIBRARIES libirccd
+    LIBRARIES libirccd libirccd-js
 )