diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java index ef919630bcc..69672f15e1b 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java @@ -18,19 +18,11 @@ package org.eclipse.jetty.server.handler; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; - import javax.servlet.AsyncContext; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; @@ -46,6 +38,12 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + public class StatisticsHandlerTest { private Server _server; @@ -60,7 +58,7 @@ public class StatisticsHandlerTest _server = new Server(); _connector = new LocalConnector(_server); - _statistics=new ConnectorStatistics(); + _statistics = new ConnectorStatistics(); _connector.addBean(_statistics); _server.addConnector(_connector); @@ -105,8 +103,8 @@ public class StatisticsHandlerTest _server.start(); String request = "GET / HTTP/1.1\r\n" + - "Host: localhost\r\n" + - "\r\n"; + "Host: localhost\r\n" + + "\r\n"; _connector.executeRequest(request); barrier[0].await(); @@ -174,8 +172,8 @@ public class StatisticsHandlerTest assertEquals(2, _statsHandler.getResponses2xx()); _latchHandler.reset(2); - barrier[0]=new CyclicBarrier(3); - barrier[1]=new CyclicBarrier(3); + barrier[0] = new CyclicBarrier(3); + barrier[1] = new CyclicBarrier(3); _connector.executeRequest(request); _connector.executeRequest(request); @@ -208,37 +206,33 @@ public class StatisticsHandlerTest assertEquals(0, _statsHandler.getAsyncDispatches()); assertEquals(0, _statsHandler.getExpires()); assertEquals(4, _statsHandler.getResponses2xx()); - - } @Test public void testSuspendResume() throws Exception { + final long dispatchTime = 10; + final long requestTime = 50; final AtomicReference asyncHolder = new AtomicReference<>(); - final CyclicBarrier barrier[] = { new CyclicBarrier(2), new CyclicBarrier(2), new CyclicBarrier(2)}; + final CyclicBarrier barrier[] = {new CyclicBarrier(2), new CyclicBarrier(2), new CyclicBarrier(2)}; _statsHandler.setHandler(new AbstractHandler() { @Override public void handle(String path, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException { request.setHandled(true); - try { barrier[0].await(); - Thread.sleep(10); - + Thread.sleep(dispatchTime); + if (asyncHolder.get() == null) - { asyncHolder.set(request.startAsync()); - } } catch (Exception x) { - Thread.currentThread().interrupt(); - throw (IOException)new IOException().initCause(x); + throw new ServletException(x); } finally { @@ -246,50 +240,41 @@ public class StatisticsHandlerTest { barrier[1].await(); } - catch (Exception x) + catch (Exception ignored) { - x.printStackTrace(); - Thread.currentThread().interrupt(); - fail(); } } - } }); _server.start(); String request = "GET / HTTP/1.1\r\n" + - "Host: localhost\r\n" + - "\r\n"; + "Host: localhost\r\n" + + "\r\n"; _connector.executeRequest(request); - barrier[0].await(); assertEquals(1, _statistics.getConnectionsOpen()); - assertEquals(1, _statsHandler.getRequests()); assertEquals(1, _statsHandler.getRequestsActive()); assertEquals(1, _statsHandler.getDispatched()); assertEquals(1, _statsHandler.getDispatchedActive()); barrier[1].await(); - assertTrue(_latchHandler.await()); assertNotNull(asyncHolder.get()); - assertTrue(asyncHolder.get()!=null); assertEquals(1, _statsHandler.getRequests()); assertEquals(1, _statsHandler.getRequestsActive()); assertEquals(1, _statsHandler.getDispatched()); assertEquals(0, _statsHandler.getDispatchedActive()); - Thread.sleep(10); _latchHandler.reset(); barrier[0].reset(); barrier[1].reset(); - Thread.sleep(50); + Thread.sleep(requestTime); asyncHolder.get().addListener(new AsyncListener() { @@ -297,30 +282,34 @@ public class StatisticsHandlerTest public void onTimeout(AsyncEvent event) throws IOException { } - + @Override public void onStartAsync(AsyncEvent event) throws IOException { } - + @Override public void onError(AsyncEvent event) throws IOException { } - + @Override public void onComplete(AsyncEvent event) throws IOException { - try { barrier[2].await(); } catch(Exception e) {} + try + { + barrier[2].await(); + } + catch (Exception ignored) + { + } } }); - asyncHolder.get().dispatch(); barrier[0].await(); // entered app handler assertEquals(1, _statistics.getConnectionsOpen()); - assertEquals(1, _statsHandler.getRequests()); assertEquals(1, _statsHandler.getRequestsActive()); assertEquals(2, _statsHandler.getDispatched()); @@ -335,50 +324,49 @@ public class StatisticsHandlerTest assertEquals(2, _statsHandler.getDispatched()); assertEquals(0, _statsHandler.getDispatchedActive()); - assertEquals(1, _statsHandler.getAsyncRequests()); assertEquals(1, _statsHandler.getAsyncDispatches()); assertEquals(0, _statsHandler.getExpires()); assertEquals(1, _statsHandler.getResponses2xx()); + assertThat(_statsHandler.getRequestTimeTotal(), greaterThanOrEqualTo(requestTime * 3 / 4)); + assertEquals(_statsHandler.getRequestTimeTotal(), _statsHandler.getRequestTimeMax()); + assertEquals(_statsHandler.getRequestTimeTotal(), _statsHandler.getRequestTimeMean(), 0.01); - assertThat(_statsHandler.getRequestTimeTotal(),greaterThanOrEqualTo(50L)); - assertEquals(_statsHandler.getRequestTimeTotal(),_statsHandler.getRequestTimeMax()); - assertEquals(_statsHandler.getRequestTimeTotal(),_statsHandler.getRequestTimeMean(), 0.01); - - assertTrue(_statsHandler.getDispatchedTimeTotal()>=20); - assertTrue(_statsHandler.getDispatchedTimeMean()+10<=_statsHandler.getDispatchedTimeTotal()); - assertTrue(_statsHandler.getDispatchedTimeMax()+10<=_statsHandler.getDispatchedTimeTotal()); - + assertThat(_statsHandler.getDispatchedTimeTotal(), greaterThanOrEqualTo(dispatchTime * 2 * 3 / 4)); + assertTrue(_statsHandler.getDispatchedTimeMean() + dispatchTime <= _statsHandler.getDispatchedTimeTotal()); + assertTrue(_statsHandler.getDispatchedTimeMax() + dispatchTime <= _statsHandler.getDispatchedTimeTotal()); } @Test public void testSuspendExpire() throws Exception { + final long dispatchTime = 10; + final long timeout = 100; final AtomicReference asyncHolder = new AtomicReference<>(); - final CyclicBarrier barrier[] = { new CyclicBarrier(2), new CyclicBarrier(2), new CyclicBarrier(2)}; + final CyclicBarrier barrier[] = {new CyclicBarrier(2), new CyclicBarrier(2), new CyclicBarrier(2)}; _statsHandler.setHandler(new AbstractHandler() { @Override public void handle(String path, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException { request.setHandled(true); - try { barrier[0].await(); - Thread.sleep(10); + + Thread.sleep(dispatchTime); + if (asyncHolder.get() == null) { - AsyncContext async=request.startAsync(); - async.setTimeout(100); + AsyncContext async = request.startAsync(); asyncHolder.set(async); + async.setTimeout(timeout); } } catch (Exception x) { - Thread.currentThread().interrupt(); - throw (IOException)new IOException().initCause(x); + throw new ServletException(x); } finally { @@ -386,28 +374,22 @@ public class StatisticsHandlerTest { barrier[1].await(); } - catch (Exception x) + catch (Exception ignored) { - x.printStackTrace(); - Thread.currentThread().interrupt(); - fail(); } } - } }); _server.start(); String request = "GET / HTTP/1.1\r\n" + - "Host: localhost\r\n" + - "\r\n"; + "Host: localhost\r\n" + + "\r\n"; _connector.executeRequest(request); - barrier[0].await(); assertEquals(1, _statistics.getConnectionsOpen()); - assertEquals(1, _statsHandler.getRequests()); assertEquals(1, _statsHandler.getRequestsActive()); assertEquals(1, _statsHandler.getDispatched()); @@ -423,31 +405,35 @@ public class StatisticsHandlerTest { event.getAsyncContext().complete(); } - + @Override public void onStartAsync(AsyncEvent event) throws IOException { } - + @Override public void onError(AsyncEvent event) throws IOException { } - + @Override public void onComplete(AsyncEvent event) throws IOException { - try { barrier[2].await(); } catch(Exception e) {} + try + { + barrier[2].await(); + } + catch (Exception ignored) + { + } } }); - assertEquals(1, _statsHandler.getRequests()); assertEquals(1, _statsHandler.getRequestsActive()); assertEquals(1, _statsHandler.getDispatched()); assertEquals(0, _statsHandler.getDispatchedActive()); - barrier[2].await(); assertEquals(1, _statsHandler.getRequests()); @@ -460,67 +446,40 @@ public class StatisticsHandlerTest assertEquals(1, _statsHandler.getExpires()); assertEquals(1, _statsHandler.getResponses2xx()); + assertTrue(_statsHandler.getRequestTimeTotal() >= (timeout + dispatchTime) * 3 / 4); + assertEquals(_statsHandler.getRequestTimeTotal(), _statsHandler.getRequestTimeMax()); + assertEquals(_statsHandler.getRequestTimeTotal(), _statsHandler.getRequestTimeMean(), 0.01); - assertTrue(_statsHandler.getRequestTimeTotal()>=30); - assertEquals(_statsHandler.getRequestTimeTotal(),_statsHandler.getRequestTimeMax()); - assertEquals(_statsHandler.getRequestTimeTotal(),_statsHandler.getRequestTimeMean(), 0.01); - - assertThat(_statsHandler.getDispatchedTimeTotal(),greaterThanOrEqualTo(10L)); - + assertThat(_statsHandler.getDispatchedTimeTotal(), greaterThanOrEqualTo(dispatchTime * 3 / 4)); } @Test public void testSuspendComplete() throws Exception { + final long dispatchTime = 10; final AtomicReference asyncHolder = new AtomicReference<>(); - final CyclicBarrier barrier[] = { new CyclicBarrier(2), new CyclicBarrier(2), new CyclicBarrier(2)}; + final CyclicBarrier barrier[] = {new CyclicBarrier(2), new CyclicBarrier(2), new CyclicBarrier(2)}; _statsHandler.setHandler(new AbstractHandler() { @Override public void handle(String path, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException { request.setHandled(true); - try { barrier[0].await(); - Thread.sleep(10); + + Thread.sleep(dispatchTime); + if (asyncHolder.get() == null) { - AsyncContext async=request.startAsync(); - async.setTimeout(1000); + AsyncContext async = request.startAsync(); asyncHolder.set(async); - asyncHolder.get().addListener(new AsyncListener() - { - - @Override - public void onTimeout(AsyncEvent event) throws IOException - { - } - - @Override - public void onStartAsync(AsyncEvent event) throws IOException - { - } - - @Override - public void onError(AsyncEvent event) throws IOException - { - } - - @Override - public void onComplete(AsyncEvent event) throws IOException - { - try { barrier[2].await(); } catch(Exception e) {} - } - }); } - } catch (Exception x) { - Thread.currentThread().interrupt(); - throw (IOException)new IOException().initCause(x); + throw new ServletException(x); } finally { @@ -528,11 +487,8 @@ public class StatisticsHandlerTest { barrier[1].await(); } - catch (Exception x) + catch (Exception ignored) { - x.printStackTrace(); - Thread.currentThread().interrupt(); - fail(); } } @@ -541,21 +497,18 @@ public class StatisticsHandlerTest _server.start(); String request = "GET / HTTP/1.1\r\n" + - "Host: localhost\r\n" + - "\r\n"; + "Host: localhost\r\n" + + "\r\n"; _connector.executeRequest(request); - barrier[0].await(); assertEquals(1, _statistics.getConnectionsOpen()); - assertEquals(1, _statsHandler.getRequests()); assertEquals(1, _statsHandler.getRequestsActive()); assertEquals(1, _statsHandler.getDispatched()); assertEquals(1, _statsHandler.getDispatchedActive()); - barrier[1].await(); assertTrue(_latchHandler.await()); assertNotNull(asyncHolder.get()); @@ -565,7 +518,37 @@ public class StatisticsHandlerTest assertEquals(1, _statsHandler.getDispatched()); assertEquals(0, _statsHandler.getDispatchedActive()); - Thread.sleep(10); + asyncHolder.get().addListener(new AsyncListener() + { + @Override + public void onTimeout(AsyncEvent event) throws IOException + { + } + + @Override + public void onStartAsync(AsyncEvent event) throws IOException + { + } + + @Override + public void onError(AsyncEvent event) throws IOException + { + } + + @Override + public void onComplete(AsyncEvent event) throws IOException + { + try + { + barrier[2].await(); + } + catch (Exception ignored) + { + } + } + }); + long requestTime = 20; + Thread.sleep(requestTime); asyncHolder.get().complete(); barrier[2].await(); @@ -579,17 +562,16 @@ public class StatisticsHandlerTest assertEquals(0, _statsHandler.getExpires()); assertEquals(1, _statsHandler.getResponses2xx()); - assertTrue(_statsHandler.getRequestTimeTotal()>=20); - assertEquals(_statsHandler.getRequestTimeTotal(),_statsHandler.getRequestTimeMax()); - assertEquals(_statsHandler.getRequestTimeTotal(),_statsHandler.getRequestTimeMean(), 0.01); + assertTrue(_statsHandler.getRequestTimeTotal() >= (dispatchTime + requestTime) * 3 / 4); + assertEquals(_statsHandler.getRequestTimeTotal(), _statsHandler.getRequestTimeMax()); + assertEquals(_statsHandler.getRequestTimeTotal(), _statsHandler.getRequestTimeMean(), 0.01); - assertTrue(_statsHandler.getDispatchedTimeTotal()>=10); - assertTrue(_statsHandler.getDispatchedTimeTotal()<_statsHandler.getRequestTimeTotal()); - assertEquals(_statsHandler.getDispatchedTimeTotal(),_statsHandler.getDispatchedTimeMax()); - assertEquals(_statsHandler.getDispatchedTimeTotal(),_statsHandler.getDispatchedTimeMean(), 0.01); + assertTrue(_statsHandler.getDispatchedTimeTotal() >= dispatchTime * 3 / 4); + assertTrue(_statsHandler.getDispatchedTimeTotal() < _statsHandler.getRequestTimeTotal()); + assertEquals(_statsHandler.getDispatchedTimeTotal(), _statsHandler.getDispatchedTimeMax()); + assertEquals(_statsHandler.getDispatchedTimeTotal(), _statsHandler.getDispatchedTimeMean(), 0.01); } - /** * This handler is external to the statistics handler and it is used to ensure that statistics handler's * handle() is fully executed before asserting its values in the tests, to avoid race conditions with the @@ -602,7 +584,7 @@ public class StatisticsHandlerTest @Override public void handle(String path, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException { - final CountDownLatch latch=_latch; + final CountDownLatch latch = _latch; try { super.handle(path, request, httpRequest, httpResponse); @@ -615,12 +597,12 @@ public class StatisticsHandlerTest private void reset() { - _latch=new CountDownLatch(1); + _latch = new CountDownLatch(1); } private void reset(int count) { - _latch=new CountDownLatch(count); + _latch = new CountDownLatch(count); } private boolean await() throws InterruptedException