/*
* Copyright 2008-2014 by Emeric Vernat
*
* This file is part of Java Melody.
*
* Licensed 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 net.bull.javamelody; // NOPMD
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collections;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Test unitaire de la classe JiraMonitoringFilter.
* @author Emeric Vernat
*/
public class TestJiraMonitoringFilter { // NOPMD
private static final String FILTER_NAME = "monitoring";
private static final String CONTEXT_PATH = "/test";
private FilterConfig config;
private ServletContext context;
private JiraMonitoringFilter jiraMonitoringFilter;
/**
* Initialisation.
*/
@Before
public void setUpFirst() {
Utils.initialize();
}
/**
* Initialisation.
*/
@Before
public void setUp() {
// rq: pas setUpFirst ici car setUp est rappelée dans les méthodes
tearDown();
try {
final Field field = MonitoringFilter.class.getDeclaredField("instanceCreated");
field.setAccessible(true);
field.set(null, false);
} catch (final IllegalAccessException e) {
throw new IllegalStateException(e);
} catch (final NoSuchFieldException e) {
throw new IllegalStateException(e);
}
config = createNiceMock(FilterConfig.class);
context = createNiceMock(ServletContext.class);
expect(config.getServletContext()).andReturn(context).anyTimes();
expect(config.getFilterName()).andReturn(FILTER_NAME).anyTimes();
// anyTimes sur getInitParameter car TestJdbcDriver a pu fixer la propriété système à false
expect(
context.getInitParameter(Parameters.PARAMETER_SYSTEM_PREFIX
+ Parameter.DISABLED.getCode())).andReturn(null).anyTimes();
expect(config.getInitParameter(Parameter.DISABLED.getCode())).andReturn(null).anyTimes();
expect(context.getMajorVersion()).andReturn(2).anyTimes();
expect(context.getMinorVersion()).andReturn(5).anyTimes();
expect(context.getServletContextName()).andReturn("test webapp").anyTimes();
expect(context.getServerInfo()).andReturn("mockJetty").anyTimes();
expect(context.getContextPath()).andReturn(CONTEXT_PATH).anyTimes();
jiraMonitoringFilter = new JiraMonitoringFilter();
}
/**
* Finalisation.
*/
@After
public void tearDown() {
destroy();
}
private void destroy() {
if (jiraMonitoringFilter != null) {
jiraMonitoringFilter.destroy();
}
}
/** Test.
* @throws ServletException e
* @throws IOException e */
@Test
public void testNoHttp() throws ServletException, IOException {
// non http
final FilterChain servletChain = createNiceMock(FilterChain.class);
final ServletRequest servletRequest = createNiceMock(ServletRequest.class);
final ServletResponse servletResponse = createNiceMock(ServletResponse.class);
replay(config);
replay(context);
replay(servletRequest);
replay(servletResponse);
replay(servletChain);
jiraMonitoringFilter.init(config);
jiraMonitoringFilter.doFilter(servletRequest, servletResponse, servletChain);
verify(config);
verify(context);
verify(servletRequest);
verify(servletResponse);
verify(servletChain);
}
/** Test.
* @throws ServletException e
* @throws IOException e */
@Test
public void testNoSession() throws ServletException, IOException {
// pas de session
doJiraFilter(null);
}
/** Test.
* @throws ServletException e
* @throws IOException e */
@Test
public void testValidSession() throws ServletException, IOException {
// session valide dans PluginMonitoringFilter
final HttpSession session = createNiceMock(HttpSession.class);
expect(session.getId()).andReturn("sessionId").anyTimes();
doJiraFilter(session);
}
/** Test.
* @throws ServletException e
* @throws IOException e */
@Test
public void testInvalidatedSession() throws ServletException, IOException {
jiraMonitoringFilter.unregisterInvalidatedSessions();
// session invalidée dans PluginMonitoringFilter
final HttpSession session = createNiceMock(HttpSession.class);
expect(session.getId()).andReturn("sessionId2").anyTimes();
expect(session.getCreationTime()).andThrow(new IllegalStateException("invalidated"))
.anyTimes();
doJiraFilter(session);
}
private void doJiraFilter(HttpSession session) throws IOException, ServletException {
final HttpServletRequest request = createNiceMock(HttpServletRequest.class);
expect(request.getRequestURI()).andReturn("/test/monitoring").anyTimes();
expect(request.getContextPath()).andReturn(CONTEXT_PATH).anyTimes();
expect(request.getHeaders("Accept-Encoding")).andReturn(
Collections.enumeration(Arrays.asList("text/html"))).anyTimes();
if (session != null) {
expect(request.isRequestedSessionIdValid()).andReturn(Boolean.TRUE).anyTimes();
expect(request.getSession(false)).andReturn(session).anyTimes();
}
final HttpServletResponse response = createNiceMock(HttpServletResponse.class);
final ByteArrayOutputStream output = new ByteArrayOutputStream();
expect(response.getOutputStream()).andReturn(new FilterServletOutputStream(output))
.anyTimes();
final StringWriter stringWriter = new StringWriter();
expect(response.getWriter()).andReturn(new PrintWriter(stringWriter)).anyTimes();
final FilterChain chain = createNiceMock(FilterChain.class);
replay(config);
replay(context);
replay(request);
replay(response);
replay(chain);
if (session != null) {
replay(session);
}
jiraMonitoringFilter.init(config);
jiraMonitoringFilter.doFilter(request, response, chain);
verify(config);
verify(context);
verify(request);
verify(response);
verify(chain);
if (session != null) {
verify(session);
}
}
}