aboutsummaryrefslogtreecommitdiff
path: root/src/unittest/test_modmetadatadatabase.cpp
diff options
context:
space:
mode:
authorJude Melton-Houghton <jwmhjwmh@gmail.com>2022-10-19 14:16:57 -0400
committerLoïc Blot <nerzhul@users.noreply.github.com>2022-11-10 18:56:48 +0100
commitaaa05f901adddebf2435890edcbe03fe3e501771 (patch)
tree187afc29f1c3bc36bb1e7ddc9b95c8e46d48c200 /src/unittest/test_modmetadatadatabase.cpp
parent9dbac989bd0fb22de8bd882a788c827a7a3bc2e1 (diff)
downloadminetest-aaa05f901adddebf2435890edcbe03fe3e501771.tar.xz
Add mod storage PostgreSQL backend
Diffstat (limited to 'src/unittest/test_modmetadatadatabase.cpp')
-rw-r--r--src/unittest/test_modmetadatadatabase.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/unittest/test_modmetadatadatabase.cpp b/src/unittest/test_modmetadatadatabase.cpp
index b93ff7e3b..b46feb884 100644
--- a/src/unittest/test_modmetadatadatabase.cpp
+++ b/src/unittest/test_modmetadatadatabase.cpp
@@ -20,12 +20,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,
// This file is an edited copy of test_authdatabase.cpp
+#include "cmake_config.h"
+
#include "test.h"
#include <algorithm>
+#include <cstdlib>
#include "database/database-dummy.h"
#include "database/database-files.h"
#include "database/database-sqlite3.h"
+#if USE_POSTGRESQL
+#include "database/database-postgresql.h"
+#endif
#include "filesys.h"
namespace
@@ -104,6 +110,46 @@ private:
std::string dir;
ModMetadataDatabase *mod_meta_db = nullptr;
};
+
+#if USE_POSTGRESQL
+void clearPostgreSQLDatabase(const std::string &connect_string)
+{
+ ModMetadataDatabasePostgreSQL db(connect_string);
+ std::vector<std::string> modnames;
+ db.beginSave();
+ db.listMods(&modnames);
+ for (const std::string &modname : modnames)
+ db.removeModEntries(modname);
+ db.endSave();
+}
+
+class PostgreSQLProvider : public ModMetadataDatabaseProvider
+{
+public:
+ PostgreSQLProvider(const std::string &connect_string): m_connect_string(connect_string) {}
+
+ ~PostgreSQLProvider()
+ {
+ if (m_db)
+ m_db->endSave();
+ delete m_db;
+ }
+
+ ModMetadataDatabase *getModMetadataDatabase() override
+ {
+ if (m_db)
+ m_db->endSave();
+ delete m_db;
+ m_db = new ModMetadataDatabasePostgreSQL(m_connect_string);
+ m_db->beginSave();
+ return m_db;
+ };
+
+private:
+ std::string m_connect_string;
+ ModMetadataDatabase *m_db = nullptr;
+};
+#endif // USE_POSTGRESQL
}
class TestModMetadataDatabase : public TestBase
@@ -193,6 +239,33 @@ void TestModMetadataDatabase::runTests(IGameDef *gamedef)
runTestsForCurrentDB();
delete mod_meta_provider;
+
+#if USE_POSTGRESQL
+ const char *env_postgresql_connect_string = getenv("MINETEST_POSTGRESQL_CONNECT_STRING");
+ if (env_postgresql_connect_string) {
+ std::string connect_string(env_postgresql_connect_string);
+
+ rawstream << "-------- PostgreSQL database (same object)" << std::endl;
+
+ clearPostgreSQLDatabase(connect_string);
+ mod_meta_db = new ModMetadataDatabasePostgreSQL(connect_string);
+ mod_meta_provider = new FixedProvider(mod_meta_db);
+
+ runTestsForCurrentDB();
+
+ delete mod_meta_db;
+ delete mod_meta_provider;
+
+ rawstream << "-------- PostgreSQL database (new objects)" << std::endl;
+
+ clearPostgreSQLDatabase(connect_string);
+ mod_meta_provider = new PostgreSQLProvider(connect_string);
+
+ runTestsForCurrentDB();
+
+ delete mod_meta_provider;
+ }
+#endif // USE_POSTGRESQL
}
////////////////////////////////////////////////////////////////////////////////