package fitnesse.components; import static org.junit.Assert.*; import static util.RegexTestCase.assertMatches; import static util.RegexTestCase.assertNotSubString; import static util.RegexTestCase.assertSubString; import org.apache.commons.lang.StringUtils; import org.junit.Test; import java.io.File; import java.net.URL; import java.net.URLClassLoader; public class PluginsClassLoaderTest { @Test public void whenPluginsDirectoryDoesNotExist() throws Exception { PluginsClassLoader pluginsClassLoader = new PluginsClassLoader("nonExistingRootDirectory"); pluginsClassLoader.addPluginsToClassLoader(); assertTrue("didn't cause exception", true); } @Test public void addPluginsToClassLoader() throws Exception { String[] dynamicClasses = new String[]{"fitnesse.testing.PluginX", "fitnesse.testing.PluginY"}; //todo This fails because some other test probably loads plugin path assertLoadingClassCausesException(dynamicClasses); PluginsClassLoader pluginsClassLoader = new PluginsClassLoader("."); pluginsClassLoader.addPluginsToClassLoader(); assertLoadingClassWorksNow(dynamicClasses); } private void assertLoadingClassWorksNow(String... dynamicClasses) { for (String dynamicClass : dynamicClasses) { try { Class<?> dynamicallyLoadedClass = Class.forName(dynamicClass); assertEquals(dynamicClass, dynamicallyLoadedClass.getName()); } catch (ClassNotFoundException e) { fail(e.getMessage()); } } } @Test public void testAddUrlToClasspath() throws Exception { ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); assertTrue(systemClassLoader instanceof URLClassLoader); URLClassLoader classLoader = (URLClassLoader) systemClassLoader; URL sampleUrl = new File("src").toURI().toURL(); String classpath = classpathAsString(classLoader); assertNotSubString(sampleUrl.toString(), classpath); PluginsClassLoader.addUrlToClasspath(sampleUrl); classpath = classpathAsString(classLoader); assertSubString(sampleUrl.toString(), classpath); } @Test public void testAddMultipleUrlsToClasspath() throws Exception { String separator = System.getProperty("path.separator"); String paths = "/blah/blah" + separator + "C" + otherSeperator(separator) + "\\foo\\bar"; PluginsClassLoader.addItemsToClasspath(paths); URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); String classpath = classpathAsString(classLoader); assertSubString("/blah/blah", classpath); assertMatches("[C" + otherSeperator(separator) + "?foo?bar]", classpath); } private String otherSeperator(String separator) { return separator.equals(";") ? ":" : ";"; } private String classpathAsString(URLClassLoader classLoader) { URL[] urls = classLoader.getURLs(); return StringUtils.join(urls, ":"); } }