From 6c184947c3886ce80aa9eb9807a700025a344442 Mon Sep 17 00:00:00 2001 From: Loïc Blot Date: Fri, 16 Mar 2018 08:41:33 +0100 Subject: Server: delegate mod management & config to ServerModConfiguration (#7131) * Server: delegate mod management & config to ServerModConfiguration (rename it to ServerModManager) * Use c++11 range based loops * Add unittests + experimental/default mod as a test case to permit testing mod loading in future tests --- src/unittest/CMakeLists.txt | 9 ++ src/unittest/test_config.h.in | 6 ++ src/unittest/test_servermodmanager.cpp | 165 +++++++++++++++++++++++++++++++++ src/unittest/test_world/world.mt | 1 + 4 files changed, 181 insertions(+) create mode 100644 src/unittest/test_config.h.in create mode 100644 src/unittest/test_servermodmanager.cpp create mode 100644 src/unittest/test_world/world.mt (limited to 'src/unittest') diff --git a/src/unittest/CMakeLists.txt b/src/unittest/CMakeLists.txt index 3373f9d11..aca736f3e 100644 --- a/src/unittest/CMakeLists.txt +++ b/src/unittest/CMakeLists.txt @@ -22,6 +22,7 @@ set (UNITTEST_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/test_serialization.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_settings.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_socket.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test_servermodmanager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_threading.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_utilities.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_voxelarea.cpp @@ -33,3 +34,11 @@ set (UNITTEST_CLIENT_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/test_gameui.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_keycode.cpp PARENT_SCOPE) + +set (TEST_WORLDDIR ${CMAKE_CURRENT_SOURCE_DIR}/test_world) +set (TEST_SUBGAME_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../games/minimal) + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/test_config.h.in" + "${PROJECT_BINARY_DIR}/test_config.h" +) diff --git a/src/unittest/test_config.h.in b/src/unittest/test_config.h.in new file mode 100644 index 000000000..36850b00d --- /dev/null +++ b/src/unittest/test_config.h.in @@ -0,0 +1,6 @@ +// Filled in by the build system + +#pragma once + +#define TEST_WORLDDIR "@TEST_WORLDDIR@" +#define TEST_SUBGAME_PATH "@TEST_SUBGAME_PATH@" diff --git a/src/unittest/test_servermodmanager.cpp b/src/unittest/test_servermodmanager.cpp new file mode 100644 index 000000000..cb43babf9 --- /dev/null +++ b/src/unittest/test_servermodmanager.cpp @@ -0,0 +1,165 @@ +/* +Minetest +Copyright (C) 2018 nerzhul, Loic Blot + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "test.h" +#include +#include "server/mods.h" +#include "test_config.h" + +class TestServerModManager : public TestBase +{ +public: + TestServerModManager() { TestManager::registerTestModule(this); } + const char *getName() { return "TestServerModManager"; } + + void runTests(IGameDef *gamedef); + + void testCreation(); + void testIsConsistent(); + void testUnsatisfiedMods(); + void testGetMods(); + void testGetModsWrongDir(); + void testGetModspec(); + void testGetModNamesWrongDir(); + void testGetModNames(); + void testGetModMediaPathsWrongDir(); + void testGetModMediaPaths(); +}; + +static TestServerModManager g_test_instance; + +void TestServerModManager::runTests(IGameDef *gamedef) +{ + const char *saved_env_mt_subgame_path = getenv("MINETEST_SUBGAME_PATH"); +#ifdef WIN32 + { + std::string subgame_path("MINETEST_SUBGAME_PATH="); + subgame_path.append(TEST_SUBGAME_PATH); + _putenv(subgame_path.c_str()); + } +#else + setenv("MINETEST_SUBGAME_PATH", TEST_SUBGAME_PATH, 1); +#endif + + TEST(testCreation); + TEST(testIsConsistent); + TEST(testGetModsWrongDir); + TEST(testUnsatisfiedMods); + TEST(testGetMods); + TEST(testGetModspec); + TEST(testGetModNamesWrongDir); + TEST(testGetModNames); + TEST(testGetModMediaPathsWrongDir); + TEST(testGetModMediaPaths); + +#ifdef WIN32 + { + std::string subgame_path("MINETEST_SUBGAME_PATH="); + subgame_path.append(saved_env_mt_subgame_path); + _putenv(subgame_path.c_str()); + } +#else + setenv("MINETEST_SUBGAME_PATH", saved_env_mt_subgame_path, 1); +#endif +} + +void TestServerModManager::testCreation() +{ + ServerModManager sm(TEST_WORLDDIR); +} + +void TestServerModManager::testGetModsWrongDir() +{ + // Test in non worlddir to ensure no mods are found + ServerModManager sm(std::string(TEST_WORLDDIR) + DIR_DELIM + ".."); + UASSERTEQ(bool, sm.getMods().empty(), true); +} + +void TestServerModManager::testUnsatisfiedMods() +{ + ServerModManager sm(std::string(TEST_WORLDDIR)); + UASSERTEQ(bool, sm.getUnsatisfiedMods().empty(), true); +} + +void TestServerModManager::testIsConsistent() +{ + ServerModManager sm(std::string(TEST_WORLDDIR)); + UASSERTEQ(bool, sm.isConsistent(), true); +} + +void TestServerModManager::testGetMods() +{ + ServerModManager sm(std::string(TEST_WORLDDIR)); + const auto &mods = sm.getMods(); + UASSERTEQ(bool, mods.empty(), false); + + // Ensure we found default mod inside the test folder + bool default_found = false; + for (const auto &m : mods) { + if (m.name == "default") + default_found = true; + + // Verify if paths are not empty + UASSERTEQ(bool, m.path.empty(), false); + } + + UASSERTEQ(bool, default_found, true); +} + +void TestServerModManager::testGetModspec() +{ + ServerModManager sm(std::string(TEST_WORLDDIR)); + UASSERTEQ(const ModSpec *, sm.getModSpec("wrongmod"), NULL); + UASSERT(sm.getModSpec("default") != NULL); +} + +void TestServerModManager::testGetModNamesWrongDir() +{ + ServerModManager sm(std::string(TEST_WORLDDIR) + DIR_DELIM + ".."); + std::vector result; + sm.getModNames(result); + UASSERTEQ(bool, result.empty(), true); +} + +void TestServerModManager::testGetModNames() +{ + ServerModManager sm(std::string(TEST_WORLDDIR)); + std::vector result; + sm.getModNames(result); + UASSERTEQ(bool, result.empty(), false); + UASSERT(std::find(result.begin(), result.end(), "default") != result.end()); +} + +void TestServerModManager::testGetModMediaPathsWrongDir() +{ + ServerModManager sm(std::string(TEST_WORLDDIR) + DIR_DELIM + ".."); + std::vector result; + sm.getModsMediaPaths(result); + UASSERTEQ(bool, result.empty(), true); +} + +void TestServerModManager::testGetModMediaPaths() +{ + ServerModManager sm(std::string(TEST_WORLDDIR)); + std::vector result; + sm.getModsMediaPaths(result); + UASSERTEQ(bool, result.empty(), false); + // We should have 5 folders for each mod (textures, media, locale, model, sounds) + UASSERTEQ(unsigned long, result.size() % 5, 0); +} diff --git a/src/unittest/test_world/world.mt b/src/unittest/test_world/world.mt new file mode 100644 index 000000000..ab9b5413a --- /dev/null +++ b/src/unittest/test_world/world.mt @@ -0,0 +1 @@ +gameid = minimal -- cgit v1.2.3