package io.dropwizard.server;
import io.dropwizard.Configuration;
import io.dropwizard.jersey.DropwizardResourceConfig;
import io.dropwizard.jersey.setup.JerseyContainerHolder;
import io.dropwizard.jersey.setup.JerseyEnvironment;
import io.dropwizard.jetty.MutableServletContextHandler;
import io.dropwizard.setup.Environment;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.thread.ThreadPool;
import org.junit.Before;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Tests that the {@link JerseyEnvironment#getUrlPattern()} is set by the following priority order:
* <ol>
* <li>YAML defined value</li>
* <li>{@link io.dropwizard.Application#run(Configuration, Environment)} defined value</li>
* <li>Default value defined by {@link DropwizardResourceConfig#urlPattern}</li>
* </ol>
*/
public class AbstractServerFactoryTest {
private final JerseyContainerHolder holder = mock(JerseyContainerHolder.class);
private final DropwizardResourceConfig config = new DropwizardResourceConfig();
private final JerseyEnvironment jerseyEnvironment = new JerseyEnvironment(holder, config);
private final Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS);
private final TestServerFactory serverFactory = new TestServerFactory();
private static final String DEFAULT_PATTERN = "/*";
private static final String RUN_SET_PATTERN = "/set/from/run/*";
private static final String YAML_SET_PATTERN = "/set/from/yaml/*";
@Before
public void before() {
when(environment.jersey()).thenReturn(jerseyEnvironment);
when(environment.getApplicationContext()).thenReturn(new MutableServletContextHandler());
}
@Test
public void usesYamlDefinedPattern() {
serverFactory.setJerseyRootPath(YAML_SET_PATTERN);
jerseyEnvironment.setUrlPattern(RUN_SET_PATTERN);
serverFactory.build(environment);
assertThat(jerseyEnvironment.getUrlPattern()).isEqualTo(YAML_SET_PATTERN);
}
@Test
public void usesRunDefinedPatternWhenNoYaml() {
jerseyEnvironment.setUrlPattern(RUN_SET_PATTERN);
serverFactory.build(environment);
assertThat(jerseyEnvironment.getUrlPattern()).isEqualTo(RUN_SET_PATTERN);
}
@Test
public void usesDefaultPatternWhenNoneSet() {
serverFactory.build(environment);
assertThat(jerseyEnvironment.getUrlPattern()).isEqualTo(DEFAULT_PATTERN);
}
/**
* Test implementation of {@link AbstractServerFactory} used to run {@link #createAppServlet}, which triggers the
* setting of {@link JerseyEnvironment#setUrlPattern(String)}.
*/
public static class TestServerFactory extends AbstractServerFactory {
@Override
public Server build(Environment environment) {
// mimics the current default + simple server factory build() methods
ThreadPool threadPool = createThreadPool(environment.metrics());
Server server = buildServer(environment.lifecycle(), threadPool);
createAppServlet(server,
environment.jersey(),
environment.getObjectMapper(),
environment.getValidator(),
environment.getApplicationContext(),
environment.getJerseyServletContainer(),
environment.metrics());
return server;
}
@Override
public void configure(Environment environment) {
// left blank intentionally
}
}
}