1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */ 
17  
18  package org.apache.commons.logging.config;
19  
20  
21  import java.net.URL;
22  
23  import junit.framework.Test;
24  import junit.framework.TestCase;
25  
26  import org.apache.commons.logging.LogFactory;
27  import org.apache.commons.logging.PathableClassLoader;
28  import org.apache.commons.logging.PathableTestSuite;
29  
30  
31  /**
32   * Tests that verify that the process of configuring logging on startup
33   * works correctly by selecting the file with the highest priority.
34   * <p>
35   * This test sets up a classpath where:
36   * <ul>
37   * <li> first file (in parent loader) has priority=10 (parentFirst=true)
38   * <li> second file found has no priority set
39   * <li> third file found has priority=20
40   * <li> fourth file found also has priority=20
41   * </ul>
42   * The result should be that the third file is used.
43   * <p>
44   * Note that parentFirst=true is used in this test because method
45   * <code>PathableClassLoader.getResources</code> always behaves as if
46   * parentFirst=true; see the PathableClassLoader javadoc for details.
47   */
48  
49  public class PriorityConfigTestCase extends TestCase {
50  
51      // ------------------------------------------- JUnit Infrastructure Methods
52  
53  
54      /**
55       * Return the tests included in this test suite.
56       */
57      public static Test suite() throws Exception {
58          Class thisClass = PriorityConfigTestCase.class;
59  
60          // Determine the URL to this .class file, so that we can then
61          // append the priority dirs to it. For tidiness, load this
62          // class through a dummy loader though this is not absolutely
63          // necessary...
64          PathableClassLoader dummy = new PathableClassLoader(null);
65          dummy.useExplicitLoader("junit.", Test.class.getClassLoader());
66          dummy.addLogicalLib("testclasses");
67          dummy.addLogicalLib("commons-logging");
68          
69          String thisClassPath = thisClass.getName().replace('.', '/') + ".class";
70          URL baseUrl = dummy.findResource(thisClassPath);
71  
72          // Now set up the desired classloader hierarchy. We'll put a config
73          // file of priority=10 in the container path, and ones of both
74          // "no priority" and priority=20 in the webapp path.
75          //
76          // A second properties file with priority=20 is also added,
77          // so we can check that the first one in the classpath is
78          // used.
79          PathableClassLoader containerLoader = new PathableClassLoader(null);
80          containerLoader.useExplicitLoader("junit.", Test.class.getClassLoader());
81          containerLoader.addLogicalLib("commons-logging");
82          
83          URL pri10URL = new URL(baseUrl, "priority10/");
84          containerLoader.addURL(pri10URL);
85  
86          PathableClassLoader webappLoader = new PathableClassLoader(containerLoader);
87          webappLoader.setParentFirst(true);
88          webappLoader.addLogicalLib("testclasses");
89  
90          URL noPriorityURL = new URL(baseUrl, "nopriority/");
91          webappLoader.addURL(noPriorityURL);
92          
93          URL pri20URL = new URL(baseUrl, "priority20/");
94          webappLoader.addURL(pri20URL);
95          
96          URL pri20aURL = new URL(baseUrl, "priority20a/");
97          webappLoader.addURL(pri20aURL);
98          
99          // 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 }