tests now pass

This commit is contained in:
2026-05-03 14:03:31 -04:00
parent 54403c02ee
commit c5766b6fb0
29 changed files with 161 additions and 117 deletions
+1
View File
@@ -12,6 +12,7 @@ dependencies {
testImplementation 'org.mockito:mockito-core:5.11.0' testImplementation 'org.mockito:mockito-core:5.11.0'
testImplementation 'org.mockito:mockito-subclass:5.11.0' testImplementation 'org.mockito:mockito-subclass:5.11.0'
testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0' testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0'
testImplementation testFixtures(project(':Common:Source'))
} }
shadowJar { shadowJar {
@@ -44,9 +44,9 @@ public class BukkitCommandExecutor implements CommandExecutor {
@Override @Override
public Optional<APIPlayer> getPlayer() { public Optional<APIPlayer> 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 @Override
@@ -85,9 +85,9 @@ public class BukkitListener extends VPNExecutor implements Listener {
CheckResult result = player.checkPlayer(); 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; return;
} }
@@ -98,8 +98,7 @@ public class BukkitListener extends VPNExecutor implements Listener {
player, player,
result.response() result.response()
); );
case DENIED_PROXY -> case DENIED_PROXY -> StringUtil.varReplace(
StringUtil.varReplace(
AntiVPN.getInstance().getVpnConfig().getKickMessage(), AntiVPN.getInstance().getVpnConfig().getKickMessage(),
player, player,
result.response() result.response()
@@ -24,6 +24,7 @@ import org.bukkit.scheduler.BukkitRunnable;
public class BukkitPlayer extends APIPlayer { public class BukkitPlayer extends APIPlayer {
private final Player player; private final Player player;
public BukkitPlayer(Player player) { public BukkitPlayer(Player player) {
super(player.getUniqueId(), player.getName(), player.getAddress() != null ? player.getAddress().getAddress() : null); super(player.getUniqueId(), player.getName(), player.getAddress() != null ? player.getAddress().getAddress() : null);
@@ -32,7 +32,7 @@ public class BukkitPlayerExecutor implements PlayerExecutor {
public Optional<APIPlayer> getPlayer(String name) { public Optional<APIPlayer> getPlayer(String name) {
final Player player = Bukkit.getPlayer(name); final Player player = Bukkit.getPlayer(name);
if(player == null) { if (player == null) {
return Optional.empty(); return Optional.empty();
} }
@@ -43,7 +43,7 @@ public class BukkitPlayerExecutor implements PlayerExecutor {
public Optional<APIPlayer> getPlayer(UUID uuid) { public Optional<APIPlayer> getPlayer(UUID uuid) {
final Player player = Bukkit.getPlayer(uuid); final Player player = Bukkit.getPlayer(uuid);
if(player == null) { if (player == null) {
return Optional.empty(); return Optional.empty();
} }
@@ -72,7 +72,7 @@ public class BukkitPlugin implements LoaderBootstrap {
playerCommandRunner.start(); playerCommandRunner.start();
// Loading our bStats metrics to be pushed to https://bstats.org // 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..."); Bukkit.getLogger().info("Starting bStats metrics...");
Metrics metrics = new Metrics(plugin, 12615); Metrics metrics = new Metrics(plugin, 12615);
metrics.addCustomChart(new SimplePie("database_used", this::getDatabaseType)); metrics.addCustomChart(new SimplePie("database_used", this::getDatabaseType));
@@ -129,7 +129,7 @@ public class BukkitPlugin implements LoaderBootstrap {
Field field = SimpleCommandMap.class.getDeclaredField("knownCommands"); Field field = SimpleCommandMap.class.getDeclaredField("knownCommands");
field.setAccessible(true); field.setAccessible(true);
if(field.get(commandMap) instanceof Map<?, ?> knownCommands) { if (field.get(commandMap) instanceof Map<?, ?> knownCommands) {
Map<String, org.bukkit.command.Command> casted = (Map<String, org.bukkit.command.Command>) knownCommands; Map<String, org.bukkit.command.Command> casted = (Map<String, org.bukkit.command.Command>) knownCommands;
casted.values().removeAll(registeredCommands); casted.values().removeAll(registeredCommands);
registeredCommands.clear(); registeredCommands.clear();
@@ -149,11 +149,11 @@ public class BukkitPlugin implements LoaderBootstrap {
private String getDatabaseType() { private String getDatabaseType() {
VPNDatabase database = AntiVPN.getInstance().getDatabase(); VPNDatabase database = AntiVPN.getInstance().getDatabase();
if(database instanceof MySqlVPN) { if (database instanceof MySqlVPN) {
return "MySQL"; return "MySQL";
} else if(database instanceof H2VPN) { } else if (database instanceof H2VPN) {
return "H2"; return "H2";
} else if(database instanceof MongoVPN) { } else if (database instanceof MongoVPN) {
return "MongoDB"; return "MongoDB";
} else { } else {
return "No-Database"; return "No-Database";
@@ -41,12 +41,12 @@ public class PlayerCommandRunner {
void start() { void start() {
executorService.scheduleAtFixedRate(() -> { executorService.scheduleAtFixedRate(() -> {
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
while(!playerActions.isEmpty()) { while (!playerActions.isEmpty()) {
PlayerAction action = playerActions.peek(); 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() { new BukkitRunnable() {
public void run() { public void run() {
action.getAction().run(); action.getAction().run();
@@ -30,6 +30,7 @@ import java.util.stream.IntStream;
public class BukkitCommand extends org.bukkit.command.Command { public class BukkitCommand extends org.bukkit.command.Command {
private final Command command; private final Command command;
public BukkitCommand(Command command) { public BukkitCommand(Command command) {
super(command.name(), command.description(), command.usage(), Arrays.asList(command.aliases())); 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 { throws IllegalArgumentException {
val children = command.children(); val children = command.children();
if(children.length > 0 && args.length > 0) { if (children.length > 0 && args.length > 0) {
for (Command child : children) { 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]))) { .anyMatch(alias2 -> alias2.equalsIgnoreCase(args[0]))) {
return child.tabComplete(new BukkitCommandExecutor(sender), alias, IntStream return child.tabComplete(new BukkitCommandExecutor(sender), alias, IntStream
.range(0, args.length - 1) .range(0, args.length - 1)
@@ -56,7 +57,7 @@ public class BukkitCommand extends org.bukkit.command.Command {
@Override @Override
public boolean execute(CommandSender sender, String s, String[] args) { public boolean execute(CommandSender sender, String s, String[] args) {
if(!sender.hasPermission("antivpn.command.*") if (!sender.hasPermission("antivpn.command.*")
&& !sender.hasPermission(command.permission())) { && !sender.hasPermission(command.permission())) {
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', sender.sendMessage(ChatColor.translateAlternateColorCodes('&',
AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage())); AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage()));
@@ -65,11 +66,11 @@ public class BukkitCommand extends org.bukkit.command.Command {
val children = command.children(); val children = command.children();
if(children.length > 0 && args.length > 0) { if (children.length > 0 && args.length > 0) {
for (Command child : children) { 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]))) { .anyMatch(alias -> alias.equalsIgnoreCase(args[0]))) {
if(!sender.hasPermission("antivpn.command.*") if (!sender.hasPermission("antivpn.command.*")
&& !sender.hasPermission(child.permission())) { && !sender.hasPermission(child.permission())) {
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', sender.sendMessage(ChatColor.translateAlternateColorCodes('&',
AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage())); AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage()));
@@ -3,10 +3,9 @@ package dev.brighten.antivpn.bukkit;
import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.MockBukkit;
import be.seeseemelk.mockbukkit.ServerMock; import be.seeseemelk.mockbukkit.ServerMock;
import be.seeseemelk.mockbukkit.entity.PlayerMock; import be.seeseemelk.mockbukkit.entity.PlayerMock;
import dev.brighten.antivpn.StandardTest;
import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.AntiVPN;
import dev.brighten.antivpn.api.PlayerExecutor; import dev.brighten.antivpn.api.*;
import dev.brighten.antivpn.api.VPNConfig;
import dev.brighten.antivpn.api.VPNExecutor;
import dev.brighten.antivpn.message.MessageHandler; import dev.brighten.antivpn.message.MessageHandler;
import dev.brighten.antivpn.message.VpnString; import dev.brighten.antivpn.message.VpnString;
import dev.brighten.antivpn.web.objects.VPNResponse; 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.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
public class BukkitListenerTest { public class BukkitListenerTest extends StandardTest {
private ServerMock server; private ServerMock server;
private BukkitListener listener; private BukkitListener listener;
@@ -101,6 +100,10 @@ public class BukkitListenerTest {
PlayerMock player = server.addPlayer("TestPlayer"); PlayerMock player = server.addPlayer("TestPlayer");
InetAddress address = InetAddress.getByName("127.0.0.1"); InetAddress address = InetAddress.getByName("127.0.0.1");
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); PlayerLoginEvent event = new PlayerLoginEvent(player, "localhost", address);
listener.onLogin(event); listener.onLogin(event);
@@ -108,35 +111,12 @@ public class BukkitListenerTest {
assertEquals(PlayerLoginEvent.Result.ALLOWED, event.getResult()); 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()
));
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()));
}
@Test @Test
public void testLoginPipelineProxyPlayerIsKickedWithoutErrors() throws Exception { public void testLoginPipelineProxyPlayerIsKickedWithoutErrors() throws Exception {
PlayerMock player = server.addPlayer("PipelineProxyPlayer"); PlayerMock player = server.addPlayer("PipelineProxyPlayer");
InetAddress address = InetAddress.getByName("1.1.1.1"); InetAddress address = InetAddress.getByName("1.1.1.1");
when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( mockCache();
VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1")
.method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build()
));
PlayerLoginEvent event = new PlayerLoginEvent(player, "localhost", address); PlayerLoginEvent event = new PlayerLoginEvent(player, "localhost", address);
assertDoesNotThrow(() -> listener.onLogin(event)); assertDoesNotThrow(() -> listener.onLogin(event));
+1
View File
@@ -13,6 +13,7 @@ dependencies {
testImplementation 'org.mockito:mockito-subclass:5.11.0' testImplementation 'org.mockito:mockito-subclass:5.11.0'
testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0' testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0'
testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'
testImplementation testFixtures(project(':Common:Source'))
} }
tasks.compileJava.dependsOn(':Common:Source:jar') tasks.compileJava.dependsOn(':Common:Source:jar')
@@ -91,7 +91,7 @@ public class BungeeListener extends VPNExecutor implements Listener {
if (!result.resultType().isShouldBlock()) return; if (!result.resultType().isShouldBlock()) return;
if(!AntiVPN.getInstance().getVpnConfig().isKickPlayers()) { if (!AntiVPN.getInstance().getVpnConfig().isKickPlayers()) {
return; return;
} }
@@ -107,7 +107,7 @@ public class BungeeListener extends VPNExecutor implements Listener {
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onJoin(LoginEvent event) { public void onJoin(LoginEvent event) {
if(event.isCancelled()) return; if (event.isCancelled()) return;
// Handling player alerts on join // Handling player alerts on join
AntiVPN.getInstance().getPlayerExecutor().getPlayer(event.getConnection().getUniqueId()) AntiVPN.getInstance().getPlayerExecutor().getPlayer(event.getConnection().getUniqueId())
@@ -24,6 +24,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer;
public class BungeePlayer extends APIPlayer { public class BungeePlayer extends APIPlayer {
private final ProxiedPlayer player; private final ProxiedPlayer player;
public BungeePlayer(ProxiedPlayer player) { public BungeePlayer(ProxiedPlayer player) {
super(player.getUniqueId(), player.getName(), player.getAddress().getAddress()); super(player.getUniqueId(), player.getName(), player.getAddress().getAddress());
@@ -31,7 +31,7 @@ public class BungeePlayerExecutor implements PlayerExecutor {
public Optional<APIPlayer> getPlayer(String name) { public Optional<APIPlayer> getPlayer(String name) {
ProxiedPlayer player = BungeePlugin.pluginInstance.getProxy().getPlayer(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))); return Optional.of(cachedPlayers.computeIfAbsent(player.getUniqueId(), key -> new BungeePlayer(player)));
} }
@@ -40,7 +40,7 @@ public class BungeePlayerExecutor implements PlayerExecutor {
public Optional<APIPlayer> getPlayer(UUID uuid) { public Optional<APIPlayer> getPlayer(UUID uuid) {
ProxiedPlayer player = BungeePlugin.pluginInstance.getProxy().getPlayer(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))); return Optional.of(cachedPlayers.computeIfAbsent(uuid, key -> new BungeePlayer(player)));
} }
@@ -64,7 +64,7 @@ public class BungeePlugin implements LoaderBootstrap {
ProxyServer.getInstance().getLogger().info("Starting AntiVPN services..."); ProxyServer.getInstance().getLogger().info("Starting AntiVPN services...");
AntiVPN.start(new BungeeListener(), new BungeePlayerExecutor(), getDataFolder()); AntiVPN.start(new BungeeListener(), new BungeePlayerExecutor(), getDataFolder());
if(AntiVPN.getInstance().getVpnConfig().metrics()) { if (AntiVPN.getInstance().getVpnConfig().metrics()) {
ProxyServer.getInstance().getLogger().info("Starting bStats metrics..."); ProxyServer.getInstance().getLogger().info("Starting bStats metrics...");
Metrics metrics = new Metrics(getPlugin(), 12616); Metrics metrics = new Metrics(getPlugin(), 12616);
metrics.addCustomChart(new SimplePie("database_used", this::getDatabaseType)); metrics.addCustomChart(new SimplePie("database_used", this::getDatabaseType));
@@ -85,11 +85,11 @@ public class BungeePlugin implements LoaderBootstrap {
private String getDatabaseType() { private String getDatabaseType() {
VPNDatabase database = AntiVPN.getInstance().getDatabase(); VPNDatabase database = AntiVPN.getInstance().getDatabase();
if(database instanceof MySqlVPN) { if (database instanceof MySqlVPN) {
return "MySQL"; return "MySQL";
} else if(database instanceof H2VPN) { } else if (database instanceof H2VPN) {
return "H2"; return "H2";
} else if(database instanceof MongoVPN) { } else if (database instanceof MongoVPN) {
return "MongoDB"; return "MongoDB";
} else { } else {
return "No-Database"; return "No-Database";
@@ -30,6 +30,7 @@ import java.util.stream.IntStream;
public class BungeeCommand extends Command implements TabExecutor { public class BungeeCommand extends Command implements TabExecutor {
private final dev.brighten.antivpn.command.Command command; private final dev.brighten.antivpn.command.Command command;
public BungeeCommand(dev.brighten.antivpn.command.Command command) { public BungeeCommand(dev.brighten.antivpn.command.Command command) {
super(command.name(), command.permission(), command.aliases()); super(command.name(), command.permission(), command.aliases());
@@ -38,7 +39,7 @@ public class BungeeCommand extends Command implements TabExecutor {
@Override @Override
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("antivpn.command.*") if (!sender.hasPermission("antivpn.command.*")
&& !sender.hasPermission(command.permission())) { && !sender.hasPermission(command.permission())) {
sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',
AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage()))); AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage())));
@@ -47,11 +48,11 @@ public class BungeeCommand extends Command implements TabExecutor {
val children = command.children(); 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) { 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]))) { .anyMatch(alias -> alias.equalsIgnoreCase(args[0]))) {
if(!sender.hasPermission("antivpn.command.*") if (!sender.hasPermission("antivpn.command.*")
&& !sender.hasPermission(child.permission())) { && !sender.hasPermission(child.permission())) {
sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',
AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage()))); AntiVPN.getInstance().getMessageHandler().getString("no-permission").getMessage())));
@@ -80,9 +81,9 @@ public class BungeeCommand extends Command implements TabExecutor {
public Iterable<String> onTabComplete(CommandSender sender, String[] args) { public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
val children = command.children(); 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) { 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]))) { .anyMatch(alias2 -> alias2.equalsIgnoreCase(args[0]))) {
return child.tabComplete(new BungeeCommandExecutor(sender), "alias", IntStream return child.tabComplete(new BungeeCommandExecutor(sender), "alias", IntStream
.range(0, args.length - 1) .range(0, args.length - 1)
@@ -45,7 +45,7 @@ public class BungeeCommandExecutor implements CommandExecutor {
@Override @Override
public Optional<APIPlayer> getPlayer() { public Optional<APIPlayer> getPlayer() {
if(!isPlayer()) return Optional.empty(); if (!isPlayer()) return Optional.empty();
return AntiVPN.getInstance().getPlayerExecutor().getPlayer(((ProxiedPlayer) sender).getUniqueId()); return AntiVPN.getInstance().getPlayerExecutor().getPlayer(((ProxiedPlayer) sender).getUniqueId());
} }
@@ -1,6 +1,7 @@
package dev.brighten.antivpn.bungee; package dev.brighten.antivpn.bungee;
import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.AntiVPN;
import dev.brighten.antivpn.StandardTest;
import dev.brighten.antivpn.api.PlayerExecutor; import dev.brighten.antivpn.api.PlayerExecutor;
import dev.brighten.antivpn.api.VPNConfig; import dev.brighten.antivpn.api.VPNConfig;
import dev.brighten.antivpn.api.VPNExecutor; import dev.brighten.antivpn.api.VPNExecutor;
@@ -21,7 +22,7 @@ import java.util.concurrent.CompletableFuture;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
public class BungeeListenerTest { public class BungeeListenerTest extends StandardTest {
private BungeeListener listener; private BungeeListener listener;
private VPNExecutor vpnExecutor; private VPNExecutor vpnExecutor;
@@ -86,7 +87,7 @@ public class BungeeListenerTest {
} }
@Test @Test
public void testPreLoginEventBlocked() { public void testPreLoginEventBlocked() throws NoSuchFieldException, IllegalAccessException {
PreLoginEvent event = mock(PreLoginEvent.class); PreLoginEvent event = mock(PreLoginEvent.class);
PendingConnection connection = mock(PendingConnection.class); PendingConnection connection = mock(PendingConnection.class);
@@ -97,10 +98,7 @@ public class BungeeListenerTest {
when(connection.getSocketAddress()).thenReturn(new InetSocketAddress("1.1.1.1", 12345)); when(connection.getSocketAddress()).thenReturn(new InetSocketAddress("1.1.1.1", 12345));
// Mock proxy response // Mock proxy response
when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( mockCache();
VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1")
.method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build()
));
listener.onListener(event); listener.onListener(event);
+2
View File
@@ -1,5 +1,6 @@
plugins { plugins {
id 'com.gradleup.shadow' id 'com.gradleup.shadow'
id 'java-test-fixtures'
} }
dependencies { dependencies {
@@ -24,6 +25,7 @@ dependencies {
testImplementation 'com.h2database:h2:2.4.240' testImplementation 'com.h2database:h2:2.4.240'
testImplementation 'org.mongodb:mongo-java-driver:3.12.14' testImplementation 'org.mongodb:mongo-java-driver:3.12.14'
testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'
testFixturesImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'
} }
shadowJar { shadowJar {
@@ -36,7 +36,7 @@ public abstract class APIPlayer {
@Setter @Setter
private boolean alertsEnabled; private boolean alertsEnabled;
private static final Cache<String, CheckResult> checkResultCache = Caffeine.newBuilder() public static final Cache<String, CheckResult> checkResultCache = Caffeine.newBuilder()
.expireAfterWrite(5, TimeUnit.MINUTES) .expireAfterWrite(5, TimeUnit.MINUTES)
.maximumSize(2000) .maximumSize(2000)
.build(); .build();
@@ -0,0 +1,12 @@
package dev.brighten.antivpn.utils;
public class ReflectionUtils {
public static <T> T getDeclaredField(Class<?> clazz, String name) throws NoSuchFieldException, IllegalAccessException {
var declaredField = clazz.getDeclaredField(name);
declaredField.setAccessible(true);
return (T) declaredField.get(null);
}
}
@@ -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<String, CheckResult> checkResultCache = (Cache<String, CheckResult>) field.get(null);
checkResultCache.put(ip, result);
}
}
@@ -25,8 +25,10 @@ public interface LoaderBootstrap {
void onLoad(File dataFolder); void onLoad(File dataFolder);
default void onEnable() {} default void onEnable() {
}
default void onDisable() {} default void onDisable() {
}
} }
+1
View File
@@ -14,6 +14,7 @@ dependencies {
testImplementation 'org.mockito:mockito-subclass:5.11.0' testImplementation 'org.mockito:mockito-subclass:5.11.0'
testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0' testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0'
testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' testImplementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'
testImplementation testFixtures(project(':Common:Source'))
} }
tasks.compileJava.dependsOn(':Common:Source:jar') tasks.compileJava.dependsOn(':Common:Source:jar')
@@ -1,6 +1,7 @@
package dev.brighten.antivpn.sponge; package dev.brighten.antivpn.sponge;
import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.AntiVPN;
import dev.brighten.antivpn.StandardTest;
import dev.brighten.antivpn.api.PlayerExecutor; import dev.brighten.antivpn.api.PlayerExecutor;
import dev.brighten.antivpn.api.VPNConfig; import dev.brighten.antivpn.api.VPNConfig;
import dev.brighten.antivpn.api.VPNExecutor; import dev.brighten.antivpn.api.VPNExecutor;
@@ -22,7 +23,7 @@ import java.util.concurrent.CompletableFuture;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
public class SpongeListenerTest { public class SpongeListenerTest extends StandardTest {
private SpongeListener listener; private SpongeListener listener;
private VPNExecutor vpnExecutor; private VPNExecutor vpnExecutor;
@@ -89,7 +90,7 @@ public class SpongeListenerTest {
} }
@Test @Test
public void testLoginEventBlocked() { public void testLoginEventBlocked() throws NoSuchFieldException, IllegalAccessException {
ServerSideConnectionEvent.Login event = mock(ServerSideConnectionEvent.Login.class); ServerSideConnectionEvent.Login event = mock(ServerSideConnectionEvent.Login.class);
GameProfile profile = mock(GameProfile.class); GameProfile profile = mock(GameProfile.class);
ServerSideConnection connection = mock(ServerSideConnection.class); ServerSideConnection connection = mock(ServerSideConnection.class);
@@ -101,10 +102,7 @@ public class SpongeListenerTest {
when(connection.address()).thenReturn(new InetSocketAddress("1.1.1.1", 12345)); when(connection.address()).thenReturn(new InetSocketAddress("1.1.1.1", 12345));
// Mock proxy response // Mock proxy response
when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( mockCache();
VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1")
.method("N/A").countryName("N/A").countryCode("N/A").city("N/A").build()
));
listener.onJoin(event); listener.onJoin(event);
+1
View File
@@ -15,6 +15,7 @@ dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4'
testImplementation project(':Common:Source') testImplementation project(':Common:Source')
testImplementation project(':Common:loader-utils') testImplementation project(':Common:loader-utils')
testImplementation testFixtures(project(':Common:Source'))
} }
tasks.compileJava.dependsOn(':Common:Source:jar') tasks.compileJava.dependsOn(':Common:Source:jar')
@@ -3,6 +3,7 @@ package dev.brighten.antivpn.velocity;
import com.velocitypowered.api.event.connection.LoginEvent; import com.velocitypowered.api.event.connection.LoginEvent;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.AntiVPN;
import dev.brighten.antivpn.StandardTest;
import dev.brighten.antivpn.api.PlayerExecutor; import dev.brighten.antivpn.api.PlayerExecutor;
import dev.brighten.antivpn.api.VPNConfig; import dev.brighten.antivpn.api.VPNConfig;
import dev.brighten.antivpn.api.VPNExecutor; import dev.brighten.antivpn.api.VPNExecutor;
@@ -23,24 +24,21 @@ import java.util.logging.Logger;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
public class VelocityListenerTest { public class VelocityListenerTest extends StandardTest {
private VelocityListener listener; private VelocityListener listener;
private AntiVPN antiVPN;
private VPNConfig config; private VPNConfig config;
private PlayerExecutor playerExecutor; private PlayerExecutor playerExecutor;
private VPNExecutor vpnExecutor; private VPNExecutor vpnExecutor;
private MessageHandler messageHandler;
private VelocityPlugin velocityPlugin;
@BeforeEach @BeforeEach
public void setUp() throws Exception { public void setUp() throws Exception {
antiVPN = mock(AntiVPN.class); AntiVPN antiVPN = mock(AntiVPN.class);
config = mock(VPNConfig.class); config = mock(VPNConfig.class);
playerExecutor = mock(PlayerExecutor.class); playerExecutor = mock(PlayerExecutor.class);
vpnExecutor = mock(VPNExecutor.class); vpnExecutor = mock(VPNExecutor.class);
messageHandler = mock(MessageHandler.class); MessageHandler messageHandler = mock(MessageHandler.class);
velocityPlugin = mock(VelocityPlugin.class); VelocityPlugin velocityPlugin = mock(VelocityPlugin.class);
when(antiVPN.getVpnConfig()).thenReturn(config); when(antiVPN.getVpnConfig()).thenReturn(config);
when(antiVPN.getPlayerExecutor()).thenReturn(playerExecutor); when(antiVPN.getPlayerExecutor()).thenReturn(playerExecutor);
@@ -114,10 +112,7 @@ public class VelocityListenerTest {
when(player.getRemoteAddress()).thenReturn(new InetSocketAddress("1.1.1.1", 12345)); when(player.getRemoteAddress()).thenReturn(new InetSocketAddress("1.1.1.1", 12345));
// Mock proxy response // Mock proxy response
when(vpnExecutor.checkIp("1.1.1.1")).thenReturn(CompletableFuture.completedFuture( mockCache();
VPNResponse.builder().success(true).proxy(true).ip("1.1.1.1")
.method("N/A").countryName("N/A").city("N/A").countryCode("N/A").build()
));
listener.onLogin(event); listener.onLogin(event);
+29
View File
@@ -1,6 +1,7 @@
plugins { plugins {
id 'java' id 'java'
id 'com.gradleup.shadow' version '9.4.1' 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 id 'xyz.jpenilla.run-velocity' version '3.0.2' apply false
} }
@@ -30,6 +31,7 @@ allprojects {
} }
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'com.diffplug.spotless'
java { java {
toolchain { toolchain {
@@ -42,6 +44,33 @@ allprojects {
options.compilerArgs << '-XDignore.symbol.file' 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 { dependencies {
compileOnly 'org.projectlombok:lombok:1.18.44' compileOnly 'org.projectlombok:lombok:1.18.44'
annotationProcessor 'org.projectlombok:lombok:1.18.44' annotationProcessor 'org.projectlombok:lombok:1.18.44'
-2
View File
@@ -14,5 +14,3 @@ include 'Sponge:SpongeLoader'
include 'Velocity:VelocityPlugin' include 'Velocity:VelocityPlugin'
include 'Velocity:VelocityLoader' include 'Velocity:VelocityLoader'