// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.servlet; import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.server.LocalConnector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.StatisticsHandler; import org.eclipse.jetty.server.session.SessionHandler; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.xml.sax.InputSource; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; import java.nio.ByteBuffer; public class StatisticsServletTest { private Server _server; private LocalConnector _connector; @Before public void createServer() { _server = new Server(); _connector = new LocalConnector( _server ); _server.addConnector( _connector ); } @After public void destroyServer() throws Exception { _server.stop(); _server.join(); } @Test public void getStats() throws Exception { StatisticsHandler statsHandler = new StatisticsHandler(); _server.setHandler(statsHandler); ServletContextHandler statsContext = new ServletContextHandler(statsHandler, "/"); statsContext.addServlet( new ServletHolder( new TestServlet() ), "/test1" ); ServletHolder servletHolder = new ServletHolder( new StatisticsServlet() ); servletHolder.setInitParameter( "restrictToLocalhost", "false" ); statsContext.addServlet( servletHolder, "/stats" ); statsContext.setSessionHandler( new SessionHandler() ); _server.start(); getResponse("/test1" ); String response = getResponse("/stats?xml=true" ); Stats stats = parseStats( response ); Assert.assertEquals(1, stats.responses2xx); getResponse("/stats?statsReset=true" ); response = getResponse("/stats?xml=true" ); stats = parseStats( response ); Assert.assertEquals(1, stats.responses2xx); getResponse("/test1" ); getResponse("/nothing" ); response = getResponse("/stats?xml=true" ); stats = parseStats( response ); Assert.assertEquals(3, stats.responses2xx); Assert.assertEquals(1, stats.responses4xx); } public String getResponse( String path ) throws Exception { HttpTester.Request request = new HttpTester.Request(); request.setMethod( "GET" ); request.setURI( path ); request.setVersion( HttpVersion.HTTP_1_1 ); request.setHeader( "Host", "test" ); ByteBuffer responseBuffer = _connector.getResponse( request.generate() ); return HttpTester.parseResponse( responseBuffer ).getContent(); } public Stats parseStats( String xml ) throws Exception { XPath xPath = XPathFactory.newInstance().newXPath(); String responses4xx = xPath.evaluate( "//responses4xx", new InputSource( new StringReader( xml ) ) ); String responses2xx = xPath.evaluate( "//responses2xx", new InputSource( new StringReader( xml ) ) ); return new Stats(Integer.parseInt( responses2xx), Integer.parseInt( responses4xx )); } public static class Stats { int responses2xx,responses4xx; public Stats( int responses2xx, int responses4xx ) { this.responses2xx = responses2xx; this.responses4xx = responses4xx; } } public static class TestServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { resp.setStatus( HttpServletResponse.SC_OK ); PrintWriter writer = resp.getWriter(); writer.write( "Yup!!" ); } } }