| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache license, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the license for the specific language governing permissions and |
| * limitations under the license. |
| */ |
| package org.apache.logging.log4j.web; |
| |
| import java.util.Map; |
| |
| import javax.servlet.ServletContext; |
| |
| import org.apache.logging.log4j.core.Appender; |
| import org.apache.logging.log4j.core.LoggerContext; |
| import org.apache.logging.log4j.core.appender.FileAppender; |
| import org.apache.logging.log4j.core.config.Configuration; |
| import org.apache.logging.log4j.core.impl.ContextAnchor; |
| import org.apache.logging.log4j.core.lookup.StrSubstitutor; |
| import org.junit.Test; |
| import org.springframework.mock.web.MockHttpServletRequest; |
| import org.springframework.mock.web.MockServletContext; |
| |
| import static org.junit.Assert.*; |
| |
| public class WebLookupTest { |
| |
| @Test |
| public void testLookup() throws Exception { |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| final ServletContext servletContext = new MockServletContext(); |
| ((MockServletContext) servletContext).setContextPath("/WebApp"); |
| servletContext.setAttribute("TestAttr", "AttrValue"); |
| servletContext.setInitParameter("TestParam", "ParamValue"); |
| servletContext.setAttribute("Name1", "Ben"); |
| servletContext.setInitParameter("Name2", "Jerry"); |
| final Log4jWebLifeCycle initializer = WebLoggerContextUtils.getWebLifeCycle(servletContext); |
| try { |
| initializer.start(); |
| initializer.setLoggerContext(); |
| final LoggerContext ctx = ContextAnchor.THREAD_CONTEXT.get(); |
| assertNotNull("No LoggerContext", ctx); |
| assertNotNull("No ServletContext", ctx.getExternalContext()); |
| final Configuration config = ctx.getConfiguration(); |
| assertNotNull("No Configuration", config); |
| final StrSubstitutor substitutor = config.getStrSubstitutor(); |
| assertNotNull("No Interpolator", substitutor); |
| String value = substitutor.replace("${web:initParam.TestParam}"); |
| assertNotNull("No value for TestParam", value); |
| assertEquals("Incorrect value for TestParam: " + value, "ParamValue", value); |
| value = substitutor.replace("${web:attr.TestAttr}"); |
| assertNotNull("No value for TestAttr", value); |
| assertEquals("Incorrect value for TestAttr: " + value, "AttrValue", value); |
| value = substitutor.replace("${web:Name1}"); |
| assertNotNull("No value for Name1", value); |
| assertEquals("Incorrect value for Name1: " + value, "Ben", value); |
| value = substitutor.replace("${web:Name2}"); |
| assertNotNull("No value for Name2", value); |
| assertEquals("Incorrect value for Name2: " + value, "Jerry", value); |
| value = substitutor.replace("${web:contextPathName}"); |
| assertNotNull("No value for context name", value); |
| assertEquals("Incorrect value for context name", "WebApp", value); |
| } catch (final IllegalStateException e) { |
| fail("Failed to initialize Log4j properly." + e.getMessage()); |
| } |
| initializer.stop(); |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| } |
| |
| @Test |
| public void testLookup2() throws Exception { |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| final ServletContext servletContext = new MockServletContext(); |
| ((MockServletContext) servletContext).setContextPath("/"); |
| servletContext.setAttribute("TestAttr", "AttrValue"); |
| servletContext.setInitParameter("myapp.logdir", "target"); |
| servletContext.setAttribute("Name1", "Ben"); |
| servletContext.setInitParameter("Name2", "Jerry"); |
| servletContext.setInitParameter("log4jConfiguration", "WEB-INF/classes/log4j-webvar.xml"); |
| final Log4jWebLifeCycle initializer = WebLoggerContextUtils.getWebLifeCycle(servletContext); |
| initializer.start(); |
| initializer.setLoggerContext(); |
| final LoggerContext ctx = ContextAnchor.THREAD_CONTEXT.get(); |
| assertNotNull("No LoggerContext", ctx); |
| assertNotNull("No ServletContext", ctx.getExternalContext()); |
| final Configuration config = ctx.getConfiguration(); |
| assertNotNull("No Configuration", config); |
| final Map<String, Appender> appenders = config.getAppenders(); |
| for (final Map.Entry<String, Appender> entry : appenders.entrySet()) { |
| if (entry.getKey().equals("file")) { |
| final FileAppender fa = (FileAppender) entry.getValue(); |
| assertEquals("target/myapp.log", fa.getFileName()); |
| } |
| } |
| final StrSubstitutor substitutor = config.getStrSubstitutor(); |
| String value = substitutor.replace("${web:contextPathName:-default}"); |
| assertNotNull("No value for context name", value); |
| assertEquals("Incorrect value for context name", "default", value); |
| initializer.stop(); |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| } |
| |
| @Test |
| public void testRequestAttributeLookups() { |
| final Log4jWebLifeCycle initializer = startInitializer(); |
| final MockHttpServletRequest request = new MockHttpServletRequest(); |
| request.setAttribute("foo", "bar"); |
| Log4jServletFilter.CURRENT_REQUEST.set(request); |
| final WebLookup lookup = new WebLookup(); |
| assertEquals("bar", lookup.lookup(null, "request.attr.foo")); |
| assertNull(lookup.lookup(null, "request.attr.missing")); |
| Log4jServletFilter.CURRENT_REQUEST.remove(); |
| assertNull(lookup.lookup(null, "request.attr.missing")); |
| assertNull(lookup.lookup(null, "request.attr.foo")); |
| initializer.stop(); |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| } |
| |
| @Test |
| public void testRequestHeaderLookups() { |
| final Log4jWebLifeCycle initializer = startInitializer(); |
| final MockHttpServletRequest request = new MockHttpServletRequest(); |
| request.addHeader("foo", "bar"); |
| Log4jServletFilter.CURRENT_REQUEST.set(request); |
| final WebLookup lookup = new WebLookup(); |
| assertEquals("bar", lookup.lookup(null, "header.foo")); |
| assertNull(lookup.lookup(null, "header.missing")); |
| Log4jServletFilter.CURRENT_REQUEST.remove(); |
| assertNull(lookup.lookup(null, "header.foo")); |
| assertNull(lookup.lookup(null, "header.missing")); |
| initializer.stop(); |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| } |
| |
| @Test |
| public void testSessionId() { |
| final Log4jWebLifeCycle initializer = startInitializer(); |
| final MockHttpServletRequest request = new MockHttpServletRequest(); |
| request.getSession(); |
| Log4jServletFilter.CURRENT_REQUEST.set(request); |
| final WebLookup lookup = new WebLookup(); |
| assertNotNull(lookup.lookup(null, "session.id")); |
| Log4jServletFilter.CURRENT_REQUEST.remove(); |
| assertNull(lookup.lookup(null, "session.id")); |
| initializer.stop(); |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| } |
| |
| @Test |
| public void testSessionAttribute() { |
| final Log4jWebLifeCycle initializer = startInitializer(); |
| final MockHttpServletRequest request = new MockHttpServletRequest(); |
| request.getSession().setAttribute("foo", "bar"); |
| Log4jServletFilter.CURRENT_REQUEST.set(request); |
| final WebLookup lookup = new WebLookup(); |
| assertEquals("bar", lookup.lookup(null, "session.attr.foo")); |
| Log4jServletFilter.CURRENT_REQUEST.remove(); |
| assertNull(lookup.lookup(null, "session.attr.foo")); |
| initializer.stop(); |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| } |
| |
| private Log4jWebLifeCycle startInitializer() { |
| ContextAnchor.THREAD_CONTEXT.remove(); |
| final ServletContext servletContext = new MockServletContext(); |
| final Log4jWebLifeCycle initializer = WebLoggerContextUtils.getWebLifeCycle(servletContext); |
| initializer.start(); |
| initializer.setLoggerContext(); |
| return initializer; |
| } |
| |
| } |