diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java index 6add26b1078b772547b8ac096f0377d88c667ef1..62a0f9a264c7df4242f413ec138df7cac31ce317 100644 --- a/test/src/test/java/hudson/PluginManagerTest.java +++ b/test/src/test/java/hudson/PluginManagerTest.java @@ -41,6 +41,7 @@ import org.jvnet.hudson.test.recipes.WithPlugin; import org.jvnet.hudson.test.recipes.WithPluginManager; import java.io.File; +import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.Collections; @@ -222,4 +223,129 @@ public class PluginManagerTest extends HudsonTestCase { // TODO required plugin installed but inactive } + // plugin "depender" optionally depends on plugin "dependee". + // they are written like this: + // org.jenkinsci.plugins.dependencytest.dependee: + // public class Dependee { + // public static String getValue() { + // return "dependee"; + // } + // } + // + // public abstract class DependeeExtensionPoint implements ExtensionPoint { + // } + // + // org.jenkinsci.plugins.dependencytest.depender: + // public class Depender { + // public static String getValue() { + // if (Jenkins.getInstance().getPlugin("dependee") != null) { + // return Dependee.getValue(); + // } + // return "depender"; + // } + // } + // + // @Extension(optional=true) + // public class DependerExtension extends DependeeExtensionPoint { + // } + + + /** + * call org.jenkinsci.plugins.dependencytest.depender.Depender.getValue(). + * + * @return + * @throws Exception + */ + private String callDependerValue() throws Exception { + Class c = jenkins.getPluginManager().uberClassLoader.loadClass("org.jenkinsci.plugins.dependencytest.depender.Depender"); + Method m = c.getMethod("getValue"); + return (String)m.invoke(null); + } + + /** + * Load "dependee" and then load "depender". + * Asserts that "depender" can access to "dependee". + * + * @throws Exception + */ + public void testInstallDependingPluginWithoutRestart() throws Exception { + // Load dependee. + { + String target = "dependee.hpi"; + URL src = getClass().getClassLoader().getResource(String.format("plugins/%s", target)); + File dest = new File(jenkins.getRootDir(), String.format("plugins/%s", target)); + FileUtils.copyURLToFile(src, dest); + jenkins.pluginManager.dynamicLoad(dest); + } + + // before load depender, of course failed to call Depender.getValue() + try { + callDependerValue(); + fail(); + } catch (ClassNotFoundException _) { + } + + // No extensions exist. + assertTrue(jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint").isEmpty()); + + // Load depender. + { + String target = "depender.hpi"; + URL src = getClass().getClassLoader().getResource(String.format("plugins/%s", target)); + File dest = new File(jenkins.getRootDir(), String.format("plugins/%s", target)); + FileUtils.copyURLToFile(src, dest); + jenkins.pluginManager.dynamicLoad(dest); + } + + // (MUST) Not throws an exception + // (SHOULD) depender successfully accesses to dependee. + assertEquals("dependee", callDependerValue()); + + // Extension in depender is loaded. + assertFalse(jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint").isEmpty()); + } + + /** + * Load "depender" and then load "dependee". + * Asserts that "depender" can access to "dependee". + * + * @throws Exception + */ + public void testInstallDependedPluginWithoutRestart() throws Exception { + // Load depender. + { + String target = "depender.hpi"; + URL src = getClass().getClassLoader().getResource(String.format("plugins/%s", target)); + File dest = new File(jenkins.getRootDir(), String.format("plugins/%s", target)); + FileUtils.copyURLToFile(src, dest); + jenkins.pluginManager.dynamicLoad(dest); + } + + // before load dependee, depender does not access to dependee. + assertEquals("depender", callDependerValue()); + + // before load dependee, of course failed to list extensions for dependee. + try { + jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint"); + fail(); + } catch( ClassNotFoundException _ ){ + } + + // Load dependee. + { + String target = "dependee.hpi"; + URL src = getClass().getClassLoader().getResource(String.format("plugins/%s", target)); + File dest = new File(jenkins.getRootDir(), String.format("plugins/%s", target)); + FileUtils.copyURLToFile(src, dest); + jenkins.pluginManager.dynamicLoad(dest); + } + + // depender successfully access to dependee. + assertEquals("dependee", callDependerValue()); + + // No extensions exist. + // extensions in depender is not loaded. + assertTrue(jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint").isEmpty()); + } + } diff --git a/test/src/test/resources/plugins/dependee.hpi b/test/src/test/resources/plugins/dependee.hpi new file mode 100644 index 0000000000000000000000000000000000000000..0459ae63727d9427b4fe44137ef88d90413c3338 Binary files /dev/null and b/test/src/test/resources/plugins/dependee.hpi differ diff --git a/test/src/test/resources/plugins/depender.hpi b/test/src/test/resources/plugins/depender.hpi new file mode 100644 index 0000000000000000000000000000000000000000..bebd4b6943a835bdf14eeaae5cb0768862779a37 Binary files /dev/null and b/test/src/test/resources/plugins/depender.hpi differ