From 0b3fe5470a4ad534b95ad8a01d69e8e8faa64f2e Mon Sep 17 00:00:00 2001 From: "Kristian S. Stangeland" Date: Thu, 27 Jun 2013 03:05:53 +0200 Subject: [PATCH] Added a plugin verifier test. Attempting to solve a problem discovered by Silthus, but I need more information. --- .../protocol/injector/PluginVerifier.java | 5 +- .../protocol/injector/PluginVerifierTest.java | 89 +++++++++++++++++++ 2 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 ProtocolLib/src/test/java/com/comphenix/protocol/injector/PluginVerifierTest.java diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PluginVerifier.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PluginVerifier.java index 2e66cf5d..30bf4e51 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PluginVerifier.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PluginVerifier.java @@ -5,7 +5,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginLoadOrder; @@ -61,7 +60,7 @@ class PluginVerifier { * Reference to ProtocolLib. */ private final Plugin dependency; - + /** * Construct a new plugin verifier. * @param dependency - reference to ProtocolLib, a dependency we require of plugins. @@ -98,7 +97,7 @@ class PluginVerifier { * @return The retrieved plugin, or NULL if not found. */ private Plugin getPluginOrDefault(String pluginName) { - return Bukkit.getPluginManager().getPlugin(pluginName); + return dependency.getServer().getPluginManager().getPlugin(pluginName); } /** diff --git a/ProtocolLib/src/test/java/com/comphenix/protocol/injector/PluginVerifierTest.java b/ProtocolLib/src/test/java/com/comphenix/protocol/injector/PluginVerifierTest.java new file mode 100644 index 00000000..daa3cacd --- /dev/null +++ b/ProtocolLib/src/test/java/com/comphenix/protocol/injector/PluginVerifierTest.java @@ -0,0 +1,89 @@ +package com.comphenix.protocol.injector; + +import static org.junit.Assert.*; + +import java.util.Arrays; +import java.util.List; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.bukkit.Server; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.PluginLoadOrder; +import org.bukkit.plugin.PluginManager; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.powermock.core.classloader.annotations.PrepareForTest; +import com.comphenix.protocol.injector.PluginVerifier.VerificationResult; +import com.google.common.base.Objects; +import com.google.common.collect.Lists; + +// Damn final classes +@RunWith(org.powermock.modules.junit4.PowerMockRunner.class) +@PrepareForTest(PluginDescriptionFile.class) +public class PluginVerifierTest { + @Test + public void testDependecies() { + List plugins = Lists.newArrayList(); + Server server = mockServer(plugins); + + Plugin library = mockPlugin(server, "ProtocolLib", PluginLoadOrder.POSTWORLD); + Plugin skillPlugin = mockPlugin(server, "SkillPlugin", "RaidCraft-API", "RCPermissions", "RCConversations"); + Plugin raidCraftAPI = mockPlugin(server, "RaidCraft-API", "WorldGuard", "WorldEdit"); + Plugin conversations = mockPlugin(server, "RCConversations", "RaidCraft-API"); + Plugin permissions = mockPlugin(server, "RCPermissions", "RaidCraft-API"); + + // Add the plugins + plugins.addAll(Arrays.asList(library, skillPlugin, raidCraftAPI, conversations, permissions)); + PluginVerifier verifier = new PluginVerifier(library); + + // Verify the root - it should have no dependencies on ProtocolLib + assertEquals(VerificationResult.NO_DEPEND, verifier.verify(skillPlugin)); + } + + private Server mockServer(final List plugins) { + Server mockServer = mock(Server.class); + PluginManager manager = mock(PluginManager.class); + + when(mockServer.getPluginManager()).thenReturn(manager); + when(manager.getPlugin(anyString())).thenAnswer(new Answer() { + @Override + public Plugin answer(InvocationOnMock invocation) throws Throwable { + String name = (String) invocation.getArguments()[0]; + + for (Plugin plugin : plugins) { + if (Objects.equal(name, plugin.getName())) { + return plugin; + } + } + return null; + } + }); + return mockServer; + } + + private Plugin mockPlugin(Server server, String name,String... depend) { + return mockPlugin(server, name, PluginLoadOrder.POSTWORLD, depend); + } + + private Plugin mockPlugin(Server server, String name, PluginLoadOrder order, String... depend) { + Plugin plugin = mock(Plugin.class); + PluginDescriptionFile file = mock(PluginDescriptionFile.class); + + when(plugin.getServer()).thenReturn(server); + when(plugin.getName()).thenReturn(name); + when(plugin.toString()).thenReturn(name); + when(plugin.getDescription()).thenReturn(file); + + // This is the difficult part + when(file.getLoad()).thenReturn(order); + when(file.getDepend()).thenReturn(Arrays.asList(depend)); + when(file.getSoftDepend()).thenReturn(null); + return plugin; + } +}