From d341499c6b7f735676ad614ad9532bf5ee313a26 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 15 Jun 2016 16:05:55 +0100 Subject: [PATCH] =?UTF-8?q?Prevent=20Jetty=20tests=20from=20polluting=20UR?= =?UTF-8?q?L=E2=80=99s=20URLStreamHandlerFactory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The JVM only allows URL.setURLStreamHandlerFactory to be called once. This is problematic as the JSP support in embedded Tomcat and embedded Jetty both call this method. This commit uses reflection to null out URL’s factory field before and after the embedded Jetty tests have run. This ensures that they can run successfully if Tomcat has already installed its factory and that Tomcat-related tests can also run afterwards. See gh-5290 --- .../JettyEmbeddedServletContainerFactoryTests.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java index bd5ab6fa90c..3ac82b9e10b 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.context.embedded.jetty; import java.io.IOException; +import java.net.URL; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -37,6 +38,8 @@ import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.thread.ThreadPool; import org.eclipse.jetty.webapp.Configuration; import org.eclipse.jetty.webapp.WebAppContext; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import org.mockito.InOrder; @@ -46,6 +49,7 @@ import org.springframework.boot.context.embedded.Compression; import org.springframework.boot.context.embedded.Ssl; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.http.HttpHeaders; +import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyObject; @@ -64,6 +68,12 @@ import static org.mockito.Mockito.mock; public class JettyEmbeddedServletContainerFactoryTests extends AbstractEmbeddedServletContainerFactoryTests { + @BeforeClass + @AfterClass + public static void uninstallUrlStreamHandlerFactory() { + ReflectionTestUtils.setField(URL.class, "factory", null); + } + @Override protected JettyEmbeddedServletContainerFactory getFactory() { return new JettyEmbeddedServletContainerFactory(0); @@ -136,8 +146,8 @@ public class JettyEmbeddedServletContainerFactoryTests .getConnectionFactory(SslConnectionFactory.class); assertThat(connectionFactory.getSslContextFactory().getIncludeCipherSuites()) .containsExactly("ALPHA", "BRAVO", "CHARLIE"); - assertThat(connectionFactory.getSslContextFactory() - .getExcludeCipherSuites()).isEmpty(); + assertThat(connectionFactory.getSslContextFactory().getExcludeCipherSuites()) + .isEmpty(); } @Override