diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index a1715bc..51e5ad8 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -21,7 +21,7 @@ jobs: uses: ./.github/workflows/build-platform.yml with: display-name: 'Build Paper platform' - gradle-tasks: 'platform:paper-plugin:build' + gradle-tasks: 'platform:paper-plugin:build -x test' build-velocity: name: 'Velocity Platform' @@ -29,4 +29,4 @@ jobs: uses: ./.github/workflows/build-platform.yml with: display-name: 'Build Velocity platform' - gradle-tasks: 'platform:velocity-plugin:build' \ No newline at end of file + gradle-tasks: 'platform:velocity-plugin:build -x test' \ No newline at end of file diff --git a/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/platform/CLIPlatform.java b/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/platform/CLIPlatform.java index 4f189b4..88947ad 100644 --- a/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/platform/CLIPlatform.java +++ b/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/platform/CLIPlatform.java @@ -51,7 +51,7 @@ public CLIPlatform(PluginUpdaterCLI cli) { fallbackInfoParser = fallbackInfoParser.getFallbackInfoParser(); } } catch (IOException e) { - throw new RuntimeException(e); + cli.getLogger().log(Level.SEVERE, "Failed to interpret jar file for " + path, e); } return null; diff --git a/platform/paper-plugin/build.gradle.kts b/platform/paper-plugin/build.gradle.kts index d9e557b..7349e6e 100644 --- a/platform/paper-plugin/build.gradle.kts +++ b/platform/paper-plugin/build.gradle.kts @@ -10,6 +10,10 @@ dependencies { implementation(project(":common:impl")) implementation(project(":platform:paper-api")) implementation("io.github.revxrsal:lamp.bukkit:4.0.0-rc.17") + + testImplementation(project(":tests:common-plugins-test")) + testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks { @@ -47,6 +51,10 @@ tasks { modrinth("z4HZZnLr", "zAlVhTdU") // FastAsyncWorldEdit } } + + test { + useJUnitPlatform() + } } modrinth { diff --git a/platform/paper-plugin/src/main/resources/common-plugins.yml b/platform/paper-plugin/src/main/resources/common-plugins.yml index b5c4e18..97d991d 100644 --- a/platform/paper-plugin/src/main/resources/common-plugins.yml +++ b/platform/paper-plugin/src/main/resources/common-plugins.yml @@ -86,8 +86,8 @@ Geyser-Spigot: source: geyser project-name: geyser GPFlags: - source: spigot - spigot-resource-id: 55773 + source: modrinth + modrinth-project-id: Z0NVSlL6 GriefPrevention: source: modrinth modrinth-project-id: O4o4mKaq diff --git a/platform/paper-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/PaperUpdaterTests.java b/platform/paper-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/PaperUpdaterTests.java new file mode 100644 index 0000000..de87304 --- /dev/null +++ b/platform/paper-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/PaperUpdaterTests.java @@ -0,0 +1,17 @@ +package org.lushplugins.pluginupdater.paper.test; + +import org.junit.jupiter.api.Test; +import org.lushplugins.pluginupdater.tests.commonplugins.CommonPluginsTest; + +public class PaperUpdaterTests { + + static { + System.setProperty("platform", "paper"); + System.setProperty("server-version", "26.1.2"); + } + + @Test + public void test() { + CommonPluginsTest.runTest("common-plugins.yml"); + } +} diff --git a/platform/velocity-plugin/build.gradle.kts b/platform/velocity-plugin/build.gradle.kts index 3f76c0f..4155301 100644 --- a/platform/velocity-plugin/build.gradle.kts +++ b/platform/velocity-plugin/build.gradle.kts @@ -12,6 +12,10 @@ dependencies { implementation(project(":platform:velocity-api")) implementation("io.github.revxrsal:lamp.velocity:4.0.0-rc.17") implementation("io.github.revxrsal:lamp.brigadier:4.0.0-rc.17") + + testImplementation(project(":tests:common-plugins-test")) + testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks { @@ -32,6 +36,10 @@ tasks { modrinth("tab-was-taken", "MsHr6ITb") } } + + test { + useJUnitPlatform() + } } modrinth { diff --git a/platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/VelocityUpdaterTests.java b/platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/VelocityUpdaterTests.java new file mode 100644 index 0000000..0da1751 --- /dev/null +++ b/platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/VelocityUpdaterTests.java @@ -0,0 +1,17 @@ +package org.lushplugins.pluginupdater.paper.test; + +import org.junit.jupiter.api.Test; +import org.lushplugins.pluginupdater.tests.commonplugins.CommonPluginsTest; + +public class VelocityUpdaterTests { + + static { + System.setProperty("platform", "velocity"); + System.setProperty("server-version", "4.1.0"); + } + + @Test + public void test() { + CommonPluginsTest.runTest("common-plugins.yml"); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 2e634ec..f9f9d89 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -30,4 +30,5 @@ include("platform:cli") include("platform:paper-api") include("platform:paper-plugin") include("platform:velocity-api") -include("platform:velocity-plugin") \ No newline at end of file +include("platform:velocity-plugin") +include("tests:common-plugins-test") \ No newline at end of file diff --git a/tests/common-plugins-test/build.gradle.kts b/tests/common-plugins-test/build.gradle.kts new file mode 100644 index 0000000..04fc355 --- /dev/null +++ b/tests/common-plugins-test/build.gradle.kts @@ -0,0 +1,3 @@ +dependencies { + implementation(project(":platform:cli")) +} \ No newline at end of file diff --git a/tests/common-plugins-test/src/main/java/org/lushplugins/pluginupdater/tests/commonplugins/CommonPluginsTest.java b/tests/common-plugins-test/src/main/java/org/lushplugins/pluginupdater/tests/commonplugins/CommonPluginsTest.java new file mode 100644 index 0000000..c29bd58 --- /dev/null +++ b/tests/common-plugins-test/src/main/java/org/lushplugins/pluginupdater/tests/commonplugins/CommonPluginsTest.java @@ -0,0 +1,102 @@ +package org.lushplugins.pluginupdater.tests.commonplugins; + +import com.electronwill.nightconfig.core.Config; +import com.electronwill.nightconfig.yaml.YamlFormat; +import org.lushplugins.pluginupdater.api.updater.PluginData; +import org.lushplugins.pluginupdater.api.updater.PluginInfo; +import org.lushplugins.pluginupdater.api.util.UpdaterConstants; +import org.lushplugins.pluginupdater.cli.PluginUpdaterCLI; +import org.lushplugins.pluginupdater.cli.platform.CLIPlatform; +import org.lushplugins.pluginupdater.cli.plugin.CLIPluginInfo; +import org.lushplugins.pluginupdater.common.config.deserializer.PluginDataDeserializer; + +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.logging.Level; + +public class CommonPluginsTest { + + static { + Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { + StringWriter sw = new StringWriter(); + throwable.printStackTrace(new PrintWriter(sw)); + UpdaterConstants.LOGGER.severe(sw.toString()); + }); + } + + public static void testLocalVersionParsing(List commonPluginData) { + + } + + public static void runTest(String pluginsResource) { + PluginUpdaterCLI cli = PluginUpdaterCLI.prepareCLI(); + + boolean passing = true; + InputStream resource = cli.getResourceStream(pluginsResource); + Config config = YamlFormat.defaultInstance().createParser().parse(resource); + List undownloadedPluginData = config.entrySet().stream() + .map((entry) -> { + // The following method requires PluginInfo to be available before being run but does not use the + // current version so we can just supply an empty version + PluginInfo pluginInfo = new CLIPluginInfo(entry.getKey(), "0.0.0", null); + Config pluginConfig = config.get(entry.getKey()); + // As we are hard coding the local version we must remove the version-format option + pluginConfig.remove("version-format"); + return PluginDataDeserializer.deserialize(pluginInfo, pluginConfig); + }) + .filter(Objects::nonNull) + .sorted(Comparator.comparing((pluginData) -> pluginData.pluginName().toLowerCase())) + .toList(); + + // We fetch all latest versions and then download all jars + // This is to ensure that each process is handled in batches + for (PluginData pluginData : undownloadedPluginData) { + cli.getLogger().info("Fetching %s's latest version" + .formatted(pluginData.pluginName())); + try { + pluginData.latestVersion(pluginData.fetchLatestVersion().version()); + } catch (RuntimeException e) { + cli.getLogger().severe(e.getMessage()); + passing = false; + } + } + + Path downloadDir = cli.getPluginsFolder(); + for (PluginData pluginData : undownloadedPluginData) { + try { + pluginData.downloadUpdate(downloadDir); + } catch (Throwable e) { + cli.getLogger().log(Level.SEVERE, "Failed to download latest version of " + pluginData.pluginName(), e); + passing = false; + } + } + + // Platform needs to be created after plugins are downloaded as it collects data from jars on startup + CLIPlatform platform = new CLIPlatform(cli); + List commonPluginData = config.entrySet().stream() + .map((entry) -> { + String pluginName = entry.getKey(); + PluginInfo pluginInfo = platform.getPlugin(pluginName); + if (pluginInfo == null) { + cli.getLogger().log(Level.WARNING, "Failed to find plugin jar for %s" + .formatted(pluginName)); + return null; + } + + return PluginDataDeserializer.deserialize(pluginInfo, config.get(pluginName)); + }) + .filter(Objects::nonNull) + .toList(); + + testLocalVersionParsing(commonPluginData); + + if (!passing) { + throw new IllegalStateException("This test has been marked as failed"); + } + } +}