From a455b8ea3a9152f54d486e3f386e798759c88dbb Mon Sep 17 00:00:00 2001 From: aro Date: Sun, 11 Dec 2022 11:21:38 +0100 Subject: [PATCH] feat(sql+test): sql database+table creation test --- nicko-core/pom.xml | 7 ++ .../net/artelnatif/nicko/NickoBukkit.java | 90 +++++++++++-------- .../nicko/config/NickoConfiguration.java | 5 +- .../nicko/storage/sql/SQLStorageProvider.java | 43 +++++---- .../nicko/test/mock/NickoServerMock.java | 6 -- .../nicko/test/storage/SQLStorageTest.java | 15 ++-- 6 files changed, 100 insertions(+), 66 deletions(-) delete mode 100644 nicko-core/src/test/java/net/artelnatif/nicko/test/mock/NickoServerMock.java diff --git a/nicko-core/pom.xml b/nicko-core/pom.xml index 5781d33..63c389d 100644 --- a/nicko-core/pom.xml +++ b/nicko-core/pom.xml @@ -99,6 +99,13 @@ 2.29.0 test + + + org.mariadb.jdbc + mariadb-java-client + 3.1.0 + + diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/NickoBukkit.java b/nicko-core/src/main/java/net/artelnatif/nicko/NickoBukkit.java index 71f24ab..de3096c 100644 --- a/nicko-core/src/main/java/net/artelnatif/nicko/NickoBukkit.java +++ b/nicko-core/src/main/java/net/artelnatif/nicko/NickoBukkit.java @@ -27,9 +27,10 @@ import java.io.File; import java.util.logging.Level; public class NickoBukkit extends JavaPlugin { - private boolean unitTesting; private static NickoBukkit plugin; + private final boolean unitTesting; + private NickoConfiguration nickoConfiguration; private MojangAPI mojangAPI; private PlayerDataStore dataStore; @@ -37,9 +38,10 @@ public class NickoBukkit extends JavaPlugin { /** * Used by MockBukkit */ - protected NickoBukkit(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { + protected NickoBukkit(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file, NickoConfiguration nickoConfiguration) { super(loader, description, dataFolder, file); unitTesting = true; + this.nickoConfiguration = nickoConfiguration; getLogger().info("Unit Testing Mode enabled."); } @@ -47,13 +49,48 @@ public class NickoBukkit extends JavaPlugin { public void onEnable() { plugin = this; - if(!isUnitTesting()) { - getLogger().info("Loading internals..."); - if (getInternals() == null) { - getLogger().log(Level.SEVERE, "Nicko could not find a valid implementation for this server version. Is your server supported?"); - dataStore.getStorage().setError(true); - getServer().getPluginManager().disablePlugin(this); + if (isUnitTesting()) { + onUnitTestingStartup(); + } else { + onPluginStartup(); + } + } + + @Override + public void onDisable() { + if (!dataStore.getStorage().isError()) { + getLogger().info("Closing persistence..."); + dataStore.removeAllNames(); + if (!dataStore.getStorage().getProvider().close()) { + getLogger().warning("Failed to close persistence!"); } + dataStore.getStorage().setError(false); + } + + if (nickoConfiguration.isBungeecordEnabled()) { + getServer().getMessenger().unregisterIncomingPluginChannel(this); + getServer().getMessenger().unregisterOutgoingPluginChannel(this); + } + + getLogger().info("Nicko (Bukkit) has been disabled."); + } + + public void onUnitTestingStartup() { + getLogger().info("Loading persistence..."); + dataStore = new PlayerDataStore(this); + + if (!dataStore.getStorage().getProvider().init()) { + dataStore.getStorage().setError(true); + getLogger().warning("Failed to open persistence, data will NOT be saved!"); + } + } + + public void onPluginStartup() { + getLogger().info("Loading internals..."); + if (getInternals() == null) { + getLogger().log(Level.SEVERE, "Nicko could not find a valid implementation for this server version. Is your server supported?"); + dataStore.getStorage().setError(true); + getServer().getPluginManager().disablePlugin(this); } if (getServer().getPluginManager().isPluginEnabled(this)) { @@ -84,17 +121,15 @@ public class NickoBukkit extends JavaPlugin { new PlaceHolderHook(this).hook(); - if(!isUnitTesting()) { - getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); - getServer().getPluginManager().registerEvents(new PlayerQuitListener(), this); + getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); + getServer().getPluginManager().registerEvents(new PlayerQuitListener(), this); - final ServerUtils serverUtils = new ServerUtils(this); - serverUtils.checkSpigotBungeeCordHook(); - if (nickoConfiguration.isBungeecordEnabled()) { - if (serverUtils.checkBungeeCordHook()) { - getLogger().info("Enabling BungeeCord support..."); - getServer().getMessenger().registerIncomingPluginChannel(this, NickoBungee.NICKO_PLUGIN_CHANNEL_UPDATE, new PluginMessageHandler()); - } + final ServerUtils serverUtils = new ServerUtils(this); + serverUtils.checkSpigotBungeeCordHook(); + if (nickoConfiguration.isBungeecordEnabled()) { + if (serverUtils.checkBungeeCordHook()) { + getLogger().info("Enabling BungeeCord support..."); + getServer().getMessenger().registerIncomingPluginChannel(this, NickoBungee.NICKO_PLUGIN_CHANNEL_UPDATE, new PluginMessageHandler()); } } @@ -102,25 +137,6 @@ public class NickoBukkit extends JavaPlugin { } } - @Override - public void onDisable() { - if (!dataStore.getStorage().isError()) { - getLogger().info("Closing persistence..."); - dataStore.removeAllNames(); - if (!dataStore.getStorage().getProvider().close()) { - getLogger().warning("Failed to close persistence!"); - } - dataStore.getStorage().setError(false); - } - - if (nickoConfiguration.isBungeecordEnabled()) { - getServer().getMessenger().unregisterIncomingPluginChannel(this); - getServer().getMessenger().unregisterOutgoingPluginChannel(this); - } - - getLogger().info("Nicko (Bukkit) has been disabled."); - } - public static NickoBukkit getInstance() { return plugin; } diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/config/NickoConfiguration.java b/nicko-core/src/main/java/net/artelnatif/nicko/config/NickoConfiguration.java index 0d045cb..2edd6c5 100644 --- a/nicko-core/src/main/java/net/artelnatif/nicko/config/NickoConfiguration.java +++ b/nicko-core/src/main/java/net/artelnatif/nicko/config/NickoConfiguration.java @@ -80,7 +80,10 @@ public class NickoConfiguration { } public String getSQLPassword() { - return getStorageSection().getString("password"); + if (sqlPassword == null) { + return sqlPassword = getStorageSection().getString("password"); + } + return sqlPassword; } public void setSQLPassword(String sqlPassword) { diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java b/nicko-core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java index 2ba5096..78e0724 100644 --- a/nicko-core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java +++ b/nicko-core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java @@ -4,12 +4,18 @@ import net.artelnatif.nicko.NickoBukkit; import net.artelnatif.nicko.config.NickoConfiguration; import net.artelnatif.nicko.storage.StorageProvider; -import java.sql.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; public class SQLStorageProvider implements StorageProvider { private final NickoBukkit instance; private Connection connection; + private final String schemaName = "nicko"; + private final String tableName = "DATA"; + public SQLStorageProvider(NickoBukkit instance) { this.instance = instance; } @@ -18,18 +24,20 @@ public class SQLStorageProvider implements StorageProvider { public boolean init() { try { final NickoConfiguration config = instance.getNickoConfig(); - connection = DriverManager.getConnection("jdbc://" + config.getSQLAddress(), config.getSQLUsername(), config.getSQLPassword()); + connection = DriverManager.getConnection("jdbc:mariadb://" + config.getSQLAddress(), config.getSQLUsername(), config.getSQLPassword()); final boolean initialized = connection != null && !connection.isClosed(); if (initialized) { - if (!doesTableExist()) { - instance.getLogger().info("Creating SQL tables..."); - return createTables(); - } + instance.getLogger().info("Creating SQL database..."); + createDatabase(); + + instance.getLogger().info("Creating SQL table..."); + createTable(); return true; } return false; } catch (SQLException e) { + e.printStackTrace(); return false; } } @@ -40,6 +48,7 @@ public class SQLStorageProvider implements StorageProvider { @Override public boolean close() { + if(connection == null) { return true; } try { connection.close(); return connection.isClosed(); @@ -48,38 +57,42 @@ public class SQLStorageProvider implements StorageProvider { } } - private boolean createTables() { + private void createTable() { final Connection connection = getConnection(); final String query = """ - CREATE TABLE IF NOT EXISTS 'NICKO' ( + CREATE TABLE IF NOT EXISTS %s.%s ( uuid uuid NOT NULL, name varchar(16) NOT NULL, skin varchar(16) NOT NULL, bungeecord boolean NOT NULL, PRIMARY KEY (UUID) ) - """; + """.formatted(schemaName, tableName); try { final PreparedStatement statement = connection.prepareStatement(query); - ResultSet result = statement.executeQuery(); - return result.next(); + statement.executeUpdate(); + statement.close(); } catch (SQLException e) { + // TODO: 12/10/22 Handle error throw new RuntimeException(e); } } - private boolean doesTableExist() { + private void createDatabase() { final Connection connection = getConnection(); - final String query = "SELECT UUID FROM 'NICKO'"; + final String query = """ + CREATE DATABASE IF NOT EXISTS %s + """.formatted(schemaName); try { final PreparedStatement statement = connection.prepareStatement(query); - ResultSet result = statement.executeQuery(); - return result.next(); + statement.executeUpdate(); + statement.close(); } catch (SQLException e) { + // TODO: 12/10/22 Handle error throw new RuntimeException(e); } } diff --git a/nicko-core/src/test/java/net/artelnatif/nicko/test/mock/NickoServerMock.java b/nicko-core/src/test/java/net/artelnatif/nicko/test/mock/NickoServerMock.java deleted file mode 100644 index 2071ad6..0000000 --- a/nicko-core/src/test/java/net/artelnatif/nicko/test/mock/NickoServerMock.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.artelnatif.nicko.test.mock; - -import be.seeseemelk.mockbukkit.ServerMock; - -public class NickoServerMock extends ServerMock { -} diff --git a/nicko-core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java b/nicko-core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java index 914704b..d6cc9c1 100644 --- a/nicko-core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java +++ b/nicko-core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java @@ -6,7 +6,6 @@ import be.seeseemelk.mockbukkit.entity.PlayerMock; import net.artelnatif.nicko.NickoBukkit; import net.artelnatif.nicko.config.NickoConfiguration; import net.artelnatif.nicko.disguise.NickoProfile; -import net.artelnatif.nicko.test.mock.NickoServerMock; import org.junit.jupiter.api.*; import java.util.Optional; @@ -18,17 +17,19 @@ public class SQLStorageTest { @BeforeAll public static void setup() { - server = MockBukkit.mock(new NickoServerMock()); - plugin = MockBukkit.load(NickoBukkit.class); - config = plugin.getNickoConfig(); + server = MockBukkit.mock(); + config = new NickoConfiguration(null); + config.setLocalStorage(false); + config.setBungeecordSupport(false); + config.setSQLAddress("127.0.0.1"); + config.setSQLUsername("root"); + config.setSQLPassword("12345"); // https://howsecureismypassword.net/ "Your password would be cracked: Instantly" + plugin = MockBukkit.load(NickoBukkit.class, config); } @Test @DisplayName("Create SQL Tables") public void testSQLTables() { - config.setSQLAddress("localhost"); - config.setSQLUsername("root"); - config.setSQLPassword("12345"); // https://howsecureismypassword.net/ "Your password would be cracked: Instantly" final PlayerMock playerMock = server.addPlayer("Aro"); final Optional data = plugin.getDataStore().getData(playerMock.getUniqueId());