/* * Copyright 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.stream.module.jms.source; import static org.hamcrest.Matchers.instanceOf; 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.concurrent.TimeUnit; import javax.jms.Session; 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.WebIntegrationTest; import org.springframework.cloud.stream.messaging.Source; import org.springframework.cloud.stream.test.binder.MessageCollector; import org.springframework.integration.jms.JmsMessageDrivenEndpoint; import org.springframework.integration.test.util.TestUtils; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.listener.AbstractMessageListenerContainer; import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.jms.listener.SimpleMessageListenerContainer; import org.springframework.messaging.Message; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * Tests for JmsSource. * * @author Gary Russell */ @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = JmsSourceApplication.class) @DirtiesContext @WebIntegrationTest(randomPort = true) public abstract class JmsSourceTests { @Autowired protected Source channels; @Autowired protected MessageCollector messageCollector; @Autowired protected JmsSourceProperties properties; @Autowired protected JmsMessageDrivenEndpoint endpoint; @IntegrationTest({ "sessionTransacted = false", "clientId = client", "destination = topic", "messageSelector = JMSCorrelationId=foo", "subscriptionDurable = false", "subscriptionShared = false", "spring.jms.listener.acknowledgeMode = DUPS_OK", "spring.jms.listener.concurrency = 3", "spring.jms.listener.maxConcurrency = 4", "spring.jms.pubSubDomain = true" }) public static class PropertiesPopulated1Tests extends JmsSourceTests { @Test public void test() throws Exception { AbstractMessageListenerContainer container = TestUtils.getPropertyValue(this.endpoint, "listenerContainer", AbstractMessageListenerContainer.class); assertThat(container, instanceOf(SimpleMessageListenerContainer.class)); assertEquals(Session.DUPS_OK_ACKNOWLEDGE, TestUtils.getPropertyValue(container, "sessionAcknowledgeMode")); assertFalse(TestUtils.getPropertyValue(container, "sessionTransacted", Boolean.class)); assertEquals("client", TestUtils.getPropertyValue(container, "clientId")); assertEquals("topic", TestUtils.getPropertyValue(container, "destination")); assertEquals("JMSCorrelationId=foo", TestUtils.getPropertyValue(container, "messageSelector")); assertFalse(TestUtils.getPropertyValue(container, "subscriptionDurable", Boolean.class)); assertFalse(TestUtils.getPropertyValue(container, "subscriptionShared", Boolean.class)); assertEquals(3, TestUtils.getPropertyValue(container, "concurrentConsumers")); assertTrue(TestUtils.getPropertyValue(container, "pubSubDomain", Boolean.class)); } } @IntegrationTest({ "sessionTransacted = true", "clientId = client", "destination = topic", "subscriptionName = subName", "subscriptionDurable = true", "subscriptionShared = false", "spring.jms.listener.acknowledgeMode = AUTO", "spring.jms.listener.concurrency = 3", "spring.jms.listener.maxConcurrency = 4" }) public static class PropertiesPopulated2Tests extends JmsSourceTests { @Test public void test() throws Exception { AbstractMessageListenerContainer container = TestUtils.getPropertyValue(this.endpoint, "listenerContainer", AbstractMessageListenerContainer.class); assertThat(container, instanceOf(DefaultMessageListenerContainer.class)); assertEquals(Session.AUTO_ACKNOWLEDGE, TestUtils.getPropertyValue(container, "sessionAcknowledgeMode")); assertTrue(TestUtils.getPropertyValue(container, "sessionTransacted", Boolean.class)); assertEquals("client", TestUtils.getPropertyValue(container, "clientId")); assertEquals("topic", TestUtils.getPropertyValue(container, "destination")); assertTrue(TestUtils.getPropertyValue(container, "subscriptionDurable", Boolean.class)); assertEquals("subName", TestUtils.getPropertyValue(container, "subscriptionName")); assertFalse(TestUtils.getPropertyValue(container, "subscriptionShared", Boolean.class)); assertEquals(3, TestUtils.getPropertyValue(container, "concurrentConsumers")); assertEquals(4, TestUtils.getPropertyValue(container, "maxConcurrentConsumers")); assertTrue(TestUtils.getPropertyValue(container, "pubSubDomain", Boolean.class)); } } @IntegrationTest({ "sessionTransacted = true", "destination = jmssource.test.queue", "messageSelector = JMSCorrelationId=foo", "subscriptionDurable = false", "subscriptionShared = false", "spring.jms.listener.acknowledgeMode = AUTO", "spring.jms.listener.concurrency = 3", "spring.jms.listener.maxConcurrency = 4", "spring.jms.pubSubDomain = false" }) public static class PropertiesPopulated3Tests extends JmsSourceTests { @Autowired private JmsTemplate template; @Test public void test() throws Exception { AbstractMessageListenerContainer container = TestUtils.getPropertyValue(this.endpoint, "listenerContainer", AbstractMessageListenerContainer.class); assertThat(container, instanceOf(DefaultMessageListenerContainer.class)); assertEquals(Session.AUTO_ACKNOWLEDGE, TestUtils.getPropertyValue(container, "sessionAcknowledgeMode")); assertTrue(TestUtils.getPropertyValue(container, "sessionTransacted", Boolean.class)); assertEquals("jmssource.test.queue", TestUtils.getPropertyValue(container, "destination")); assertEquals("JMSCorrelationId=foo", TestUtils.getPropertyValue(container, "messageSelector")); assertFalse(TestUtils.getPropertyValue(container, "subscriptionDurable", Boolean.class)); assertFalse(TestUtils.getPropertyValue(container, "subscriptionShared", Boolean.class)); assertEquals(3, TestUtils.getPropertyValue(container, "concurrentConsumers")); assertEquals(4, TestUtils.getPropertyValue(container, "maxConcurrentConsumers")); assertFalse(TestUtils.getPropertyValue(container, "pubSubDomain", Boolean.class)); template.convertAndSend("jmssource.test.queue", "Hello, world!"); Message<?> received = messageCollector.forChannel(channels.output()).poll(10, TimeUnit.SECONDS); assertNotNull(received); assertEquals("Hello, world!", received.getPayload()); } } }