001    /*
002     * Copyright 2006-2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.kuali.rice.kew.plugin;
018    
019    import static org.junit.Assert.assertEquals;
020    import static org.junit.Assert.assertNotNull;
021    import static org.junit.Assert.assertTrue;
022    
023    import java.io.File;
024    import java.util.List;
025    
026    import org.apache.commons.io.FileUtils;
027    import org.junit.Test;
028    import org.kuali.rice.core.api.config.property.Config;
029    import org.kuali.rice.kew.test.KEWTestCase;
030    import org.kuali.rice.kew.test.TestUtilities;
031    
032    
033    /**
034     * Tests that the extra classpath features of the plugin work as advertised.
035     *
036     * <p>Adds the test/src/org/kuali/rice/kew/plugin/classes directory to the extra classes on
037     * the classpath.  Adds the test/src/org/kuali/rice/kew/plugin/lib directory to the extra
038     * libs on the classpath.  Within the lib directory is a jar called extraclasspath.jar.
039     * Inside this jar is a single resource called extraclasspath-lib.txt.
040     *
041     * @author Kuali Rice Team (rice.collab@kuali.org)
042     */
043    public class ExtraClassPathTest extends KEWTestCase {
044        
045        private PluginRegistry registry;
046    
047            @Override
048            public void setUp() throws Exception {
049                    // we want to copy the ziptest plugin into the plugin directories before the
050                    // test harness starts up.  That way the plugin will be loaded at startup time.
051            super.setUp();
052                    TestUtilities.initializePluginDirectories();
053                    String pluginZipFileLocation = getBaseDir() + "/src/test/resources/org/kuali/rice/kew/plugin/extraclasspathtest.zip";
054                    File pluginZipFile = new File(pluginZipFileLocation);
055                    assertTrue("File " + pluginZipFileLocation + " should exist", pluginZipFile.exists());
056                    assertTrue("File " + pluginZipFileLocation + " should be a file", pluginZipFile.isFile());
057                    FileUtils.copyFileToDirectory(pluginZipFile, TestUtilities.getPluginsDirectory());
058                    pluginZipFile = new File(TestUtilities.getPluginsDirectory(), pluginZipFile.getName());
059                    FileUtils.forceDeleteOnExit(pluginZipFile);
060            registry = new PluginRegistryFactory().createPluginRegistry();
061            registry.start();
062            }
063            
064            @Override
065            public void tearDown() throws Exception {
066                    super.tearDown();
067                    if (registry != null) {
068                        registry.stop();
069                    }
070                    TestUtilities.cleanupPluginDirectories();
071            }
072            
073            @Test public void testExtraClassPath() throws Exception {
074                    // first of all, let's check that the plugin was loaded when the test harness started up
075                    List<PluginEnvironment> environments = registry.getPluginEnvironments();
076                    assertEquals("There should be 1 plugin environment.", 1, environments.size());
077    
078                    PluginEnvironment environment = environments.get(0);
079                    assertEquals("Should be the extraclasspathtest plugin.", "extraclasspathtest", environment.getPlugin().getName().getLocalPart());
080    
081                    // check that the properties were configured correctly
082            String extraClassesDirName = environment.getPlugin().getConfig().getProperty(Config.EXTRA_CLASSES_DIR);
083            String extraLibDirName = environment.getPlugin().getConfig().getProperty(Config.EXTRA_LIB_DIR);
084                    
085                    File extraClassesDir = new File(extraClassesDirName);
086                    assertTrue("extra classes dir (" + extraClassesDirName + ") should exist.", extraClassesDir.exists());
087                    assertTrue("extra classes dir (" + extraClassesDirName + ") should be a directory.", extraClassesDir.isDirectory());
088                    File extraLibDir = new File(extraLibDirName);
089                    assertTrue("extra lib dir (" + extraLibDirName + ") should exist.", extraLibDir.exists());
090                    assertTrue("extra lib dir (" + extraLibDirName + ") should be a directory.", extraLibDir.isDirectory());
091    
092                    // now verify that the resources from the extra classes and extra lib dirs got loaded
093                    ClassLoader classLoader = environment.getPlugin().getClassLoader();
094                    assertNotNull("Resource should exist.", classLoader.getResource("extraclasspath-classes.txt"));
095                    assertNotNull("Resource should exist.", classLoader.getResource("extraclasspath-lib.txt"));
096            }
097    
098    }