/* * Copyright 2014 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.xd.dirt.stream; import static org.junit.Assert.assertEquals; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import org.springframework.integration.test.util.SocketUtils; import org.springframework.xd.dirt.integration.bus.Binding; /** * Base class for testing non-local transports, such as RabbitMQ and Redis. * * @author Mark Fisher * @author Gary Russell */ public abstract class AbstractDistributedTransportSingleNodeStreamDeploymentIntegrationTests extends AbstractSingleNodeStreamDeploymentIntegrationTests { @Test public void directBindingEnabledWithExplicitModuleCounts() throws InterruptedException { String streamName = "directBindingEnabledWithExplicitModuleCounts"; StreamDefinition sd = new StreamDefinition(streamName, getHttpLogStream()); integrationSupport.streamDefinitionRepository().save(sd); Map<String, String> props = new HashMap<String, String>(); props.put("module.http.count", "0"); props.put("module.log.count", "0"); integrationSupport.deployStream(sd, props); List<Binding> bindings = getMessageBusBindingsForStream(streamName); assertEquals(2, bindings.size()); Binding consumerBinding = bindings.get(0); Binding producerBinding = bindings.get(1); assertEquals("consumer", consumerBinding.getType()); assertEquals("direct", producerBinding.getType()); } @Test public void directBindingEnabledWithWildcardModuleCount() throws InterruptedException { String streamName = "directBindingEnabledWithWildcardModuleCount"; StreamDefinition sd = new StreamDefinition(streamName, getHttpLogStream()); integrationSupport.streamDefinitionRepository().save(sd); integrationSupport.deployStream(sd, Collections.singletonMap("module.*.count", "0")); List<Binding> bindings = getMessageBusBindingsForStream(streamName); assertEquals(2, bindings.size()); Binding consumerBinding = bindings.get(0); Binding producerBinding = bindings.get(1); assertEquals("consumer", consumerBinding.getType()); assertEquals("direct", producerBinding.getType()); } @Test public void directBindingEnabledWithCriteria() throws InterruptedException { String streamName = "directBindingEnabledWithCriteria"; StreamDefinition sd = new StreamDefinition(streamName, getHttpLogStream()); integrationSupport.streamDefinitionRepository().save(sd); Map<String, String> props = new HashMap<String, String>(); props.put("module.http.count", "0"); props.put("module.http.criteria", "true"); props.put("module.log.count", "0"); props.put("module.log.criteria", "true"); integrationSupport.deployStream(sd, props); List<Binding> bindings = getMessageBusBindingsForStream(streamName); assertEquals(2, bindings.size()); Binding consumerBinding = bindings.get(0); Binding producerBinding = bindings.get(1); assertEquals("consumer", consumerBinding.getType()); assertEquals("direct", producerBinding.getType()); } @Test public void directBindingNotEnabledWithMismatchedCounts() throws InterruptedException { String streamName = "directBindingNotEnabledWithMismatchedCounts"; StreamDefinition sd = new StreamDefinition(streamName, getHttpLogStream()); integrationSupport.streamDefinitionRepository().save(sd); Map<String, String> props = new HashMap<String, String>(); props.put("module.http.count", "0"); props.put("module.log.count", "3"); integrationSupport.deployStream(sd, props,/*allowIncomplete*/true); List<Binding> bindings = getMessageBusBindingsForStream(streamName); assertEquals(2, bindings.size()); Binding consumerBinding = bindings.get(0); Binding producerBinding = bindings.get(1); assertEquals("consumer", consumerBinding.getType()); assertEquals("producer", producerBinding.getType()); } @Test public void directBindingNotEnabledWithOverriddenCount() throws InterruptedException { String streamName = "directBindingNotEnabledWithOverriddenCount"; StreamDefinition sd = new StreamDefinition(streamName, "http | log"); integrationSupport.streamDefinitionRepository().save(sd); Map<String, String> props = new HashMap<String, String>(); props.put("module.*.count", "0"); props.put("module.log.count", "3"); integrationSupport.deployStream(sd, props,/*allowIncomplete*/true); List<Binding> bindings = getMessageBusBindingsForStream(streamName); assertEquals(2, bindings.size()); Binding consumerBinding = bindings.get(0); Binding producerBinding = bindings.get(1); assertEquals("consumer", consumerBinding.getType()); assertEquals("producer", producerBinding.getType()); } @Test public void directBindingNotEnabledWithMismatchedCriteria() throws InterruptedException { String streamName = "directBindingNotEnabledWithMismatchedCriteria"; StreamDefinition sd = new StreamDefinition(streamName, getHttpLogStream()); integrationSupport.streamDefinitionRepository().save(sd); Map<String, String> props = new HashMap<String, String>(); props.put("module.http.count", "0"); props.put("module.http.criteria", "true"); props.put("module.log.count", "0"); props.put("module.log.criteria", "!false"); integrationSupport.deployStream(sd, props); List<Binding> bindings = getMessageBusBindingsForStream(streamName); assertEquals(2, bindings.size()); Binding consumerBinding = bindings.get(0); Binding producerBinding = bindings.get(1); assertEquals("consumer", consumerBinding.getType()); assertEquals("producer", producerBinding.getType()); } @Test public void directBindingEnabledForPartOfStream() throws InterruptedException { String streamName = "directBindingEnabledForPartOfStream"; StreamDefinition sd = new StreamDefinition(streamName, String.format("http --port=%s | filter | log", SocketUtils.findAvailableServerSocket())); integrationSupport.streamDefinitionRepository().save(sd); Map<String, String> props = new HashMap<String, String>(); props.put("module.http.count", "0"); props.put("module.filter.count", "0"); props.put("module.log.count", "1"); integrationSupport.deployStream(sd, props); List<Binding> bindings = getMessageBusBindingsForStream(streamName); assertEquals(4, bindings.size()); Binding logConsumerBinding = bindings.get(0); Binding filterProducerBinding = bindings.get(1); Binding filterConsumerBinding = bindings.get(2); Binding httpProducerBinding = bindings.get(3); assertEquals("inbound." + streamName + ".1", logConsumerBinding.getEndpoint().getComponentName()); assertEquals("consumer", logConsumerBinding.getType()); assertEquals("inbound." + streamName + ".0", filterConsumerBinding.getEndpoint().getComponentName()); assertEquals("consumer", filterConsumerBinding.getType()); assertEquals("outbound." + streamName + ".1", filterProducerBinding.getEndpoint().getComponentName()); assertEquals("producer", filterProducerBinding.getType()); assertEquals("outbound." + streamName + ".0", httpProducerBinding.getEndpoint().getComponentName()); assertEquals("direct", httpProducerBinding.getType()); } }