package io.dropwizard.jetty; import com.google.common.collect.ImmutableMap; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpChannel; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.servlet.ServletContextHandler; import org.junit.Test; import java.util.Arrays; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class RoutingHandlerTest { private final Connector connector1 = mock(Connector.class); private final Connector connector2 = mock(Connector.class); private final Handler handler1 = spy(new ContextHandler()); private final Handler handler2 = spy(new ContextHandler()); private final RoutingHandler handler = new RoutingHandler(ImmutableMap.of(connector1, handler1, connector2, handler2)); @Test public void startsAndStopsAllHandlers() throws Exception { handler1.setServer(mock(Server.class)); handler2.setServer(mock(Server.class)); handler.start(); try { assertThat(handler1.isStarted()) .isTrue(); assertThat(handler2.isStarted()) .isTrue(); } finally { handler.stop(); } assertThat(handler1.isStopped()) .isTrue(); assertThat(handler2.isStopped()) .isTrue(); } @Test @SuppressWarnings({ "rawtypes", "unchecked" }) public void routesRequestsToTheConnectorSpecificHandler() throws Exception { final HttpChannel channel = mock(HttpChannel.class); when(channel.getConnector()).thenReturn(connector1); final Request baseRequest = mock(Request.class); when(baseRequest.getHttpChannel()).thenReturn(channel); final HttpServletRequest request = mock(HttpServletRequest.class); final HttpServletResponse response = mock(HttpServletResponse.class); handler.handle("target", baseRequest, request, response); verify(handler1).handle("target", baseRequest, request, response); } @Test public void withSessionHandler() throws Exception { final ContextHandler handler1 = new ContextHandler(); final ServletContextHandler handler2 = new ServletContextHandler(); final SessionHandler childHandler1 = new SessionHandler(); handler2.setSessionHandler(childHandler1); final RoutingHandler handler = new RoutingHandler(ImmutableMap.of(connector1, handler1, connector2, handler2)); new Server().setHandler(handler); handler.start(); try { assertThat(getSessionHandlers(handler)).containsOnly(childHandler1); } finally { handler.stop(); } } @Test public void withoutSessionHandler() throws Exception { new Server().setHandler(handler); handler.start(); try { assertThat(getSessionHandlers(handler)).isEmpty(); } finally { handler.stop(); } } private Set<SessionHandler> getSessionHandlers(final RoutingHandler routingHandler) { return Arrays.stream(routingHandler.getServer().getChildHandlersByClass(ContextHandler.class)) .map(handler -> ((ContextHandler) handler).getChildHandlerByClass(SessionHandler.class)) .filter(Objects::nonNull).collect(Collectors.toSet()); } }