/* * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.boot.web.servlet.context; import java.net.URI; import java.nio.charset.Charset; import org.junit.After; import org.junit.Test; import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; import org.springframework.boot.web.server.WebServer; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Controller; import org.springframework.util.StreamUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import static org.assertj.core.api.Assertions.assertThat; /** * Integration tests for {@link ServletWebServerApplicationContext} and {@link WebServer}s * running Spring MVC. * * @author Phillip Webb * @author Ivan Sopov */ public class ServletWebServerMvcIntegrationTests { private AnnotationConfigServletWebServerApplicationContext context; @After public void closeContext() { try { this.context.close(); } catch (Exception ex) { // Ignore } } @Test public void tomcat() throws Exception { this.context = new AnnotationConfigServletWebServerApplicationContext( TomcatConfig.class); doTest(this.context, "/hello"); } @Test public void jetty() throws Exception { this.context = new AnnotationConfigServletWebServerApplicationContext( JettyConfig.class); doTest(this.context, "/hello"); } @Test public void undertow() throws Exception { this.context = new AnnotationConfigServletWebServerApplicationContext( UndertowConfig.class); doTest(this.context, "/hello"); } @Test public void advancedConfig() throws Exception { this.context = new AnnotationConfigServletWebServerApplicationContext( AdvancedConfig.class); doTest(this.context, "/example/spring/hello"); } private void doTest(AnnotationConfigServletWebServerApplicationContext context, String resourcePath) throws Exception { SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory(); ClientHttpRequest request = clientHttpRequestFactory.createRequest(new URI( "http://localhost:" + context.getWebServer().getPort() + resourcePath), HttpMethod.GET); ClientHttpResponse response = request.execute(); try { String actual = StreamUtils.copyToString(response.getBody(), Charset.forName("UTF-8")); assertThat(actual).isEqualTo("Hello World"); } finally { response.close(); } } // Simple main method for testing in a browser @SuppressWarnings("resource") public static void main(String[] args) { new AnnotationConfigServletWebServerApplicationContext( JettyServletWebServerFactory.class, Config.class); } @Configuration @Import(Config.class) public static class TomcatConfig { @Bean public ServletWebServerFactory webServerFactory() { return new TomcatServletWebServerFactory(0); } } @Configuration @Import(Config.class) public static class JettyConfig { @Bean public ServletWebServerFactory webServerFactory() { return new JettyServletWebServerFactory(0); } } @Configuration @Import(Config.class) public static class UndertowConfig { @Bean public ServletWebServerFactory webServerFactory() { return new UndertowServletWebServerFactory(0); } } @Configuration @EnableWebMvc public static class Config { @Bean public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); // Alternatively you can use ServletContextInitializer beans including // ServletRegistration and FilterRegistration. Read the // EmbeddedWebApplicationContext Javadoc for details. } @Bean public HelloWorldController helloWorldController() { return new HelloWorldController(); } } @Configuration @EnableWebMvc @PropertySource("classpath:/org/springframework/boot/web/servlet/context/conf.properties") public static class AdvancedConfig { private final Environment env; public AdvancedConfig(Environment env) { this.env = env; } @Bean public ServletWebServerFactory webServerFactory() { JettyServletWebServerFactory factory = new JettyServletWebServerFactory(0); factory.setContextPath(this.env.getProperty("context")); return factory; } @Bean public ServletRegistrationBean<DispatcherServlet> dispatcherRegistration() { ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>( dispatcherServlet()); registration.addUrlMappings("/spring/*"); return registration; } @Bean public DispatcherServlet dispatcherServlet() { DispatcherServlet dispatcherServlet = new DispatcherServlet(); // Can configure dispatcher servlet here as would usually do via init-params return dispatcherServlet; } @Bean public HelloWorldController helloWorldController() { return new HelloWorldController(); } } @Controller public static class HelloWorldController { @RequestMapping("/hello") @ResponseBody public String sayHello() { return "Hello World"; } } }