From 6f32aa95a7d87641f4a4c84e0a6cec19fae46583 Mon Sep 17 00:00:00 2001 From: Daniel Lavoie Date: Fri, 22 Jul 2016 00:54:48 +0200 Subject: [PATCH 01/19] Migrate tests to Spring Boot Test 1.4 Fixes gh-1205 --- .../ArchaiusAutoConfigurationTests.java | 2 +- .../feign/EnableFeignClientsTests.java | 4 +- .../FeignClientOverrideDefaultsTests.java | 12 +- .../feign/FeignHttpClientUrlTests.java | 16 +- .../netflix/feign/SpringDecoderTests.java | 37 +++-- .../netflix/feign/beans/FeignClientTests.java | 13 +- .../encoding/FeignAcceptEncodingTests.java | 16 +- .../encoding/FeignContentEncodingTest.java | 16 +- .../ribbon/FeignRibbonClientPathTests.java | 15 +- .../ribbon/FeignRibbonClientRetryTests.java | 27 ++-- .../LoadBalancerFeignClientOverrideTests.java | 11 +- .../feign/support/SpringEncoderTests.java | 19 +-- .../netflix/feign/valid/FeignClientTests.java | 84 +++++----- .../feign/valid/FeignHttpClientTests.java | 7 +- .../scanning/FeignClientScanningTests.java | 23 +-- .../netflix/hystrix/HystrixOnlyTests.java | 19 +-- .../hystrix/HystrixStreamEndpointTests.java | 30 ++-- ...ricsClientHttpRequestInterceptorTests.java | 2 +- ...icsHandlerInterceptorIntegrationTests.java | 10 +- .../metrics/MetricsRestTemplateTests.java | 20 +-- .../metrics/atlas/AtlasExporterTests.java | 4 +- .../NoServoMetricsAutoConfigurationTests.java | 10 +- .../ServoMetricsAutoConfigurationTests.java | 8 +- .../metrics/servo/ServoMonitorCacheTests.java | 9 +- .../resttemplate/RestTemplateRetryTest.java | 13 +- ...bonClientPreprocessorIntegrationTests.java | 4 +- ...bbonAutoConfigurationIntegrationTests.java | 10 +- .../RibbonClientHttpRequestFactoryTests.java | 37 +++-- ...bonClientPreprocessorIntegrationTests.java | 10 +- ...PreprocessorOverridesIntegrationTests.java | 8 +- ...ClientPreprocessorOverridesRetryTests.java | 40 ++--- ...orPropertiesOverridesIntegrationTests.java | 24 +-- ...onClientsPreprocessorIntegrationTests.java | 18 +-- .../ribbon/SpringClientFactoryTests.java | 2 +- ...RibbonClientDefaultConfigurationTests.java | 6 +- .../rx/ObservableReturnValueHandlerTest.java | 19 +-- .../netflix/rx/ObservableSseEmitterTest.java | 143 +++++++++--------- .../rx/SingleReturnValueHandlerTest.java | 117 +++++++------- .../ContextPathZuulProxyApplicationTests.java | 12 +- .../zuul/FormZuulProxyApplicationTests.java | 18 +-- .../FormZuulServletProxyApplicationTests.java | 13 +- .../RetryableZuulProxyApplicationTests.java | 21 ++- .../ServletPathZuulProxyApplicationTests.java | 17 +-- .../SimpleZuulServerApplicationTests.java | 17 +-- .../filters/CustomHostRoutingFilterTests.java | 27 ++-- ...ernServiceRouteMapperIntegrationTests.java | 24 ++- .../route/SimpleHostRoutingFilterTests.java | 2 +- ...tpClientRibbonCommandIntegrationTests.java | 78 +++++----- .../OkHttpRibbonCommandIntegrationTests.java | 10 +- ...stClientRibbonCommandIntegrationTests.java | 38 ++--- .../route/support/ZuulProxyTestBase.java | 13 +- .../EurekaClientAutoConfigurationTests.java | 6 +- .../eureka/EurekaClientConfigBeanTests.java | 2 +- .../eureka/EurekaInstanceConfigBeanTests.java | 2 +- .../eureka/InstanceInfoFactoryTests.java | 2 +- ...ntConfigServiceAutoConfigurationTests.java | 2 +- .../healthcheck/EurekaHealthCheckTests.java | 57 ++++--- .../eureka/sample/ApplicationTests.java | 9 +- ...bonClientPreprocessorIntegrationTests.java | 4 +- ...lientPropertyOverrideIntegrationTests.java | 7 +- ...bonClientPreprocessorIntegrationTests.java | 10 +- .../server/ApplicationContextTests.java | 30 ++-- .../ApplicationDashboardDisabledTests.java | 15 +- .../server/ApplicationDashboardPathTests.java | 23 ++- .../server/ApplicationServletPathTests.java | 30 ++-- .../eureka/server/ApplicationTests.java | 47 +++--- .../HystrixDashboardContextTests.java | 17 +-- .../HystrixDashboardHomePageTests.java | 31 ++-- .../dashboard/HystrixDashboardTests.java | 33 ++-- .../hystrix/stream/HystrixStreamTests.java | 10 +- .../sidecar/SidecarApplicationTests.java | 22 +-- .../stream/HystrixStreamAggregatorTests.java | 16 +- .../TurbinePortApplicationListenerTests.java | 2 +- .../turbine/stream/TurbineStreamTests.java | 10 +- .../netflix/turbine/TurbineHttpTests.java | 10 +- 75 files changed, 746 insertions(+), 806 deletions(-) diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/archaius/ArchaiusAutoConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/archaius/ArchaiusAutoConfigurationTests.java index babb9e9e..d9f9b709 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/archaius/ArchaiusAutoConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/archaius/ArchaiusAutoConfigurationTests.java @@ -27,7 +27,7 @@ import com.netflix.config.ConfigurationManager; import com.netflix.config.DynamicPropertyFactory; import com.netflix.config.DynamicStringProperty; -import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.annotation.AnnotationConfigApplicationContext; diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/EnableFeignClientsTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/EnableFeignClientsTests.java index 449d66d8..09069962 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/EnableFeignClientsTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/EnableFeignClientsTests.java @@ -20,7 +20,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.feign.support.ResponseEntityDecoder; import org.springframework.cloud.netflix.feign.support.SpringEncoder; @@ -42,7 +42,7 @@ import feign.slf4j.Slf4jLogger; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = EnableFeignClientsTests.PlainConfiguration.class) +@SpringBootTest(classes = EnableFeignClientsTests.PlainConfiguration.class) @DirtiesContext public class EnableFeignClientsTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientOverrideDefaultsTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientOverrideDefaultsTests.java index d60587a7..92d82311 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientOverrideDefaultsTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientOverrideDefaultsTests.java @@ -16,11 +16,15 @@ package org.springframework.cloud.netflix.feign; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.feign.support.ResponseEntityDecoder; import org.springframework.cloud.netflix.feign.support.SpringEncoder; @@ -33,10 +37,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - import feign.Contract; import feign.Feign; import feign.Logger; @@ -56,7 +56,7 @@ import feign.slf4j.Slf4jLogger; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FeignClientOverrideDefaultsTests.TestConfiguration.class) +@SpringBootTest(classes = FeignClientOverrideDefaultsTests.TestConfiguration.class) @DirtiesContext public class FeignClientOverrideDefaultsTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java index b7a2e5b3..081b7e16 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java @@ -31,8 +31,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.annotation.DirtiesContext; @@ -55,8 +55,7 @@ import lombok.NoArgsConstructor; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FeignHttpClientUrlTests.TestConfig.class) -@WebIntegrationTest(value = { +@SpringBootTest(classes = FeignHttpClientUrlTests.TestConfig.class, webEnvironment = WebEnvironment.DEFINED_PORT, value = { "spring.application.name=feignclienturltest", "feign.hystrix.enabled=false", "feign.okhttp.enabled=false" }) @DirtiesContext @@ -98,12 +97,15 @@ public class FeignHttpClientUrlTests { public Targeter feignTargeter() { return new Targeter() { @Override - public T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignContext context, Target.HardCodedTarget target) { - Field field = ReflectionUtils.findField(Feign.Builder.class, "client"); + public T target(FeignClientFactoryBean factory, Feign.Builder feign, + FeignContext context, Target.HardCodedTarget target) { + Field field = ReflectionUtils.findField(Feign.Builder.class, + "client"); ReflectionUtils.makeAccessible(field); Client client = (Client) ReflectionUtils.getField(field, feign); if (target.name().equals("localappurl")) { - assertThat("client was wrong type", client, is(instanceOf(ApacheHttpClient.class))); + assertThat("client was wrong type", client, + is(instanceOf(ApacheHttpClient.class))); } return feign.target(target); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/SpringDecoderTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/SpringDecoderTests.java index e1c353d6..fee2550e 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/SpringDecoderTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/SpringDecoderTests.java @@ -16,43 +16,40 @@ package org.springframework.cloud.netflix.feign; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import java.util.ArrayList; import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; /** * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SpringDecoderTests.Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=springdecodertest", - "spring.jmx.enabled=true" }) +@SpringBootTest(classes = SpringDecoderTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=springdecodertest", "spring.jmx.enabled=true" }) @DirtiesContext public class SpringDecoderTests extends FeignClientFactoryBean { @@ -83,7 +80,8 @@ public class SpringDecoderTests extends FeignClientFactoryBean { assertEquals("wrong status code", HttpStatus.OK, response.getStatusCode()); Hello hello = response.getBody(); assertNotNull("hello was null", hello); - assertEquals("first hello didn't match", new Hello("hello world via response"), hello); + assertEquals("first hello didn't match", new Hello("hello world via response"), + hello); } @Test @@ -198,13 +196,14 @@ public class SpringDecoderTests extends FeignClientFactoryBean { @Override public ResponseEntity getNotFound() { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body((String)null); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body((String) null); } public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=springdecodertest", - "management.contextPath=/admin").run(args); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=springdecodertest", + "management.contextPath=/admin") + .run(args); } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/FeignClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/FeignClientTests.java index d3f85261..fc5182e2 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/FeignClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/FeignClientTests.java @@ -16,6 +16,9 @@ package org.springframework.cloud.netflix.feign.beans; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.util.Map; @@ -26,8 +29,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.context.ApplicationContext; @@ -38,9 +41,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -49,8 +49,7 @@ import lombok.NoArgsConstructor; * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FeignClientTests.Application.class) -@WebIntegrationTest(randomPort = true, value = { +@SpringBootTest(classes = FeignClientTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=feignclienttest", "logging.level.org.springframework.cloud.netflix.feign.valid=DEBUG", "feign.httpclient.enabled=false", "feign.okhttp.enabled=false" }) diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/encoding/FeignAcceptEncodingTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/encoding/FeignAcceptEncodingTests.java index a146cd57..a0620fc8 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/encoding/FeignAcceptEncodingTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/encoding/FeignAcceptEncodingTests.java @@ -16,6 +16,9 @@ package org.springframework.cloud.netflix.feign.encoding; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import java.util.Collections; import java.util.List; @@ -24,8 +27,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.encoding.app.client.InvoiceClient; import org.springframework.cloud.netflix.feign.encoding.app.domain.Invoice; @@ -35,23 +38,18 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import com.netflix.loadbalancer.BaseLoadBalancer; import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.Server; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - /** * Tests the response compression. * * @author Jakub Narloch */ -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "feign.compression.response.enabled=true" }) -@SpringApplicationConfiguration(classes = { FeignAcceptEncodingTests.Application.class }) +@SpringBootTest(classes = FeignAcceptEncodingTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "feign.compression.response.enabled=true" }) @RunWith(SpringJUnit4ClassRunner.class) public class FeignAcceptEncodingTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/encoding/FeignContentEncodingTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/encoding/FeignContentEncodingTest.java index f38629f8..2a94815d 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/encoding/FeignContentEncodingTest.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/encoding/FeignContentEncodingTest.java @@ -16,6 +16,9 @@ package org.springframework.cloud.netflix.feign.encoding; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import java.util.Collections; import java.util.List; @@ -24,8 +27,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.encoding.app.client.InvoiceClient; import org.springframework.cloud.netflix.feign.encoding.app.domain.Invoice; @@ -35,25 +38,20 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import com.netflix.loadbalancer.BaseLoadBalancer; import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.Server; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - /** * Tests the response compression. * * @author Jakub Narloch */ -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "feign.compression.request.enabled=true", +@SpringBootTest(classes = FeignContentEncodingTest.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "feign.compression.request.enabled=true", "hystrix.command.default.execution.isolation.strategy=SEMAPHORE", "ribbon.OkToRetryOnAllOperations=false" }) -@SpringApplicationConfiguration(classes = { FeignContentEncodingTest.Application.class }) @RunWith(SpringJUnit4ClassRunner.class) public class FeignContentEncodingTest { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientPathTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientPathTests.java index 1a8d45cc..5bd13d0b 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientPathTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientPathTests.java @@ -16,14 +16,17 @@ package org.springframework.cloud.netflix.feign.ribbon; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; @@ -43,17 +46,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - /** * @author Venil Noronha */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FeignRibbonClientPathTests.Application.class) -@WebIntegrationTest( - randomPort = true, - value = { +@SpringBootTest(classes = FeignRibbonClientPathTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT,value = { "spring.application.name=feignribbonclientpathtest", "feign.okhttp.enabled=false", "feign.httpclient.enabled=false", diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientRetryTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientRetryTests.java index 2404b25a..5b066bc9 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientRetryTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientRetryTests.java @@ -16,6 +16,10 @@ package org.springframework.cloud.netflix.feign.ribbon; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.util.concurrent.atomic.AtomicInteger; @@ -26,8 +30,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; @@ -47,19 +51,14 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - /** * Tests the Feign Retryer, not ribbon retry. * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FeignRibbonClientRetryTests.Application.class) -@WebIntegrationTest(randomPort = true, value = { "spring.application.name=feignclientretrytest", - "feign.okhttp.enabled=false", "feign.httpclient.enabled=false", - "feign.hystrix.enabled=false", }) +@SpringBootTest(classes = FeignRibbonClientRetryTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=feignclientretrytest", "feign.okhttp.enabled=false", + "feign.httpclient.enabled=false", "feign.hystrix.enabled=false", }) @DirtiesContext public class FeignRibbonClientRetryTests { @@ -98,10 +97,10 @@ public class FeignRibbonClientRetryTests { } public static void main(String[] args) throws InterruptedException { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=feignclientretrytest", - "management.contextPath=/admin" - ).run(args); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=feignclientretrytest", + "management.contextPath=/admin") + .run(args); } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/LoadBalancerFeignClientOverrideTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/LoadBalancerFeignClientOverrideTests.java index df12e615..0efae7be 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/LoadBalancerFeignClientOverrideTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/ribbon/LoadBalancerFeignClientOverrideTests.java @@ -16,12 +16,14 @@ package org.springframework.cloud.netflix.feign.ribbon; +import static org.junit.Assert.assertEquals; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.feign.FeignContext; @@ -34,16 +36,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.IClientConfig; -import static org.junit.Assert.assertEquals; - import feign.Request; /** * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = LoadBalancerFeignClientOverrideTests.TestConfiguration.class) -@WebIntegrationTest(randomPort = true, value = { +@SpringBootTest(classes = LoadBalancerFeignClientOverrideTests.TestConfiguration.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=loadBalancerFeignClientTests", "feign.httpclient.enabled=false", "feign.okhttp.enabled=false" }) @DirtiesContext diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringEncoderTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringEncoderTests.java index cfa04cac..0bf281c8 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringEncoderTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringEncoderTests.java @@ -1,5 +1,9 @@ package org.springframework.cloud.netflix.feign.support; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + import java.io.IOException; import java.lang.reflect.Type; import java.util.Collection; @@ -10,8 +14,8 @@ import org.mockito.ArgumentMatcher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.FeignContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -24,13 +28,8 @@ import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RestController; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; - import feign.RequestTemplate; import lombok.Data; @@ -38,10 +37,8 @@ import lombok.Data; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SpringEncoderTests.Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=springencodertest", - "spring.jmx.enabled=true" }) +@SpringBootTest(classes = SpringEncoderTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=springencodertest", "spring.jmx.enabled=true" }) @DirtiesContext public class SpringEncoderTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignClientTests.java index f9a44600..49f3b831 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignClientTests.java @@ -16,6 +16,14 @@ package org.springframework.cloud.netflix.feign.valid; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.text.ParseException; @@ -33,8 +41,8 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.feign.FeignFormatterRegistrar; @@ -72,24 +80,15 @@ import lombok.NoArgsConstructor; import rx.Observable; import rx.Single; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - /** * @author Spencer Gibb * @author Jakub Narloch */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FeignClientTests.Application.class) -@WebIntegrationTest(randomPort = true, value = { +@SpringBootTest(classes = FeignClientTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=feignclienttest", "logging.level.org.springframework.cloud.netflix.feign.valid=DEBUG", - "feign.httpclient.enabled=false", "feign.okhttp.enabled=false"}) + "feign.httpclient.enabled=false", "feign.okhttp.enabled=false" }) @DirtiesContext public class FeignClientTests { @@ -167,18 +166,15 @@ public class FeignClientTests { HystrixCommand> getHellosHystrix(); @RequestMapping(method = RequestMethod.GET, path = "/noContent") - ResponseEntity noContent(); + ResponseEntity noContent(); @RequestMapping(method = RequestMethod.HEAD, path = "/head") - ResponseEntity head(); + ResponseEntity head(); @RequestMapping(method = RequestMethod.GET, path = "/hello") HttpEntity getHelloEntity(); - @RequestMapping(method = RequestMethod.POST, - consumes = "application/vnd.io.spring.cloud.test.v1+json", - produces = "application/vnd.io.spring.cloud.test.v1+json", - path = "/complex") + @RequestMapping(method = RequestMethod.POST, consumes = "application/vnd.io.spring.cloud.test.v1+json", produces = "application/vnd.io.spring.cloud.test.v1+json", path = "/complex") String moreComplexContentType(String body); @RequestMapping(method = RequestMethod.GET, path = "/tostring") @@ -271,14 +267,14 @@ public class FeignClientTests { @Configuration @EnableAutoConfiguration @RestController - @EnableFeignClients(clients = {TestClientServiceId.class, TestClient.class, DecodingTestClient.class, HystrixClient.class}, - defaultConfiguration = TestDefaultFeignConfig.class) + @EnableFeignClients(clients = { TestClientServiceId.class, TestClient.class, + DecodingTestClient.class, + HystrixClient.class }, defaultConfiguration = TestDefaultFeignConfig.class) @RibbonClients({ @RibbonClient(name = "localapp", configuration = LocalRibbonClientConfiguration.class), @RibbonClient(name = "localapp1", configuration = LocalRibbonClientConfiguration.class), @RibbonClient(name = "localapp2", configuration = LocalRibbonClientConfiguration.class), - @RibbonClient(name = "localapp3", configuration = LocalRibbonClientConfiguration.class), - }) + @RibbonClient(name = "localapp3", configuration = LocalRibbonClientConfiguration.class), }) protected static class Application { // needs to be in parent context to test multiple HystrixClient beans @@ -344,7 +340,8 @@ public class FeignClientTests { } @RequestMapping(method = RequestMethod.GET, path = "/helloheadersplaceholders") - public String getHelloHeadersPlaceholders(@RequestHeader("myPlaceholderHeader") String myPlaceholderHeader) { + public String getHelloHeadersPlaceholders( + @RequestHeader("myPlaceholderHeader") String myPlaceholderHeader) { return myPlaceholderHeader; } @@ -354,12 +351,12 @@ public class FeignClientTests { } @RequestMapping(method = RequestMethod.GET, path = "/noContent") - ResponseEntity noContent() { + ResponseEntity noContent() { return ResponseEntity.noContent().build(); } @RequestMapping(method = RequestMethod.HEAD, path = "/head") - ResponseEntity head() { + ResponseEntity head() { return ResponseEntity.ok().build(); } @@ -369,14 +366,11 @@ public class FeignClientTests { } @RequestMapping(method = RequestMethod.GET, path = "/notFound") - ResponseEntity notFound() { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body((String)null); + ResponseEntity notFound() { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body((String) null); } - @RequestMapping(method = RequestMethod.POST, - consumes = "application/vnd.io.spring.cloud.test.v1+json", - produces = "application/vnd.io.spring.cloud.test.v1+json", - path = "/complex") + @RequestMapping(method = RequestMethod.POST, consumes = "application/vnd.io.spring.cloud.test.v1+json", produces = "application/vnd.io.spring.cloud.test.v1+json", path = "/complex") String complex(String body) { return "{\"value\":\"OK\"}"; } @@ -392,9 +386,10 @@ public class FeignClientTests { } public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=feignclienttest", - "management.contextPath=/admin").run(args); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=feignclienttest", + "management.contextPath=/admin") + .run(args); } } @@ -480,7 +475,9 @@ public class FeignClientTests { public void testHystrixCommand() { HystrixCommand> command = this.testClient.getHellosHystrix(); assertNotNull("command was null", command); - assertEquals("Hystrix command group name should match the name of the feign client", "localapp", command.getCommandGroup().name()); + assertEquals( + "Hystrix command group name should match the name of the feign client", + "localapp", command.getCommandGroup().name()); List hellos = command.execute(); assertNotNull("hellos was null", hellos); assertEquals("hellos didn't match", hellos, getHelloList()); @@ -497,14 +494,15 @@ public class FeignClientTests { @Test public void testNoContentResponse() { - ResponseEntity response = testClient.noContent(); + ResponseEntity response = testClient.noContent(); assertNotNull("response was null", response); - assertEquals("status code was wrong", HttpStatus.NO_CONTENT, response.getStatusCode()); + assertEquals("status code was wrong", HttpStatus.NO_CONTENT, + response.getStatusCode()); } @Test public void testHeadResponse() { - ResponseEntity response = testClient.head(); + ResponseEntity response = testClient.head(); assertNotNull("response was null", response); assertEquals("status code was wrong", HttpStatus.OK, response.getStatusCode()); } @@ -522,14 +520,16 @@ public class FeignClientTests { public void testMoreComplexHeader() { String response = testClient.moreComplexContentType("{\"value\":\"OK\"}"); assertNotNull("response was null", response); - assertEquals("didn't respond with {\"value\":\"OK\"}", "{\"value\":\"OK\"}", response); + assertEquals("didn't respond with {\"value\":\"OK\"}", "{\"value\":\"OK\"}", + response); } @Test public void testDecodeNotFound() { - ResponseEntity response = decodingTestClient.notFound(); + ResponseEntity response = decodingTestClient.notFound(); assertNotNull("response was null", response); - assertEquals("status code was wrong", HttpStatus.NOT_FOUND, response.getStatusCode()); + assertEquals("status code was wrong", HttpStatus.NOT_FOUND, + response.getStatusCode()); assertNull("response body was not null", response.getBody()); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignHttpClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignHttpClientTests.java index 0bc72850..03758b2f 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignHttpClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignHttpClientTests.java @@ -29,8 +29,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient; @@ -58,8 +58,7 @@ import lombok.NoArgsConstructor; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FeignHttpClientTests.Application.class) -@WebIntegrationTest(randomPort = true, value = { +@SpringBootTest(classes = FeignHttpClientTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=feignclienttest", "feign.hystrix.enabled=false", "feign.okhttp.enabled=false" }) @DirtiesContext diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/scanning/FeignClientScanningTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/scanning/FeignClientScanningTests.java index 945f0e0a..91c2316c 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/scanning/FeignClientScanningTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/scanning/FeignClientScanningTests.java @@ -25,8 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; @@ -48,9 +48,8 @@ import feign.Client; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FeignClientScanningTests.Application.class) -@WebIntegrationTest(randomPort = true, value = { "spring.application.name=feignclienttest", - "feign.httpclient.enabled=false"}) +@SpringBootTest(classes = FeignClientScanningTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=feignclienttest", "feign.httpclient.enabled=false" }) @DirtiesContext public class FeignClientScanningTests { @@ -62,8 +61,9 @@ public class FeignClientScanningTests { @Autowired private TestClientByKey testClientByKey; - + @Autowired + @SuppressWarnings("unused") private Client feignClient; @FeignClient("localapp") @@ -77,7 +77,7 @@ public class FeignClientScanningTests { @RequestMapping(method = RequestMethod.GET, value = "/hello") String getHello(); } - + @Configuration @EnableAutoConfiguration @RestController @@ -90,9 +90,10 @@ public class FeignClientScanningTests { } public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=feignclienttest", - "management.contextPath=/admin").run(args); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=feignclienttest", + "management.contextPath=/admin") + .run(args); } } @@ -109,7 +110,7 @@ public class FeignClientScanningTests { assertNotNull("hello was null", hello); assertEquals("first hello didn't match", "hello world 1", hello); } - + // Load balancer with fixed server list for "local" pointing to localhost @Configuration public static class LocalRibbonClientConfiguration { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixOnlyTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixOnlyTests.java index 7e21f97b..1e3478d5 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixOnlyTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixOnlyTests.java @@ -24,15 +24,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -46,9 +45,7 @@ import static org.junit.Assert.assertTrue; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = HystrixOnlyApplication.class) -@WebAppConfiguration -@IntegrationTest({ "server.port: 0" }) +@SpringBootTest(classes = HystrixOnlyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) @DirtiesContext public class HystrixOnlyTests { @@ -57,15 +54,15 @@ public class HystrixOnlyTests { @Test public void testNormalExecution() { - String s = new TestRestTemplate().getForObject("http://localhost:" + this.port - + "/", String.class); + String s = new TestRestTemplate() + .getForObject("http://localhost:" + this.port + "/", String.class); assertEquals("incorrect response", "Hello world", s); } @Test public void testFailureFallback() { - String s = new TestRestTemplate().getForObject("http://localhost:" + this.port - + "/fail", String.class); + String s = new TestRestTemplate() + .getForObject("http://localhost:" + this.port + "/fail", String.class); assertEquals("incorrect fallback", "Fallback Hello world", s); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixStreamEndpointTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixStreamEndpointTests.java index 7a5f903f..d51daa5c 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixStreamEndpointTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixStreamEndpointTests.java @@ -16,15 +16,20 @@ package org.springframework.cloud.netflix.hystrix; -import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.InputStream; +import java.net.URL; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,23 +37,18 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.io.InputStream; -import java.net.URL; - -import static org.junit.Assert.*; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; /** * @author Dave Syer * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = HystrixStreamEndpointTests.Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=hystrixstreamtest" }) +@SpringBootTest(classes = HystrixStreamEndpointTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=hystrixstreamtest" }) @DirtiesContext public class HystrixStreamEndpointTests { @@ -64,8 +64,9 @@ public class HystrixStreamEndpointTests { @Test public void hystrixStreamWorks() throws Exception { String url = "http://localhost:" + port; - //you have to hit a Hystrix circuit breaker before the stream sends anything - ResponseEntity response = new TestRestTemplate().getForEntity(url, String.class); + // you have to hit a Hystrix circuit breaker before the stream sends anything + ResponseEntity response = new TestRestTemplate().getForEntity(url, + String.class); assertEquals("bad response code", HttpStatus.OK, response.getStatusCode()); URL hystrixUrl = new URL(url + "/admin/hystrix.stream"); @@ -103,4 +104,3 @@ public class HystrixStreamEndpointTests { } } } - diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptorTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptorTests.java index 9bfdc883..816b1cac 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptorTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptorTests.java @@ -18,9 +18,9 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.aop.AopAutoConfiguration; -import org.springframework.boot.autoconfigure.test.ImportAutoConfiguration; import org.springframework.cloud.netflix.metrics.servo.ServoMetricsAutoConfiguration; import org.springframework.cloud.netflix.metrics.servo.ServoMonitorCache; import org.springframework.context.annotation.Bean; diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsHandlerInterceptorIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsHandlerInterceptorIntegrationTests.java index 0ece08d3..dd7cf2c0 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsHandlerInterceptorIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsHandlerInterceptorIntegrationTests.java @@ -13,6 +13,10 @@ package org.springframework.cloud.netflix.metrics; +import static org.junit.Assert.assertFalse; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import javax.servlet.http.HttpServletRequest; import org.junit.Assert; @@ -20,8 +24,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.autoconfigure.test.ImportAutoConfiguration; import org.springframework.cloud.netflix.metrics.servo.ServoMetricsAutoConfiguration; import org.springframework.cloud.netflix.metrics.servo.ServoMonitorCache; import org.springframework.context.annotation.Bean; @@ -49,10 +53,6 @@ import com.netflix.servo.MonitorRegistry; import com.netflix.servo.monitor.BasicTimer; import com.netflix.servo.monitor.MonitorConfig; -import static org.junit.Assert.assertFalse; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - /** * @author Jon Schneider */ diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsRestTemplateTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsRestTemplateTests.java index 135ba3bb..d9ff97f4 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsRestTemplateTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsRestTemplateTests.java @@ -16,12 +16,17 @@ package org.springframework.cloud.netflix.metrics; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactory; import org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactoryTests; import org.springframework.http.client.ClientHttpRequestFactory; @@ -31,18 +36,13 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.util.ReflectionTestUtils; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - /** * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = MetricsRestTemplateTests.App.class) -@WebIntegrationTest(value = { "spring.application.name=ribbonclienttest", - "spring.jmx.enabled=true", "ribbon.http.client.enabled=true" }, randomPort = true) +@SpringBootTest(classes = MetricsRestTemplateTests.App.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=ribbonclienttest", "spring.jmx.enabled=true", + "ribbon.http.client.enabled=true" }) @DirtiesContext public class MetricsRestTemplateTests extends RibbonClientHttpRequestFactoryTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/atlas/AtlasExporterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/atlas/AtlasExporterTests.java index a1e80c6c..644ebcb1 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/atlas/AtlasExporterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/atlas/AtlasExporterTests.java @@ -20,7 +20,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @@ -37,7 +37,7 @@ import com.netflix.servo.monitor.DynamicCounter; /** * @author Jon Schneider */ -@SpringApplicationConfiguration(AtlasExporterConfiguration.class) +@SpringBootTest(classes = AtlasExporterConfiguration.class) @RunWith(SpringJUnit4ClassRunner.class) public class AtlasExporterTests { @Autowired diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/NoServoMetricsAutoConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/NoServoMetricsAutoConfigurationTests.java index fc4a1498..c7ecb155 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/NoServoMetricsAutoConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/NoServoMetricsAutoConfigurationTests.java @@ -16,24 +16,24 @@ package org.springframework.cloud.netflix.metrics.servo; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.autoconfigure.ExportMetricReader; import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - /** * @author Dave Syer */ +@SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration() public class NoServoMetricsAutoConfigurationTests { @Autowired(required = false) diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/ServoMetricsAutoConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/ServoMetricsAutoConfigurationTests.java index 1010e8b0..21fa6b89 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/ServoMetricsAutoConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/ServoMetricsAutoConfigurationTests.java @@ -16,23 +16,23 @@ package org.springframework.cloud.netflix.metrics.servo; +import static org.junit.Assert.assertNotNull; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.autoconfigure.ExportMetricReader; import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.junit.Assert.assertNotNull; - /** * @author Dave Syer */ +@SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration() public class ServoMetricsAutoConfigurationTests { @Autowired(required = false) diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/ServoMonitorCacheTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/ServoMonitorCacheTests.java index a7bddf45..57faade8 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/ServoMonitorCacheTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/servo/ServoMonitorCacheTests.java @@ -1,18 +1,19 @@ package org.springframework.cloud.netflix.metrics.servo; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.springframework.boot.test.OutputCapture; +import org.springframework.boot.test.rule.OutputCapture; import com.netflix.servo.MonitorRegistry; import com.netflix.servo.monitor.MonitorConfig; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - /** * @author Spencer Gibb */ diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/resttemplate/RestTemplateRetryTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/resttemplate/RestTemplateRetryTest.java index 676cc8a4..8166bfb2 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/resttemplate/RestTemplateRetryTest.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/resttemplate/RestTemplateRetryTest.java @@ -1,5 +1,8 @@ package org.springframework.cloud.netflix.resttemplate; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.net.UnknownHostException; import java.util.Arrays; import java.util.concurrent.atomic.AtomicInteger; @@ -12,8 +15,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.Bean; @@ -39,12 +42,8 @@ import com.netflix.loadbalancer.ServerList; import com.netflix.loadbalancer.ServerStats; import com.netflix.niws.client.http.HttpClientLoadBalancerErrorHandler; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = RestTemplateRetryTest.Application.class) -@WebIntegrationTest(randomPort = true, value = { +@SpringBootTest(classes = RestTemplateRetryTest.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=resttemplatetest", "logging.level.org.springframework.cloud.netflix.resttemplate=DEBUG", "badClients.ribbon.MaxAutoRetries=0", diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/PlainRibbonClientPreprocessorIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/PlainRibbonClientPreprocessorIntegrationTests.java index 21b020d5..9a9ef98b 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/PlainRibbonClientPreprocessorIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/PlainRibbonClientPreprocessorIntegrationTests.java @@ -20,7 +20,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.ribbon.PlainRibbonClientPreprocessorIntegrationTests.TestConfiguration; import org.springframework.context.annotation.Configuration; @@ -36,7 +36,7 @@ import com.netflix.loadbalancer.ZoneAwareLoadBalancer; * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = TestConfiguration.class) +@SpringBootTest(classes = TestConfiguration.class) @DirtiesContext public class PlainRibbonClientPreprocessorIntegrationTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfigurationIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfigurationIntegrationTests.java index 3153e79b..1bd2422a 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfigurationIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfigurationIntegrationTests.java @@ -16,12 +16,13 @@ package org.springframework.cloud.netflix.ribbon; +import static org.junit.Assert.assertEquals; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonAutoConfigurationIntegrationTests.TestConfiguration; import org.springframework.context.annotation.Configuration; @@ -32,15 +33,12 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.IClientConfig; -import static org.junit.Assert.assertEquals; - /** * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = TestConfiguration.class) +@SpringBootTest(classes = TestConfiguration.class, value = {"ribbon.ConnectTimeout=25000"}) @DirtiesContext -@IntegrationTest("ribbon.ConnectTimeout=25000") public class RibbonAutoConfigurationIntegrationTests { @Autowired diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientHttpRequestFactoryTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientHttpRequestFactoryTests.java index 2090aeaa..bbcbb2f8 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientHttpRequestFactoryTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientHttpRequestFactoryTests.java @@ -16,6 +16,9 @@ package org.springframework.cloud.netflix.ribbon; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.net.URI; import org.junit.Rule; @@ -25,8 +28,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -51,17 +54,13 @@ import com.netflix.loadbalancer.ServerList; import lombok.SneakyThrows; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - /** * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = RibbonClientHttpRequestFactoryTests.App.class) -@WebIntegrationTest(value = { "spring.application.name=ribbonclienttest", - "spring.jmx.enabled=true", "spring.cloud.netflix.metrics.enabled=false", - "ribbon.http.client.enabled=true" }, randomPort = true) +@SpringBootTest(classes = RibbonClientHttpRequestFactoryTests.App.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=ribbonclienttest", "spring.jmx.enabled=true", + "spring.cloud.netflix.metrics.enabled=false", "ribbon.http.client.enabled=true" }) @DirtiesContext public class RibbonClientHttpRequestFactoryTests { @@ -81,16 +80,16 @@ public class RibbonClientHttpRequestFactoryTests { @Test public void vanillaRequestWorks() { - ResponseEntity response = this.restTemplate.getForEntity( - "http://simple/", String.class); + ResponseEntity response = this.restTemplate.getForEntity("http://simple/", + String.class); assertEquals("wrong response code", HttpStatus.OK, response.getStatusCode()); assertEquals("wrong response body", "hello", response.getBody()); } @Test public void requestWithPathParamWorks() { - ResponseEntity response = this.restTemplate.getForEntity( - "http://simple/path/{param}", String.class, "world"); + ResponseEntity response = this.restTemplate + .getForEntity("http://simple/path/{param}", String.class, "world"); assertEquals("wrong response code", HttpStatus.OK, response.getStatusCode()); assertEquals("wrong response body", "hello world", response.getBody()); } @@ -114,16 +113,16 @@ public class RibbonClientHttpRequestFactoryTests { @Test public void requestWithPostWorks() { - ResponseEntity response = this.restTemplate.postForEntity( - "http://simple/post", "world", String.class); + ResponseEntity response = this.restTemplate + .postForEntity("http://simple/post", "world", String.class); assertEquals("wrong response code", HttpStatus.OK, response.getStatusCode()); assertEquals("wrong response body", "hello world", response.getBody()); } @Test public void requestWithEmptyPostWorks() { - ResponseEntity response = this.restTemplate.postForEntity( - "http://simple/emptypost", "", String.class); + ResponseEntity response = this.restTemplate + .postForEntity("http://simple/emptypost", "", String.class); assertEquals("wrong response code", HttpStatus.OK, response.getStatusCode()); assertEquals("wrong response body", "hello empty", response.getBody()); } @@ -133,8 +132,8 @@ public class RibbonClientHttpRequestFactoryTests { public void requestWithHeaderWorks() { RequestEntity entity = RequestEntity.get(new URI("http://simple/header")) .header("X-Param", "world").build(); - ResponseEntity response = this.restTemplate - .exchange(entity, String.class); + ResponseEntity response = this.restTemplate.exchange(entity, + String.class); assertEquals("wrong response code", HttpStatus.OK, response.getStatusCode()); assertEquals("wrong response body", "hello world", response.getBody()); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorIntegrationTests.java index 3fa09fd5..f61b1f3c 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorIntegrationTests.java @@ -20,7 +20,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonClientPreprocessorIntegrationTests.PlainConfiguration; import org.springframework.context.annotation.Configuration; @@ -28,13 +28,17 @@ import org.springframework.context.annotation.Import; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.netflix.loadbalancer.*; +import com.netflix.loadbalancer.ConfigurationBasedServerList; +import com.netflix.loadbalancer.NoOpPing; +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ZoneAvoidanceRule; +import com.netflix.loadbalancer.ZoneAwareLoadBalancer; /** * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = PlainConfiguration.class) +@SpringBootTest(classes = PlainConfiguration.class) @DirtiesContext public class RibbonClientPreprocessorIntegrationTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesIntegrationTests.java index 5f7cdc76..00d58639 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesIntegrationTests.java @@ -16,11 +16,13 @@ package org.springframework.cloud.netflix.ribbon; +import static org.junit.Assert.assertEquals; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.context.annotation.Bean; @@ -42,13 +44,11 @@ import com.netflix.loadbalancer.ServerList; import com.netflix.loadbalancer.ServerListFilter; import com.netflix.loadbalancer.ZoneAwareLoadBalancer; -import static org.junit.Assert.assertEquals; - /** * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = RibbonClientPreprocessorOverridesIntegrationTests.TestConfiguration.class) +@SpringBootTest(classes = RibbonClientPreprocessorOverridesIntegrationTests.TestConfiguration.class) @DirtiesContext public class RibbonClientPreprocessorOverridesIntegrationTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesRetryTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesRetryTests.java index ecabe95d..a71dd28e 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesRetryTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesRetryTests.java @@ -21,20 +21,18 @@ import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.util.Assert; @@ -46,8 +44,8 @@ import com.netflix.client.config.IClientConfig; * @author Tyler Van Gorder */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = RibbonClientPreprocessorOverridesRetryTests.TestConfiguration.class) -@TestPropertySource(properties = { "customRetry.ribbon.MaxAutoRetries=0", +@SpringBootTest(classes = RibbonClientPreprocessorOverridesRetryTests.TestConfiguration.class, value = { + "customRetry.ribbon.MaxAutoRetries=0", "customRetry.ribbon.MaxAutoRetriesNextServer=1", "customRetry.ribbon.OkToRetryOnAllOperations=true" }) @DirtiesContext @@ -64,14 +62,14 @@ public class RibbonClientPreprocessorOverridesRetryTests { context.getRetryHandler()); Assert.isTrue(context.getRetryHandler().getMaxRetriesOnSameServer() == 0); Assert.isTrue(context.getRetryHandler().getMaxRetriesOnNextServer() == 1); - Assert.isTrue(context.getRetryHandler().isCircuitTrippingException( - new UnknownHostException("Unknown Host"))); + Assert.isTrue(context.getRetryHandler() + .isCircuitTrippingException(new UnknownHostException("Unknown Host"))); } @Configuration @RibbonClient(name = "customRetry", configuration = RetryRibbonConfiguration.class) - @Import({ PropertyPlaceholderAutoConfiguration.class, - ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class }) + @Import({ PropertyPlaceholderAutoConfiguration.class, ArchaiusAutoConfiguration.class, + RibbonAutoConfiguration.class }) protected static class TestConfiguration { } @@ -87,18 +85,22 @@ class RetryRibbonConfiguration { class CustomRetryHandler extends DefaultLoadBalancerRetryHandler { @SuppressWarnings("unchecked") - private List> retriable = new ArrayList(){{ - add(UnknownHostException.class); - add(ConnectException.class); - add(SocketTimeoutException.class); - }}; + private List> retriable = new ArrayList() { + { + add(UnknownHostException.class); + add(ConnectException.class); + add(SocketTimeoutException.class); + } + }; @SuppressWarnings("unchecked") - private List> circuitRelated = new ArrayList(){{ - add(UnknownHostException.class); - add(SocketException.class); - add(SocketTimeoutException.class); - }}; + private List> circuitRelated = new ArrayList() { + { + add(UnknownHostException.class); + add(SocketException.class); + add(SocketTimeoutException.class); + } + }; CustomRetryHandler(IClientConfig config) { super(config); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java index afc24041..ffb9af59 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java @@ -16,11 +16,16 @@ package org.springframework.cloud.netflix.ribbon; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.junit.Assume.assumeThat; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.ribbon.test.TestLoadBalancer; @@ -39,16 +44,11 @@ import com.netflix.loadbalancer.ServerListSubsetFilter; import com.netflix.loadbalancer.ZoneAvoidanceRule; import com.netflix.loadbalancer.ZoneAwareLoadBalancer; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -import static org.junit.Assume.assumeThat; - /** * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(RibbonClientPreprocessorPropertiesOverridesIntegrationTests.TestConfiguration.class) +@SpringBootTest(classes = RibbonClientPreprocessorPropertiesOverridesIntegrationTests.TestConfiguration.class) @DirtiesContext public class RibbonClientPreprocessorPropertiesOverridesIntegrationTests { @@ -62,9 +62,10 @@ public class RibbonClientPreprocessorPropertiesOverridesIntegrationTests { ZoneAvoidanceRule.class.cast(getLoadBalancer("bar").getRule()); } - //TODO: why do these tests fail in travis? + // TODO: why do these tests fail in travis? void assumeNotTravis() { - assumeThat("running in travis, skipping", System.getenv("TRAVIS"), is(not(equalTo("true")))); + assumeThat("running in travis, skipping", System.getenv("TRAVIS"), + is(not(equalTo("true")))); } @Test @@ -77,7 +78,8 @@ public class RibbonClientPreprocessorPropertiesOverridesIntegrationTests { public void serverListOverridesToTest() throws Exception { assumeNotTravis(); TestServerList.class.cast(getLoadBalancer("foo2").getServerListImpl()); - ConfigurationBasedServerList.class.cast(getLoadBalancer("bar").getServerListImpl()); + ConfigurationBasedServerList.class + .cast(getLoadBalancer("bar").getServerListImpl()); } @Test @@ -101,7 +103,7 @@ public class RibbonClientPreprocessorPropertiesOverridesIntegrationTests { @Configuration @RibbonClients @Import({ UtilAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, - ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class}) + ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class }) protected static class TestConfiguration { } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientsPreprocessorIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientsPreprocessorIntegrationTests.java index 9710c4d4..302a6f90 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientsPreprocessorIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientsPreprocessorIntegrationTests.java @@ -16,11 +16,13 @@ package org.springframework.cloud.netflix.ribbon; +import static org.junit.Assert.assertEquals; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonClientsPreprocessorIntegrationTests.TestConfiguration; @@ -34,13 +36,11 @@ import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.ZoneAvoidanceRule; import com.netflix.loadbalancer.ZoneAwareLoadBalancer; -import static org.junit.Assert.assertEquals; - /** * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = TestConfiguration.class) +@SpringBootTest(classes = TestConfiguration.class) @DirtiesContext public class RibbonClientsPreprocessorIntegrationTests { @@ -54,21 +54,19 @@ public class RibbonClientsPreprocessorIntegrationTests { @SuppressWarnings("unchecked") private ZoneAwareLoadBalancer getLoadBalancer() { - return (ZoneAwareLoadBalancer) this.factory - .getLoadBalancer("foo"); + return (ZoneAwareLoadBalancer) this.factory.getLoadBalancer("foo"); } @Test public void serverListFilterOverride() throws Exception { - assertEquals("myTestZone", - ZonePreferenceServerListFilter.class.cast(getLoadBalancer().getFilter()) - .getZone()); + assertEquals("myTestZone", ZonePreferenceServerListFilter.class + .cast(getLoadBalancer().getFilter()).getZone()); } @Configuration @RibbonClients(@RibbonClient(name = "foo", configuration = FooConfiguration.class)) @Import({ UtilAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, - ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class}) + ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class }) protected static class TestConfiguration { } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/SpringClientFactoryTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/SpringClientFactoryTests.java index c8b07caf..531a231e 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/SpringClientFactoryTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/SpringClientFactoryTests.java @@ -19,7 +19,7 @@ package org.springframework.cloud.netflix.ribbon; import org.apache.http.client.params.ClientPNames; import org.apache.http.client.params.CookiePolicy; import org.junit.Test; -import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTests.java index 8f27449c..1d811b58 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTests.java @@ -23,8 +23,7 @@ import static org.junit.Assert.assertThat; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.netflix.ribbon.test.RibbonClientDefaultConfigurationTestsConfig.BazServiceList; import org.springframework.test.annotation.DirtiesContext; @@ -41,8 +40,7 @@ import com.netflix.loadbalancer.ZoneAwareLoadBalancer; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = RibbonClientDefaultConfigurationTestsConfig.class) -@IntegrationTest("ribbon.eureka.enabled=true") +@SpringBootTest(classes = RibbonClientDefaultConfigurationTestsConfig.class, value = "ribbon.eureka.enabled=true") @DirtiesContext public class RibbonClientDefaultConfigurationTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/ObservableReturnValueHandlerTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/ObservableReturnValueHandlerTest.java index cff2d202..cbf36676 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/ObservableReturnValueHandlerTest.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/ObservableReturnValueHandlerTest.java @@ -16,6 +16,10 @@ package org.springframework.cloud.netflix.rx; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8; + import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; @@ -25,9 +29,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -35,7 +39,6 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -44,10 +47,6 @@ import rx.Observable; import rx.Single; import rx.functions.Func1; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8; - /** * Tests the demonstrate using {@link Observable} with {@link SingleReturnValueHandler} class. * @@ -55,9 +54,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8; * @author Jakub Narloch */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = ObservableReturnValueHandlerTest.Application.class) -@WebAppConfiguration -@IntegrationTest({"server.port=0"}) +@SpringBootTest(classes = ObservableReturnValueHandlerTest.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT) @DirtiesContext public class ObservableReturnValueHandlerTest { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/ObservableSseEmitterTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/ObservableSseEmitterTest.java index 74b6c5b5..8473520f 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/ObservableSseEmitterTest.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/ObservableSseEmitterTest.java @@ -16,6 +16,10 @@ package org.springframework.cloud.netflix.rx; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8; + import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; @@ -24,15 +28,14 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -43,10 +46,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import rx.Observable; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8; - /** * Tests the {@link ObservableSseEmitter} class. * @@ -54,88 +53,91 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8; * @author Jakub Narloch */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = ObservableSseEmitterTest.Application.class) -@WebAppConfiguration -@IntegrationTest({"server.port=0"}) +@SpringBootTest(classes = ObservableSseEmitterTest.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT) @DirtiesContext public class ObservableSseEmitterTest { - @Value("${local.server.port}") - private int port = 0; + @Value("${local.server.port}") + private int port = 0; - private TestRestTemplate restTemplate = new TestRestTemplate(); + private TestRestTemplate restTemplate = new TestRestTemplate(); - @Configuration - @EnableAutoConfiguration - @RestController - protected static class Application { + @Configuration + @EnableAutoConfiguration + @RestController + protected static class Application { // tag::rx_observable_sse[] - @RequestMapping(method = RequestMethod.GET, value = "/sse") - public SseEmitter single() { - return RxResponse.sse(Observable.just("single value")); - } + @RequestMapping(method = RequestMethod.GET, value = "/sse") + public SseEmitter single() { + return RxResponse.sse(Observable.just("single value")); + } - @RequestMapping(method = RequestMethod.GET, value = "/messages") - public SseEmitter messages() { - return RxResponse.sse(Observable.just("message 1", "message 2", "message 3")); - } + @RequestMapping(method = RequestMethod.GET, value = "/messages") + public SseEmitter messages() { + return RxResponse.sse(Observable.just("message 1", "message 2", "message 3")); + } - @RequestMapping(method = RequestMethod.GET, value = "/events") - public SseEmitter event() { - return RxResponse.sse(APPLICATION_JSON_UTF8, Observable.just( - new EventDto("Spring io", getDate(2016, 5, 19)), - new EventDto("SpringOnePlatform", getDate(2016, 8, 1)) - )); - } + @RequestMapping(method = RequestMethod.GET, value = "/events") + public SseEmitter event() { + return RxResponse.sse(APPLICATION_JSON_UTF8, + Observable.just(new EventDto("Spring io", getDate(2016, 5, 19)), + new EventDto("SpringOnePlatform", getDate(2016, 8, 1)))); + } // end::rx_observable_sse[] - } + } - @Test - public void shouldRetrieveSse() { + @Test + public void shouldRetrieveSse() { - // when - ResponseEntity response = restTemplate.getForEntity(path("/sse"), String.class); + // when + ResponseEntity response = restTemplate.getForEntity(path("/sse"), + String.class); - // then - assertNotNull(response); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertEquals("data:single value\n\n", response.getBody()); - } + // then + assertNotNull(response); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertEquals("data:single value\n\n", response.getBody()); + } - @Test - public void shouldRetrieveSseWithMultipleMessages() { + @Test + public void shouldRetrieveSseWithMultipleMessages() { - // when - ResponseEntity response = restTemplate.getForEntity(path("/messages"), String.class); + // when + ResponseEntity response = restTemplate.getForEntity(path("/messages"), + String.class); - // then - assertNotNull(response); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertEquals("data:message 1\n\ndata:message 2\n\ndata:message 3\n\n", response.getBody()); - } + // then + assertNotNull(response); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertEquals("data:message 1\n\ndata:message 2\n\ndata:message 3\n\n", + response.getBody()); + } - @Test - public void shouldRetrieveJsonOverSseWithMultipleMessages() { + @Test + public void shouldRetrieveJsonOverSseWithMultipleMessages() { - // when - ResponseEntity response = restTemplate.getForEntity(path("/events"), String.class); + // when + ResponseEntity response = restTemplate.getForEntity(path("/events"), + String.class); - // then - assertNotNull(response); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertEquals("data:{\"name\":\"Spring io\",\"date\":1466337600000}\n\ndata:{\"name\":\"SpringOnePlatform\",\"date\":1472731200000}\n\n", response.getBody()); - } + // then + assertNotNull(response); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertEquals( + "data:{\"name\":\"Spring io\",\"date\":1466337600000}\n\ndata:{\"name\":\"SpringOnePlatform\",\"date\":1472731200000}\n\n", + response.getBody()); + } - private String path(String context) { - return String.format("http://localhost:%d%s", port, context); - } + private String path(String context) { + return String.format("http://localhost:%d%s", port, context); + } - private static Date getDate(int year, int month, int day) { - GregorianCalendar calendar = new GregorianCalendar(year, month, day, 12, 0, 0); - calendar.setTimeZone(TimeZone.getTimeZone("UTC")); - return calendar.getTime(); - } + private static Date getDate(int year, int month, int day) { + GregorianCalendar calendar = new GregorianCalendar(year, month, day, 12, 0, 0); + calendar.setTimeZone(TimeZone.getTimeZone("UTC")); + return calendar.getTime(); + } /** * A simple DTO used for testing purpose. @@ -149,7 +151,8 @@ public class ObservableSseEmitterTest { private final Date date; @JsonCreator - public EventDto(@JsonProperty("name") String name, @JsonProperty("date") Date date) { + public EventDto(@JsonProperty("name") String name, + @JsonProperty("date") Date date) { this.name = name; this.date = date; } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/SingleReturnValueHandlerTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/SingleReturnValueHandlerTest.java index 976145f6..8c7f0c45 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/SingleReturnValueHandlerTest.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/rx/SingleReturnValueHandlerTest.java @@ -16,28 +16,27 @@ package org.springframework.cloud.netflix.rx; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import rx.Single; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - /** * Tests the {@link SingleReturnValueHandler} class. * @@ -45,76 +44,78 @@ import static org.junit.Assert.assertNotNull; * @author Jakub Narloch */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SingleReturnValueHandlerTest.Application.class) -@WebAppConfiguration -@IntegrationTest({"server.port=0"}) +@SpringBootTest(classes = SingleReturnValueHandlerTest.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT) @DirtiesContext public class SingleReturnValueHandlerTest { - @Value("${local.server.port}") - private int port = 0; + @Value("${local.server.port}") + private int port = 0; - private TestRestTemplate restTemplate = new TestRestTemplate(); + private TestRestTemplate restTemplate = new TestRestTemplate(); - @Configuration - @EnableAutoConfiguration - @RestController - protected static class Application { + @Configuration + @EnableAutoConfiguration + @RestController + protected static class Application { // tag::rx_single[] - @RequestMapping(method = RequestMethod.GET, value = "/single") - public Single single() { - return Single.just("single value"); - } + @RequestMapping(method = RequestMethod.GET, value = "/single") + public Single single() { + return Single.just("single value"); + } - @RequestMapping(method = RequestMethod.GET, value = "/singleWithResponse") - public ResponseEntity> singleWithResponse() { - return new ResponseEntity<>(Single.just("single value"), HttpStatus.NOT_FOUND); - } + @RequestMapping(method = RequestMethod.GET, value = "/singleWithResponse") + public ResponseEntity> singleWithResponse() { + return new ResponseEntity<>(Single.just("single value"), + HttpStatus.NOT_FOUND); + } - @RequestMapping(method = RequestMethod.GET, value = "/throw") - public Single error() { - return Single.error(new RuntimeException("Unexpected")); - } + @RequestMapping(method = RequestMethod.GET, value = "/throw") + public Single error() { + return Single.error(new RuntimeException("Unexpected")); + } // end::rx_single[] } - @Test - public void shouldRetrieveSingleValue() { + @Test + public void shouldRetrieveSingleValue() { - // when - ResponseEntity response = restTemplate.getForEntity(path("/single"), String.class); + // when + ResponseEntity response = restTemplate.getForEntity(path("/single"), + String.class); - // then - assertNotNull(response); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertEquals("single value", response.getBody()); - } + // then + assertNotNull(response); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertEquals("single value", response.getBody()); + } - @Test - public void shouldRetrieveSingleValueWithStatusCode() { + @Test + public void shouldRetrieveSingleValueWithStatusCode() { - // when - ResponseEntity response = restTemplate.getForEntity(path("/singleWithResponse"), String.class); + // when + ResponseEntity response = restTemplate + .getForEntity(path("/singleWithResponse"), String.class); - // then - assertNotNull(response); - assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); - assertEquals("single value", response.getBody()); - } + // then + assertNotNull(response); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + assertEquals("single value", response.getBody()); + } - @Test - public void shouldRetrieveErrorResponse() { + @Test + public void shouldRetrieveErrorResponse() { - // when - ResponseEntity response = restTemplate.getForEntity(path("/throw"), Object.class); + // when + ResponseEntity response = restTemplate.getForEntity(path("/throw"), + Object.class); - // then - assertNotNull(response); - assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); - } + // then + assertNotNull(response); + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); + } - private String path(String context) { - return String.format("http://localhost:%d%s", port, context); - } + private String path(String context) { + return String.format("http://localhost:%d%s", port, context); + } } \ No newline at end of file diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ContextPathZuulProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ContextPathZuulProxyApplicationTests.java index 9a9868b1..7a98c454 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ContextPathZuulProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ContextPathZuulProxyApplicationTests.java @@ -24,9 +24,9 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; import org.springframework.context.annotation.Configuration; @@ -36,7 +36,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -45,9 +44,8 @@ import org.springframework.web.bind.annotation.RestController; import com.netflix.zuul.context.RequestContext; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = ContextPathZuulProxyApplication.class) -@WebAppConfiguration -@IntegrationTest({ "server.port: 0", "server.contextPath: /app" }) +@SpringBootTest(classes = ContextPathZuulProxyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "server.contextPath: /app" }) @DirtiesContext public class ContextPathZuulProxyApplicationTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulProxyApplicationTests.java index 872a6059..f2d786c1 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulProxyApplicationTests.java @@ -16,6 +16,8 @@ package org.springframework.cloud.netflix.zuul; +import static org.junit.Assert.assertEquals; + import java.io.IOException; import java.io.InputStream; import java.util.Map; @@ -29,9 +31,9 @@ import org.springframework.boot.actuate.trace.InMemoryTraceRepository; import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.StaticServerList; @@ -45,7 +47,6 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestMapping; @@ -59,14 +60,11 @@ import com.netflix.loadbalancer.ServerList; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; -import static org.junit.Assert.assertEquals; - import lombok.extern.slf4j.Slf4j; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FormZuulProxyApplication.class) -@WebAppConfiguration -@IntegrationTest({ "server.port:0", "zuul.routes.simple:/simple/**" }) +@SpringBootTest(classes = FormZuulProxyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "zuul.routes.simple:/simple/**" }) @DirtiesContext public class FormZuulProxyApplicationTests { @@ -93,7 +91,7 @@ public class FormZuulProxyApplicationTests { assertEquals("Posted! {foo=[bar]}", result.getBody()); } - @Ignore //TODO: fix this test + @Ignore // TODO: fix this test @Test public void postWithMultipartForm() { MultiValueMap form = new LinkedMultiValueMap(); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulServletProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulServletProxyApplicationTests.java index 3c158023..7f6dfb1c 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulServletProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulServletProxyApplicationTests.java @@ -16,6 +16,8 @@ package org.springframework.cloud.netflix.zuul; +import static org.junit.Assert.assertEquals; + import java.io.IOException; import java.io.InputStream; import java.util.Map; @@ -28,9 +30,9 @@ import org.springframework.boot.actuate.trace.InMemoryTraceRepository; import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.StaticServerList; @@ -57,13 +59,10 @@ import com.netflix.loadbalancer.ServerList; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; -import static org.junit.Assert.assertEquals; - import lombok.extern.slf4j.Slf4j; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = FormZuulServletProxyApplication.class) -@WebIntegrationTest(value = "zuul.routes.simple:/simple/**", randomPort = true) +@SpringBootTest(classes = FormZuulServletProxyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = "zuul.routes.simple:/simple/**") @DirtiesContext public class FormZuulServletProxyApplicationTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/RetryableZuulProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/RetryableZuulProxyApplicationTests.java index 66bccf29..91d80bdb 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/RetryableZuulProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/RetryableZuulProxyApplicationTests.java @@ -1,15 +1,16 @@ package org.springframework.cloud.netflix.zuul; +import static org.junit.Assert.assertEquals; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.StaticServerList; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; @@ -23,7 +24,6 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestBody; @@ -36,13 +36,10 @@ import com.netflix.loadbalancer.ServerList; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; -import static org.junit.Assert.assertEquals; - @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = RetryableZuulProxyApplication.class) -@WebAppConfiguration -@IntegrationTest({ "server.port: 0", "zuul.routes.simple.path: /simple/**", - "zuul.routes.simple.retryable: true", "ribbon.OkToRetryOnAllOperations: true" }) +@SpringBootTest(classes = RetryableZuulProxyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "zuul.routes.simple.path: /simple/**", "zuul.routes.simple.retryable: true", + "ribbon.OkToRetryOnAllOperations: true" }) @DirtiesContext public class RetryableZuulProxyApplicationTests { @@ -50,9 +47,11 @@ public class RetryableZuulProxyApplicationTests { private int port; @Autowired + @SuppressWarnings("unused") private DiscoveryClientRouteLocator routes; @Autowired + @SuppressWarnings("unused") private RoutesEndpoint endpoint; @Before diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ServletPathZuulProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ServletPathZuulProxyApplicationTests.java index 8da0e2de..9b103cce 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ServletPathZuulProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ServletPathZuulProxyApplicationTests.java @@ -24,9 +24,9 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; import org.springframework.context.annotation.Configuration; @@ -36,7 +36,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -45,9 +44,8 @@ import org.springframework.web.bind.annotation.RestController; import com.netflix.zuul.context.RequestContext; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = ServletPathZuulProxyApplicationTests.ServletPathZuulProxyApplication.class) -@WebAppConfiguration -@IntegrationTest({ "server.port: 0", "server.servletPath: /app" }) +@SpringBootTest(classes = ServletPathZuulProxyApplicationTests.ServletPathZuulProxyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "server.port: 0", "server.servletPath: /app" }) @DirtiesContext public class ServletPathZuulProxyApplicationTests { @@ -90,7 +88,6 @@ public class ServletPathZuulProxyApplicationTests { assertEquals("Gotten strip!", result.getBody()); } - // Don't use @SpringBootApplication because we don't want to component scan @Configuration @EnableAutoConfiguration @@ -100,8 +97,8 @@ public class ServletPathZuulProxyApplicationTests { @RequestMapping(value = "/local/{id}", method = RequestMethod.GET) public String get(@PathVariable String id) { - return "Gotten " + id + "!"; - } + return "Gotten " + id + "!"; + } } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SimpleZuulServerApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SimpleZuulServerApplicationTests.java index ae906e68..3ad939f0 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SimpleZuulServerApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SimpleZuulServerApplicationTests.java @@ -16,6 +16,9 @@ package org.springframework.cloud.netflix.zuul; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -23,9 +26,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.zuul.filters.RouteLocator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -35,20 +38,14 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SimpleZuulServerApplication.class) -@WebAppConfiguration -@IntegrationTest({ "server.port: 0" }) +@SpringBootTest(classes = SimpleZuulServerApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) @DirtiesContext public class SimpleZuulServerApplicationTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java index 1026165b..8911e076 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java @@ -1,5 +1,9 @@ package org.springframework.cloud.netflix.zuul.filters; +import static junit.framework.TestCase.assertFalse; +import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertEquals; + import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -15,9 +19,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.cloud.netflix.zuul.RoutesEndpoint; import org.springframework.cloud.netflix.zuul.ZuulProxyConfiguration; @@ -31,7 +35,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.PathVariable; @@ -43,14 +46,9 @@ import org.springframework.web.client.RestTemplate; import com.netflix.zuul.context.RequestContext; -import static junit.framework.TestCase.assertFalse; -import static junit.framework.TestCase.assertTrue; -import static org.junit.Assert.assertEquals; - @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SampleCustomZuulProxyApplication.class) -@WebAppConfiguration -@IntegrationTest({ "server.port: 0", "server.contextPath: /app" }) +@SpringBootTest(classes = SampleCustomZuulProxyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "server.contextPath: /app" }) @DirtiesContext public class CustomHostRoutingFilterTests { @@ -192,13 +190,14 @@ class SampleCustomZuulProxyApplication { @Bean @Override - public SimpleHostRoutingFilter simpleHostRoutingFilter( - ProxyRequestHelper helper, ZuulProperties zuulProperties) { + public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, + ZuulProperties zuulProperties) { return new CustomHostRoutingFilter(helper, zuulProperties); } private class CustomHostRoutingFilter extends SimpleHostRoutingFilter { - public CustomHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties zuulProperties) { + public CustomHostRoutingFilter(ProxyRequestHelper helper, + ZuulProperties zuulProperties) { super(helper, zuulProperties); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/PatternServiceRouteMapperIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/PatternServiceRouteMapperIntegrationTests.java index be2a06f1..4864d271 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/PatternServiceRouteMapperIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/PatternServiceRouteMapperIntegrationTests.java @@ -1,5 +1,10 @@ package org.springframework.cloud.netflix.zuul.filters.discovery; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.springframework.cloud.netflix.zuul.filters.discovery.PatternServiceRouteMapperIntegrationTests.SERVICE_ID; + import java.util.ArrayList; import java.util.List; @@ -10,9 +15,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.StaticServerList; @@ -25,7 +30,6 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -36,19 +40,13 @@ import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.ServerList; import com.netflix.zuul.context.RequestContext; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.springframework.cloud.netflix.zuul.filters.discovery.PatternServiceRouteMapperIntegrationTests.SERVICE_ID; - /** * @author Stéphane Leroy */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SampleCustomZuulProxyApplication.class) -@WebIntegrationTest(value = { "spring.application.name=regex-test-application", - "spring.jmx.enabled=true" }, randomPort = true) -@TestPropertySource(properties = "eureka.client.enabled=false") +@SpringBootTest(classes = SampleCustomZuulProxyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=regex-test-application", "spring.jmx.enabled=true", + "eureka.client.enabled=false" }) @DirtiesContext public class PatternServiceRouteMapperIntegrationTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java index 20b0f5ef..7275e36d 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java @@ -30,7 +30,7 @@ import org.springframework.context.annotation.Configuration; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.springframework.boot.test.EnvironmentTestUtils.addEnvironment; +import static org.springframework.boot.test.util.EnvironmentTestUtils.addEnvironment; /** * @author Andreas Kluth diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/apache/HttpClientRibbonCommandIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/apache/HttpClientRibbonCommandIntegrationTests.java index 483294c1..d4bcfa2c 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/apache/HttpClientRibbonCommandIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/apache/HttpClientRibbonCommandIntegrationTests.java @@ -17,20 +17,24 @@ package org.springframework.cloud.netflix.zuul.filters.route.apache; -import com.netflix.client.RetryHandler; -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.ILoadBalancer; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.springframework.http.HttpHeaders.SET_COOKIE; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.web.ErrorAttributes; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; @@ -54,24 +58,21 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.WebUtils; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.springframework.http.HttpHeaders.SET_COOKIE; +import com.netflix.client.RetryHandler; +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.ILoadBalancer; +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ServerList; /** * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = HttpClientRibbonCommandIntegrationTests.TestConfig.class) -@WebIntegrationTest(randomPort = true, value = { +@SpringBootTest(classes = HttpClientRibbonCommandIntegrationTests.TestConfig.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "zuul.routes.other: /test/**=http://localhost:7777/local", "zuul.routes.another: /another/twolevel/**", "zuul.routes.simple: /simple/**", - "zuul.routes.singleton: /singleton/**", "zuul.routes.singleton.sensitiveHeaders: " }) + "zuul.routes.singleton: /singleton/**", + "zuul.routes.singleton.sensitiveHeaders: " }) @DirtiesContext public class HttpClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { @@ -115,26 +116,27 @@ public class HttpClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { @Test public void ribbonLoadBalancingHttpClientCookiePolicy() { ResponseEntity result = new TestRestTemplate().exchange( - "http://localhost:" + this.port + "/simple/downstream_cookie", HttpMethod.POST, - new HttpEntity<>((Void) null), String.class); + "http://localhost:" + this.port + "/simple/downstream_cookie", + HttpMethod.POST, new HttpEntity<>((Void) null), String.class); assertEquals(HttpStatus.OK, result.getStatusCode()); assertEquals("Cookie 434354454!", result.getBody()); assertNull(result.getHeaders().getFirst(SET_COOKIE)); - // if new instance of RibbonLoadBalancingHttpClient is getting created every time - // and HttpClient is not reused then there are no concerns for the shared cookie storage - // but since https://github.com/spring-cloud/spring-cloud-netflix/issues/1150 is on the way a + // and HttpClient is not reused then there are no concerns for the shared cookie + // storage + // but since https://github.com/spring-cloud/spring-cloud-netflix/issues/1150 is + // on the way a result = new TestRestTemplate().exchange( - "http://localhost:" + this.port + "/singleton/downstream_cookie", HttpMethod.POST, - new HttpEntity<>((Void) null), String.class); + "http://localhost:" + this.port + "/singleton/downstream_cookie", + HttpMethod.POST, new HttpEntity<>((Void) null), String.class); assertEquals(HttpStatus.OK, result.getStatusCode()); assertEquals("Cookie 434354454!", result.getBody()); assertEquals("jsessionid=434354454", result.getHeaders().getFirst(SET_COOKIE)); result = new TestRestTemplate().exchange( - "http://localhost:" + this.port + "/singleton/downstream_cookie", HttpMethod.GET, - new HttpEntity<>((Void) null), String.class); + "http://localhost:" + this.port + "/singleton/downstream_cookie", + HttpMethod.GET, new HttpEntity<>((Void) null), String.class); assertEquals(HttpStatus.OK, result.getStatusCode()); assertEquals("Cookie null!", result.getBody()); } @@ -144,6 +146,7 @@ public class HttpClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { assertTrue("ribbonCommandFactory not a HttpClientRibbonCommandFactory", this.ribbonCommandFactory instanceof HttpClientRibbonCommandFactory); } + // Don't use @SpringBootApplication because we don't want to component scan @Configuration @EnableAutoConfiguration @@ -152,29 +155,27 @@ public class HttpClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { @RibbonClients({ @RibbonClient(name = "simple", configuration = ZuulProxyTestBase.SimpleRibbonClientConfiguration.class), @RibbonClient(name = "another", configuration = ZuulProxyTestBase.AnotherRibbonClientConfiguration.class), - @RibbonClient(name = "singleton", configuration = SingletonRibbonClientConfiguration.class) }) + @RibbonClient(name = "singleton", configuration = SingletonRibbonClientConfiguration.class) }) static class TestConfig extends ZuulProxyTestBase.AbstractZuulProxyApplication { @RequestMapping(value = "/local/{id}", method = RequestMethod.PATCH) - public String patch(@PathVariable final String id, @RequestBody final String body) { + public String patch(@PathVariable final String id, + @RequestBody final String body) { return "Patched " + id + "!"; } @RequestMapping(value = "/downstream_cookie", method = RequestMethod.POST) - public String setDownstreamCookie(HttpServletResponse response) - { + public String setDownstreamCookie(HttpServletResponse response) { response.addCookie(new Cookie("jsessionid", "434354454")); return "Cookie 434354454!"; } @RequestMapping(value = "/downstream_cookie", method = RequestMethod.GET) - public String readDownstreamCookie(HttpServletRequest request) - { + public String readDownstreamCookie(HttpServletRequest request) { final Cookie cookie = WebUtils.getCookie(request, "jsessionid"); return "Cookie " + cookie + "!"; } - @Bean public RibbonCommandFactory ribbonCommandFactory( final SpringClientFactory clientFactory) { @@ -182,7 +183,8 @@ public class HttpClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { } @Bean - public ZuulProxyTestBase.MyErrorController myErrorController(ErrorAttributes errorAttributes) { + public ZuulProxyTestBase.MyErrorController myErrorController( + ErrorAttributes errorAttributes) { return new ZuulProxyTestBase.MyErrorController(errorAttributes); } } @@ -200,8 +202,8 @@ public class HttpClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { } @Bean - public RibbonLoadBalancingHttpClient ribbonClient(IClientConfig config, ILoadBalancer loadBalancer, RetryHandler retryHandler) - { + public RibbonLoadBalancingHttpClient ribbonClient(IClientConfig config, + ILoadBalancer loadBalancer, RetryHandler retryHandler) { final RibbonLoadBalancingHttpClient client = new RibbonLoadBalancingHttpClient(); client.setLoadBalancer(loadBalancer); client.setRetryHandler(retryHandler); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonCommandIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonCommandIntegrationTests.java index 725f7327..7c4086f8 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonCommandIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonCommandIntegrationTests.java @@ -25,9 +25,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.web.ErrorAttributes; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; @@ -45,8 +45,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.bind.annotation.RestController; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = OkHttpRibbonCommandIntegrationTests.TestConfig.class) -@WebIntegrationTest(randomPort = true, value = { +@SpringBootTest(classes = OkHttpRibbonCommandIntegrationTests.TestConfig.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "zuul.routes.other: /test/**=http://localhost:7777/local", "zuul.routes.another: /another/twolevel/**", "zuul.routes.simple: /simple/**" }) @DirtiesContext @@ -89,7 +88,6 @@ public class OkHttpRibbonCommandIntegrationTests extends ZuulProxyTestBase { assertEquals("Deleted 1!", result.getBody()); } - @Test public void ribbonCommandFactoryOverridden() { assertTrue("ribbonCommandFactory not a OkHttpRibbonCommandFactory", diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/restclient/RestClientRibbonCommandIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/restclient/RestClientRibbonCommandIntegrationTests.java index db862e19..725516b4 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/restclient/RestClientRibbonCommandIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/restclient/RestClientRibbonCommandIntegrationTests.java @@ -34,23 +34,23 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.web.ErrorAttributes; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.netflix.ribbon.StaticServerList; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; +import org.springframework.cloud.netflix.zuul.filters.RouteLocator; +import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; +import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; import org.springframework.cloud.netflix.zuul.filters.route.RestClientRibbonCommand; import org.springframework.cloud.netflix.zuul.filters.route.RestClientRibbonCommandFactory; import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandContext; import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandFactory; import org.springframework.cloud.netflix.zuul.filters.route.support.ZuulProxyTestBase; -import org.springframework.cloud.netflix.zuul.filters.RouteLocator; -import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; -import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpEntity; @@ -62,7 +62,6 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.mock.http.client.MockClientHttpResponse; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.MatrixVariable; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -77,9 +76,7 @@ import com.netflix.niws.client.http.RestClient; import lombok.SneakyThrows; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = RestClientRibbonCommandIntegrationTests.TestConfig.class) -@WebAppConfiguration -@IntegrationTest({ "server.port: 0", +@SpringBootTest(classes = RestClientRibbonCommandIntegrationTests.TestConfig.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "zuul.routes.other: /test/**=http://localhost:7777/local", "zuul.routes.another: /another/twolevel/**", "zuul.routes.simple: /simple/**", "zuul.routes.badhost: /badhost/**", "zuul.ignoredHeaders: X-Header", @@ -236,7 +233,6 @@ public class RestClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { this.routeLocator instanceof TestConfig.MyRouteLocator); } - // Don't use @SpringBootApplication because we don't want to component scan @Configuration @EnableAutoConfiguration @@ -250,8 +246,8 @@ public class RestClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { @RequestMapping("/trailing-slash") public String trailingSlash(HttpServletRequest request) { - return request.getRequestURI(); - } + return request.getRequestURI(); + } @RequestMapping("/content-type") public String contentType(HttpServletRequest request) { @@ -289,7 +285,8 @@ public class RestClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { } @Bean - public RouteLocator routeLocator(DiscoveryClient discoveryClient, ZuulProperties zuulProperties) { + public RouteLocator routeLocator(DiscoveryClient discoveryClient, + ZuulProperties zuulProperties) { return new MyRouteLocator("/", discoveryClient, zuulProperties); } @@ -299,10 +296,11 @@ public class RestClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { } public static void main(String[] args) { - SpringApplication.run(TestConfig.class, args); - } + SpringApplication.run(TestConfig.class, args); + } - public static class MyRibbonCommandFactory extends RestClientRibbonCommandFactory { + public static class MyRibbonCommandFactory + extends RestClientRibbonCommandFactory { private SpringClientFactory clientFactory; @@ -352,14 +350,16 @@ public class RestClientRibbonCommandIntegrationTests extends ZuulProxyTestBase { static class BadHostRibbonClientConfiguration { @Bean public ServerList ribbonServerList() { - return new StaticServerList<>(new Server(UUID.randomUUID().toString(), 4322)); + return new StaticServerList<>( + new Server(UUID.randomUUID().toString(), 4322)); } } static class MyRouteLocator extends DiscoveryClientRouteLocator { - public MyRouteLocator(String servletPath, DiscoveryClient discovery, ZuulProperties properties) { + public MyRouteLocator(String servletPath, DiscoveryClient discovery, + ZuulProperties properties) { super(servletPath, discovery, properties); } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/ZuulProxyTestBase.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/ZuulProxyTestBase.java index ffdb3771..00baab11 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/ZuulProxyTestBase.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/ZuulProxyTestBase.java @@ -17,6 +17,11 @@ package org.springframework.cloud.netflix.zuul.filters.route.support; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assume.assumeThat; + import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -25,7 +30,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.servlet.http.HttpServletRequest; -import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +37,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.web.BasicErrorController; import org.springframework.boot.autoconfigure.web.ErrorAttributes; import org.springframework.boot.autoconfigure.web.ErrorProperties; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.ribbon.StaticServerList; import org.springframework.cloud.netflix.zuul.RoutesEndpoint; import org.springframework.cloud.netflix.zuul.filters.Route; @@ -60,11 +64,6 @@ import com.netflix.loadbalancer.ServerList; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assume.assumeThat; - /** * @author Spencer Gibb */ diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java index 6c21cb62..a9240293 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java @@ -18,12 +18,11 @@ package org.springframework.cloud.netflix.eureka; import org.junit.After; import org.junit.Test; -import org.mockito.Matchers; import org.mockito.Mockito; import org.springframework.aop.scope.ScopedProxyFactoryBean; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -32,12 +31,11 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import com.netflix.discovery.shared.transport.jersey.EurekaJerseyClient; -import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; import com.sun.jersey.client.apache4.ApacheHttpClient4; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.springframework.boot.test.EnvironmentTestUtils.addEnvironment; +import static org.springframework.boot.test.util.EnvironmentTestUtils.addEnvironment; /** * @author Spencer Gibb diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBeanTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBeanTests.java index cc7f36c0..1d2da41d 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBeanTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBeanTests.java @@ -22,7 +22,7 @@ import org.junit.After; import org.junit.Test; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.CompositePropertySource; diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java index f2f39639..0f3f99b6 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java @@ -33,7 +33,7 @@ import com.netflix.appinfo.InstanceInfo.InstanceStatus; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.springframework.boot.test.EnvironmentTestUtils.addEnvironment; +import static org.springframework.boot.test.util.EnvironmentTestUtils.addEnvironment; /** * @author Dave Syer diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactoryTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactoryTests.java index d833c1dc..e2f1dbdc 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactoryTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactoryTests.java @@ -15,7 +15,7 @@ import com.netflix.appinfo.InstanceInfo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.springframework.boot.test.EnvironmentTestUtils.addEnvironment; +import static org.springframework.boot.test.util.EnvironmentTestUtils.addEnvironment; public class InstanceInfoFactoryTests { private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientConfigServiceAutoConfigurationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientConfigServiceAutoConfigurationTests.java index 9616dab5..095404f5 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientConfigServiceAutoConfigurationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientConfigServiceAutoConfigurationTests.java @@ -22,7 +22,7 @@ import org.junit.After; import org.junit.Test; import org.mockito.Mockito; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.config.client.ConfigClientProperties; import org.springframework.cloud.config.client.DiscoveryClientConfigServiceBootstrapConfiguration; diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/healthcheck/EurekaHealthCheckTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/healthcheck/EurekaHealthCheckTests.java index ee8ab079..79aed7e5 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/healthcheck/EurekaHealthCheckTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/healthcheck/EurekaHealthCheckTests.java @@ -25,57 +25,54 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; - /** * Tests the Eureka health check handler. * * @author Jakub Narloch */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = EurekaHealthCheckTests.EurekaHealthCheckApplication.class) -@WebAppConfiguration -@IntegrationTest({"server.port=0", "eureka.client.healthcheck.enabled=true", "debug=true"}) +@SpringBootTest(classes = EurekaHealthCheckTests.EurekaHealthCheckApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "eureka.client.healthcheck.enabled=true", "debug=true" }) @DirtiesContext public class EurekaHealthCheckTests { - @Autowired - private EurekaClient discoveryClient; + @Autowired + private EurekaClient discoveryClient; - @Test - public void shouldRegisterService() { + @Test + public void shouldRegisterService() { - InstanceInfo.InstanceStatus status = this.discoveryClient.getHealthCheckHandler() - .getStatus(InstanceInfo.InstanceStatus.UNKNOWN); + InstanceInfo.InstanceStatus status = this.discoveryClient.getHealthCheckHandler() + .getStatus(InstanceInfo.InstanceStatus.UNKNOWN); - assertNotNull(status); - assertEquals(InstanceInfo.InstanceStatus.OUT_OF_SERVICE, status); - } + assertNotNull(status); + assertEquals(InstanceInfo.InstanceStatus.OUT_OF_SERVICE, status); + } - @Configuration - @EnableAutoConfiguration - @EnableEurekaClient - protected static class EurekaHealthCheckApplication { + @Configuration + @EnableAutoConfiguration + @EnableEurekaClient + protected static class EurekaHealthCheckApplication { - @Bean - public HealthIndicator healthIndicator() { - return new HealthIndicator() { - @Override - public Health health() { - return new Health.Builder().outOfService().build(); - } - }; - } - } + @Bean + public HealthIndicator healthIndicator() { + return new HealthIndicator() { + @Override + public Health health() { + return new Health.Builder().outOfService().build(); + } + }; + } + } } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/sample/ApplicationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/sample/ApplicationTests.java index eae13e52..3b72e97e 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/sample/ApplicationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/sample/ApplicationTests.java @@ -18,16 +18,13 @@ package org.springframework.cloud.netflix.eureka.sample; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = EurekaSampleApplication.class) -@WebAppConfiguration -@IntegrationTest("server.port=0") +@SpringBootTest(classes = EurekaSampleApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) @DirtiesContext public class ApplicationTests { diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessorIntegrationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessorIntegrationTests.java index 4835e63b..c75f8966 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessorIntegrationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessorIntegrationTests.java @@ -20,7 +20,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration; @@ -43,7 +43,7 @@ import com.netflix.niws.loadbalancer.NIWSDiscoveryPing; * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = TestConfiguration.class) +@SpringBootTest(classes = TestConfiguration.class) @DirtiesContext public class EurekaRibbonClientPreprocessorIntegrationTests { diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPropertyOverrideIntegrationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPropertyOverrideIntegrationTests.java index b301fb7f..cd51607e 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPropertyOverrideIntegrationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPropertyOverrideIntegrationTests.java @@ -22,7 +22,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; @@ -45,7 +45,7 @@ import com.netflix.niws.loadbalancer.NIWSDiscoveryPing; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(EurekaRibbonClientPropertyOverrideIntegrationTests.TestConfiguration.class) +@SpringBootTest(classes = EurekaRibbonClientPropertyOverrideIntegrationTests.TestConfiguration.class) @DirtiesContext public class EurekaRibbonClientPropertyOverrideIntegrationTests { @@ -60,7 +60,8 @@ public class EurekaRibbonClientPropertyOverrideIntegrationTests { @Test public void serverListOverridesToTest() throws Exception { - ConfigurationBasedServerList.class.cast(getLoadBalancer("foo3").getServerListImpl()); + ConfigurationBasedServerList.class + .cast(getLoadBalancer("foo3").getServerListImpl()); DomainExtractingServerList.class.cast(getLoadBalancer("bar").getServerListImpl()); } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientPreprocessorIntegrationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientPreprocessorIntegrationTests.java index 045389fe..b78d48c4 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientPreprocessorIntegrationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientPreprocessorIntegrationTests.java @@ -16,13 +16,14 @@ package org.springframework.cloud.netflix.ribbon.eureka; -import com.netflix.discovery.EurekaClient; +import static org.junit.Assert.assertEquals; + import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.commons.util.InetUtils; import org.springframework.cloud.commons.util.InetUtilsProperties; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; @@ -38,17 +39,16 @@ import org.springframework.context.annotation.Import; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import com.netflix.discovery.EurekaClient; import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.ZoneAvoidanceRule; import com.netflix.loadbalancer.ZoneAwareLoadBalancer; -import static org.junit.Assert.assertEquals; - /** * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = TestConfiguration.class) +@SpringBootTest(classes = TestConfiguration.class) @DirtiesContext public class RibbonClientPreprocessorIntegrationTests { diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java index e562e773..11f80ae2 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java @@ -27,9 +27,9 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.eureka.server.ApplicationContextTests.Application; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpEntity; @@ -39,13 +39,10 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=eureka", - "server.contextPath=/context" }) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=eureka", "server.contextPath=/context" }) public class ApplicationContextTests { @Value("${local.server.port}") @@ -69,8 +66,8 @@ public class ApplicationContextTests { assertTrue(body.contains("eureka/js")); assertTrue(body.contains("eureka/css")); // The "DS Replicas" - assertTrue(body - .contains("localhost")); + assertTrue( + body.contains("localhost")); } @Test @@ -95,9 +92,9 @@ public class ApplicationContextTests { headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); @SuppressWarnings("rawtypes") - ResponseEntity entity = new TestRestTemplate().exchange("http://localhost:" - + this.port + "/context/env", HttpMethod.GET, new HttpEntity<>( - "parameters", headers), Map.class); + ResponseEntity entity = new TestRestTemplate().exchange( + "http://localhost:" + this.port + "/context/env", HttpMethod.GET, + new HttpEntity<>("parameters", headers), Map.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); } @@ -107,9 +104,10 @@ public class ApplicationContextTests { protected static class Application { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=eureka", "server.contextPath=/context").run( - args); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=eureka", + "server.contextPath=/context") + .run(args); } } diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationDashboardDisabledTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationDashboardDisabledTests.java index 41b13b64..69b9abaa 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationDashboardDisabledTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationDashboardDisabledTests.java @@ -16,26 +16,23 @@ package org.springframework.cloud.netflix.eureka.server; +import static org.junit.Assert.assertEquals; + import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.eureka.server.ApplicationContextTests.Application; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; - -import static org.junit.Assert.assertEquals; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=eureka", +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=eureka", "eureka.dashboard.enabled=false" }) public class ApplicationDashboardDisabledTests { diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationDashboardPathTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationDashboardPathTests.java index a902c6ef..d3fd0004 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationDashboardPathTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationDashboardPathTests.java @@ -16,28 +16,25 @@ package org.springframework.cloud.netflix.eureka.server; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.eureka.server.ApplicationContextTests.Application; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=eureka", - "eureka.dashboard.path=/dashboard" }) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=eureka", "eureka.dashboard.path=/dashboard" }) public class ApplicationDashboardPathTests { @Value("${local.server.port}") @@ -61,8 +58,8 @@ public class ApplicationDashboardPathTests { assertTrue(body.contains("eureka/js")); assertTrue(body.contains("eureka/css")); // The "DS Replicas" - assertTrue(body - .contains("localhost")); + assertTrue( + body.contains("localhost")); // The Home assertTrue(body.contains("Home")); // The Lastn diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationServletPathTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationServletPathTests.java index aeaad178..90e70ac6 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationServletPathTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationServletPathTests.java @@ -27,9 +27,9 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.eureka.server.ApplicationServletPathTests.Application; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpEntity; @@ -39,13 +39,10 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=eureka", - "server.servletPath=/servlet" }) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=eureka", "server.servletPath=/servlet" }) public class ApplicationServletPathTests { @Value("${local.server.port}") @@ -56,9 +53,10 @@ public class ApplicationServletPathTests { @EnableEurekaServer protected static class Application { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=eureka", "server.servletPath=/servlet").run( - args); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=eureka", + "server.servletPath=/servlet") + .run(args); } } @@ -80,8 +78,8 @@ public class ApplicationServletPathTests { assertTrue(body.contains("eureka/js")); assertTrue(body.contains("eureka/css")); // The "DS Replicas" - assertTrue(body - .contains("localhost")); + assertTrue( + body.contains("localhost")); } @Test @@ -106,9 +104,9 @@ public class ApplicationServletPathTests { headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); @SuppressWarnings("rawtypes") - ResponseEntity entity = new TestRestTemplate().exchange("http://localhost:" - + this.port + "/servlet/env", HttpMethod.GET, new HttpEntity<>( - "parameters", headers), Map.class); + ResponseEntity entity = new TestRestTemplate().exchange( + "http://localhost:" + this.port + "/servlet/env", HttpMethod.GET, + new HttpEntity<>("parameters", headers), Map.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); } diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationTests.java index a3e3a2b4..22e46a89 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationTests.java @@ -16,6 +16,14 @@ package org.springframework.cloud.netflix.eureka.server; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + import java.util.Collections; import java.util.Map; @@ -25,9 +33,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.eureka.server.ApplicationTests.Application; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpEntity; @@ -37,24 +45,14 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.converters.wrappers.CodecWrapper; import com.netflix.eureka.resources.ServerCodecs; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.jmx.enabled=true" }) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.jmx.enabled=true" }) public class ApplicationTests { @Value("${local.server.port}") @@ -77,9 +75,9 @@ public class ApplicationTests { headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); @SuppressWarnings("rawtypes") - ResponseEntity entity = new TestRestTemplate().exchange("http://localhost:" - + this.port + "/env", HttpMethod.GET, new HttpEntity<>("parameters", - headers), Map.class); + ResponseEntity entity = new TestRestTemplate().exchange( + "http://localhost:" + this.port + "/env", HttpMethod.GET, + new HttpEntity<>("parameters", headers), Map.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); } @@ -107,14 +105,13 @@ public class ApplicationTests { @Test public void customCodecWorks() throws Exception { - assertThat("serverCodecs is wrong type", this.serverCodecs, is(instanceOf(EurekaServerConfiguration.CloudServerCodecs.class))); + assertThat("serverCodecs is wrong type", this.serverCodecs, + is(instanceOf(EurekaServerConfiguration.CloudServerCodecs.class))); CodecWrapper codec = this.serverCodecs.getFullJsonCodec(); assertThat("codec is wrong type", codec, is(instanceOf(CloudJacksonJson.class))); - InstanceInfo instanceInfo = InstanceInfo.Builder.newBuilder() - .setAppName("fooapp") - .add("instanceId", "foo") - .build(); + InstanceInfo instanceInfo = InstanceInfo.Builder.newBuilder().setAppName("fooapp") + .add("instanceId", "foo").build(); String encoded = codec.encode(instanceInfo); InstanceInfo decoded = codec.decode(encoded, InstanceInfo.class); assertThat("instanceId was wrong", decoded.getInstanceId(), is("foo")); @@ -125,8 +122,8 @@ public class ApplicationTests { @EnableEurekaServer protected static class Application { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=eureka").run(args); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=eureka").run(args); } } diff --git a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardContextTests.java b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardContextTests.java index 505883f7..7aa02841 100644 --- a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardContextTests.java +++ b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardContextTests.java @@ -16,32 +16,29 @@ package org.springframework.cloud.netflix.hystrix.dashboard; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.hystrix.dashboard.HystrixDashboardContextTests.Application; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; /** * @author Dave Syer * */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=hystrix-dashboard", +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=hystrix-dashboard", "server.contextPath=/context" }) public class HystrixDashboardContextTests { diff --git a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java index 19c51ac2..37884f58 100644 --- a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java +++ b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java @@ -16,33 +16,31 @@ package org.springframework.cloud.netflix.hystrix.dashboard; +import static org.junit.Assert.assertEquals; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.hystrix.dashboard.HystrixDashboardHomePageTests.Application; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; -import static org.junit.Assert.assertEquals; - /** * @author Dave Syer * */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=hystrix-dashboard" }) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "server.port=0", "spring.application.name=hystrix-dashboard" }) public class HystrixDashboardHomePageTests { @Value("${local.server.port}") @@ -50,18 +48,17 @@ public class HystrixDashboardHomePageTests { @Test public void homePage() { - ResponseEntity entity = new TestRestTemplate().getForEntity( - "http://localhost:" + this.port, String.class); + ResponseEntity entity = new TestRestTemplate() + .getForEntity("http://localhost:" + this.port, String.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); entity.getBody().contains(""); } @Test public void cssAvailable() { - ResponseEntity entity = new TestRestTemplate() - .getForEntity( - "http://localhost:" + this.port + "/hystrix/css/global.css", - String.class); + ResponseEntity entity = new TestRestTemplate().getForEntity( + "http://localhost:" + this.port + "/hystrix/css/global.css", + String.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); } @@ -84,8 +81,8 @@ public class HystrixDashboardHomePageTests { } public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=hystrix-dashboard").run(); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=hystrix-dashboard").run(); } } diff --git a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardTests.java b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardTests.java index 954ba5c7..99aaca87 100644 --- a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardTests.java +++ b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardTests.java @@ -16,31 +16,29 @@ package org.springframework.cloud.netflix.hystrix.dashboard; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.hystrix.dashboard.HystrixDashboardTests.Application; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; /** * @author Dave Syer */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.application.name=hystrix-dashboard" }) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=hystrix-dashboard" }) public class HystrixDashboardTests { @Value("${local.server.port}") @@ -48,8 +46,8 @@ public class HystrixDashboardTests { @Test public void homePage() { - ResponseEntity entity = new TestRestTemplate().getForEntity( - "http://localhost:" + this.port + "/hystrix", String.class); + ResponseEntity entity = new TestRestTemplate() + .getForEntity("http://localhost:" + this.port + "/hystrix", String.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); String body = entity.getBody(); assertTrue(body.contains("")); @@ -59,10 +57,9 @@ public class HystrixDashboardTests { @Test public void cssAvailable() { - ResponseEntity entity = new TestRestTemplate() - .getForEntity( - "http://localhost:" + this.port + "/hystrix/css/global.css", - String.class); + ResponseEntity entity = new TestRestTemplate().getForEntity( + "http://localhost:" + this.port + "/hystrix/css/global.css", + String.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); } @@ -81,8 +78,8 @@ public class HystrixDashboardTests { protected static class Application { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).properties( - "spring.application.name=hystrix-dashboard").run(); + new SpringApplicationBuilder(Application.class) + .properties("spring.application.name=hystrix-dashboard").run(); } } diff --git a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTests.java b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTests.java index 30f5d87a..d8bae20e 100644 --- a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTests.java +++ b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTests.java @@ -20,12 +20,11 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -35,9 +34,8 @@ import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = HystrixStreamTests.Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "spring.jmx.enabled=true" }) +@SpringBootTest(classes = HystrixStreamTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "server.port=0", "spring.jmx.enabled=true" }) @DirtiesContext public class HystrixStreamTests { diff --git a/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java b/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java index fca2240f..0112061a 100644 --- a/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java +++ b/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java @@ -16,20 +16,22 @@ package org.springframework.cloud.netflix.sidecar; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; -import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SidecarApplication.class) -@WebIntegrationTest(randomPort = true, value = {"spring.application.name=mytest", "spring.cloud.client.hostname=mhhost", "spring.application.instance_id=1", "eureka.instance.hostname=mhhost", "sidecar.port=7000"}) +@SpringBootTest(classes = SidecarApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=mytest", "spring.cloud.client.hostname=mhhost", + "spring.application.instance_id=1", "eureka.instance.hostname=mhhost", + "sidecar.port=7000" }) public class SidecarApplicationTests { @Autowired diff --git a/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/HystrixStreamAggregatorTests.java b/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/HystrixStreamAggregatorTests.java index d5d2c1df..998bb1ca 100644 --- a/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/HystrixStreamAggregatorTests.java +++ b/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/HystrixStreamAggregatorTests.java @@ -16,19 +16,19 @@ package org.springframework.cloud.netflix.turbine.stream; -import java.util.Map; - -import org.junit.Rule; -import org.junit.Test; -import org.springframework.boot.test.OutputCapture; - -import com.fasterxml.jackson.databind.ObjectMapper; - import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertThat; +import java.util.Map; + +import org.junit.Rule; +import org.junit.Test; +import org.springframework.boot.test.rule.OutputCapture; + +import com.fasterxml.jackson.databind.ObjectMapper; + import rx.subjects.PublishSubject; public class HystrixStreamAggregatorTests { diff --git a/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/TurbinePortApplicationListenerTests.java b/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/TurbinePortApplicationListenerTests.java index 5c53bd94..887cfce8 100644 --- a/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/TurbinePortApplicationListenerTests.java +++ b/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/TurbinePortApplicationListenerTests.java @@ -5,7 +5,7 @@ import static org.junit.Assert.*; import org.junit.Test; import org.springframework.boot.SpringApplication; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; -import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.StandardEnvironment; diff --git a/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/TurbineStreamTests.java b/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/TurbineStreamTests.java index 9e7d44cc..5d2a7af7 100644 --- a/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/TurbineStreamTests.java +++ b/spring-cloud-netflix-turbine-stream/src/test/java/org/springframework/cloud/netflix/turbine/stream/TurbineStreamTests.java @@ -20,18 +20,16 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; /** * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = TurbineStreamTests.Application.class) -@WebAppConfiguration -@IntegrationTest({ "server.port=0", "turbine.stream.port=0", "spring.jmx.enabled=true" }) +@SpringBootTest(classes = TurbineStreamTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "turbine.stream.port=0", "spring.jmx.enabled=true" }) public class TurbineStreamTests { @EnableAutoConfiguration diff --git a/spring-cloud-netflix-turbine/src/test/java/org/springframework/cloud/netflix/turbine/TurbineHttpTests.java b/spring-cloud-netflix-turbine/src/test/java/org/springframework/cloud/netflix/turbine/TurbineHttpTests.java index 36d8c450..95adc064 100644 --- a/spring-cloud-netflix-turbine/src/test/java/org/springframework/cloud/netflix/turbine/TurbineHttpTests.java +++ b/spring-cloud-netflix-turbine/src/test/java/org/springframework/cloud/netflix/turbine/TurbineHttpTests.java @@ -20,23 +20,23 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = TurbineHttpTests.TurbineHttpSampleApplication.class) -@WebIntegrationTest(randomPort = true) +@SpringBootTest(classes = TurbineHttpTests.TurbineHttpSampleApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class TurbineHttpTests { @EnableAutoConfiguration @EnableTurbine public static class TurbineHttpSampleApplication { public static void main(String[] args) { - new SpringApplicationBuilder().sources(TurbineHttpSampleApplication.class).run(args); + new SpringApplicationBuilder().sources(TurbineHttpSampleApplication.class) + .run(args); } } From 0095ba89843cdc5d85a1d1f8703d2ca5249e9aa0 Mon Sep 17 00:00:00 2001 From: Michael Hartle Date: Tue, 26 Jul 2016 13:37:46 +0200 Subject: [PATCH 02/19] Fixed an issue where the pre FormBodyWrapperFilter adds multiples of every multipart part to a request --- .../cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java index 35a3a45a..4231ecc4 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java @@ -184,10 +184,10 @@ public class FormBodyWrapperFilter extends ZuulFilter { MultipartRequest multi = (MultipartRequest) this.request; for (Entry> parts : multi .getMultiFileMap().entrySet()) { - for (Part file : this.request.getParts()) { + for (MultipartFile file : parts.getValue()) { HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData(file.getName(), - file.getSubmittedFileName()); + file.getOriginalFilename()); if (file.getContentType() != null) { headers.setContentType( MediaType.valueOf(file.getContentType())); From 8bb223f6e3975d1d2b5d692cdc7244c18eaca5ae Mon Sep 17 00:00:00 2001 From: Michael Hartle Date: Tue, 2 Aug 2016 12:15:15 +0200 Subject: [PATCH 03/19] Added a minimal test for FormBodyWrapperFilter handling multiple part names with multiple parts --- .../pre/FormBodyWrapperFilterTests.java | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilterTests.java diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilterTests.java new file mode 100644 index 00000000..10ef5b4e --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilterTests.java @@ -0,0 +1,188 @@ +package org.springframework.cloud.netflix.zuul.filters.pre; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.Part; + +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.springframework.mock.web.MockMultipartHttpServletRequest; + +import com.netflix.zuul.context.RequestContext; + +/** + * @author Michael Hartle + */ +public class FormBodyWrapperFilterTests { + + private FormBodyWrapperFilter filter; + + private MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest(); + + @Before + public void init() { + this.filter = new FormBodyWrapperFilter(); + RequestContext ctx = RequestContext.getCurrentContext(); + ctx.clear(); + ctx.setRequest(this.request); + } + + @Test + public void multiplePartNamesWithMultipleParts() throws IOException, ServletException { + this.request.setRequestURI("/api/foo/1"); + this.request.setRemoteAddr("5.6.7.8"); + + final Map> firstPartHeaders = new HashMap<>(); + final byte[] firstPartBody = "{ \"u\" : 1 }".getBytes(); + final Part firstPart = new MockPart("a", "application/json", null, firstPartHeaders, firstPartBody); + this.request.addPart(firstPart); + + final Map> secondPartHeaders = new HashMap<>(); + final byte[] secondPartBody = "%PDF...1".getBytes(); + final Part secondPart = new MockPart("b", "application/pdf", "document.pdf", secondPartHeaders, secondPartBody); + this.request.addPart(secondPart); + + final Map> thirdPartHeaders = new HashMap<>(); + final byte[] thirdPartBody = "%PDF...2".getBytes(); + final Part thirdPart = new MockPart("c", "application/pdf", "attachment1.pdf", thirdPartHeaders, thirdPartBody); + this.request.addPart(thirdPart); + + final Map> fourthPartHeaders = new HashMap<>(); + final byte[] fourthPartBody = "%PDF...3".getBytes(); + final Part fourthPart = new MockPart("c", "application/pdf", "attachment2.pdf", fourthPartHeaders, fourthPartBody); + this.request.addPart(fourthPart); + + final Map> fifthPartHeaders = new HashMap<>(); + final byte[] fifthPartBody = "%PDF...4".getBytes(); + final Part fifthPart = new MockPart("c", "application/pdf", "attachment3.pdf", fifthPartHeaders, fifthPartBody); + this.request.addPart(fifthPart); + + this.filter.run(); + + final RequestContext ctx = RequestContext.getCurrentContext(); + assertEquals("/api/foo/1", ctx.getRequest().getRequestURI()); + assertEquals("5.6.7.8", ctx.getRequest().getRemoteAddr()); + assertEquals(5, ctx.getRequest().getParts().size()); + + final Part[] parts = ctx.getRequest().getParts().toArray(new Part[0]); + assertEquals("a", parts[0].getName()); + assertEquals(null, parts[0].getSubmittedFileName()); + assertEquals("application/json", parts[0].getContentType()); + assertArrayEquals(firstPartBody, IOUtils.toByteArray(parts[0].getInputStream())); + + assertEquals("b", parts[1].getName()); + assertEquals("document.pdf", parts[1].getSubmittedFileName()); + assertEquals("application/pdf", parts[1].getContentType()); + assertArrayEquals(secondPartBody, IOUtils.toByteArray(parts[1].getInputStream())); + + assertEquals("c", parts[2].getName()); + assertEquals("attachment1.pdf", parts[2].getSubmittedFileName()); + assertEquals("application/pdf", parts[2].getContentType()); + assertArrayEquals(thirdPartBody, IOUtils.toByteArray(parts[2].getInputStream())); + + assertEquals("c", parts[3].getName()); + assertEquals("attachment2.pdf", parts[3].getSubmittedFileName()); + assertEquals("application/pdf", parts[3].getContentType()); + assertArrayEquals(fourthPartBody, IOUtils.toByteArray(parts[3].getInputStream())); + + assertEquals("c", parts[4].getName()); + assertEquals("attachment3.pdf", parts[4].getSubmittedFileName()); + assertEquals("application/pdf", parts[4].getContentType()); + assertArrayEquals(fifthPartBody, IOUtils.toByteArray(parts[4].getInputStream())); + } + + private class MockPart implements Part { + private final String name; + private final String contentType; + private final String submittedFileName; + private final Map> headers; + private final byte[] body; + + public MockPart(final String name, final String contentType, final String submittedFileName, final Map> headers, final byte[] body) { + this.name = name; + this.contentType = contentType; + this.submittedFileName = submittedFileName; + this.headers = headers; + this.body = body; + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(this.body); + } + + @Override + public String getContentType() { + return this.contentType; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String getSubmittedFileName() { + return this.submittedFileName; + } + + @Override + public long getSize() { + return this.body != null ? this.body.length : 0; + } + + @Override + public void write(String fileName) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public void delete() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public String getHeader(String name) { + if (this.headers == null) { + return null; + } + + final List values = this.headers.get(name); + + if (values == null || values.size() == 0) { + return null; + } + + return values.get(0); + } + + @Override + public Collection getHeaders(String name) { + if (this.headers == null) { + return null; + } + + return this.headers.get(name); + } + + @Override + public Collection getHeaderNames() { + if (this.headers == null) { + return null; + } + + return this.headers.keySet(); + } + } +} From d21a7ef8e203ec8310a58493d37d3f3baf712789 Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Beaudet Date: Wed, 3 Aug 2016 13:51:38 -0400 Subject: [PATCH 04/19] Fix an issue where the FormBodyWrapperFilter would encode the form parameters differently than on the original request. The FormBodyWrapperFilter handles the application/x-www-form-urlencoded. In the case of requests received by curl or javascript, the FormHttpMessageConverter will reencode the parameters differently (for example, '(' will be encoded while it's not with the javascript encodeURIComponent method). While this doesn't create any problem, the content length was not properly set in AbstractRibbonCommand. This causes the form params being stripped or the backend server would wait a long time for additional bytes depending on if the content length header was bigger/smaller than the actual data. --- .../filters/pre/FormBodyWrapperFilter.java | 16 +++++ .../route/support/AbstractRibbonCommand.java | 6 +- ...stClientRibbonCommandIntegrationTests.java | 25 +++++++ .../NoEncodingFormHttpMessageConverter.java | 65 +++++++++++++++++++ .../route/support/ZuulProxyTestBase.java | 45 ++++++++++++- 5 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/NoEncodingFormHttpMessageConverter.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java index 35a3a45a..3c252b4b 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/FormBodyWrapperFilter.java @@ -26,6 +26,8 @@ import java.util.Map.Entry; import java.util.Set; import javax.servlet.ServletInputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletRequestWrapper; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Part; @@ -57,13 +59,19 @@ import com.netflix.zuul.http.ServletInputStreamWrapper; public class FormBodyWrapperFilter extends ZuulFilter { private Field requestField; + private Field servletRequestField; public FormBodyWrapperFilter() { this.requestField = ReflectionUtils.findField(HttpServletRequestWrapper.class, "req", HttpServletRequest.class); + this.servletRequestField = ReflectionUtils.findField(ServletRequestWrapper.class, + "request", ServletRequest.class); Assert.notNull(this.requestField, "HttpServletRequestWrapper.req field not found"); + Assert.notNull(this.servletRequestField, + "ServletRequestWrapper.request field not found"); this.requestField.setAccessible(true); + this.servletRequestField.setAccessible(true); } @Override @@ -113,6 +121,9 @@ public class FormBodyWrapperFilter extends ZuulFilter { .getField(this.requestField, request); wrapper = new FormBodyRequestWrapper(wrapped); ReflectionUtils.setField(this.requestField, request, wrapper); + if(request instanceof ServletRequestWrapper) { + ReflectionUtils.setField(this.servletRequestField, request, wrapper); + } } else { wrapper = new FormBodyRequestWrapper(request); @@ -159,6 +170,11 @@ public class FormBodyWrapperFilter extends ZuulFilter { } return this.contentLength; } + + @Override + public long getContentLengthLong() { + return getContentLength(); + } @Override public ServletInputStream getInputStream() throws IOException { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/support/AbstractRibbonCommand.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/support/AbstractRibbonCommand.java index 04261c79..eb15b4ba 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/support/AbstractRibbonCommand.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/support/AbstractRibbonCommand.java @@ -74,9 +74,9 @@ public abstract class AbstractRibbonCommand> converters = new ArrayList<>(); + converters.addAll(Arrays.asList(new StringHttpMessageConverter(), + new NoEncodingFormHttpMessageConverter())); + testRestTemplate.setMessageConverters(converters); + + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add("foo", "(bar)"); + ResponseEntity result = testRestTemplate.postForEntity( + "http://localhost:" + this.port + "/simple/local", map, String.class); + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertEquals("Posted [(bar)] and Content-Length was: -1!", result.getBody()); + } @Test public void routeLocatorOverridden() { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/NoEncodingFormHttpMessageConverter.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/NoEncodingFormHttpMessageConverter.java new file mode 100644 index 00000000..3f54c909 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/NoEncodingFormHttpMessageConverter.java @@ -0,0 +1,65 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.zuul.filters.route.support; + +import java.io.IOException; +import java.util.Iterator; + +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.MediaType; +import org.springframework.http.converter.FormHttpMessageConverter; +import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StreamUtils; + +/** + * @author Jacques-Etienne Beaudet + */ +public class NoEncodingFormHttpMessageConverter extends FormHttpMessageConverter { + + @SuppressWarnings("unchecked") + @Override + public void write(MultiValueMap map, MediaType contentType, HttpOutputMessage outputMessage) + throws IOException, HttpMessageNotWritableException { + + MultiValueMap form = (MultiValueMap) map; + StringBuilder builder = new StringBuilder(); + for (Iterator nameIterator = form.keySet().iterator(); nameIterator.hasNext();) { + String name = nameIterator.next(); + for (Iterator valueIterator = form.get(name).iterator(); valueIterator.hasNext();) { + String value = valueIterator.next(); + builder.append(name); + if (value != null) { + builder.append('='); + builder.append(value); + if (valueIterator.hasNext()) { + builder.append('&'); + } + } + } + if (nameIterator.hasNext()) { + builder.append('&'); + } + } + final byte[] bytes = builder.toString().getBytes(FormHttpMessageConverter.DEFAULT_CHARSET); + outputMessage.getHeaders().setContentLength(bytes.length); + outputMessage.getHeaders().setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + StreamUtils.copy(bytes, outputMessage.getBody()); + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/ZuulProxyTestBase.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/ZuulProxyTestBase.java index ffdb3771..21e993c4 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/ZuulProxyTestBase.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/ZuulProxyTestBase.java @@ -17,6 +17,8 @@ package org.springframework.cloud.netflix.zuul.filters.route.support; +import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -25,7 +27,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.servlet.http.HttpServletRequest; -import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -45,7 +46,12 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.FormHttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -53,6 +59,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import com.netflix.loadbalancer.Server; @@ -247,6 +254,23 @@ public abstract class ZuulProxyTestBase { assertEquals(HttpStatus.OK, result.getStatusCode()); assertEquals("Patched 1!", result.getBody()); } + + @SuppressWarnings("deprecation") + @Test + public void javascriptEncodedFormParams() { + TestRestTemplate testRestTemplate = new TestRestTemplate(); + ArrayList> converters = new ArrayList<>(); + converters.addAll(Arrays.asList(new StringHttpMessageConverter(), + new NoEncodingFormHttpMessageConverter())); + testRestTemplate.setMessageConverters(converters); + + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add("foo", "(bar)"); + ResponseEntity result = testRestTemplate.postForEntity( + "http://localhost:" + this.port + "/simple/local", map, String.class); + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertEquals("Posted [(bar)] and Content-Length was: 13!", result.getBody()); + } protected abstract boolean supportsPatch(); @@ -268,6 +292,12 @@ public abstract class ZuulProxyTestBase { public String local() { return "Hello local"; } + + @RequestMapping(value = "/local", method = RequestMethod.POST) + public String postWithFormParam(HttpServletRequest request, + @RequestBody MultiValueMap body) { + return "Posted " + body.get("foo") + " and Content-Length was: " + request.getContentLength() + "!"; + } @RequestMapping(value = "/local/{id}", method = RequestMethod.DELETE) public String delete(@PathVariable String id) { @@ -341,6 +371,19 @@ public abstract class ZuulProxyTestBase { return mapping; } } + + @Configuration + public class FormEncodedMessageConverterConfiguration extends WebMvcConfigurerAdapter { + + @Override + public void configureMessageConverters(List> converters) { + FormHttpMessageConverter converter = new FormHttpMessageConverter(); + MediaType mediaType = new MediaType("application", "x-www-form-urlencoded", Charset.forName("UTF-8")); + converter.setSupportedMediaTypes(Arrays.asList(mediaType)); + converters.add(converter); + super.configureMessageConverters(converters); + } + } // Load balancer with fixed server list for "simple" pointing to localhost @Configuration From eed72600c5b812146328c71d3fa8a5040aad4a00 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 8 Aug 2016 11:47:29 -0400 Subject: [PATCH 05/19] initial commit for circleci build --- circle.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 circle.yml diff --git a/circle.yml b/circle.yml new file mode 100644 index 00000000..526f14ff --- /dev/null +++ b/circle.yml @@ -0,0 +1,25 @@ +general: + branches: + ignore: + - gh-pages # list of branches to ignore +machine: + java: + version: oraclejdk8 + environment: + _JAVA_OPTIONS: "-Xms1024m -Xmx2048m" +dependencies: + override: + - ./mvnw -s .settings.xml -U --fail-never dependency:go-offline || true +test: + override: + - ./mvnw -s .settings.xml clean install -U -P sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn + post: + - mkdir -p $CIRCLE_TEST_REPORTS/junit/ + - find . -type f -regex ".*/target/.*-reports/.*" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \; +# - bash <(curl -s https://codecov.io/bash) + +notify: + webhooks: + # A list of hook hashes, containing the url field + # gitter hook +# - url: https://webhooks.gitter.im/e/fac69f6fc000ef14f7ec From 5676c8f7533996889db13bda863cf8d73dedb162 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 8 Aug 2016 13:20:12 -0400 Subject: [PATCH 06/19] added artifacts directory to circle config --- circle.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/circle.yml b/circle.yml index 526f14ff..39c52677 100644 --- a/circle.yml +++ b/circle.yml @@ -2,6 +2,8 @@ general: branches: ignore: - gh-pages # list of branches to ignore + artifacts: + - "target/" machine: java: version: oraclejdk8 From 4f93897b71b93830fd021af05b3995f3fd94df44 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 8 Aug 2016 13:57:23 -0400 Subject: [PATCH 07/19] more circle ci configuration --- circle.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/circle.yml b/circle.yml index 39c52677..20b3eeeb 100644 --- a/circle.yml +++ b/circle.yml @@ -3,7 +3,7 @@ general: ignore: - gh-pages # list of branches to ignore artifacts: - - "target/" + - ".*/target/" machine: java: version: oraclejdk8 @@ -18,10 +18,10 @@ test: post: - mkdir -p $CIRCLE_TEST_REPORTS/junit/ - find . -type f -regex ".*/target/.*-reports/.*" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \; -# - bash <(curl -s https://codecov.io/bash) + - bash <(curl -s https://codecov.io/bash) notify: webhooks: # A list of hook hashes, containing the url field # gitter hook -# - url: https://webhooks.gitter.im/e/fac69f6fc000ef14f7ec + - url: https://webhooks.gitter.im/e/22e6bb4eb945dd61ba54 From 52c956831e4daf6f2bd09a4b8b960c28030912fd Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 8 Aug 2016 15:03:00 -0400 Subject: [PATCH 08/19] circleci updates --- circle.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/circle.yml b/circle.yml index 20b3eeeb..466be43d 100644 --- a/circle.yml +++ b/circle.yml @@ -2,8 +2,6 @@ general: branches: ignore: - gh-pages # list of branches to ignore - artifacts: - - ".*/target/" machine: java: version: oraclejdk8 @@ -16,6 +14,7 @@ test: override: - ./mvnw -s .settings.xml clean install -U -P sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn post: + - find . -type f -regex ".*/spring-cloud-*.*/target/*.*" | cpio -pdm $CIRCLE_ARTIFACTS - mkdir -p $CIRCLE_TEST_REPORTS/junit/ - find . -type f -regex ".*/target/.*-reports/.*" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \; - bash <(curl -s https://codecov.io/bash) From 5b0f6013e859b2b72e4746bdbb48de16dfb0620d Mon Sep 17 00:00:00 2001 From: Daniel Lavoie Date: Mon, 8 Aug 2016 23:05:10 +0200 Subject: [PATCH 09/19] Expose security context to any Hystrix command. Fix issue gh-1054 --- .../main/asciidoc/spring-cloud-netflix.adoc | 2 + spring-cloud-netflix-core/pom.xml | 5 ++ .../HystrixSecurityAutoConfiguration.java | 87 +++++++++++++++++++ .../SecurityContextConcurrencyStrategy.java | 78 +++++++++++++++++ .../netflix/zuul/filters/ZuulProperties.java | 2 +- .../main/resources/META-INF/spring.factories | 1 + .../netflix/hystrix/HystrixOnlyTests.java | 40 +++++++-- .../security/HystrixSecurityApplication.java | 32 +++++++ .../security/HystrixSecurityTests.java | 87 +++++++++++++++++++ .../app/CustomConcurrenyStrategy.java | 23 +++++ .../security/app/ProxyUsernameController.java | 36 ++++++++ .../hystrix/security/app/TestInterceptor.java | 40 +++++++++ .../hystrix/security/app/UsernameClient.java | 30 +++++++ .../security/app/UsernameController.java | 33 +++++++ .../zuul/filters/ZuulPropertiesTests.java | 7 +- .../src/test/resources/application.yml | 8 ++ 16 files changed, 501 insertions(+), 10 deletions(-) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityAutoConfiguration.java create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/SecurityContextConcurrencyStrategy.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityApplication.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityTests.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/CustomConcurrenyStrategy.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/ProxyUsernameController.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/TestInterceptor.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/UsernameClient.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/UsernameController.java diff --git a/docs/src/main/asciidoc/spring-cloud-netflix.adoc b/docs/src/main/asciidoc/spring-cloud-netflix.adoc index 31b6d208..41d0e2f9 100644 --- a/docs/src/main/asciidoc/spring-cloud-netflix.adoc +++ b/docs/src/main/asciidoc/spring-cloud-netflix.adoc @@ -507,6 +507,8 @@ If you want some thread local context to propagate into a `@HystrixCommand` the The same thing applies if you are using `@SessionScope` or `@RequestScope`. You will know when you need to do this because of a runtime exception that says it can't find the scoped context. +You also have the option to set the `hystrix.shareSecurityContext` property to `true`. Doing so will auto configure an Hystrix concurrency strategy plugin hook who will transfer the `SecurityContext` from your main thread to the one used by the Hystrix command. Hystrix does not allow multiple hystrix concurrency strategy to be registered so an extension mechanism is available by declaring your own `HystrixConcurrencyStrategy` as a Spring bean. Spring Cloud will lookup for your implementation within the Spring context and wrap it inside its own plugin. + ### Health Indicator The state of the connected circuit breakers are also exposed in the diff --git a/spring-cloud-netflix-core/pom.xml b/spring-cloud-netflix-core/pom.xml index 91b38f2a..45c1e2de 100644 --- a/spring-cloud-netflix-core/pom.xml +++ b/spring-cloud-netflix-core/pom.xml @@ -34,6 +34,11 @@ spring-boot-starter-actuator true + + org.springframework.boot + spring-boot-starter-security + true + org.springframework.boot spring-boot-starter-web diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityAutoConfiguration.java new file mode 100644 index 00000000..41442c9a --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityAutoConfiguration.java @@ -0,0 +1,87 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.hystrix.security; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.AllNestedConditions; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.netflix.hystrix.security.HystrixSecurityAutoConfiguration.HystrixSecurityCondition; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.context.SecurityContext; + +import com.netflix.hystrix.Hystrix; +import com.netflix.hystrix.strategy.HystrixPlugins; +import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy; +import com.netflix.hystrix.strategy.eventnotifier.HystrixEventNotifier; +import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook; +import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisher; +import com.netflix.hystrix.strategy.properties.HystrixPropertiesStrategy; + +/** + * @author Daniel Lavoie + */ +@Configuration +@Conditional(HystrixSecurityCondition.class) +@ConditionalOnClass({ Hystrix.class, SecurityContext.class }) +public class HystrixSecurityAutoConfiguration { + @Autowired(required = false) + private HystrixConcurrencyStrategy existingConcurrencyStrategy; + + @PostConstruct + public void init() { + // Keeps references of existing Hystrix plugins. + HystrixEventNotifier eventNotifier = HystrixPlugins.getInstance() + .getEventNotifier(); + HystrixMetricsPublisher metricsPublisher = HystrixPlugins.getInstance() + .getMetricsPublisher(); + HystrixPropertiesStrategy propertiesStrategy = HystrixPlugins.getInstance() + .getPropertiesStrategy(); + HystrixCommandExecutionHook commandExecutionHook = HystrixPlugins.getInstance() + .getCommandExecutionHook(); + + HystrixPlugins.reset(); + + // Registers existing plugins excepts the Concurrent Strategy plugin. + HystrixPlugins.getInstance().registerConcurrencyStrategy( + new SecurityContextConcurrencyStrategy(existingConcurrencyStrategy)); + HystrixPlugins.getInstance().registerEventNotifier(eventNotifier); + HystrixPlugins.getInstance().registerMetricsPublisher(metricsPublisher); + HystrixPlugins.getInstance().registerPropertiesStrategy(propertiesStrategy); + HystrixPlugins.getInstance().registerCommandExecutionHook(commandExecutionHook); + } + + static class HystrixSecurityCondition extends AllNestedConditions { + + public HystrixSecurityCondition() { + super(ConfigurationPhase.REGISTER_BEAN); + } + + @ConditionalOnProperty(name = "feign.hystrix.enabled", matchIfMissing = true) + static class HystrixEnabled { + + } + + @ConditionalOnProperty(name = "hystrix.shareSecurityContext") + static class ShareSecurityContext { + + } + } +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/SecurityContextConcurrencyStrategy.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/SecurityContextConcurrencyStrategy.java new file mode 100644 index 00000000..48079e74 --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/SecurityContextConcurrencyStrategy.java @@ -0,0 +1,78 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.hystrix.security; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.springframework.security.concurrent.DelegatingSecurityContextCallable; + +import com.netflix.hystrix.HystrixThreadPoolKey; +import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy; +import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariable; +import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariableLifecycle; +import com.netflix.hystrix.strategy.properties.HystrixProperty; + +/** + * @author daniellavoie + */ +public class SecurityContextConcurrencyStrategy extends HystrixConcurrencyStrategy { + private HystrixConcurrencyStrategy existingConcurrencyStrategy; + + public SecurityContextConcurrencyStrategy( + HystrixConcurrencyStrategy existingConcurrencyStrategy) { + this.existingConcurrencyStrategy = existingConcurrencyStrategy; + } + + @Override + public BlockingQueue getBlockingQueue(int maxQueueSize) { + return existingConcurrencyStrategy != null + ? existingConcurrencyStrategy.getBlockingQueue(maxQueueSize) + : super.getBlockingQueue(maxQueueSize); + } + + @Override + public HystrixRequestVariable getRequestVariable( + HystrixRequestVariableLifecycle rv) { + return existingConcurrencyStrategy != null + ? existingConcurrencyStrategy.getRequestVariable(rv) + : super.getRequestVariable(rv); + } + + @Override + public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey, + HystrixProperty corePoolSize, + HystrixProperty maximumPoolSize, + HystrixProperty keepAliveTime, TimeUnit unit, + BlockingQueue workQueue) { + return existingConcurrencyStrategy != null + ? existingConcurrencyStrategy.getThreadPool(threadPoolKey, corePoolSize, + maximumPoolSize, keepAliveTime, unit, workQueue) + : super.getThreadPool(threadPoolKey, corePoolSize, maximumPoolSize, + keepAliveTime, unit, workQueue); + } + + @Override + public Callable wrapCallable(Callable callable) { + return existingConcurrencyStrategy != null + ? existingConcurrencyStrategy + .wrapCallable(new DelegatingSecurityContextCallable(callable)) + : super.wrapCallable(new DelegatingSecurityContextCallable(callable)); + } +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java index debf0d10..0d49e12b 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java @@ -48,7 +48,7 @@ public class ZuulProperties { * duplicated if the proxy and the backend are secured with Spring. By default they * are added to the ignored headers if Spring Security is present. */ - private static final List SECURITY_HEADERS = Arrays.asList("Pragma", + public static final List SECURITY_HEADERS = Arrays.asList("Pragma", "Cache-Control", "X-Frame-Options", "X-Content-Type-Options", "X-XSS-Protection", "Expires"); diff --git a/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories b/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories index 709e2987..09988567 100644 --- a/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories @@ -5,6 +5,7 @@ org.springframework.cloud.netflix.feign.FeignAutoConfiguration,\ org.springframework.cloud.netflix.feign.encoding.FeignAcceptGzipEncodingAutoConfiguration,\ org.springframework.cloud.netflix.feign.encoding.FeignContentGzipEncodingAutoConfiguration,\ org.springframework.cloud.netflix.hystrix.HystrixAutoConfiguration,\ +org.springframework.cloud.netflix.hystrix.security.HystrixSecurityAutoConfiguration,\ org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration,\ org.springframework.cloud.netflix.rx.RxJavaAutoConfiguration,\ org.springframework.cloud.netflix.metrics.servo.ServoMetricsAutoConfiguration diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixOnlyTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixOnlyTests.java index 1e3478d5..799c8ac0 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixOnlyTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/HystrixOnlyTests.java @@ -16,6 +16,11 @@ package org.springframework.cloud.netflix.hystrix; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Base64; import java.util.Map; import org.junit.Test; @@ -30,6 +35,9 @@ import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.bind.annotation.RequestMapping; @@ -37,10 +45,6 @@ import org.springframework.web.bind.annotation.RestController; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - /** * @author Spencer Gibb */ @@ -51,6 +55,12 @@ public class HystrixOnlyTests { @Value("${local.server.port}") private int port; + + @Value("${security.user.username}") + private String username; + + @Value("${security.user.password}") + private String password; @Test public void testNormalExecution() { @@ -82,9 +92,27 @@ public class HystrixOnlyTests { map.containsKey("discovery")); } + + private Map getHealth() { - return new TestRestTemplate().getForObject("http://localhost:" + this.port - + "/admin/health", Map.class); + return new TestRestTemplate().exchange( + "http://localhost:" + this.port + "/admin/health", HttpMethod.GET, + new HttpEntity(createBasicAuthHeader(username, password)), + Map.class).getBody(); + } + + public static HttpHeaders createBasicAuthHeader(final String username, + final String password) { + return new HttpHeaders() { + private static final long serialVersionUID = 1766341693637204893L; + + { + String auth = username + ":" + password; + byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes()); + String authHeader = "Basic " + new String(encodedAuth); + this.set("Authorization", authHeader); + } + }; } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityApplication.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityApplication.java new file mode 100644 index 00000000..7d146703 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityApplication.java @@ -0,0 +1,32 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.hystrix.security; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.feign.EnableFeignClients; +import org.springframework.cloud.netflix.hystrix.security.app.UsernameClient; +import org.springframework.context.annotation.Configuration; + +/** + * @author Daniel Lavoie + */ +@Configuration +@SpringBootApplication +@EnableFeignClients(clients = UsernameClient.class) +public class HystrixSecurityApplication { + +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityTests.java new file mode 100644 index 00000000..6645a905 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityTests.java @@ -0,0 +1,87 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.hystrix.security; + +import java.util.Base64; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.cloud.netflix.hystrix.security.app.CustomConcurrenyStrategy; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.client.RestTemplate; + +/** + * Tests that a secured web service returning values using a feign client properly access + * the security context from a hystrix command. + * @author Daniel Lavoie + */ +@RunWith(SpringJUnit4ClassRunner.class) +@DirtiesContext +@SpringBootTest(classes = HystrixSecurityApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, properties = "username.ribbon.listOfServers=localhost:${local.server.port}") +public class HystrixSecurityTests { + @Autowired + private CustomConcurrenyStrategy customConcurrenyStrategy; + + @Value("${local.server.port}") + private String serverPort; + + @Value("${security.user.username}") + private String username; + + @Value("${security.user.password}") + private String password; + + @Test + public void testFeignHystrixSecurity() { + HttpHeaders headers = HystrixSecurityTests.createBasicAuthHeader(username, + password); + + String usernameResult = new RestTemplate() + .exchange("http://localhost:" + serverPort + "/proxy-username", + HttpMethod.GET, new HttpEntity(headers), String.class) + .getBody(); + + Assert.assertTrue("Username should have been intercepted by feign interceptor.", + username.equals(usernameResult)); + + Assert.assertTrue("Custom hook should have been called.", + customConcurrenyStrategy.isHookCalled()); + } + + public static HttpHeaders createBasicAuthHeader(final String username, + final String password) { + return new HttpHeaders() { + private static final long serialVersionUID = 1766341693637204893L; + + { + String auth = username + ":" + password; + byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes()); + String authHeader = "Basic " + new String(encodedAuth); + this.set("Authorization", authHeader); + } + }; + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/CustomConcurrenyStrategy.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/CustomConcurrenyStrategy.java new file mode 100644 index 00000000..674adf67 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/CustomConcurrenyStrategy.java @@ -0,0 +1,23 @@ +package org.springframework.cloud.netflix.hystrix.security.app; + +import java.util.concurrent.Callable; + +import org.springframework.stereotype.Component; + +import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy; + +@Component +public class CustomConcurrenyStrategy extends HystrixConcurrencyStrategy { + private boolean hookCalled; + + @Override + public Callable wrapCallable(Callable callable) { + this.hookCalled = true; + + return super.wrapCallable(callable); + } + + public boolean isHookCalled() { + return hookCalled; + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/ProxyUsernameController.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/ProxyUsernameController.java new file mode 100644 index 00000000..2f30427c --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/ProxyUsernameController.java @@ -0,0 +1,36 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.hystrix.security.app; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Daniel Lavoie + */ +@RestController +@RequestMapping("/proxy-username") +public class ProxyUsernameController { + @Autowired + private UsernameClient usernameClient; + + @RequestMapping + public String getUsername() { + return usernameClient.getUsername(); + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/TestInterceptor.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/TestInterceptor.java new file mode 100644 index 00000000..c904de7e --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/TestInterceptor.java @@ -0,0 +1,40 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.hystrix.security.app; + +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +import feign.RequestInterceptor; +import feign.RequestTemplate; + +/** + * This interceptor should be called from an Hyxtrix command execution thread. It is + * access the SecurityContext and settings an http header from the authentication details. + * + * @author Daniel Lavoie + */ +@Component +public class TestInterceptor implements RequestInterceptor { + + @Override + public void apply(RequestTemplate template) { + if (SecurityContextHolder.getContext().getAuthentication() != null) + template.header("username", + SecurityContextHolder.getContext().getAuthentication().getName()); + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/UsernameClient.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/UsernameClient.java new file mode 100644 index 00000000..b630f839 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/UsernameClient.java @@ -0,0 +1,30 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.hystrix.security.app; + +import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * @author Daniel Lavoie + */ +@FeignClient("username") +public interface UsernameClient { + + @RequestMapping("/username") + public String getUsername(); +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/UsernameController.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/UsernameController.java new file mode 100644 index 00000000..54605b8e --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/app/UsernameController.java @@ -0,0 +1,33 @@ +/* + * Copyright 2013-2016 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.cloud.netflix.hystrix.security.app; + +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Daniel Lavoie + */ +@RestController +@RequestMapping("/username") +public class UsernameController { + @RequestMapping + public String getUsername(@RequestHeader String username){ + return username; + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ZuulPropertiesTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ZuulPropertiesTests.java index 5a1270bb..60e25406 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ZuulPropertiesTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ZuulPropertiesTests.java @@ -46,7 +46,8 @@ public class ZuulPropertiesTests { @Test public void defaultIgnoredHeaders() { - assertTrue(this.zuul.getIgnoredHeaders().isEmpty()); + assertTrue(this.zuul.getIgnoredHeaders() + .containsAll(ZuulProperties.SECURITY_HEADERS)); } @Test @@ -60,8 +61,8 @@ public class ZuulPropertiesTests { ZuulRoute route = new ZuulRoute("foo"); this.zuul.getRoutes().put("foo", route); assertTrue(this.zuul.getRoutes().get("foo").getSensitiveHeaders().isEmpty()); - assertTrue(this.zuul.getSensitiveHeaders().containsAll( - Arrays.asList("Cookie", "Set-Cookie", "Authorization"))); + assertTrue(this.zuul.getSensitiveHeaders() + .containsAll(Arrays.asList("Cookie", "Set-Cookie", "Authorization"))); } @Test diff --git a/spring-cloud-netflix-core/src/test/resources/application.yml b/spring-cloud-netflix-core/src/test/resources/application.yml index 777e546f..dd7d5dea 100644 --- a/spring-cloud-netflix-core/src/test/resources/application.yml +++ b/spring-cloud-netflix-core/src/test/resources/application.yml @@ -53,7 +53,15 @@ zuul: stores: url: http://localhost:8081 path: /stores/** +hystrix: + shareSecurityContext: true feignClient: localappName: localapp methodLevelRequestMappingPath: /hello2 myPlaceholderHeader: myPlaceholderHeaderValue +security: + basic: + path: /proxy-username + user: + username: user + password: password \ No newline at end of file From 36ae029c181821c83eaf0313568951292fab6a6b Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Tue, 9 Aug 2016 11:44:01 -0400 Subject: [PATCH 10/19] circleci updates --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 466be43d..6386b1d8 100644 --- a/circle.yml +++ b/circle.yml @@ -12,7 +12,7 @@ dependencies: - ./mvnw -s .settings.xml -U --fail-never dependency:go-offline || true test: override: - - ./mvnw -s .settings.xml clean install -U -P sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn + - ./mvnw -s .settings.xml clean install org.jacoco:jacoco-maven-plugin:prepare-agent install -U -P sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn post: - find . -type f -regex ".*/spring-cloud-*.*/target/*.*" | cpio -pdm $CIRCLE_ARTIFACTS - mkdir -p $CIRCLE_TEST_REPORTS/junit/ From a4ba11eabb01617686b5c269162d5a1a7784541b Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Tue, 9 Aug 2016 14:31:13 -0400 Subject: [PATCH 11/19] Updated sonar profile configuration --- pom.xml | 43 ++++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/pom.xml b/pom.xml index ba18ea10..bbca6b01 100644 --- a/pom.xml +++ b/pom.xml @@ -177,52 +177,45 @@ sonar - - false - org.jacoco jacoco-maven-plugin - 0.7.4.201502262128 - - ${sonar.jacoco.reportPath} - true - - agent + pre-unit-test prepare-agent + + surefireArgLine + ${project.build.directory}/jacoco.exec + + + + post-unit-test + test + + report + + + + ${project.build.directory}/jacoco.exec + org.apache.maven.plugins maven-surefire-plugin - - ${surefire.plugin.version} - - - listener - org.sonar.java.jacoco.JUnitListener - - + + ${surefireArgLine} - - - org.sonarsource.java - sonar-jacoco-listeners - 3.8 - test - - From ec22c23bc560a39e0b99b682259f8f5e3298ef56 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Tue, 9 Aug 2016 16:45:26 -0400 Subject: [PATCH 12/19] Added CircleCI and Codecov badges --- docs/src/main/asciidoc/README.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/main/asciidoc/README.adoc b/docs/src/main/asciidoc/README.adoc index fa878819..933f7a0f 100644 --- a/docs/src/main/asciidoc/README.adoc +++ b/docs/src/main/asciidoc/README.adoc @@ -1,4 +1,6 @@ -image::https://travis-ci.org/spring-cloud/spring-cloud-netflix.svg?branch=master[Build Status, link=https://travis-ci.org/spring-cloud/spring-cloud-netflix] +image::https://circleci.com/gh/spring-cloud/spring-cloud-netflix/tree/master.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-netflix/tree/master"] +image::https://codecov.io/gh/spring-cloud/spring-cloud-netflix/branch/master/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-netflix/branch/master"] + include::intro.adoc[] From 306b43624bf8501bffcb7b5c80c7f2a8a73cf86a Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Tue, 9 Aug 2016 14:51:19 -0600 Subject: [PATCH 13/19] update readme --- README.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index 6d9556ac..e0597541 100644 --- a/README.adoc +++ b/README.adoc @@ -1,6 +1,8 @@ // Do not edit this file (e.g. go instead to src/main/asciidoc) -image::https://travis-ci.org/spring-cloud/spring-cloud-netflix.svg?branch=master[Build Status, link=https://travis-ci.org/spring-cloud/spring-cloud-netflix] +image::https://circleci.com/gh/spring-cloud/spring-cloud-netflix/tree/master.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-netflix/tree/master"] +image::https://codecov.io/gh/spring-cloud/spring-cloud-netflix/branch/master/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-netflix/branch/master"] + This project provides Netflix OSS integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. With a few From 909a51000fd9762a2212eca77bc0aced343479b8 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Tue, 9 Aug 2016 16:50:57 -0600 Subject: [PATCH 14/19] Remove @Ignore fixes gh-1157 --- .../cloud/netflix/zuul/FormZuulProxyApplicationTests.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulProxyApplicationTests.java index f2d786c1..d0bc21d8 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/FormZuulProxyApplicationTests.java @@ -23,7 +23,6 @@ import java.io.InputStream; import java.util.Map; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; @@ -91,7 +90,6 @@ public class FormZuulProxyApplicationTests { assertEquals("Posted! {foo=[bar]}", result.getBody()); } - @Ignore // TODO: fix this test @Test public void postWithMultipartForm() { MultiValueMap form = new LinkedMultiValueMap(); From b09b0bcdbd29841cb129efd2fd417d862aa929a9 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 10 Aug 2016 10:36:34 -0400 Subject: [PATCH 15/19] Added Codacy badge to README --- README.adoc | 1 + docs/src/main/asciidoc/README.adoc | 1 + 2 files changed, 2 insertions(+) diff --git a/README.adoc b/README.adoc index e0597541..2e14bffb 100644 --- a/README.adoc +++ b/README.adoc @@ -2,6 +2,7 @@ image::https://circleci.com/gh/spring-cloud/spring-cloud-netflix/tree/master.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-netflix/tree/master"] image::https://codecov.io/gh/spring-cloud/spring-cloud-netflix/branch/master/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-netflix/branch/master"] +image::https://api.codacy.com/project/badge/Grade/a6885a06921e4f72a0df0b7aabd6d118["Codacy code quality", link="https://www.codacy.com/app/Spring-Cloud/spring-cloud-netflix?utm_source=github.com&utm_medium=referral&utm_content=spring-cloud/spring-cloud-netflix&utm_campaign=Badge_Grade"] This project provides Netflix OSS integrations for Spring Boot apps through autoconfiguration diff --git a/docs/src/main/asciidoc/README.adoc b/docs/src/main/asciidoc/README.adoc index 933f7a0f..2d490236 100644 --- a/docs/src/main/asciidoc/README.adoc +++ b/docs/src/main/asciidoc/README.adoc @@ -1,5 +1,6 @@ image::https://circleci.com/gh/spring-cloud/spring-cloud-netflix/tree/master.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-netflix/tree/master"] image::https://codecov.io/gh/spring-cloud/spring-cloud-netflix/branch/master/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-netflix/branch/master"] +image::https://api.codacy.com/project/badge/Grade/a6885a06921e4f72a0df0b7aabd6d118["Codacy code quality", link="https://www.codacy.com/app/Spring-Cloud/spring-cloud-netflix?utm_source=github.com&utm_medium=referral&utm_content=spring-cloud/spring-cloud-netflix&utm_campaign=Badge_Grade"] include::intro.adoc[] From 5e698278a83b254aefd2be2dd9f4f16395127c90 Mon Sep 17 00:00:00 2001 From: Scott Oster Date: Wed, 10 Aug 2016 13:10:30 -0400 Subject: [PATCH 16/19] Fixed double-encoding issue in RibbonClientConfiguration fixes gh-1241 --- .../ribbon/RibbonClientConfiguration.java | 2 +- .../RibbonClientConfigurationTests.java | 70 +++++++++++++++++-- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java index efc4433e..3420d4f9 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java @@ -200,7 +200,7 @@ public class RibbonClientConfiguration { public URI reconstructURIWithServer(Server server, URI original) { String scheme = original.getScheme(); if (!"https".equals(scheme) && this.serverIntrospector.isSecure(server)) { - original = UriComponentsBuilder.fromUri(original).scheme("https").build() + original = UriComponentsBuilder.fromUri(original).scheme("https").build(true) .toUri(); } return super.reconstructURIWithServer(server, original); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java index 101121b5..31544a78 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java @@ -16,26 +16,46 @@ package org.springframework.cloud.netflix.ribbon; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertThat; +import java.net.URI; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration.OverrideRestClient; import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.DefaultClientConfigImpl; import com.netflix.client.config.IClientConfig; -import org.junit.Test; +import com.netflix.loadbalancer.Server; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.when; /** * @author Spencer Gibb */ public class RibbonClientConfigurationTests { - @Test - public void restClientInitCalledOnce() { - CountingConfig config = new CountingConfig(); + private CountingConfig config; + + @Mock + private ServerIntrospector inspector; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + config = new CountingConfig(); config.setProperty(CommonClientConfigKey.ConnectTimeout, "1"); config.setProperty(CommonClientConfigKey.ReadTimeout, "1"); config.setProperty(CommonClientConfigKey.MaxHttpConnectionsPerHost, "1"); config.setClientName("testClient"); + } + + @Test + public void restClientInitCalledOnce() { new TestRestClient(config); assertThat(config.count, is(equalTo(1))); } @@ -44,7 +64,43 @@ public class RibbonClientConfigurationTests { int count = 0; } - static class TestRestClient extends RibbonClientConfiguration.OverrideRestClient { + @Test + public void testSecureUriFromClientConfig() throws Exception { + Server server = new Server("foo", 7777); + when(inspector.isSecure(server)).thenReturn(true); + + OverrideRestClient overrideRestClient = new OverrideRestClient(this.config, + inspector); + URI uri = overrideRestClient.reconstructURIWithServer(server, + new URI("http://foo/")); + assertThat(uri, is(new URI("https://foo:7777/"))); + } + + @Test + public void testInSecureUriFromClientConfig() throws Exception { + Server server = new Server("foo", 7777); + when(inspector.isSecure(server)).thenReturn(false); + + OverrideRestClient overrideRestClient = new OverrideRestClient(this.config, + inspector); + URI uri = overrideRestClient.reconstructURIWithServer(server, + new URI("http://foo/")); + assertThat(uri, is(new URI("http://foo:7777/"))); + } + + @Test + public void testNotDoubleEncodedWhenSecure() throws Exception { + Server server = new Server("foo", 7777); + when(inspector.isSecure(server)).thenReturn(true); + + OverrideRestClient overrideRestClient = new OverrideRestClient(this.config, + inspector); + URI uri = overrideRestClient.reconstructURIWithServer(server, + new URI("http://foo/%20bar")); + assertThat(uri, is(new URI("https://foo:7777/%20bar"))); + } + + static class TestRestClient extends OverrideRestClient { private TestRestClient(IClientConfig ncc) { super(ncc, new DefaultServerIntrospector()); From 519be4db06329658633477c4fb046895ca177c30 Mon Sep 17 00:00:00 2001 From: libetl Date: Wed, 10 Aug 2016 07:54:06 +0200 Subject: [PATCH 17/19] MetricsInterceptorConfiguration modifies potenially unmodifiable list. fixes gh-1240 --- .../MetricsInterceptorConfiguration.java | 14 +++++-- ...ricsClientHttpRequestInterceptorTests.java | 37 +++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsInterceptorConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsInterceptorConfiguration.java index 8b316bba..e48f68b3 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsInterceptorConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsInterceptorConfiguration.java @@ -13,6 +13,8 @@ package org.springframework.cloud.netflix.metrics; +import java.util.ArrayList; + import org.aspectj.lang.JoinPoint; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; @@ -25,6 +27,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @@ -80,8 +83,8 @@ public class MetricsInterceptorConfiguration { return new MetricsInterceptorPostProcessor(); } - private static class MetricsInterceptorPostProcessor implements - BeanPostProcessor, ApplicationContextAware { + private static class MetricsInterceptorPostProcessor + implements BeanPostProcessor, ApplicationContextAware { private ApplicationContext context; private MetricsClientHttpRequestInterceptor interceptor; @@ -97,7 +100,12 @@ public class MetricsInterceptorConfiguration { this.interceptor = this.context .getBean(MetricsClientHttpRequestInterceptor.class); } - ((RestTemplate) bean).getInterceptors().add(interceptor); + RestTemplate restTemplate = (RestTemplate) bean; + // create a new list as the old one may be unmodifiable (ie Arrays.asList()) + ArrayList interceptors = new ArrayList<>(); + interceptors.add(interceptor); + interceptors.addAll(restTemplate.getInterceptors()); + restTemplate.setInterceptors(interceptors); } return bean; } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptorTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptorTests.java index 816b1cac..db5ac7b1 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptorTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptorTests.java @@ -15,8 +15,11 @@ package org.springframework.cloud.netflix.metrics; import static org.junit.Assert.assertEquals; +import java.util.Arrays; + import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; @@ -28,6 +31,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -58,6 +62,9 @@ public class MetricsClientHttpRequestInterceptorTests { @Autowired RestTemplate restTemplate; + @Autowired + RestTemplate restTemplateWithFakeInterceptorsList; + @Test public void metricsGatheredWhenSuccessful() { MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); @@ -79,6 +86,28 @@ public class MetricsClientHttpRequestInterceptorTests { mockServer.verify(); } + + @Test + public void restTemplateWithFakeInterceptorList() { + MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplateWithFakeInterceptorsList); + mockServer.expect(MockRestRequestMatchers.requestTo("/test/123")) + .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) + .andRespond(MockRestResponseCreators.withSuccess("OK", MediaType.APPLICATION_JSON)); + String s = restTemplate.getForObject("/test/{id}", String.class, 123); + + MonitorConfig.Builder builder = new MonitorConfig.Builder("metricName") + .withTag("method", "GET") + .withTag("uri", "_test_-id-") + .withTag("status", "200") + .withTag("clientName", "none"); + + BasicTimer timer = servoMonitorCache.getTimer(builder.build()); + + assertEquals(2L, (long) timer.getCount()); + assertEquals("OK", s); + + mockServer.verify(); + } } @Configuration @@ -95,7 +124,15 @@ class MetricsRestTemplateTestConfig { @Configuration class MetricsRestTemplateRestTemplateConfig { @Bean + @Primary RestTemplate restTemplate() { return new RestTemplate(); } + + @Bean(name="restTemplateWithFakeInterceptorsList") + RestTemplate restTemplateWithFakeInterceptorsList() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setInterceptors(Arrays.asList(Mockito.mock(ClientHttpRequestInterceptor.class))); + return restTemplate; + } } \ No newline at end of file From f37b513f21325233345f24b9f9260e8aeee6bf65 Mon Sep 17 00:00:00 2001 From: Mike Liu Date: Tue, 9 Aug 2016 21:20:50 -0700 Subject: [PATCH 18/19] Add @Qualifier customization for @FeignClient Changed test to use @Qualifier. Add documentation to reference the new attribute. --- .../src/main/asciidoc/spring-cloud-netflix.adoc | 7 ++++++- .../cloud/netflix/feign/FeignClient.java | 5 +++++ .../netflix/feign/FeignClientsRegistrar.java | 17 +++++++++++++++++ .../netflix/feign/beans/FeignClientTests.java | 2 ++ .../netflix/feign/beans/extra/TestClient.java | 2 +- 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/docs/src/main/asciidoc/spring-cloud-netflix.adoc b/docs/src/main/asciidoc/spring-cloud-netflix.adoc index 31b6d208..141f986a 100644 --- a/docs/src/main/asciidoc/spring-cloud-netflix.adoc +++ b/docs/src/main/asciidoc/spring-cloud-netflix.adoc @@ -790,7 +790,12 @@ In the `@FeignClient` annotation the String value ("stores" above) is an arbitrary client name, which is used to create a Ribbon load balancer (see <>). You can also specify a URL using the `url` attribute -(absolute value or just a hostname). The name of the bean in the application context is the fully qualified name of the interface. An alias is also created which is the 'name' attribute plus 'FeignClient'. For the example above, `@Qualifier("storesFeignClient")` could be used to reference the bean. +(absolute value or just a hostname). The name of the bean in the +application context is the fully qualified name of the interface. +An alias is also created which is the 'name' attribute plus 'FeignClient'. +For the example above, `@Qualifier("storesFeignClient")` could be used to +reference the bean. If you want to change the default `@Qualifier` value, +this can be done with the `qualifier` value in `@FeignClient`. The Ribbon client above will want to discover the physical addresses for the "stores" service. If your application is a Eureka client then diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClient.java index 2aaaeca1..8c2e361f 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClient.java @@ -59,6 +59,11 @@ public @interface FeignClient { */ @AliasFor("value") String name() default ""; + + /** + * Sets the @Qualifier value for the feign client. + */ + String qualifier() default ""; /** * An absolute URL or resolvable hostname (the protocol is optional). diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsRegistrar.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsRegistrar.java index ff1a6728..9d31319b 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsRegistrar.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsRegistrar.java @@ -184,6 +184,12 @@ class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, String alias = name + "FeignClient"; AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); beanDefinition.setPrimary(true); + + String qualifier = getQualifier(attributes); + if (StringUtils.hasText(qualifier)) { + alias = qualifier; + } + BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, new String[] { alias }); BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); @@ -317,6 +323,17 @@ class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, } return basePackages; } + + private String getQualifier(Map client) { + if (client == null) { + return null; + } + String qualifier = (String) client.get("qualifier"); + if (StringUtils.hasText(qualifier)) { + return qualifier; + } + return null; + } private String getClientName(Map client) { if (client == null) { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/FeignClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/FeignClientTests.java index fc5182e2..35406a42 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/FeignClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/FeignClientTests.java @@ -26,6 +26,7 @@ import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; @@ -65,6 +66,7 @@ public class FeignClientTests { @Autowired private ApplicationContext context; + @Qualifier("uniquequalifier") @Autowired private org.springframework.cloud.netflix.feign.beans.extra.TestClient extraClient; diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/extra/TestClient.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/extra/TestClient.java index 0f239aa9..42676f68 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/extra/TestClient.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/beans/extra/TestClient.java @@ -21,7 +21,7 @@ import org.springframework.cloud.netflix.feign.beans.FeignClientTests.Hello; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -@FeignClient(value = "otherapp") +@FeignClient(value = "otherapp", qualifier = "uniquequalifier") public interface TestClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") Hello getHello(); From 674e45f473bf71b766b324fcca3173923ac5a22f Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Wed, 10 Aug 2016 14:13:28 -0600 Subject: [PATCH 19/19] Add Client to list of feign objects that can be customized. --- docs/src/main/asciidoc/spring-cloud-netflix.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/src/main/asciidoc/spring-cloud-netflix.adoc b/docs/src/main/asciidoc/spring-cloud-netflix.adoc index eeb71b9f..648b4084 100644 --- a/docs/src/main/asciidoc/spring-cloud-netflix.adoc +++ b/docs/src/main/asciidoc/spring-cloud-netflix.adoc @@ -847,6 +847,9 @@ Spring Cloud Netflix provides the following beans by default for feign (`BeanTyp * `Logger` feignLogger: `Slf4jLogger` * `Contract` feignContract: `SpringMvcContract` * `Feign.Builder` feignBuilder: `HystrixFeign.Builder` +* `Client` feignClient: if Ribbon is enabled it is a `LoadBalancerFeignClient`, otherwise the default feign client is used. + +The OkHttpClient and ApacheHttpClient feign clients can be used by setting `feign.okhttp.enabled` or `feign.httpclient.enabled` to `true`, respectively, and having them on the classpath. Spring Cloud Netflix _does not_ provide the following beans by default for feign, but still looks up beans of these types from the application context to create the feign client: