/* * 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; import static net.bull.javamelody.HttpParameters.REQUEST_PARAMETER; 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 static org.junit.Assert.assertTrue; 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 java.util.Map; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.Before; import org.junit.Test; /** * Test unitaire de la classe ReportServlet. * @author Emeric Vernat */ public class TestReportServlet { private static final String CONTEXT_PATH = "/test"; private ReportServlet reportServlet; /** * Initialisation. */ @Before public void setUp() { Utils.initialize(); 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); } final ServletContext parametersContext = createNiceMock(ServletContext.class); expect(parametersContext.getMajorVersion()).andReturn(2).anyTimes(); expect(parametersContext.getMinorVersion()).andReturn(5).anyTimes(); expect(parametersContext.getContextPath()).andReturn(CONTEXT_PATH).anyTimes(); expect(parametersContext.getServletContextName()).andReturn("test webapp").anyTimes(); expect(parametersContext.getServerInfo()).andReturn("mock").anyTimes(); replay(parametersContext); Parameters.initialize(parametersContext); verify(parametersContext); final ServletConfig config = createNiceMock(ServletConfig.class); final ServletContext context = createNiceMock(ServletContext.class); expect(config.getServletContext()).andReturn(context).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.getContextPath()).andReturn(CONTEXT_PATH).anyTimes(); expect(context.getAttribute(ReportServlet.FILTER_CONTEXT_KEY)).andReturn( new FilterContext()).anyTimes(); reportServlet = new ReportServlet(); replay(config); replay(context); reportServlet.init(config); verify(config); verify(context); } /** Test. */ @Test public void testDestroy() { reportServlet.destroy(); } /** Test. * @throws ServletException e * @throws IOException e */ @Test public void testDoGet() throws ServletException, IOException { doGet(Collections.<String, String> emptyMap(), true); setProperty(Parameter.ALLOWED_ADDR_PATTERN, "256.*"); try { setUp(); doGet(Collections.<String, String> emptyMap(), false); setProperty(Parameter.ALLOWED_ADDR_PATTERN, ".*"); setUp(); doGet(Collections.<String, String> emptyMap(), false); } finally { setProperty(Parameter.ALLOWED_ADDR_PATTERN, null); } } private void doGet(Map<String, String> parameters, boolean checkResultContent) throws IOException, ServletException { final HttpServletRequest request = createNiceMock(HttpServletRequest.class); expect(request.getRequestURI()).andReturn("/test/monitoring").anyTimes(); expect(request.getRequestURL()).andReturn(new StringBuffer("/test/monitoring")).anyTimes(); expect(request.getContextPath()).andReturn(CONTEXT_PATH).anyTimes(); expect(request.getRemoteAddr()).andReturn("here").anyTimes(); for (final Map.Entry<String, String> entry : parameters.entrySet()) { if (REQUEST_PARAMETER.equals(entry.getKey())) { expect(request.getHeader(entry.getKey())).andReturn(entry.getValue()).anyTimes(); } else { expect(request.getParameter(entry.getKey())).andReturn(entry.getValue()).anyTimes(); } } expect(request.getHeaders("Accept-Encoding")).andReturn( Collections.enumeration(Arrays.asList("application/gzip"))).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(); replay(request); replay(response); reportServlet.doGet(request, response); verify(request); verify(response); if (checkResultContent) { assertTrue("result", output.size() != 0 || stringWriter.getBuffer().length() != 0); } } private static void setProperty(Parameter parameter, String value) { Utils.setProperty(parameter, value); } }