From badd024207f81285136409671ad0d7128ea70a3a Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 24 Jan 2020 16:35:49 +0100 Subject: [PATCH] GH-1895 Made test binder not eligible as default This effectively ensures that it has to be explicitly added Resolves #1895 --- .../BinderFactoryAutoConfiguration.java | 3 +- .../config/BindingServiceConfiguration.java | 2 +- .../CustomPartitionedProducerTest.java | 10 - .../ImplicitFunctionBindingTests.java | 197 ++++++------------ 4 files changed, 71 insertions(+), 141 deletions(-) diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java index a95e45621..2fb3913e1 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java @@ -173,13 +173,14 @@ public class BinderFactoryAutoConfiguration { try { Enumeration resources = classLoader.getResources("META-INF/spring.binders"); - // see if test binder is available on the classpath and if so add it t o the binderTypes + // see if test binder is available on the classpath and if so add it to the binderTypes try { BinderType bt = new BinderType("integration", new Class[] { classLoader.loadClass("org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration")}); binderTypes.put("integration", bt); } catch (Exception e) { +// e.printStackTrace(); // ignore. means test binder is not available } diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingServiceConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingServiceConfiguration.java index 47a7fee0f..59b7849d4 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingServiceConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingServiceConfiguration.java @@ -149,7 +149,7 @@ public class BindingServiceConfiguration { if (!existingBinderConfigurations.contains(binderEntry.getKey())) { binderConfigurations.put(binderEntry.getKey(), new BinderConfiguration(binderEntry.getKey(), new HashMap<>(), - true, true)); + true, "integration".equals(binderEntry.getKey()) ? false : true)); } } } diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binding/CustomPartitionedProducerTest.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binding/CustomPartitionedProducerTest.java index 93d74ff15..9653da1a0 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binding/CustomPartitionedProducerTest.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binding/CustomPartitionedProducerTest.java @@ -188,16 +188,6 @@ public class CustomPartitionedProducerTest { } } - @Test(expected = Exception.class) - // It actually throws UnsatisfiedDependencyException, but it is confusing when it - // comes to test - // But for the purposes of the test all we care about is that it fails - public void testCustomPartitionedProducerMultipleInstancesFailNoFilter() { - SpringApplication.run( - CustomPartitionedProducerTest.TestSourceMultipleStrategies.class, - "--spring.jmx.enabled=false", "--spring.main.web-application-type=none"); - } - @EnableBinding(Source.class) @EnableAutoConfiguration @PropertySource("classpath:/org/springframework/cloud/stream/binder/custom-partitioned-producer-test.properties") diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/ImplicitFunctionBindingTests.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/ImplicitFunctionBindingTests.java index 1be1e558e..ef9910ce1 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/ImplicitFunctionBindingTests.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/ImplicitFunctionBindingTests.java @@ -22,7 +22,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; - import org.junit.After; import org.junit.Test; import reactor.core.publisher.Flux; @@ -68,10 +67,8 @@ public class ImplicitFunctionBindingTests { public void testEmptyConfiguration() { try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - EmptyConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false", "--debug")) { + TestChannelBinderConfiguration.getCompleteConfiguration(EmptyConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false", "--debug")) { context.getBean(InputDestination.class); } catch (Exception e) { // should not fail @@ -83,18 +80,14 @@ public class ImplicitFunctionBindingTests { public void testSimpleFunctionWithStreamProperty() { try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - NoEnableBindingConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false", - "--spring.cloud.function.definition=func")) { + TestChannelBinderConfiguration.getCompleteConfiguration(NoEnableBindingConfiguration.class)) + .web(WebApplicationType.NONE) + .run("--spring.jmx.enabled=false", "--spring.cloud.function.definition=func")) { InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + OutputDestination outputDestination = context.getBean(OutputDestination.class); - Message inputMessage = MessageBuilder - .withPayload("Hello".getBytes()).build(); + Message inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build(); inputDestination.send(inputMessage); Message outputMessage = outputDestination.receive(); @@ -107,18 +100,14 @@ public class ImplicitFunctionBindingTests { public void testReactiveFunctionWithState() { try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - NoEnableBindingConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false", - "--spring.cloud.function.definition=aggregate")) { + TestChannelBinderConfiguration.getCompleteConfiguration(NoEnableBindingConfiguration.class)) + .web(WebApplicationType.NONE) + .run("--spring.jmx.enabled=false", "--spring.cloud.function.definition=aggregate")) { InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + OutputDestination outputDestination = context.getBean(OutputDestination.class); - Message inputMessage = MessageBuilder - .withPayload("Hello".getBytes()).build(); + Message inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build(); inputDestination.send(inputMessage); inputDestination.send(inputMessage); inputDestination.send(inputMessage); @@ -138,19 +127,15 @@ public class ImplicitFunctionBindingTests { public void testFunctionWithUseNativeEncoding() { try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - NoEnableBindingConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false", - "--spring.cloud.function.definition=func", - "--spring.cloud.stream.bindings.func-out-0.producer.useNativeEncoding=true")) { + TestChannelBinderConfiguration.getCompleteConfiguration(NoEnableBindingConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false", + "--spring.cloud.function.definition=func", + "--spring.cloud.stream.bindings.func-out-0.producer.useNativeEncoding=true")) { InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + OutputDestination outputDestination = context.getBean(OutputDestination.class); - Message inputMessage = MessageBuilder - .withPayload("Hello".getBytes()).build(); + Message inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build(); inputDestination.send(inputMessage); Message outputMessage = outputDestination.receive(); assertThat(outputMessage.getPayload()).isEqualTo("Hello"); @@ -161,18 +146,14 @@ public class ImplicitFunctionBindingTests { public void testSimpleFunctionWithNativeProperty() { try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - NoEnableBindingConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false", - "--spring.cloud.function.definition=func")) { + TestChannelBinderConfiguration.getCompleteConfiguration(NoEnableBindingConfiguration.class)) + .web(WebApplicationType.NONE) + .run("--spring.jmx.enabled=false", "--spring.cloud.function.definition=func")) { InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + OutputDestination outputDestination = context.getBean(OutputDestination.class); - Message inputMessage = MessageBuilder - .withPayload("Hello".getBytes()).build(); + Message inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build(); inputDestination.send(inputMessage); Message outputMessage = outputDestination.receive(); @@ -185,17 +166,13 @@ public class ImplicitFunctionBindingTests { public void testSimpleFunctionWithoutDefinitionProperty() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - SingleFunctionConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false")) { + TestChannelBinderConfiguration.getCompleteConfiguration(SingleFunctionConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) { InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + OutputDestination outputDestination = context.getBean(OutputDestination.class); - Message inputMessage = MessageBuilder - .withPayload("Hello".getBytes()).build(); + Message inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build(); inputDestination.send(inputMessage); Message outputMessage = outputDestination.receive(); @@ -208,14 +185,11 @@ public class ImplicitFunctionBindingTests { public void testSimpleConsumerWithoutDefinitionProperty() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - SingleConsumerConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false")) { + TestChannelBinderConfiguration.getCompleteConfiguration(SingleConsumerConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) { InputDestination inputDestination = context.getBean(InputDestination.class); - Message inputMessage = MessageBuilder - .withPayload("Hello".getBytes()).build(); + Message inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build(); inputDestination.send(inputMessage); assertThat(System.getProperty("consumer")).isEqualTo("Hello"); @@ -227,14 +201,11 @@ public class ImplicitFunctionBindingTests { public void testReactiveConsumerWithoutDefinitionProperty() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - SingleReactiveConsumerConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false")) { + TestChannelBinderConfiguration.getCompleteConfiguration(SingleReactiveConsumerConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) { InputDestination inputDestination = context.getBean(InputDestination.class); - Message inputMessage = MessageBuilder - .withPayload("Hello".getBytes()).build(); + Message inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build(); inputDestination.send(inputMessage); assertThat(System.getProperty("consumer")).isEqualTo("Hello"); @@ -245,13 +216,11 @@ public class ImplicitFunctionBindingTests { @Test public void testConsumer() { try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration - .getCompleteConfiguration(SingleConsumerConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.cloud.function.definition=consumer", - "--spring.jmx.enabled=false", - "--spring.cloud.stream.bindings.input.content-type=text/plain", - "--spring.cloud.stream.bindings.input.consumer.use-native-decoding=true")) { + TestChannelBinderConfiguration.getCompleteConfiguration(SingleConsumerConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.cloud.function.definition=consumer", + "--spring.jmx.enabled=false", + "--spring.cloud.stream.bindings.input.content-type=text/plain", + "--spring.cloud.stream.bindings.input.consumer.use-native-decoding=true")) { InputDestination source = context.getBean(InputDestination.class); source.send(new GenericMessage("John Doe".getBytes())); @@ -262,19 +231,14 @@ public class ImplicitFunctionBindingTests { public void testBindingWithReactiveFunction() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - ReactiveFunctionConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false")) { + TestChannelBinderConfiguration.getCompleteConfiguration(ReactiveFunctionConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) { InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + OutputDestination outputDestination = context.getBean(OutputDestination.class); - Message inputMessageOne = MessageBuilder - .withPayload("Hello".getBytes()).build(); - Message inputMessageTwo = MessageBuilder - .withPayload("Hello Again".getBytes()).build(); + Message inputMessageOne = MessageBuilder.withPayload("Hello".getBytes()).build(); + Message inputMessageTwo = MessageBuilder.withPayload("Hello Again".getBytes()).build(); inputDestination.send(inputMessageOne); inputDestination.send(inputMessageTwo); @@ -289,29 +253,23 @@ public class ImplicitFunctionBindingTests { public void testFunctionConfigDisabledIfStreamListenerIsUsed() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - LegacyConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false")) { + TestChannelBinderConfiguration.getCompleteConfiguration(LegacyConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) { assertThat(context.getBean("supplierInitializer")).isEqualTo(null); } } - @Test(expected = Exception.class) public void testDeclaredTypeVsActualInstance() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - SCF_GH_409Configuration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false")) { + TestChannelBinderConfiguration.getCompleteConfiguration(SCF_GH_409Configuration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) { InputDestination inputDestination = context.getBean(InputDestination.class); - Message inputMessageOne = MessageBuilder - .withPayload("Hello".getBytes()).build(); + Message inputMessageOne = MessageBuilder.withPayload("Hello".getBytes()).build(); inputDestination.send(inputMessageOne); } @@ -321,21 +279,15 @@ public class ImplicitFunctionBindingTests { public void testWithContextTypeApplicationProperty() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - SingleFunctionConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false", - "--spring.cloud.stream.bindings.input.content-type=text/plain", - "--debug")) { + TestChannelBinderConfiguration.getCompleteConfiguration(SingleFunctionConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false", + "--spring.cloud.stream.bindings.input.content-type=text/plain", "--debug")) { InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + OutputDestination outputDestination = context.getBean(OutputDestination.class); - Message inputMessageOne = MessageBuilder - .withPayload("Hello".getBytes()).build(); - Message inputMessageTwo = MessageBuilder - .withPayload("Hello Again".getBytes()).build(); + Message inputMessageOne = MessageBuilder.withPayload("Hello".getBytes()).build(); + Message inputMessageTwo = MessageBuilder.withPayload("Hello Again".getBytes()).build(); inputDestination.send(inputMessageOne); inputDestination.send(inputMessageTwo); @@ -349,11 +301,9 @@ public class ImplicitFunctionBindingTests { @Test public void testWithIntegrationFlowAsFunction() { System.clearProperty("spring.cloud.function.definition"); - try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - FunctionSampleSpringIntegrationConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false")) { + try (ConfigurableApplicationContext context = new SpringApplicationBuilder(TestChannelBinderConfiguration + .getCompleteConfiguration(FunctionSampleSpringIntegrationConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) { InputDestination inputDestination = context.getBean(InputDestination.class); OutputDestination outputDestination = context.getBean(OutputDestination.class); @@ -371,11 +321,9 @@ public class ImplicitFunctionBindingTests { public void testSupplierWithCustomPoller() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - SupplierWithExplicitPollerConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false", - "--spring.cloud.stream.poller.fixed-delay=2000")) { + TestChannelBinderConfiguration.getCompleteConfiguration(SupplierWithExplicitPollerConfiguration.class)) + .web(WebApplicationType.NONE) + .run("--spring.jmx.enabled=false", "--spring.cloud.stream.poller.fixed-delay=2000")) { OutputDestination outputDestination = context.getBean(OutputDestination.class); @@ -391,12 +339,10 @@ public class ImplicitFunctionBindingTests { public void testSupplierWithCustomPollerAndMappedOutput() { System.clearProperty("spring.cloud.function.definition"); try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - SupplierWithExplicitPollerConfiguration.class)) - .web(WebApplicationType.NONE) - .run("--spring.jmx.enabled=false", - "--spring.cloud.stream.poller.fixed-delay=2000", - "--spring.cloud.function.bindings.supplier-out-0=output")) { + TestChannelBinderConfiguration.getCompleteConfiguration(SupplierWithExplicitPollerConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false", + "--spring.cloud.stream.poller.fixed-delay=2000", + "--spring.cloud.function.bindings.supplier-out-0=output")) { OutputDestination outputDestination = context.getBean(OutputDestination.class); @@ -408,7 +354,6 @@ public class ImplicitFunctionBindingTests { } } - @Test public void testNoFunctionEnabledConfiguration() { System.clearProperty("spring.cloud.function.definition"); @@ -427,9 +372,8 @@ public class ImplicitFunctionBindingTests { } } - @EnableAutoConfiguration - public static class NoEnableBindingConfiguration { + public static class NoEnableBindingConfiguration { @Bean public Function func() { @@ -441,11 +385,8 @@ public class ImplicitFunctionBindingTests { @Bean public Function, Flux> aggregate() { - return inbound -> inbound. - log() - .window(Duration.ofSeconds(1)) - .flatMap(w -> w.reduce("", (s1,s2)->s1+s2)) - .log(); + return inbound -> inbound.log().window(Duration.ofSeconds(1)) + .flatMap(w -> w.reduce("", (s1, s2) -> s1 + s2)).log(); } @Bean @@ -546,8 +487,7 @@ public class ImplicitFunctionBindingTests { @Bean public IntegrationFlow uppercaseFlow() { return IntegrationFlows.from(MessageFunction.class, "uppercase") - .transform(String::toUpperCase) - .logAndReply(LoggingHandler.Level.WARN); + .transform(String::toUpperCase).logAndReply(LoggingHandler.Level.WARN); } } @@ -556,7 +496,6 @@ public class ImplicitFunctionBindingTests { } - @EnableAutoConfiguration public static class SupplierWithExplicitPollerConfiguration {