/******************************************************************************** * CruiseControl, a Continuous Integration Toolkit * Copyright (c) 2001, ThoughtWorks, Inc. * 200 E. Randolph, 25th Floor * Chicago, IL 60601 USA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * + Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * + Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the * names of its contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ********************************************************************************/ package net.sourceforge.cruisecontrol; import java.util.List; import java.util.Set; import java.util.TreeSet; import junit.framework.TestCase; import net.sourceforge.cruisecontrol.bootstrappers.CVSBootstrapper; import net.sourceforge.cruisecontrol.builders.AntBuilder; import net.sourceforge.cruisecontrol.listeners.ListenerTestPlugin; import net.sourceforge.cruisecontrol.publishers.ExecutePublisher; import net.sourceforge.cruisecontrol.publishers.SCPPublisher; import net.sourceforge.cruisecontrol.sourcecontrols.ConcurrentVersionsSystem; import net.sourceforge.cruisecontrol.sourcecontrols.SVN; import org.jdom.Element; public class PluginRegistryTest extends TestCase { private PluginRegistry defaultRegistry; protected void setUp() throws Exception { super.setUp(); defaultRegistry = PluginRegistry.loadDefaultPluginRegistry(); } public void testGettingPluginClass() throws Exception { PluginRegistry registry = PluginRegistry.createRegistry(); assertNotNull(registry.getPluginClass("ant")); } public void testRegisteringPluginNoClass() { PluginRegistry registry = PluginRegistry.createRegistry(); final String nonExistentClassname = "net.sourceforge.cruisecontrol.Foo" + System.currentTimeMillis(); registry.register("foo", nonExistentClassname); try { registry.getPluginClass("foo"); fail("Expected an exception when getting a plugin" + " class that isn't loadable."); } catch (CruiseControlException expected) { } } public void testAddingPlugin() throws Exception { PluginRegistry registry = PluginRegistry.createRegistry(); // Add a plugin with a classname that exists final Class antBuilderClass = AntBuilder.class; final String antBuilderClassname = antBuilderClass.getName(); registry.register("ant", antBuilderClassname); // It should be registered assertTrue(registry.isPluginRegistered("ant")); assertEquals(antBuilderClassname, registry.getPluginClassname("ant")); assertEquals(antBuilderClass, registry.getPluginClass("ant")); } public void testRootRegistryAndClassnameOverrideOverwrite() throws Exception { PluginRegistry registry = PluginRegistry.createRegistry(); String antClassName = registry.getPluginClassname("ant"); String nonExistentClassname = "net.sourceforge.cruisecontrol.Foo" + System.currentTimeMillis(); Element pluginElement = new Element("plugin"); pluginElement.setAttribute("name", "ant"); pluginElement.setAttribute("classname", nonExistentClassname); PluginRegistry.registerToRoot(pluginElement); // did the overwrite work? assertNotSame(antClassName, registry.getPluginClassname("ant")); // now override the root definition in the child registry registry.register("ant", antClassName); // does it mask the parent definition? assertEquals(antClassName, registry.getPluginClassname("ant")); // restore the root definition, or we'll wreck the other tests pluginElement.setAttribute("classname", antClassName); PluginRegistry.registerToRoot(pluginElement); } /** * 2 levels of plugin registry, 1 plugin, 2 properties defined in parent, * one overriden in child * * @throws Exception * on failure */ public void testGetPluginConfigOverride() throws Exception { PluginRegistry registry = PluginRegistry.createRegistry(); // 2 plugins in the root, with the same plugin class, but different // names Element rootPluginElement = new Element("plugin"); rootPluginElement.setAttribute("name", "testlistener"); rootPluginElement.setAttribute("classname", ListenerTestPlugin.class.getName()); rootPluginElement.setAttribute("string", "default"); rootPluginElement.setAttribute("string2", "otherdefault"); Element rootStringWrapper = new Element("stringwrapper"); rootStringWrapper.setAttribute("string", "wrapper"); rootPluginElement.addContent(rootStringWrapper); PluginRegistry.registerToRoot(rootPluginElement); Element otherRootPluginElement = new Element("plugin"); otherRootPluginElement.setAttribute("name", "testlistener2"); otherRootPluginElement.setAttribute("classname", ListenerTestPlugin.class.getName()); otherRootPluginElement.setAttribute("string", "default2"); PluginRegistry.registerToRoot(otherRootPluginElement); // now let's make some 'overrides' Element pluginElement = new Element("plugin"); pluginElement.setAttribute("name", "testlistener"); pluginElement.setAttribute("string", "overriden"); Element stringWrapper = new Element("stringwrapper"); stringWrapper.setAttribute("string", "overriden"); pluginElement.addContent(stringWrapper); registry.register(pluginElement); // test the first plugin Element pluginConfig = registry.getPluginConfig("testlistener"); assertEquals("testlistener", pluginConfig.getName()); assertEquals("overriden", pluginConfig.getAttributeValue("string")); assertEquals("otherdefault", pluginConfig.getAttributeValue("string2")); List wrappers = pluginConfig.getChildren("stringwrapper"); assertEquals(2, wrappers.size()); final Set<String> expectedWrapperAttributes = new TreeSet<String>(); expectedWrapperAttributes.add("wrapper"); expectedWrapperAttributes.add("overriden"); final Set<String> wrapperAttributes = new TreeSet<String>(); for (final Object wrapper : wrappers) { final Element element = (Element) wrapper; wrapperAttributes.add(element.getAttributeValue("string")); } assertEquals(expectedWrapperAttributes, wrapperAttributes); // test the second plugin Element otherPluginConfig = registry.getPluginConfig("testlistener2"); assertEquals("testlistener2", otherPluginConfig.getName()); assertEquals("default2", otherPluginConfig.getAttributeValue("string")); assertEquals(null, otherPluginConfig.getAttributeValue("string2")); PluginRegistry.resetRootRegistry(); } public void testCaseInsensitivityPluginNames() throws Exception { // Plugin names are treated as case-insensitive by CruiseControl, so // a plugin named TestName and testname are the same. PluginRegistry registry = PluginRegistry.createRegistry(); // Add a plugin with an all lowercase name final String antBuilderClassname = AntBuilder.class.getName(); registry.register("testname", antBuilderClassname); // It should be registered assertTrue(registry.isPluginRegistered("testname")); // If we ask if other case versions are registered, it should // say "yes" assertTrue(registry.isPluginRegistered("TESTNAME")); assertTrue(registry.isPluginRegistered("Testname")); assertTrue(registry.isPluginRegistered("TestName")); assertTrue(registry.isPluginRegistered("tESTnAME")); } public void testPluginRegistry() throws Exception { // No plugins that require non-distributed API jars will be tested // (i.e., Harvest, Starteam, Sametime, Yahoo) verifyPluginClass("cvsbootstrapper", "net.sourceforge.cruisecontrol.bootstrappers.CVSBootstrapper"); verifyPluginClass("p4bootstrapper", "net.sourceforge.cruisecontrol.bootstrappers.P4Bootstrapper"); verifyPluginClass("svnbootstrapper", "net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper"); verifyPluginClass("vssbootstrapper", "net.sourceforge.cruisecontrol.bootstrappers.VssBootstrapper"); verifyPluginClass("alienbrain", "net.sourceforge.cruisecontrol.sourcecontrols.AlienBrain"); verifyPluginClass("clearcase", "net.sourceforge.cruisecontrol.sourcecontrols.ClearCase"); verifyPluginClass("cvs", "net.sourceforge.cruisecontrol.sourcecontrols.ConcurrentVersionsSystem"); verifyPluginClass("filesystem", "net.sourceforge.cruisecontrol.sourcecontrols.FileSystem"); verifyPluginClass("httpfile", "net.sourceforge.cruisecontrol.sourcecontrols.HttpFile"); verifyPluginClass("mks", "net.sourceforge.cruisecontrol.sourcecontrols.MKS"); verifyPluginClass("p4", "net.sourceforge.cruisecontrol.sourcecontrols.P4"); verifyPluginClass("pvcs", "net.sourceforge.cruisecontrol.sourcecontrols.PVCS"); verifyPluginClass("svn", "net.sourceforge.cruisecontrol.sourcecontrols.SVN"); verifyPluginClass("vss", "net.sourceforge.cruisecontrol.sourcecontrols.Vss"); verifyPluginClass("vssjournal", "net.sourceforge.cruisecontrol.sourcecontrols.VssJournal"); verifyPluginClass("compound", "net.sourceforge.cruisecontrol.sourcecontrols.Compound"); verifyPluginClass("triggers", "net.sourceforge.cruisecontrol.sourcecontrols.Triggers"); verifyPluginClass("targets", "net.sourceforge.cruisecontrol.sourcecontrols.Targets"); verifyPluginClass("ant", "net.sourceforge.cruisecontrol.builders.AntBuilder"); verifyPluginClass("maven", "net.sourceforge.cruisecontrol.builders.MavenBuilder"); verifyPluginClass("pause", "net.sourceforge.cruisecontrol.PauseBuilder"); verifyPluginClass("labelincrementer", "net.sourceforge.cruisecontrol.labelincrementers.DefaultLabelIncrementer"); verifyPluginClass("artifactspublisher", "net.sourceforge.cruisecontrol.publishers.ArtifactsPublisher"); verifyPluginClass("email", "net.sourceforge.cruisecontrol.publishers.LinkEmailPublisher"); verifyPluginClass("htmlemail", "net.sourceforge.cruisecontrol.publishers.HTMLEmailPublisher"); verifyPluginClass("execute", "net.sourceforge.cruisecontrol.publishers.ExecutePublisher"); verifyPluginClass("scp", "net.sourceforge.cruisecontrol.publishers.SCPPublisher"); verifyPluginClass("modificationset", "net.sourceforge.cruisecontrol.ModificationSet"); verifyPluginClass("schedule", "net.sourceforge.cruisecontrol.Schedule"); verifyPluginClass("buildstatus", "net.sourceforge.cruisecontrol.sourcecontrols.BuildStatus"); verifyPluginClass("clearcasebootstrapper", "net.sourceforge.cruisecontrol.bootstrappers.ClearCaseBootstrapper"); verifyPluginClass("xsltlogpublisher", "net.sourceforge.cruisecontrol.publishers.XSLTLogPublisher"); verifyPluginClass("httpfile", "net.sourceforge.cruisecontrol.sourcecontrols.HttpFile"); verifyPluginClass("currentbuildstatuslistener", "net.sourceforge.cruisecontrol.listeners.CurrentBuildStatusListener"); verifyPluginClass("onsuccess", "net.sourceforge.cruisecontrol.publishers.OnSuccessPublisher"); } public void testCanLoadDefaultRegistry() { assertTrue(defaultRegistry.isPluginRegistered("cvs")); assertTrue(defaultRegistry.isPluginRegistered("antbootstrapper")); } public void testCanGetPluginName() { PluginRegistry registry = defaultRegistry; assertEquals("cvs", registry.getPluginName(ConcurrentVersionsSystem.class)); assertEquals("cvsbootstrapper", registry.getPluginName(CVSBootstrapper.class)); assertEquals("svn", registry.getPluginName(SVN.class)); assertEquals("execute", registry.getPluginName(ExecutePublisher.class)); assertEquals("scp", registry.getPluginName(SCPPublisher.class)); } public void testCanGetPluginDetails() throws CruiseControlException { PluginDetail[] defaultPlugins = defaultRegistry.getPluginDetails(); assertNotNull(defaultPlugins); assertTrue(0 < defaultPlugins.length); } public void testCanGetPluginTypes() { PluginType[] defaultTypes = defaultRegistry.getPluginTypes(); assertNotNull(defaultTypes); assertTrue(0 < defaultTypes.length); } static void verifyPluginClass(final String pluginName, final String expectedName) throws Exception { final PluginRegistry registry = PluginRegistry.loadDefaultPluginRegistry(); assertTrue("the plugin name of '"+ pluginName +"' does not appear in the registry", registry.isPluginRegistered(pluginName)); final String className = registry.getPluginClassname(pluginName); assertEquals(expectedName, className); final Class< ? > pluginClass = Class.forName(className); // casts to suppress varargs warnings under sdk >= 1.5 pluginClass.getConstructor((Class[]) null).newInstance((Object[]) null); } }