From 332967950f8f5ec1cf4350f5df78250b82083c6a Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 7 Feb 2020 18:25:40 -0800 Subject: [PATCH] Fixes the API checking algorithm. Fixes https://github.com/BentoBoxWorld/BentoBox/issues/1176 --- .../bentobox/managers/AddonsManager.java | 26 +++-- .../bentobox/managers/AddonsManagerTest.java | 101 ++++++++++++++++++ 2 files changed, 116 insertions(+), 11 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java index 8e537a72a..f3c5e10bb 100644 --- a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java @@ -27,6 +27,7 @@ import org.bukkit.generator.ChunkGenerator; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import be.maximvdw.placeholderapi.internal.utils.NumberUtils; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.addons.Addon.State; @@ -213,24 +214,27 @@ public class AddonsManager { plugin.logWarning("NOTE: DO NOT report this as a bug from BentoBox."); } + private boolean isAddonCompatibleWithBentoBox(@NonNull Addon addon) { + return isAddonCompatibleWithBentoBox(addon, plugin.getDescription().getVersion()); + } + /** * Checks if the addon does not explicitly rely on API from a more recent BentoBox version. * @param addon instance of the Addon. + * @param plugin version string - used for testing * @return {@code true} if the addon relies on available BentoBox API, {@code false} otherwise. * @since 1.11.0 */ - private boolean isAddonCompatibleWithBentoBox(@NonNull Addon addon) { - // We have to use lists instead of arrays for dynamic changes and optimization (appending something to an array is O(n) whereas O(1) with lists). - List apiVersion = Arrays.asList(addon.getDescription().getApiVersion().split("\\.")); - List bentoboxVersion = Arrays.asList(plugin.getDescription().getVersion().split("\\.")); + boolean isAddonCompatibleWithBentoBox(@NonNull Addon addon, String pluginVersion) { + String[] apiVersion = addon.getDescription().getApiVersion().split("\\D"); + String[] bentoboxVersion = pluginVersion.split("\\D"); - while (bentoboxVersion.size() < apiVersion.size()) { - bentoboxVersion.add("0"); - } - - for (int i = 0; i < apiVersion.size(); i++) { - int apiNumber = Integer.parseInt(apiVersion.get(i)); - int bentoboxNumber = Integer.parseInt(bentoboxVersion.get(i)); + for (int i = 0; i < apiVersion.length; i++) { + int bentoboxNumber = 0; + if (i < bentoboxVersion.length && NumberUtils.isInteger(bentoboxVersion[i])) { + bentoboxNumber = Integer.parseInt(bentoboxVersion[i]); + } + int apiNumber = NumberUtils.isInteger(apiVersion[i]) ? Integer.parseInt(apiVersion[i]) : -1; if (bentoboxNumber < apiNumber) { return false; } diff --git a/src/test/java/world/bentobox/bentobox/managers/AddonsManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/AddonsManagerTest.java index 0e598daf9..8abb6dd72 100644 --- a/src/test/java/world/bentobox/bentobox/managers/AddonsManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/AddonsManagerTest.java @@ -31,6 +31,7 @@ import org.powermock.reflect.Whitebox; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.Settings; import world.bentobox.bentobox.api.addons.Addon; +import world.bentobox.bentobox.api.addons.AddonDescription; import world.bentobox.bentobox.database.DatabaseSetup.DatabaseType; import world.bentobox.bentobox.database.objects.DataObject; @@ -234,5 +235,105 @@ public class AddonsManagerTest { assertFalse(am.getDataObjects().isEmpty()); assertTrue(am.getDataObjects().size() == 1); } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxSnapshotNoAPIVersion() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642")); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxReleaseAPIVersion() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.0.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1")); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxSnapshotAPIVersion() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.0.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642")); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxReleaseNoAPIVersion() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1")); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxSnapshotAPIVersionVariableDigits() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.2.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.2-SNAPSHOT-b1642")); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxOldSnapshot() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642")); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxOldRelease() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.0.1")); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxOldReleaseLong() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.11.1.11.1.1")); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}. + */ + @Test + public void testIsAddonCompatibleWithBentoBoxOldReleaseLongAPI() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1.0.0.0.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.11.1")); + } + }