Skip to content

Commit

Permalink
Add unittests on ActiveObject and BanManager class (#6866)
Browse files Browse the repository at this point in the history
* Add unittests on ActiveObject and BanManager class

This also permit to fix a bug in ban manager setting bans modified when no modification occurs
  • Loading branch information
nerzhul authored Jan 1, 2018
1 parent 9f6d84a commit 0d6b58a
Show file tree
Hide file tree
Showing 4 changed files with 231 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/ban.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
Copyright (C) 2018 nerzhul, Loic BLOT <loic.blot@unix-experience.fr>
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
Expand Down Expand Up @@ -125,11 +126,11 @@ void BanManager::remove(const std::string &ip_or_name)
for (StringMap::iterator it = m_ips.begin(); it != m_ips.end();) {
if ((it->first == ip_or_name) || (it->second == ip_or_name)) {
m_ips.erase(it++);
m_modified = true;
} else {
++it;
}
}
m_modified = true;
}


Expand Down
2 changes: 2 additions & 0 deletions src/unittest/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
set (UNITTEST_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/test.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_activeobject.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_areastore.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_ban.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_collision.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_compression.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_connection.cpp
Expand Down
60 changes: 60 additions & 0 deletions src/unittest/test_activeobject.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
Minetest
Copyright (C) 2018 nerzhul, Loic BLOT <loic.blot@unix-experience.fr>
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 "activeobject.h"

class TestActiveObject : public TestBase
{
public:
TestActiveObject() { TestManager::registerTestModule(this); }
const char *getName() { return "TestActiveObject"; }

void runTests(IGameDef *gamedef);

void testAOAttributes();
};

static TestActiveObject g_test_instance;

void TestActiveObject::runTests(IGameDef *gamedef)
{
TEST(testAOAttributes);
}

class TestAO : public ActiveObject
{
public:
TestAO(u16 id) : ActiveObject(id) {}

virtual ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_TEST; }
virtual bool getCollisionBox(aabb3f *toset) const { return false; }
virtual bool getSelectionBox(aabb3f *toset) const { return false; }
virtual bool collideWithObjects() const { return false; }
};

void TestActiveObject::testAOAttributes()
{
TestAO ao(44);
UASSERT(ao.getId() == 44);

ao.setId(558);
UASSERT(ao.getId() == 558);
}
167 changes: 167 additions & 0 deletions src/unittest/test_ban.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
/*
Minetest
Copyright (C) 2018 nerzhul, Loic BLOT <loic.blot@unix-experience.fr>
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 "ban.h"

class TestBan : public TestBase
{
public:
TestBan() { TestManager::registerTestModule(this); }
const char *getName() { return "TestBan"; }

void runTests(IGameDef *gamedef);

private:
void testCreate();
void testAdd();
void testRemove();
void testModificationFlag();
void testGetBanName();
void testGetBanDescription();

void reinitTestEnv();
};

static TestBan g_test_instance;

void TestBan::runTests(IGameDef *gamedef)
{
reinitTestEnv();
TEST(testCreate);

reinitTestEnv();
TEST(testAdd);

reinitTestEnv();
TEST(testRemove);

reinitTestEnv();
TEST(testModificationFlag);

reinitTestEnv();
TEST(testGetBanName);

reinitTestEnv();
TEST(testGetBanDescription);
}

// This module is stateful due to disk writes, add helper to remove files
void TestBan::reinitTestEnv()
{
fs::DeleteSingleFileOrEmptyDirectory("testbm.txt");
fs::DeleteSingleFileOrEmptyDirectory("testbm2.txt");
}

void TestBan::testCreate()
{
// test save on object removal
{
BanManager bm("testbm.txt");
}

UASSERT(std::ifstream("testbm.txt", std::ios::binary).is_open());

// test manual save
{
BanManager bm("testbm2.txt");
bm.save();
UASSERT(std::ifstream("testbm2.txt", std::ios::binary).is_open());
}
}

void TestBan::testAdd()
{
std::string bm_test1_entry = "192.168.0.246";
std::string bm_test1_result = "test_username";

BanManager bm("testbm.txt");
bm.add(bm_test1_entry, bm_test1_result);

UASSERT(bm.getBanName(bm_test1_entry) == bm_test1_result);
}

void TestBan::testRemove()
{
std::string bm_test1_entry = "192.168.0.249";
std::string bm_test1_result = "test_username";

std::string bm_test2_entry = "192.168.0.250";
std::string bm_test2_result = "test_username7";

BanManager bm("testbm.txt");

// init data
bm.add(bm_test1_entry, bm_test1_result);
bm.add(bm_test2_entry, bm_test2_result);

// the test
bm.remove(bm_test1_entry);
UASSERT(bm.getBanName(bm_test1_entry).empty());

bm.remove(bm_test2_result);
UASSERT(bm.getBanName(bm_test2_result).empty());
}

void TestBan::testModificationFlag()
{
BanManager bm("testbm.txt");
bm.add("192.168.0.247", "test_username");
UASSERT(bm.isModified());

bm.remove("192.168.0.247");
UASSERT(bm.isModified());

// Clear the modification flag
bm.save();

// Test modification flag is entry was not present
bm.remove("test_username");
UASSERT(!bm.isModified());
}

void TestBan::testGetBanName()
{
std::string bm_test1_entry = "192.168.0.247";
std::string bm_test1_result = "test_username";

BanManager bm("testbm.txt");
bm.add(bm_test1_entry, bm_test1_result);

// Test with valid entry
UASSERT(bm.getBanName(bm_test1_entry) == bm_test1_result);

// Test with invalid entry
UASSERT(bm.getBanName("---invalid---").empty());
}

void TestBan::testGetBanDescription()
{
std::string bm_test1_entry = "192.168.0.247";
std::string bm_test1_entry2 = "test_username";

std::string bm_test1_result = "192.168.0.247|test_username";

BanManager bm("testbm.txt");
bm.add(bm_test1_entry, bm_test1_entry2);

UASSERT(bm.getBanDescription(bm_test1_entry) == bm_test1_result);
UASSERT(bm.getBanDescription(bm_test1_entry2) == bm_test1_result);
}

0 comments on commit 0d6b58a

Please sign in to comment.