feat: 完善稳定性并重构潜影盒安全机制

This commit is contained in:
2026-08-02 03:36:19 +08:00
parent 18cfbc2002
commit 19ddd3fa99
35 changed files with 1167 additions and 229 deletions
@@ -3,6 +3,7 @@ package cn.infstar.essentialsC;
import org.bukkit.configuration.file.YamlConfiguration;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.junit.jupiter.api.Test;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -10,6 +11,7 @@ import java.nio.charset.StandardCharsets;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ConfigurationResourcesTest {
@@ -32,10 +34,29 @@ class ConfigurationResourcesTest {
if (resourcePath.equals("config.yml")) {
assertEquals(2, configuration.getInt("config-version"));
assertEquals(5, configuration.getInt("tpa.max-pending-requests"));
assertEquals(500, configuration.getInt("skin-bridge.max-generated-cache-entries"));
assertTrue(configuration.getString("skin-bridge.mineskin.api-key", "").isBlank());
}
if (resourcePath.equals("paper-plugin.yml")) {
assertEquals("1.21.11", configuration.getString("api-version"));
}
}
}
@Test
void bundledLanguagesContainTheSameKeys() throws Exception {
YamlConfiguration chinese = loadResource("lang/zh_CN.yml");
YamlConfiguration english = loadResource("lang/en_US.yml");
assertEquals(chinese.getKeys(true), english.getKeys(true));
}
private YamlConfiguration loadResource(String resourcePath) throws Exception {
try (InputStream input = getClass().getClassLoader().getResourceAsStream(resourcePath)) {
assertNotNull(input, resourcePath);
YamlConfiguration configuration = new YamlConfiguration();
configuration.load(new InputStreamReader(input, StandardCharsets.UTF_8));
return configuration;
}
}
}
@@ -0,0 +1,25 @@
package cn.infstar.essentialsC.listeners;
import org.junit.jupiter.api.Test;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ShulkerBoxSessionPolicyTest {
@Test
void identifiesOnlySlotsInsideTopInventory() {
assertFalse(ShulkerBoxSessionPolicy.isTopSlot(-999, 27));
assertTrue(ShulkerBoxSessionPolicy.isTopSlot(0, 27));
assertTrue(ShulkerBoxSessionPolicy.isTopSlot(26, 27));
assertFalse(ShulkerBoxSessionPolicy.isTopSlot(27, 27));
}
@Test
void detectsDragsThatTouchTopInventory() {
assertTrue(ShulkerBoxSessionPolicy.touchesTopInventory(Set.of(5, 30), 27));
assertFalse(ShulkerBoxSessionPolicy.touchesTopInventory(Set.of(27, 35), 27));
}
}
@@ -0,0 +1,61 @@
package cn.infstar.essentialsC.util;
import org.bukkit.configuration.file.YamlConfiguration;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class AtomicYamlWriterTest {
@TempDir
Path temporaryDirectory;
@Test
void createsParentDirectoriesAndWritesUtf8Yaml() throws Exception {
Path target = temporaryDirectory.resolve("nested/data.yml");
YamlConfiguration configuration = new YamlConfiguration();
configuration.set("message", "中文内容");
AtomicYamlWriter.save(configuration, target.toFile());
assertTrue(Files.exists(target));
assertTrue(Files.readString(target, StandardCharsets.UTF_8).contains("中文内容"));
try (var files = Files.list(target.getParent())) {
assertFalse(files.anyMatch(path -> path.getFileName().toString().endsWith(".tmp")));
}
}
@Test
void replacesExistingYamlWithoutRetainingOldValues() throws Exception {
Path target = temporaryDirectory.resolve("state.yml");
YamlConfiguration initial = new YamlConfiguration();
initial.set("old-value", true);
AtomicYamlWriter.save(initial, target.toFile());
YamlConfiguration replacement = new YamlConfiguration();
replacement.set("new-value", 42);
AtomicYamlWriter.save(replacement, target.toFile());
YamlConfiguration loaded = YamlConfiguration.loadConfiguration(target.toFile());
assertFalse(loaded.contains("old-value"));
assertEquals(42, loaded.getInt("new-value"));
}
@Test
void supportsShortTargetFileNames() throws Exception {
Path target = temporaryDirectory.resolve("x");
YamlConfiguration configuration = new YamlConfiguration();
configuration.set("written", true);
AtomicYamlWriter.save(configuration, target.toFile());
assertTrue(YamlConfiguration.loadConfiguration(target.toFile()).getBoolean("written"));
}
}