001: /********************************************************************************
002: * CruiseControl, a Continuous Integration Toolkit
003: * Copyright (c) 2001, ThoughtWorks, Inc.
004: * 200 E. Randolph, 25th Floor
005: * Chicago, IL 60601 USA
006: * All rights reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * + Redistributions of source code must retain the above copyright
013: * notice, this list of conditions and the following disclaimer.
014: *
015: * + Redistributions in binary form must reproduce the above
016: * copyright notice, this list of conditions and the following
017: * disclaimer in the documentation and/or other materials provided
018: * with the distribution.
019: *
020: * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the
021: * names of its contributors may be used to endorse or promote
022: * products derived from this software without specific prior
023: * written permission.
024: *
025: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
026: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
027: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
028: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
029: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
030: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
031: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
032: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
033: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
034: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
035: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
036: ********************************************************************************/package net.sourceforge.cruisecontrol;
037:
038: import java.util.List;
039: import java.util.Set;
040: import java.util.TreeSet;
041:
042: import junit.framework.TestCase;
043: import net.sourceforge.cruisecontrol.bootstrappers.CVSBootstrapper;
044: import net.sourceforge.cruisecontrol.builders.AntBuilder;
045: import net.sourceforge.cruisecontrol.listeners.ListenerTestPlugin;
046: import net.sourceforge.cruisecontrol.publishers.ExecutePublisher;
047: import net.sourceforge.cruisecontrol.publishers.SCPPublisher;
048: import net.sourceforge.cruisecontrol.sourcecontrols.ConcurrentVersionsSystem;
049: import net.sourceforge.cruisecontrol.sourcecontrols.SVN;
050:
051: import org.jdom.Element;
052:
053: public class PluginRegistryTest extends TestCase {
054:
055: private PluginRegistry defaultRegistry;
056:
057: protected void setUp() throws Exception {
058: super .setUp();
059:
060: defaultRegistry = PluginRegistry.loadDefaultPluginRegistry();
061: }
062:
063: public void testGettingPluginClass() throws Exception {
064: PluginRegistry registry = PluginRegistry.createRegistry();
065:
066: assertNotNull(registry.getPluginClass("ant"));
067: }
068:
069: public void testRegisteringPluginNoClass() {
070: PluginRegistry registry = PluginRegistry.createRegistry();
071:
072: final String nonExistentClassname = "net.sourceforge.cruisecontrol.Foo"
073: + System.currentTimeMillis();
074: registry.register("foo", nonExistentClassname);
075: try {
076: registry.getPluginClass("foo");
077: fail("Expected an exception when getting a plugin"
078: + " class that isn't loadable.");
079: } catch (CruiseControlException expected) {
080: }
081: }
082:
083: public void testAddingPlugin() throws Exception {
084: PluginRegistry registry = PluginRegistry.createRegistry();
085:
086: // Add a plugin with a classname that exists
087: final Class antBuilderClass = AntBuilder.class;
088: final String antBuilderClassname = antBuilderClass.getName();
089: registry.register("ant", antBuilderClassname);
090:
091: // It should be registered
092: assertTrue(registry.isPluginRegistered("ant"));
093: assertEquals(antBuilderClassname, registry
094: .getPluginClassname("ant"));
095: assertEquals(antBuilderClass, registry.getPluginClass("ant"));
096: }
097:
098: public void testRootRegistryAndClassnameOverrideOverwrite()
099: throws Exception {
100: PluginRegistry registry = PluginRegistry.createRegistry();
101: String antClassName = registry.getPluginClassname("ant");
102: String nonExistentClassname = "net.sourceforge.cruisecontrol.Foo"
103: + System.currentTimeMillis();
104: Element pluginElement = new Element("plugin");
105: pluginElement.setAttribute("name", "ant");
106: pluginElement.setAttribute("classname", nonExistentClassname);
107: PluginRegistry.registerToRoot(pluginElement);
108: // did the overwrite work?
109: assertNotSame(antClassName, registry.getPluginClassname("ant"));
110: // now override the root definition in the child registry
111: registry.register("ant", antClassName);
112: // does it mask the parent definition?
113: assertEquals(antClassName, registry.getPluginClassname("ant"));
114:
115: // restore the root definition, or we'll wreck the other tests
116: pluginElement.setAttribute("classname", antClassName);
117: PluginRegistry.registerToRoot(pluginElement);
118: }
119:
120: /**
121: * 2 levels of plugin registry, 1 plugin, 2 properties defined in parent,
122: * one overriden in child
123: *
124: * @throws Exception
125: * on failure
126: */
127: public void testGetPluginConfigOverride() throws Exception {
128:
129: PluginRegistry registry = PluginRegistry.createRegistry();
130:
131: // 2 plugins in the root, with the same plugin class, but different
132: // names
133: Element rootPluginElement = new Element("plugin");
134: rootPluginElement.setAttribute("name", "testlistener");
135: rootPluginElement.setAttribute("classname",
136: ListenerTestPlugin.class.getName());
137: rootPluginElement.setAttribute("string", "default");
138: rootPluginElement.setAttribute("string2", "otherdefault");
139:
140: Element rootStringWrapper = new Element("stringwrapper");
141: rootStringWrapper.setAttribute("string", "wrapper");
142: rootPluginElement.addContent(rootStringWrapper);
143:
144: PluginRegistry.registerToRoot(rootPluginElement);
145:
146: Element otherRootPluginElement = new Element("plugin");
147: otherRootPluginElement.setAttribute("name", "testlistener2");
148: otherRootPluginElement.setAttribute("classname",
149: ListenerTestPlugin.class.getName());
150: otherRootPluginElement.setAttribute("string", "default2");
151:
152: PluginRegistry.registerToRoot(otherRootPluginElement);
153:
154: // now let's make some 'overrides'
155: Element pluginElement = new Element("plugin");
156: pluginElement.setAttribute("name", "testlistener");
157: pluginElement.setAttribute("string", "overriden");
158:
159: Element stringWrapper = new Element("stringwrapper");
160: stringWrapper.setAttribute("string", "overriden");
161: pluginElement.addContent(stringWrapper);
162:
163: registry.register(pluginElement);
164:
165: // test the first plugin
166: Element pluginConfig = registry.getPluginConfig("testlistener");
167: assertEquals("testlistener", pluginConfig.getName());
168: assertEquals("overriden", pluginConfig
169: .getAttributeValue("string"));
170: assertEquals("otherdefault", pluginConfig
171: .getAttributeValue("string2"));
172:
173: List wrappers = pluginConfig.getChildren("stringwrapper");
174: assertEquals(2, wrappers.size());
175: Set expectedWrapperAttributes = new TreeSet();
176: expectedWrapperAttributes.add("wrapper");
177: expectedWrapperAttributes.add("overriden");
178:
179: Set wrapperAttributes = new TreeSet();
180: for (int i = 0; i < wrappers.size(); i++) {
181: org.jdom.Element element = (org.jdom.Element) wrappers
182: .get(i);
183: wrapperAttributes.add(element.getAttributeValue("string"));
184: }
185: assertEquals(expectedWrapperAttributes, wrapperAttributes);
186:
187: // test the second plugin
188: Element otherPluginConfig = registry
189: .getPluginConfig("testlistener2");
190: assertEquals("testlistener2", otherPluginConfig.getName());
191: assertEquals("default2", otherPluginConfig
192: .getAttributeValue("string"));
193: assertEquals(null, otherPluginConfig
194: .getAttributeValue("string2"));
195:
196: PluginRegistry.resetRootRegistry();
197: }
198:
199: public void testCaseInsensitivityPluginNames() throws Exception {
200: // Plugin names are treated as case-insensitive by CruiseControl, so
201: // a plugin named TestName and testname are the same.
202: PluginRegistry registry = PluginRegistry.createRegistry();
203:
204: // Add a plugin with an all lowercase name
205: final String antBuilderClassname = AntBuilder.class.getName();
206: registry.register("testname", antBuilderClassname);
207:
208: // It should be registered
209: assertTrue(registry.isPluginRegistered("testname"));
210:
211: // If we ask if other case versions are registered, it should
212: // say "yes"
213: assertTrue(registry.isPluginRegistered("TESTNAME"));
214: assertTrue(registry.isPluginRegistered("Testname"));
215: assertTrue(registry.isPluginRegistered("TestName"));
216: assertTrue(registry.isPluginRegistered("tESTnAME"));
217: }
218:
219: public void testPluginRegistry() throws Exception {
220: // No plugins that require non-distributed API jars will be tested
221: // (i.e., Harvest, Starteam, Sametime, Yahoo)
222:
223: verifyPluginClass("currentbuildstatusbootstrapper",
224: "net.sourceforge.cruisecontrol.bootstrappers.CurrentBuildStatusBootstrapper");
225: verifyPluginClass("cvsbootstrapper",
226: "net.sourceforge.cruisecontrol.bootstrappers.CVSBootstrapper");
227: verifyPluginClass("p4bootstrapper",
228: "net.sourceforge.cruisecontrol.bootstrappers.P4Bootstrapper");
229: verifyPluginClass("svnbootstrapper",
230: "net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper");
231: verifyPluginClass("vssbootstrapper",
232: "net.sourceforge.cruisecontrol.bootstrappers.VssBootstrapper");
233: verifyPluginClass("alienbrain",
234: "net.sourceforge.cruisecontrol.sourcecontrols.AlienBrain");
235: verifyPluginClass("clearcase",
236: "net.sourceforge.cruisecontrol.sourcecontrols.ClearCase");
237: verifyPluginClass("cvs",
238: "net.sourceforge.cruisecontrol.sourcecontrols.ConcurrentVersionsSystem");
239: verifyPluginClass("filesystem",
240: "net.sourceforge.cruisecontrol.sourcecontrols.FileSystem");
241: verifyPluginClass("httpfile",
242: "net.sourceforge.cruisecontrol.sourcecontrols.HttpFile");
243: verifyPluginClass("mks",
244: "net.sourceforge.cruisecontrol.sourcecontrols.MKS");
245: verifyPluginClass("p4",
246: "net.sourceforge.cruisecontrol.sourcecontrols.P4");
247: verifyPluginClass("pvcs",
248: "net.sourceforge.cruisecontrol.sourcecontrols.PVCS");
249: verifyPluginClass("svn",
250: "net.sourceforge.cruisecontrol.sourcecontrols.SVN");
251: verifyPluginClass("vss",
252: "net.sourceforge.cruisecontrol.sourcecontrols.Vss");
253: verifyPluginClass("vssjournal",
254: "net.sourceforge.cruisecontrol.sourcecontrols.VssJournal");
255: verifyPluginClass("compound",
256: "net.sourceforge.cruisecontrol.sourcecontrols.Compound");
257: verifyPluginClass("triggers",
258: "net.sourceforge.cruisecontrol.sourcecontrols.Triggers");
259: verifyPluginClass("targets",
260: "net.sourceforge.cruisecontrol.sourcecontrols.Targets");
261: verifyPluginClass("ant",
262: "net.sourceforge.cruisecontrol.builders.AntBuilder");
263: verifyPluginClass("maven",
264: "net.sourceforge.cruisecontrol.builders.MavenBuilder");
265: verifyPluginClass("pause",
266: "net.sourceforge.cruisecontrol.PauseBuilder");
267: verifyPluginClass("labelincrementer",
268: "net.sourceforge.cruisecontrol.labelincrementers.DefaultLabelIncrementer");
269: verifyPluginClass("artifactspublisher",
270: "net.sourceforge.cruisecontrol.publishers.ArtifactsPublisher");
271: verifyPluginClass("currentbuildstatuspublisher",
272: "net.sourceforge.cruisecontrol.publishers.CurrentBuildStatusPublisher");
273: verifyPluginClass("email",
274: "net.sourceforge.cruisecontrol.publishers.LinkEmailPublisher");
275: verifyPluginClass("htmlemail",
276: "net.sourceforge.cruisecontrol.publishers.HTMLEmailPublisher");
277: verifyPluginClass("execute",
278: "net.sourceforge.cruisecontrol.publishers.ExecutePublisher");
279: verifyPluginClass("scp",
280: "net.sourceforge.cruisecontrol.publishers.SCPPublisher");
281: verifyPluginClass("modificationset",
282: "net.sourceforge.cruisecontrol.ModificationSet");
283: verifyPluginClass("schedule",
284: "net.sourceforge.cruisecontrol.Schedule");
285: verifyPluginClass("buildstatus",
286: "net.sourceforge.cruisecontrol.sourcecontrols.BuildStatus");
287: verifyPluginClass("clearcasebootstrapper",
288: "net.sourceforge.cruisecontrol.bootstrappers.ClearCaseBootstrapper");
289: verifyPluginClass("xsltlogpublisher",
290: "net.sourceforge.cruisecontrol.publishers.XSLTLogPublisher");
291: verifyPluginClass("httpfile",
292: "net.sourceforge.cruisecontrol.sourcecontrols.HttpFile");
293: verifyPluginClass("currentbuildstatuslistener",
294: "net.sourceforge.cruisecontrol.listeners.CurrentBuildStatusListener");
295: verifyPluginClass("onsuccess",
296: "net.sourceforge.cruisecontrol.publishers.OnSuccessPublisher");
297: }
298:
299: public void testCanLoadDefaultRegistry() {
300: assertTrue(defaultRegistry.isPluginRegistered("cvs"));
301: assertTrue(defaultRegistry
302: .isPluginRegistered("antbootstrapper"));
303: }
304:
305: public void testCanGetPluginName() {
306: PluginRegistry registry = defaultRegistry;
307:
308: assertEquals("cvs", registry
309: .getPluginName(ConcurrentVersionsSystem.class));
310: assertEquals("cvsbootstrapper", registry
311: .getPluginName(CVSBootstrapper.class));
312: assertEquals("svn", registry.getPluginName(SVN.class));
313: assertEquals("execute", registry
314: .getPluginName(ExecutePublisher.class));
315: assertEquals("scp", registry.getPluginName(SCPPublisher.class));
316: }
317:
318: public void testCanGetPluginDetails() throws CruiseControlException {
319: PluginDetail[] defaultPlugins = defaultRegistry
320: .getPluginDetails();
321:
322: assertNotNull(defaultPlugins);
323: assertTrue(0 < defaultPlugins.length);
324: }
325:
326: public void testCanGetPluginTypes() {
327: PluginType[] defaultTypes = defaultRegistry.getPluginTypes();
328:
329: assertNotNull(defaultTypes);
330: assertTrue(0 < defaultTypes.length);
331: }
332:
333: static void verifyPluginClass(String pluginName, String expectedName)
334: throws Exception {
335: PluginRegistry registry = PluginRegistry
336: .loadDefaultPluginRegistry();
337:
338: assertTrue(registry.isPluginRegistered(pluginName));
339:
340: String className = registry.getPluginClassname(pluginName);
341: assertEquals(expectedName, className);
342:
343: Class pluginClass = Class.forName(className);
344: // casts to suppress varargs warnings under sdk >= 1.5
345: pluginClass.getConstructor((Class[]) null).newInstance(
346: (Object[]) null);
347: }
348: }
|