001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */ 
017    
018    package org.apache.commons.logging.config;
019    
020    
021    import java.net.URL;
022    
023    import junit.framework.Test;
024    import junit.framework.TestCase;
025    
026    import org.apache.commons.logging.LogFactory;
027    import org.apache.commons.logging.PathableClassLoader;
028    import org.apache.commons.logging.PathableTestSuite;
029    
030    
031    /**
032     * Tests that verify that the process of configuring logging on startup
033     * works correctly by selecting the file with the highest priority.
034     * <p>
035     * This test sets up a classpath where:
036     * <ul>
037     * <li> first file (in parent loader) has priority=10 (parentFirst=true)
038     * <li> second file found has no priority set
039     * <li> third file found has priority=20
040     * <li> fourth file found also has priority=20
041     * </ul>
042     * The result should be that the third file is used.
043     * <p>
044     * Note that parentFirst=true is used in this test because method
045     * <code>PathableClassLoader.getResources</code> always behaves as if
046     * parentFirst=true; see the PathableClassLoader javadoc for details.
047     */
048    
049    public class PriorityConfigTestCase extends TestCase {
050    
051        // ------------------------------------------- JUnit Infrastructure Methods
052    
053    
054        /**
055         * Return the tests included in this test suite.
056         */
057        public static Test suite() throws Exception {
058            Class thisClass = PriorityConfigTestCase.class;
059    
060            // Determine the URL to this .class file, so that we can then
061            // append the priority dirs to it. For tidiness, load this
062            // class through a dummy loader though this is not absolutely
063            // necessary...
064            PathableClassLoader dummy = new PathableClassLoader(null);
065            dummy.useExplicitLoader("junit.", Test.class.getClassLoader());
066            dummy.addLogicalLib("testclasses");
067            dummy.addLogicalLib("commons-logging");
068            
069            String thisClassPath = thisClass.getName().replace('.', '/') + ".class";
070            URL baseUrl = dummy.findResource(thisClassPath);
071    
072            // Now set up the desired classloader hierarchy. We'll put a config
073            // file of priority=10 in the container path, and ones of both
074            // "no priority" and priority=20 in the webapp path.
075            //
076            // A second properties file with priority=20 is also added,
077            // so we can check that the first one in the classpath is
078            // used.
079            PathableClassLoader containerLoader = new PathableClassLoader(null);
080            containerLoader.useExplicitLoader("junit.", Test.class.getClassLoader());
081            containerLoader.addLogicalLib("commons-logging");
082            
083            URL pri10URL = new URL(baseUrl, "priority10/");
084            containerLoader.addURL(pri10URL);
085    
086            PathableClassLoader webappLoader = new PathableClassLoader(containerLoader);
087            webappLoader.setParentFirst(true);
088            webappLoader.addLogicalLib("testclasses");
089    
090            URL noPriorityURL = new URL(baseUrl, "nopriority/");
091            webappLoader.addURL(noPriorityURL);
092            
093            URL pri20URL = new URL(baseUrl, "priority20/");
094            webappLoader.addURL(pri20URL);
095            
096            URL pri20aURL = new URL(baseUrl, "priority20a/");
097            webappLoader.addURL(pri20aURL);
098            
099            // load the test class via webapp loader, and use the webapp loader
100            // as the tccl loader too.
101            Class testClass = webappLoader.loadClass(thisClass.getName());
102            return new PathableTestSuite(testClass, webappLoader);
103        }
104    
105        /**
106         * Set up instance variables required by this test case.
107         */
108        public void setUp() throws Exception {
109            LogFactory.releaseAll();
110        }
111    
112        /**
113         * Tear down instance variables required by this test case.
114         */
115        public void tearDown() {
116            LogFactory.releaseAll();
117        }
118    
119        // ----------------------------------------------------------- Test Methods
120    
121        /**
122         * Verify that the config file being used is the one containing
123         * the desired configId value.
124         */
125        public void testPriority() throws Exception {
126            LogFactory instance = LogFactory.getFactory();
127            String id = (String) instance.getAttribute("configId");
128            assertEquals("Correct config file loaded", "priority20", id );
129        }
130    }