/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.common.filter; import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Enumeration; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * LoggingFilterTest */ public class LoggingFilterTest { @Mock private HttpServletRequest request; @Mock private HttpServletResponse response; @Mock private FilterChain chain; private LoggingFilter filter; private Logger filterlogger; @Mock private Enumeration<String> headernames; @Mock private Appender<ILoggingEvent> mockapp; @Before public void setUp() { MockitoAnnotations.initMocks(this); filter = new LoggingFilter(); // prepare logger LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); filterlogger = lc.getLogger(LoggingFilter.class); filterlogger.addAppender(mockapp); filterlogger.setLevel(Level.DEBUG); when(headernames.hasMoreElements()).thenReturn(Boolean.FALSE); when(request.getHeaderNames()).thenReturn(headernames); } @Test public void testSetHeader() throws Exception { FilterConfig config = mock(FilterConfig.class); String header = "x-blorp"; when(config.getInitParameter("header.name")).thenReturn(header); filter.init(config); filter.doFilter(request, response, chain); ArgumentCaptor<String> headerName = ArgumentCaptor.forClass(String.class); verify(response).setHeader(headerName.capture(), anyString()); assertEquals(header, headerName.getValue()); } @Test public void testDoFilterDebugOff() throws Exception { filterlogger.setLevel(Level.WARN); filter.doFilter(request, response, chain); verify(mockapp, never()).doAppend(null); } @Test public void testWithHeaders() throws Exception { ArgumentCaptor<LoggingEvent> message = ArgumentCaptor.forClass(LoggingEvent.class); when(headernames.hasMoreElements()).thenReturn(Boolean.TRUE) .thenReturn(Boolean.FALSE); when(headernames.nextElement()).thenReturn("Accept"); when(request.getHeaderNames()).thenReturn(headernames); when(request.getHeader("Accept")).thenReturn("NoSubstitutes"); filter.doFilter(request, response, chain); verify(mockapp, atLeastOnce()).doAppend(message.capture()); } @Test public void testWithQueryString() throws Exception { when(request.getQueryString()).thenReturn("foo=bar"); ArgumentCaptor<LoggingEvent> message = ArgumentCaptor.forClass(LoggingEvent.class); filter.doFilter(request, response, chain); verify(mockapp, atLeastOnce()).doAppend(message.capture()); } @Test public void testDoFilter() throws Exception { filterlogger.setLevel(Level.DEBUG); final ByteArrayInputStream bais = new ByteArrayInputStream("this is my body".getBytes()); when(request.getInputStream()).thenReturn(new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } }); when(request.getRequestURL()).thenReturn(new StringBuffer("/some/url")); ArgumentCaptor<LoggingEvent> message = ArgumentCaptor.forClass(LoggingEvent.class); // DO FILTER! filter.doFilter(request, response, chain); // VERIFY verify(mockapp, atLeastOnce()).doAppend(message.capture()); } }