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 found has priority=20 038 * <li> second file found has priority=10 039 * </ul> 040 * The result should be that the first file is used. 041 */ 042 public class FirstPriorityConfigTestCase extends TestCase { 043 044 // ------------------------------------------- JUnit Infrastructure Methods 045 046 047 /** 048 * Return the tests included in this test suite. 049 */ 050 public static Test suite() throws Exception { 051 Class thisClass = FirstPriorityConfigTestCase.class; 052 053 // Determine the URL to this .class file, so that we can then 054 // append the priority dirs to it. For tidiness, load this 055 // class through a dummy loader though this is not absolutely 056 // necessary... 057 PathableClassLoader dummy = new PathableClassLoader(null); 058 dummy.useExplicitLoader("junit.", Test.class.getClassLoader()); 059 dummy.addLogicalLib("testclasses"); 060 dummy.addLogicalLib("commons-logging"); 061 062 String thisClassPath = thisClass.getName().replace('.', '/') + ".class"; 063 URL baseUrl = dummy.findResource(thisClassPath); 064 065 // Now set up the desired classloader hierarchy. We'll put JCL 066 // in the container path, the testcase in a webapp path, and 067 // both config files into the webapp path too. 068 PathableClassLoader containerLoader = new PathableClassLoader(null); 069 containerLoader.useExplicitLoader("junit.", Test.class.getClassLoader()); 070 containerLoader.addLogicalLib("commons-logging"); 071 072 PathableClassLoader webappLoader = new PathableClassLoader(containerLoader); 073 webappLoader.addLogicalLib("testclasses"); 074 075 URL pri20URL = new URL(baseUrl, "priority20/"); 076 webappLoader.addURL(pri20URL); 077 078 URL pri10URL = new URL(baseUrl, "priority10/"); 079 webappLoader.addURL(pri10URL); 080 081 // load the test class via webapp loader, and use the webapp loader 082 // as the tccl loader too. 083 Class testClass = webappLoader.loadClass(thisClass.getName()); 084 return new PathableTestSuite(testClass, webappLoader); 085 } 086 087 /** 088 * Set up instance variables required by this test case. 089 */ 090 public void setUp() throws Exception { 091 LogFactory.releaseAll(); 092 } 093 094 /** 095 * Tear down instance variables required by this test case. 096 */ 097 public void tearDown() { 098 LogFactory.releaseAll(); 099 } 100 101 // ----------------------------------------------------------- Test Methods 102 103 /** 104 * Verify that the config file being used is the one containing 105 * the desired configId value. 106 */ 107 public void testPriority() throws Exception { 108 LogFactory instance = LogFactory.getFactory(); 109 110 ClassLoader thisClassLoader = this.getClass().getClassLoader(); 111 ClassLoader lfClassLoader = instance.getClass().getClassLoader(); 112 ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); 113 114 // context classloader should be thisClassLoader 115 assertEquals(thisClassLoader, contextClassLoader); 116 117 // lfClassLoader should be parent of this classloader 118 assertEquals(lfClassLoader, thisClassLoader.getParent()); 119 assertEquals(PathableClassLoader.class.getName(), 120 lfClassLoader.getClass().getName()); 121 122 String id = (String) instance.getAttribute("configId"); 123 assertEquals("Correct config file loaded", "priority20", id ); 124 } 125 }