package io.dropwizard.jetty;
import com.google.common.collect.ImmutableList;
import com.google.common.io.Resources;
import io.dropwizard.configuration.YamlConfigurationFactory;
import io.dropwizard.jackson.Jackson;
import io.dropwizard.util.Duration;
import io.dropwizard.validation.BaseValidator;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlets.PushCacheFilter;
import org.junit.Test;
import javax.servlet.DispatcherType;
import java.io.File;
import java.util.EnumSet;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
public class ServerPushFilterFactoryTest {
@Test
public void testLoadConfiguration() throws Exception {
final ServerPushFilterFactory serverPush = new YamlConfigurationFactory<>(
ServerPushFilterFactory.class, BaseValidator.newValidator(),
Jackson.newObjectMapper(), "dw-server-push")
.build(new File(Resources.getResource("yaml/server-push.yml").toURI()));
assertThat(serverPush.isEnabled()).isTrue();
assertThat(serverPush.getAssociatePeriod()).isEqualTo(Duration.seconds(5));
assertThat(serverPush.getMaxAssociations()).isEqualTo(8);
assertThat(serverPush.getRefererHosts()).contains("dropwizard.io", "dropwizard.github.io");
assertThat(serverPush.getRefererPorts()).contains(8444, 8445);
}
@Test
public void testDefaultConfiguration() {
final ServerPushFilterFactory serverPush = new ServerPushFilterFactory();
assertThat(serverPush.isEnabled()).isFalse();
assertThat(serverPush.getAssociatePeriod()).isEqualTo(Duration.seconds(4));
assertThat(serverPush.getMaxAssociations()).isEqualTo(16);
assertThat(serverPush.getRefererHosts()).isNull();
assertThat(serverPush.getRefererPorts()).isNull();
}
@Test
public void testDontAddFilterByDefault() {
final ServerPushFilterFactory serverPush = new ServerPushFilterFactory();
ServletContextHandler servletContextHandler = mock(ServletContextHandler.class);
serverPush.addFilter(servletContextHandler);
verify(servletContextHandler, never())
.addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
}
@Test
public void testAddFilter() {
final ServerPushFilterFactory serverPush = new ServerPushFilterFactory();
serverPush.setRefererHosts(ImmutableList.of("dropwizard.io", "dropwizard.github.io"));
serverPush.setRefererPorts(ImmutableList.of(8444, 8445));
serverPush.setEnabled(true);
ServletContextHandler servletContextHandler = mock(ServletContextHandler.class);
serverPush.addFilter(servletContextHandler);
verify(servletContextHandler).setInitParameter("associatePeriod", "4000");
verify(servletContextHandler).setInitParameter("maxAssociations", "16");
verify(servletContextHandler).setInitParameter("hosts", "dropwizard.io,dropwizard.github.io");
verify(servletContextHandler).setInitParameter("ports", "8444,8445");
verify(servletContextHandler).addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
}
@Test
public void testRefererHostsAndPortsAreNotSet() {
final ServerPushFilterFactory serverPush = new ServerPushFilterFactory();
serverPush.setEnabled(true);
ServletContextHandler servletContextHandler = mock(ServletContextHandler.class);
serverPush.addFilter(servletContextHandler);
verify(servletContextHandler, never()).setInitParameter(eq("hosts"), anyString());
verify(servletContextHandler, never()).setInitParameter(eq("ports"), anyString());
verify(servletContextHandler).addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
}
}