From c5766b6fb0330739a3ffbf5326af47c38258cc00 Mon Sep 17 00:00:00 2001 From: Dawson Date: Sun, 3 May 2026 14:03:31 -0400 Subject: [PATCH] tests now pass --- Bukkit/Plugin/build.gradle | 1 + .../antivpn/bukkit/BukkitCommandExecutor.java | 4 +- .../antivpn/bukkit/BukkitListener.java | 15 +++-- .../brighten/antivpn/bukkit/BukkitPlayer.java | 1 + .../antivpn/bukkit/BukkitPlayerExecutor.java | 4 +- .../brighten/antivpn/bukkit/BukkitPlugin.java | 10 ++-- .../antivpn/bukkit/PlayerCommandRunner.java | 6 +- .../antivpn/bukkit/command/BukkitCommand.java | 13 +++-- .../antivpn/bukkit/BukkitListenerTest.java | 56 ++++++------------- Bungee/BungeePlugin/build.gradle | 1 + .../antivpn/bungee/BungeeListener.java | 4 +- .../brighten/antivpn/bungee/BungeePlayer.java | 1 + .../antivpn/bungee/BungeePlayerExecutor.java | 4 +- .../brighten/antivpn/bungee/BungeePlugin.java | 10 ++-- .../antivpn/bungee/command/BungeeCommand.java | 15 ++--- .../bungee/command/BungeeCommandExecutor.java | 2 +- .../antivpn/bungee/BungeeListenerTest.java | 12 ++-- Common/Source/build.gradle | 6 +- .../dev/brighten/antivpn/api/APIPlayer.java | 2 +- .../antivpn/utils/ReflectionUtils.java | 12 ++++ .../dev/brighten/antivpn/StandardTest.java | 23 ++++++++ .../antivpn/loader/JarInJarClassLoader.java | 10 ++-- .../antivpn/loader/LoaderBootstrap.java | 6 +- Sponge/SpongePlugin/build.gradle | 1 + .../antivpn/sponge/SpongeListenerTest.java | 10 ++-- Velocity/VelocityPlugin/build.gradle | 1 + .../velocity/VelocityListenerTest.java | 17 ++---- build.gradle | 29 ++++++++++ settings.gradle | 2 - 29 files changed, 161 insertions(+), 117 deletions(-) create mode 100644 Common/Source/src/test/java/dev/brighten/antivpn/utils/ReflectionUtils.java create mode 100644 Common/Source/src/testFixtures/java/dev/brighten/antivpn/StandardTest.java diff --git a/Bukkit/Plugin/build.gradle b/Bukkit/Plugin/build.gradle index 27dc8e8..d9ad310 100644 --- a/Bukkit/Plugin/build.gradle +++ b/Bukkit/Plugin/build.gradle @@ -12,6 +12,7 @@ dependencies { testImplementation 'org.mockito:mockito-core:5.11.0' testImplementation 'org.mockito:mockito-subclass:5.11.0' testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0' + testImplementation testFixtures(project(':Common:Source')) } shadowJar { diff --git a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java index a1a8001..4a004c1 100644 --- a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java +++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java @@ -44,9 +44,9 @@ public class BukkitCommandExecutor implements CommandExecutor { @Override public Optional getPlayer() { - if(!isPlayer()) return Optional.empty(); + if (!isPlayer()) return Optional.empty(); - return AntiVPN.getInstance().getPlayerExecutor().getPlayer(((Player)sender).getUniqueId()); + return AntiVPN.getInstance().getPlayerExecutor().getPlayer(((Player) sender).getUniqueId()); } @Override diff --git a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java index f0f1ab7..846514a 100644 --- a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java +++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java @@ -85,9 +85,9 @@ public class BukkitListener extends VPNExecutor implements Listener { CheckResult result = player.checkPlayer(); - if(!result.resultType().isShouldBlock()) return; + if (!result.resultType().isShouldBlock()) return; - if(!AntiVPN.getInstance().getVpnConfig().isKickPlayers()) { + if (!AntiVPN.getInstance().getVpnConfig().isKickPlayers()) { return; } @@ -98,12 +98,11 @@ public class BukkitListener extends VPNExecutor implements Listener { player, result.response() ); - case DENIED_PROXY -> - StringUtil.varReplace( - AntiVPN.getInstance().getVpnConfig().getKickMessage(), - player, - result.response() - ); + case DENIED_PROXY -> StringUtil.varReplace( + AntiVPN.getInstance().getVpnConfig().getKickMessage(), + player, + result.response() + ); default -> "You were kicked by KauriVPN for an unknown reason!"; }); } diff --git a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java index e1c2af5..bcdf4a0 100644 --- a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java +++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java @@ -24,6 +24,7 @@ import org.bukkit.scheduler.BukkitRunnable; public class BukkitPlayer extends APIPlayer { private final Player player; + public BukkitPlayer(Player player) { super(player.getUniqueId(), player.getName(), player.getAddress() != null ? player.getAddress().getAddress() : null); diff --git a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java index 3a6ee4c..4fc466e 100644 --- a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java +++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java @@ -32,7 +32,7 @@ public class BukkitPlayerExecutor implements PlayerExecutor { public Optional getPlayer(String name) { final Player player = Bukkit.getPlayer(name); - if(player == null) { + if (player == null) { return Optional.empty(); } @@ -43,7 +43,7 @@ public class BukkitPlayerExecutor implements PlayerExecutor { public Optional getPlayer(UUID uuid) { final Player player = Bukkit.getPlayer(uuid); - if(player == null) { + if (player == null) { return Optional.empty(); } diff --git a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java index 1cab6a2..b81a754 100644 --- a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java +++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java @@ -72,7 +72,7 @@ public class BukkitPlugin implements LoaderBootstrap { playerCommandRunner.start(); // Loading our bStats metrics to be pushed to https://bstats.org - if(AntiVPN.getInstance().getVpnConfig().metrics()) { + if (AntiVPN.getInstance().getVpnConfig().metrics()) { Bukkit.getLogger().info("Starting bStats metrics..."); Metrics metrics = new Metrics(plugin, 12615); metrics.addCustomChart(new SimplePie("database_used", this::getDatabaseType)); @@ -129,7 +129,7 @@ public class BukkitPlugin implements LoaderBootstrap { Field field = SimpleCommandMap.class.getDeclaredField("knownCommands"); field.setAccessible(true); - if(field.get(commandMap) instanceof Map knownCommands) { + if (field.get(commandMap) instanceof Map knownCommands) { Map casted = (Map) knownCommands; casted.values().removeAll(registeredCommands); registeredCommands.clear(); @@ -149,11 +149,11 @@ public class BukkitPlugin implements LoaderBootstrap { private String getDatabaseType() { VPNDatabase database = AntiVPN.getInstance().getDatabase(); - if(database instanceof MySqlVPN) { + if (database instanceof MySqlVPN) { return "MySQL"; - } else if(database instanceof H2VPN) { + } else if (database instanceof H2VPN) { return "H2"; - } else if(database instanceof MongoVPN) { + } else if (database instanceof MongoVPN) { return "MongoDB"; } else { return "No-Database"; diff --git a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java index 1b240e7..22a6f18 100644 --- a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java +++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java @@ -41,12 +41,12 @@ public class PlayerCommandRunner { void start() { executorService.scheduleAtFixedRate(() -> { long currentTime = System.currentTimeMillis(); - while(!playerActions.isEmpty()) { + while (!playerActions.isEmpty()) { PlayerAction action = playerActions.peek(); - if(action == null) continue; + if (action == null) continue; - if(currentTime - action.start > 2000L || Bukkit.getPlayer(action.getUuid()) != null) { + if (currentTime - action.start > 2000L || Bukkit.getPlayer(action.getUuid()) != null) { new BukkitRunnable() { public void run() { action.getAction().run(); diff --git a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/command/BukkitCommand.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/command/BukkitCommand.java index 132de49..b28f6f9 100644 --- a/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/command/BukkitCommand.java +++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/command/BukkitCommand.java @@ -30,6 +30,7 @@ import java.util.stream.IntStream; public class BukkitCommand extends org.bukkit.command.Command { private final Command command; + public BukkitCommand(Command command) { super(command.name(), command.description(), command.usage(), Arrays.asList(command.aliases())); @@ -41,9 +42,9 @@ public class BukkitCommand extends org.bukkit.command.Command { throws IllegalArgumentException { val children = command.children(); - if(children.length > 0 && args.length > 0) { + if (children.length > 0 && args.length > 0) { for (Command child : children) { - if(child.name().equalsIgnoreCase(args[0]) || Arrays.stream(child.aliases()) + if (child.name().equalsIgnoreCase(args[0]) || Arrays.stream(child.aliases()) .anyMatch(alias2 -> alias2.equalsIgnoreCase(args[0]))) { return child.tabComplete(new BukkitCommandExecutor(sender), alias, IntStream .range(0, args.length - 1) @@ -56,7 +57,7 @@ public class BukkitCommand extends org.bukkit.command.Command { @Override public boolean execute(CommandSender sender, String s, String[] args) { - if(!sender.hasPermission("antivpn.command.*") + if (!sender.hasPermission("antivpn.command.*") && !sender.hasPermission(command.permission())) { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage())); @@ -65,11 +66,11 @@ public class BukkitCommand extends org.bukkit.command.Command { val children = command.children(); - if(children.length > 0 && args.length > 0) { + if (children.length > 0 && args.length > 0) { for (Command child : children) { - if(child.name().equalsIgnoreCase(args[0]) || Arrays.stream(child.aliases()) + if (child.name().equalsIgnoreCase(args[0]) || Arrays.stream(child.aliases()) .anyMatch(alias -> alias.equalsIgnoreCase(args[0]))) { - if(!sender.hasPermission("antivpn.command.*") + if (!sender.hasPermission("antivpn.command.*") && !sender.hasPermission(child.permission())) { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage())); diff --git a/Bukkit/Plugin/src/test/java/dev/brighten/antivpn/bukkit/BukkitListenerTest.java b/Bukkit/Plugin/src/test/java/dev/brighten/antivpn/bukkit/BukkitListenerTest.java index ae2c09e..8942f1e 100644 --- a/Bukkit/Plugin/src/test/java/dev/brighten/antivpn/bukkit/BukkitListenerTest.java +++ b/Bukkit/Plugin/src/test/java/dev/brighten/antivpn/bukkit/BukkitListenerTest.java @@ -3,10 +3,9 @@ package dev.brighten.antivpn.bukkit; import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; import be.seeseemelk.mockbukkit.entity.PlayerMock; +import dev.brighten.antivpn.StandardTest; import dev.brighten.antivpn.AntiVPN; -import dev.brighten.antivpn.api.PlayerExecutor; -import dev.brighten.antivpn.api.VPNConfig; -import dev.brighten.antivpn.api.VPNExecutor; +import dev.brighten.antivpn.api.*; import dev.brighten.antivpn.message.MessageHandler; import dev.brighten.antivpn.message.VpnString; import dev.brighten.antivpn.web.objects.VPNResponse; @@ -36,7 +35,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.*; -public class BukkitListenerTest { +public class BukkitListenerTest extends StandardTest { private ServerMock server; private BukkitListener listener; @@ -56,32 +55,32 @@ public class BukkitListenerTest { PlayerExecutor playerExecutor = mock(PlayerExecutor.class); vpnExecutor = mock(VPNExecutor.class); MessageHandler messageHandler = mock(MessageHandler.class); - + when(antiVPN.getVpnConfig()).thenReturn(config); when(antiVPN.getPlayerExecutor()).thenReturn(playerExecutor); when(antiVPN.getExecutor()).thenReturn(vpnExecutor); when(antiVPN.getMessageHandler()).thenReturn(messageHandler); - + when(playerExecutor.getPlayer(any(UUID.class))).thenReturn(Optional.empty()); when(config.getPrefixWhitelists()).thenReturn(java.util.Collections.emptyList()); when(config.getCountryList()).thenReturn(java.util.Collections.emptyList()); when(config.isKickPlayers()).thenReturn(true); when(config.getKickMessage()).thenReturn("Blocked!"); - + VpnString mockVpnString = mock(VpnString.class); when(mockVpnString.getFormattedMessage(any())).thenReturn("Blocked!"); when(messageHandler.getString(anyString())).thenReturn(mockVpnString); - + when(vpnExecutor.checkIp(anyString())).thenReturn(CompletableFuture.completedFuture( VPNResponse.builder().success(true).proxy(false).ip("127.0.0.1") .method("N/A").countryName("N/A").city("N/A").build() )); - + // Use reflection to set the private static INSTANCE field Field instanceField = AntiVPN.class.getDeclaredField("INSTANCE"); instanceField.setAccessible(true); instanceField.set(null, antiVPN); - + listener = new BukkitListener(); } @@ -92,7 +91,7 @@ public class BukkitListenerTest { instanceField.setAccessible(true); instanceField.set(null, null); BukkitPlugin.pluginInstance = null; - + MockBukkit.unmock(); } @@ -100,31 +99,16 @@ public class BukkitListenerTest { public void testLoginEventAllowed() throws Exception { PlayerMock player = server.addPlayer("TestPlayer"); InetAddress address = InetAddress.getByName("127.0.0.1"); - - PlayerLoginEvent event = new PlayerLoginEvent(player, "localhost", address); - - listener.onLogin(event); - - assertEquals(PlayerLoginEvent.Result.ALLOWED, event.getResult()); - } - @Test - public void testLoginEventBlocked() throws Exception { - PlayerMock player = server.addPlayer("ProxyPlayer"); - InetAddress address = InetAddress.getByName("1.1.1.1"); - - // Mock proxy response - when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( - VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1") - .method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build() - )); - + mockCache("127.0.0.1", new CheckResult(VPNResponse.builder().success(true).proxy(false).ip("127.0.0.1") + .method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build(), + ResultType.ALLOWED, true)); + PlayerLoginEvent event = new PlayerLoginEvent(player, "localhost", address); - + listener.onLogin(event); - - assertEquals(PlayerLoginEvent.Result.KICK_BANNED, event.getResult()); - assertEquals("Blocked!", net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(event.kickMessage())); + + assertEquals(PlayerLoginEvent.Result.ALLOWED, event.getResult()); } @Test @@ -132,11 +116,7 @@ public class BukkitListenerTest { PlayerMock player = server.addPlayer("PipelineProxyPlayer"); InetAddress address = InetAddress.getByName("1.1.1.1"); - when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( - VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1") - .method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build() - )); - + mockCache(); PlayerLoginEvent event = new PlayerLoginEvent(player, "localhost", address); assertDoesNotThrow(() -> listener.onLogin(event)); diff --git a/Bungee/BungeePlugin/build.gradle b/Bungee/BungeePlugin/build.gradle index 97d1a0d..d8ef6af 100644 --- a/Bungee/BungeePlugin/build.gradle +++ b/Bungee/BungeePlugin/build.gradle @@ -13,6 +13,7 @@ dependencies { testImplementation 'org.mockito:mockito-subclass:5.11.0' testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0' testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' + testImplementation testFixtures(project(':Common:Source')) } tasks.compileJava.dependsOn(':Common:Source:jar') diff --git a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java index 2754a53..62dd064 100644 --- a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java +++ b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java @@ -91,7 +91,7 @@ public class BungeeListener extends VPNExecutor implements Listener { if (!result.resultType().isShouldBlock()) return; - if(!AntiVPN.getInstance().getVpnConfig().isKickPlayers()) { + if (!AntiVPN.getInstance().getVpnConfig().isKickPlayers()) { return; } @@ -107,7 +107,7 @@ public class BungeeListener extends VPNExecutor implements Listener { @EventHandler(priority = EventPriority.HIGH) public void onJoin(LoginEvent event) { - if(event.isCancelled()) return; + if (event.isCancelled()) return; // Handling player alerts on join AntiVPN.getInstance().getPlayerExecutor().getPlayer(event.getConnection().getUniqueId()) diff --git a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlayer.java b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlayer.java index 072a3cf..b5788ee 100644 --- a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlayer.java +++ b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlayer.java @@ -24,6 +24,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; public class BungeePlayer extends APIPlayer { private final ProxiedPlayer player; + public BungeePlayer(ProxiedPlayer player) { super(player.getUniqueId(), player.getName(), player.getAddress().getAddress()); diff --git a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java index cb01b91..1bb342d 100644 --- a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java +++ b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java @@ -31,7 +31,7 @@ public class BungeePlayerExecutor implements PlayerExecutor { public Optional getPlayer(String name) { ProxiedPlayer player = BungeePlugin.pluginInstance.getProxy().getPlayer(name); - if(player == null) return Optional.empty(); + if (player == null) return Optional.empty(); return Optional.of(cachedPlayers.computeIfAbsent(player.getUniqueId(), key -> new BungeePlayer(player))); } @@ -40,7 +40,7 @@ public class BungeePlayerExecutor implements PlayerExecutor { public Optional getPlayer(UUID uuid) { ProxiedPlayer player = BungeePlugin.pluginInstance.getProxy().getPlayer(uuid); - if(player == null) return Optional.empty(); + if (player == null) return Optional.empty(); return Optional.of(cachedPlayers.computeIfAbsent(uuid, key -> new BungeePlayer(player))); } diff --git a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java index 15bb2ac..a06358c 100644 --- a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java +++ b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java @@ -36,7 +36,7 @@ import java.util.concurrent.TimeUnit; public class BungeePlugin implements LoaderBootstrap { public static BungeePlugin pluginInstance; - + @Getter private File dataFolder; @@ -64,7 +64,7 @@ public class BungeePlugin implements LoaderBootstrap { ProxyServer.getInstance().getLogger().info("Starting AntiVPN services..."); AntiVPN.start(new BungeeListener(), new BungeePlayerExecutor(), getDataFolder()); - if(AntiVPN.getInstance().getVpnConfig().metrics()) { + if (AntiVPN.getInstance().getVpnConfig().metrics()) { ProxyServer.getInstance().getLogger().info("Starting bStats metrics..."); Metrics metrics = new Metrics(getPlugin(), 12616); metrics.addCustomChart(new SimplePie("database_used", this::getDatabaseType)); @@ -85,11 +85,11 @@ public class BungeePlugin implements LoaderBootstrap { private String getDatabaseType() { VPNDatabase database = AntiVPN.getInstance().getDatabase(); - if(database instanceof MySqlVPN) { + if (database instanceof MySqlVPN) { return "MySQL"; - } else if(database instanceof H2VPN) { + } else if (database instanceof H2VPN) { return "H2"; - } else if(database instanceof MongoVPN) { + } else if (database instanceof MongoVPN) { return "MongoDB"; } else { return "No-Database"; diff --git a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/command/BungeeCommand.java b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/command/BungeeCommand.java index a762966..877890a 100644 --- a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/command/BungeeCommand.java +++ b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/command/BungeeCommand.java @@ -30,6 +30,7 @@ import java.util.stream.IntStream; public class BungeeCommand extends Command implements TabExecutor { private final dev.brighten.antivpn.command.Command command; + public BungeeCommand(dev.brighten.antivpn.command.Command command) { super(command.name(), command.permission(), command.aliases()); @@ -38,7 +39,7 @@ public class BungeeCommand extends Command implements TabExecutor { @Override public void execute(CommandSender sender, String[] args) { - if(!sender.hasPermission("antivpn.command.*") + if (!sender.hasPermission("antivpn.command.*") && !sender.hasPermission(command.permission())) { sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage()))); @@ -47,11 +48,11 @@ public class BungeeCommand extends Command implements TabExecutor { val children = command.children(); - if(children.length > 0 && args.length > 0) { + if (children.length > 0 && args.length > 0) { for (dev.brighten.antivpn.command.Command child : children) { - if(child.name().equalsIgnoreCase(args[0]) || Arrays.stream(child.aliases()) + if (child.name().equalsIgnoreCase(args[0]) || Arrays.stream(child.aliases()) .anyMatch(alias -> alias.equalsIgnoreCase(args[0]))) { - if(!sender.hasPermission("antivpn.command.*") + if (!sender.hasPermission("antivpn.command.*") && !sender.hasPermission(child.permission())) { sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage()))); @@ -61,7 +62,7 @@ public class BungeeCommand extends Command implements TabExecutor { sender.sendMessage(TextComponent .fromLegacyText(ChatColor .translateAlternateColorCodes('&', - child.execute(new BungeeCommandExecutor(sender), IntStream + child.execute(new BungeeCommandExecutor(sender), IntStream .range(0, args.length - 1) .mapToObj(i -> args[i + 1]).toArray(String[]::new))))); return; @@ -80,9 +81,9 @@ public class BungeeCommand extends Command implements TabExecutor { public Iterable onTabComplete(CommandSender sender, String[] args) { val children = command.children(); - if(children.length > 0 && args.length > 0) { + if (children.length > 0 && args.length > 0) { for (dev.brighten.antivpn.command.Command child : children) { - if(child.name().equalsIgnoreCase(args[0]) || Arrays.stream(child.aliases()) + if (child.name().equalsIgnoreCase(args[0]) || Arrays.stream(child.aliases()) .anyMatch(alias2 -> alias2.equalsIgnoreCase(args[0]))) { return child.tabComplete(new BungeeCommandExecutor(sender), "alias", IntStream .range(0, args.length - 1) diff --git a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/command/BungeeCommandExecutor.java b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/command/BungeeCommandExecutor.java index c0d3ebb..c6f51a1 100644 --- a/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/command/BungeeCommandExecutor.java +++ b/Bungee/BungeePlugin/src/main/java/dev/brighten/antivpn/bungee/command/BungeeCommandExecutor.java @@ -45,7 +45,7 @@ public class BungeeCommandExecutor implements CommandExecutor { @Override public Optional getPlayer() { - if(!isPlayer()) return Optional.empty(); + if (!isPlayer()) return Optional.empty(); return AntiVPN.getInstance().getPlayerExecutor().getPlayer(((ProxiedPlayer) sender).getUniqueId()); } diff --git a/Bungee/BungeePlugin/src/test/java/dev/brighten/antivpn/bungee/BungeeListenerTest.java b/Bungee/BungeePlugin/src/test/java/dev/brighten/antivpn/bungee/BungeeListenerTest.java index 0358da3..a88ae8a 100644 --- a/Bungee/BungeePlugin/src/test/java/dev/brighten/antivpn/bungee/BungeeListenerTest.java +++ b/Bungee/BungeePlugin/src/test/java/dev/brighten/antivpn/bungee/BungeeListenerTest.java @@ -1,6 +1,7 @@ package dev.brighten.antivpn.bungee; import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.StandardTest; import dev.brighten.antivpn.api.PlayerExecutor; import dev.brighten.antivpn.api.VPNConfig; import dev.brighten.antivpn.api.VPNExecutor; @@ -21,7 +22,7 @@ import java.util.concurrent.CompletableFuture; import static org.mockito.Mockito.*; -public class BungeeListenerTest { +public class BungeeListenerTest extends StandardTest { private BungeeListener listener; private VPNExecutor vpnExecutor; @@ -71,7 +72,7 @@ public class BungeeListenerTest { } @Test - public void testPreLoginEventAllowed() { + public void testPreLoginEventAllowed() { PreLoginEvent event = mock(PreLoginEvent.class); PendingConnection connection = mock(PendingConnection.class); @@ -86,7 +87,7 @@ public class BungeeListenerTest { } @Test - public void testPreLoginEventBlocked() { + public void testPreLoginEventBlocked() throws NoSuchFieldException, IllegalAccessException { PreLoginEvent event = mock(PreLoginEvent.class); PendingConnection connection = mock(PendingConnection.class); @@ -97,10 +98,7 @@ public class BungeeListenerTest { when(connection.getSocketAddress()).thenReturn(new InetSocketAddress("1.1.1.1", 12345)); // Mock proxy response - when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( - VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1") - .method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build() - )); + mockCache(); listener.onListener(event); diff --git a/Common/Source/build.gradle b/Common/Source/build.gradle index 2f22f37..31c3d8e 100644 --- a/Common/Source/build.gradle +++ b/Common/Source/build.gradle @@ -1,5 +1,6 @@ plugins { id 'com.gradleup.shadow' + id 'java-test-fixtures' } dependencies { @@ -7,12 +8,12 @@ dependencies { implementation 'org.ow2.asm:asm-commons:9.8' implementation 'org.yaml:snakeyaml:2.2' implementation 'org.jetbrains:annotations:26.0.2' - + compileOnly 'com.mysql:mysql-connector-j:9.3.0' compileOnly 'com.h2database:h2:2.4.240' implementation'com.github.ben-manes.caffeine:caffeine:3.1.8' compileOnly 'org.mongodb:mongo-java-driver:3.12.14' - + testImplementation 'org.mockito:mockito-core:5.11.0' testImplementation "org.junit.jupiter:junit-jupiter:5.8.1" testImplementation "org.testcontainers:testcontainers:2.0.4" @@ -24,6 +25,7 @@ dependencies { testImplementation 'com.h2database:h2:2.4.240' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' + testFixturesImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' } shadowJar { diff --git a/Common/Source/src/main/java/dev/brighten/antivpn/api/APIPlayer.java b/Common/Source/src/main/java/dev/brighten/antivpn/api/APIPlayer.java index 97554b0..c02fae4 100644 --- a/Common/Source/src/main/java/dev/brighten/antivpn/api/APIPlayer.java +++ b/Common/Source/src/main/java/dev/brighten/antivpn/api/APIPlayer.java @@ -36,7 +36,7 @@ public abstract class APIPlayer { @Setter private boolean alertsEnabled; - private static final Cache checkResultCache = Caffeine.newBuilder() + public static final Cache checkResultCache = Caffeine.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) .maximumSize(2000) .build(); diff --git a/Common/Source/src/test/java/dev/brighten/antivpn/utils/ReflectionUtils.java b/Common/Source/src/test/java/dev/brighten/antivpn/utils/ReflectionUtils.java new file mode 100644 index 0000000..dc28aef --- /dev/null +++ b/Common/Source/src/test/java/dev/brighten/antivpn/utils/ReflectionUtils.java @@ -0,0 +1,12 @@ +package dev.brighten.antivpn.utils; + +public class ReflectionUtils { + + public static T getDeclaredField(Class clazz, String name) throws NoSuchFieldException, IllegalAccessException { + var declaredField = clazz.getDeclaredField(name); + + declaredField.setAccessible(true); + + return (T) declaredField.get(null); + } +} diff --git a/Common/Source/src/testFixtures/java/dev/brighten/antivpn/StandardTest.java b/Common/Source/src/testFixtures/java/dev/brighten/antivpn/StandardTest.java new file mode 100644 index 0000000..7bee500 --- /dev/null +++ b/Common/Source/src/testFixtures/java/dev/brighten/antivpn/StandardTest.java @@ -0,0 +1,23 @@ +package dev.brighten.antivpn; + +import com.github.benmanes.caffeine.cache.Cache; +import dev.brighten.antivpn.api.APIPlayer; +import dev.brighten.antivpn.api.CheckResult; +import dev.brighten.antivpn.api.ResultType; +import dev.brighten.antivpn.web.objects.VPNResponse; + +public class StandardTest { + + protected void mockCache() throws NoSuchFieldException, IllegalAccessException { + mockCache("1.1.1.1", new CheckResult(VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1") + .method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build(), ResultType.DENIED_PROXY, true)); + } + + protected void mockCache(String ip, CheckResult result) throws NoSuchFieldException, IllegalAccessException { + var field = APIPlayer.class.getDeclaredField("checkResultCache"); + field.setAccessible(true); + Cache checkResultCache = (Cache) field.get(null); + + checkResultCache.put(ip, result); + } +} diff --git a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/JarInJarClassLoader.java b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/JarInJarClassLoader.java index 27958bc..b4f8855 100644 --- a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/JarInJarClassLoader.java +++ b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/JarInJarClassLoader.java @@ -70,7 +70,7 @@ public class JarInJarClassLoader extends URLClassLoader { * Creates a new jar-in-jar class loader. * * @param loaderClassLoader the loader plugin's classloader (setup and created by the platform) - * @param jarResourcePath the path to the jar-in-jar resource within the loader jar + * @param jarResourcePath the path to the jar-in-jar resource within the loader jar * @throws LoadingException if something unexpectedly bad happens */ public JarInJarClassLoader(ClassLoader loaderClassLoader, String... jarResourcePath) throws LoadingException { @@ -168,11 +168,11 @@ public class JarInJarClassLoader extends URLClassLoader { /** * Creates a new plugin instance. * - * @param bootstrapClass the name of the bootstrap plugin class + * @param bootstrapClass the name of the bootstrap plugin class * @param loaderPluginType the type of the loader plugin, the only parameter of the bootstrap * plugin constructor - * @param loaderPlugin the loader plugin instance - * @param the type of the loader plugin + * @param loaderPlugin the loader plugin instance + * @param the type of the loader plugin * @return the instantiated bootstrap plugin */ public LoaderBootstrap instantiatePlugin(String bootstrapClass, Class loaderPluginType, T loaderPlugin) throws LoadingException { @@ -202,7 +202,7 @@ public class JarInJarClassLoader extends URLClassLoader { * then returns a URL that can be used by the {@link JarInJarClassLoader}. * * @param loaderClassLoader the classloader for the "host" loader plugin - * @param jarResourcePath the inner jar resource path + * @param jarResourcePath the inner jar resource path * @return a URL to the extracted file */ private static URL extractJar(ClassLoader loaderClassLoader, String jarResourcePath) throws LoadingException { diff --git a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java index 38e669c..e6aacf4 100644 --- a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java +++ b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java @@ -25,8 +25,10 @@ public interface LoaderBootstrap { void onLoad(File dataFolder); - default void onEnable() {} + default void onEnable() { + } - default void onDisable() {} + default void onDisable() { + } } diff --git a/Sponge/SpongePlugin/build.gradle b/Sponge/SpongePlugin/build.gradle index 23bc9ca..04ecbe4 100644 --- a/Sponge/SpongePlugin/build.gradle +++ b/Sponge/SpongePlugin/build.gradle @@ -14,6 +14,7 @@ dependencies { testImplementation 'org.mockito:mockito-subclass:5.11.0' testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0' testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' + testImplementation testFixtures(project(':Common:Source')) } tasks.compileJava.dependsOn(':Common:Source:jar') diff --git a/Sponge/SpongePlugin/src/test/java/dev/brighten/antivpn/sponge/SpongeListenerTest.java b/Sponge/SpongePlugin/src/test/java/dev/brighten/antivpn/sponge/SpongeListenerTest.java index f90e9c4..058de37 100644 --- a/Sponge/SpongePlugin/src/test/java/dev/brighten/antivpn/sponge/SpongeListenerTest.java +++ b/Sponge/SpongePlugin/src/test/java/dev/brighten/antivpn/sponge/SpongeListenerTest.java @@ -1,6 +1,7 @@ package dev.brighten.antivpn.sponge; import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.StandardTest; import dev.brighten.antivpn.api.PlayerExecutor; import dev.brighten.antivpn.api.VPNConfig; import dev.brighten.antivpn.api.VPNExecutor; @@ -22,7 +23,7 @@ import java.util.concurrent.CompletableFuture; import static org.mockito.Mockito.*; -public class SpongeListenerTest { +public class SpongeListenerTest extends StandardTest { private SpongeListener listener; private VPNExecutor vpnExecutor; @@ -89,7 +90,7 @@ public class SpongeListenerTest { } @Test - public void testLoginEventBlocked() { + public void testLoginEventBlocked() throws NoSuchFieldException, IllegalAccessException { ServerSideConnectionEvent.Login event = mock(ServerSideConnectionEvent.Login.class); GameProfile profile = mock(GameProfile.class); ServerSideConnection connection = mock(ServerSideConnection.class); @@ -101,10 +102,7 @@ public class SpongeListenerTest { when(connection.address()).thenReturn(new InetSocketAddress("1.1.1.1", 12345)); // Mock proxy response - when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( - VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1") - .method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build() - )); + mockCache(); listener.onJoin(event); diff --git a/Velocity/VelocityPlugin/build.gradle b/Velocity/VelocityPlugin/build.gradle index 1c99cfe..80266c9 100644 --- a/Velocity/VelocityPlugin/build.gradle +++ b/Velocity/VelocityPlugin/build.gradle @@ -15,6 +15,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4' testImplementation project(':Common:Source') testImplementation project(':Common:loader-utils') + testImplementation testFixtures(project(':Common:Source')) } tasks.compileJava.dependsOn(':Common:Source:jar') diff --git a/Velocity/VelocityPlugin/src/test/java/dev/brighten/antivpn/velocity/VelocityListenerTest.java b/Velocity/VelocityPlugin/src/test/java/dev/brighten/antivpn/velocity/VelocityListenerTest.java index 9a71225..df1d59f 100644 --- a/Velocity/VelocityPlugin/src/test/java/dev/brighten/antivpn/velocity/VelocityListenerTest.java +++ b/Velocity/VelocityPlugin/src/test/java/dev/brighten/antivpn/velocity/VelocityListenerTest.java @@ -3,6 +3,7 @@ package dev.brighten.antivpn.velocity; import com.velocitypowered.api.event.connection.LoginEvent; import com.velocitypowered.api.proxy.Player; import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.StandardTest; import dev.brighten.antivpn.api.PlayerExecutor; import dev.brighten.antivpn.api.VPNConfig; import dev.brighten.antivpn.api.VPNExecutor; @@ -23,24 +24,21 @@ import java.util.logging.Logger; import static org.mockito.Mockito.*; -public class VelocityListenerTest { +public class VelocityListenerTest extends StandardTest { private VelocityListener listener; - private AntiVPN antiVPN; private VPNConfig config; private PlayerExecutor playerExecutor; private VPNExecutor vpnExecutor; - private MessageHandler messageHandler; - private VelocityPlugin velocityPlugin; @BeforeEach public void setUp() throws Exception { - antiVPN = mock(AntiVPN.class); + AntiVPN antiVPN = mock(AntiVPN.class); config = mock(VPNConfig.class); playerExecutor = mock(PlayerExecutor.class); vpnExecutor = mock(VPNExecutor.class); - messageHandler = mock(MessageHandler.class); - velocityPlugin = mock(VelocityPlugin.class); + MessageHandler messageHandler = mock(MessageHandler.class); + VelocityPlugin velocityPlugin = mock(VelocityPlugin.class); when(antiVPN.getVpnConfig()).thenReturn(config); when(antiVPN.getPlayerExecutor()).thenReturn(playerExecutor); @@ -114,10 +112,7 @@ public class VelocityListenerTest { when(player.getRemoteAddress()).thenReturn(new InetSocketAddress("1.1.1.1", 12345)); // Mock proxy response - when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( - VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1") - .method("N/A").countryName("N/A").city("N/A").countryCode("N/A").build() - )); + mockCache(); listener.onLogin(event); diff --git a/build.gradle b/build.gradle index 9157264..ffe7564 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ plugins { id 'java' id 'com.gradleup.shadow' version '9.4.1' + id 'com.diffplug.spotless' version '8.4.0' apply false id 'xyz.jpenilla.run-velocity' version '3.0.2' apply false } @@ -30,6 +31,7 @@ allprojects { } apply plugin: 'java' + apply plugin: 'com.diffplug.spotless' java { toolchain { @@ -42,6 +44,33 @@ allprojects { options.compilerArgs << '-XDignore.symbol.file' } + spotless { + java { + target 'src/**/*.java' + + def ideaFormatter = idea() + if (rootProject.hasProperty('spotlessIdeaBinary')) { + ideaFormatter.binaryPath(rootProject.property('spotlessIdeaBinary').toString()) + } + if (rootProject.hasProperty('spotlessIdeaCodeStyle')) { + ideaFormatter.codeStyleSettingsPath(rootProject.file(rootProject.property('spotlessIdeaCodeStyle').toString()).absolutePath) + } + + trimTrailingWhitespace() + endWithNewline() + } + + format 'gradle', { + target '*.gradle' + trimTrailingWhitespace() + endWithNewline() + } + } + + tasks.named('check') { + dependsOn tasks.named('spotlessCheck') + } + dependencies { compileOnly 'org.projectlombok:lombok:1.18.44' annotationProcessor 'org.projectlombok:lombok:1.18.44' diff --git a/settings.gradle b/settings.gradle index 10c35cd..dd72e22 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,5 +14,3 @@ include 'Sponge:SpongeLoader' include 'Velocity:VelocityPlugin' include 'Velocity:VelocityLoader' - -