From 0d387756b305cbc1fdcd55fb4232c3a894e95271 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 21 Sep 2010 17:21:50 -0400 Subject: [PATCH] INT-1257, changed convinience method to MessageHistory.containsComponent(string), added/modified tests in XML, WS, JMS to validate MessageHistory --- .../integration/history/MessageHistory.java | 2 +- .../JmsInboundChannelAdapterParserTests.java | 4 ++ .../config/JmsInboundGatewayParserTests.java | 4 ++ ...essageDrivenChannelAdapterParserTests.java | 4 ++ .../config/JmsOutboundGatewayParserTests.java | 27 ++++++++-- .../config/gatewayMaintainsReplyChannel.xml | 17 ++++--- ...wayWithConnectionFactoryAndDestination.xml | 2 + .../jms/config/jmsInboundWithJmsTemplate.xml | 4 +- .../config/jmsInboundWithMessageSelector.xml | 2 + .../MarshallingWebServiceInboundGateway.java | 17 +++++-- .../ws/config/StubMessageFactory.java | 10 +++- ...rviceInboundGatewayParserTests-context.xml | 18 +++++-- .../WebServiceInboundGatewayParserTests.java | 50 +++++++++++++++++-- .../xml/transformer/XsltTransformerTests.java | 8 +-- 14 files changed, 142 insertions(+), 27 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java b/spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java index f6f4575b25..b5c85de1d7 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java @@ -88,7 +88,7 @@ public class MessageHistory implements List { return this.components.contains(o); } - public boolean containsEntryWithName(String name) { + public boolean containsComponent(String name) { for (Properties properties : components) { if (properties.getProperty("name").equals(name)){ return true; diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParserTests.java index 56e977081b..323f23b300 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParserTests.java @@ -16,6 +16,7 @@ package org.springframework.integration.jms.config; +import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -27,6 +28,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.Message; import org.springframework.integration.core.PollableChannel; +import org.springframework.integration.history.MessageHistory; /** * @author Mark Fisher @@ -41,6 +43,8 @@ public class JmsInboundChannelAdapterParserTests { "jmsInboundWithJmsTemplate.xml", this.getClass()); PollableChannel output = (PollableChannel) context.getBean("output"); Message message = output.receive(timeoutOnReceive); + MessageHistory history = MessageHistory.read(message); + assertTrue(history.containsComponent("inboundAdapter")); assertNotNull("message should not be null", message); assertEquals("polling-test", message.getPayload()); } diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundGatewayParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundGatewayParserTests.java index 776b6622b0..6f629a8c59 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundGatewayParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundGatewayParserTests.java @@ -30,6 +30,8 @@ import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.Message; import org.springframework.integration.core.PollableChannel; +import org.springframework.integration.history.HistoryWritingMessagePostProcessor; +import org.springframework.integration.history.MessageHistory; import org.springframework.integration.jms.JmsMessageDrivenEndpoint; import org.springframework.jms.connection.JmsTransactionManager; import org.springframework.jms.listener.AbstractMessageListenerContainer; @@ -49,6 +51,8 @@ public class JmsInboundGatewayParserTests { assertEquals(JmsMessageDrivenEndpoint.class, gateway.getClass()); context.start(); Message message = channel.receive(3000); + MessageHistory history = MessageHistory.read(message); + assertTrue(history.containsComponent("jmsGateway")); assertNotNull("message should not be null", message); assertEquals("message-driven-test", message.getPayload()); context.stop(); diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsMessageDrivenChannelAdapterParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsMessageDrivenChannelAdapterParserTests.java index 5269da993f..be5563e384 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsMessageDrivenChannelAdapterParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsMessageDrivenChannelAdapterParserTests.java @@ -16,6 +16,7 @@ package org.springframework.integration.jms.config; +import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -25,6 +26,7 @@ import org.springframework.beans.DirectFieldAccessor; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.Message; import org.springframework.integration.core.PollableChannel; +import org.springframework.integration.history.MessageHistory; import org.springframework.integration.jms.JmsMessageDrivenEndpoint; import org.springframework.jms.support.destination.JmsDestinationAccessor; @@ -41,6 +43,8 @@ public class JmsMessageDrivenChannelAdapterParserTests { "jmsInboundWithMessageSelector.xml", this.getClass()); PollableChannel output = (PollableChannel) context.getBean("output2"); Message message = output.receive(timeoutOnReceive); + MessageHistory history = MessageHistory.read(message); + assertTrue(history.containsComponent("messageDrivenAdapter")); assertNotNull("message should not be null", message); assertEquals("test [with selector: TestProperty = 'foo']", message.getPayload()); } diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundGatewayParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundGatewayParserTests.java index 84f5ab7f88..2906d59bb4 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundGatewayParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundGatewayParserTests.java @@ -17,12 +17,23 @@ package org.springframework.integration.jms.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import org.junit.Test; +import org.mockito.Mockito; import org.springframework.beans.DirectFieldAccessor; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.Message; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.MessagingException; +import org.springframework.integration.core.MessageHandler; +import org.springframework.integration.core.MessagingTemplate; +import org.springframework.integration.core.SubscribableChannel; import org.springframework.integration.endpoint.EventDrivenConsumer; import org.springframework.integration.endpoint.PollingConsumer; +import org.springframework.integration.history.MessageHistory; import org.springframework.integration.jms.JmsOutboundGateway; import org.springframework.integration.jms.StubMessageConverter; import org.springframework.jms.support.converter.MessageConverter; @@ -57,16 +68,26 @@ public class JmsOutboundGatewayParserTests { } @Test - public void gatewayMaintainsReplyChannel() { + public void gatewayMaintainsReplyChannelAndInboundHistory() { ActiveMqTestUtils.prepare(); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "gatewayMaintainsReplyChannel.xml", this.getClass()); SampleGateway gateway = context.getBean("gateway", SampleGateway.class); + SubscribableChannel jmsInput = context.getBean("jmsInput", SubscribableChannel.class); + MessageHandler handler = new MessageHandler() { + public void handleMessage(Message message) throws MessagingException { + MessageHistory history = MessageHistory.read(message); + assertTrue(history.containsComponent("inboundGateway")); + new MessagingTemplate((MessageChannel) message.getHeaders().getReplyChannel()).send(message); + } + }; + handler = spy(handler); + jmsInput.subscribe(handler); String result = gateway.echo("hello"); - assertEquals("HELLO", result); + verify(handler, times(1)).handleMessage(Mockito.any(Message.class)); + assertEquals("hello", result); } - public static interface SampleGateway{ public String echo(String value); } diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/gatewayMaintainsReplyChannel.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/gatewayMaintainsReplyChannel.xml index 51bcfda7ce..f1d4061fdc 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/gatewayMaintainsReplyChannel.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/gatewayMaintainsReplyChannel.xml @@ -6,6 +6,8 @@ http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms-2.0.xsd" xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-jms="http://www.springframework.org/schema/integration/jms"> + + + + + + receive-timeout="100000" + reply-timeout="200000"/> @@ -44,11 +49,11 @@ - + - - - + + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsGatewayWithConnectionFactoryAndDestination.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsGatewayWithConnectionFactoryAndDestination.xml index 20350250af..10fb976b55 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsGatewayWithConnectionFactoryAndDestination.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsGatewayWithConnectionFactoryAndDestination.xml @@ -10,6 +10,8 @@ http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithJmsTemplate.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithJmsTemplate.xml index 0c19999f30..0247d7200d 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithJmsTemplate.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithJmsTemplate.xml @@ -10,7 +10,9 @@ http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> - + + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithMessageSelector.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithMessageSelector.xml index bc1a9327ae..ef72def7b6 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithMessageSelector.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithMessageSelector.xml @@ -10,6 +10,8 @@ http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> + + diff --git a/spring-integration-ws/src/main/java/org/springframework/integration/ws/MarshallingWebServiceInboundGateway.java b/spring-integration-ws/src/main/java/org/springframework/integration/ws/MarshallingWebServiceInboundGateway.java index 41793a3615..cb10cec0cb 100644 --- a/spring-integration-ws/src/main/java/org/springframework/integration/ws/MarshallingWebServiceInboundGateway.java +++ b/spring-integration-ws/src/main/java/org/springframework/integration/ws/MarshallingWebServiceInboundGateway.java @@ -27,6 +27,7 @@ import org.springframework.expression.ExpressionException; import org.springframework.integration.MessageChannel; import org.springframework.integration.MessagingException; import org.springframework.integration.gateway.MessagingGatewaySupport; +import org.springframework.integration.history.TrackableComponent; import org.springframework.oxm.Marshaller; import org.springframework.oxm.Unmarshaller; import org.springframework.scheduling.TaskScheduler; @@ -37,13 +38,12 @@ import org.springframework.ws.server.endpoint.AbstractMarshallingPayloadEndpoint * @since 1.0.2 */ public class MarshallingWebServiceInboundGateway extends AbstractMarshallingPayloadEndpoint - implements BeanNameAware, BeanFactoryAware, InitializingBean, SmartLifecycle { + implements BeanNameAware, BeanFactoryAware, InitializingBean, SmartLifecycle, TrackableComponent { private final ReentrantLock lifecycleLock = new ReentrantLock(); private final GatewayDelegate gatewayDelegate = new GatewayDelegate(); - - + /** * Creates a new MarshallingWebServiceInboundGateway. * The {@link Marshaller} and {@link Unmarshaller} must be injected using properties. @@ -196,4 +196,15 @@ public class MarshallingWebServiceInboundGateway extends AbstractMarshallingPayl } } + public String getComponentName() { + return this.gatewayDelegate.getComponentName(); + } + + public String getComponentType() { + return this.gatewayDelegate.getComponentType(); + } + + public void setShouldTrack(boolean shouldTrack) { + this.gatewayDelegate.setShouldTrack(shouldTrack); + } } diff --git a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/StubMessageFactory.java b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/StubMessageFactory.java index 5ee23499e7..6dbccfc3a4 100644 --- a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/StubMessageFactory.java +++ b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/StubMessageFactory.java @@ -16,9 +16,14 @@ package org.springframework.integration.ws.config; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import java.io.IOException; import java.io.InputStream; +import javax.xml.transform.Source; + import org.springframework.ws.WebServiceMessage; import org.springframework.ws.WebServiceMessageFactory; @@ -28,7 +33,10 @@ import org.springframework.ws.WebServiceMessageFactory; public class StubMessageFactory implements WebServiceMessageFactory { public WebServiceMessage createWebServiceMessage() { - return null; + WebServiceMessage message = mock(WebServiceMessage.class); + Source source = mock(Source.class); + when(message.getPayloadSource()).thenReturn(source); + return message; } public WebServiceMessage createWebServiceMessage(InputStream inputStream) throws IOException { diff --git a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests-context.xml b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests-context.xml index 165ab0c9d1..b1e0a9bec0 100644 --- a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests-context.xml +++ b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests-context.xml @@ -11,15 +11,25 @@ http://www.springframework.org/schema/integration/ws/spring-integration-ws.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> + + - + - + - + + - + + + + + + + diff --git a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests.java b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests.java index 99e0760b0b..9ea57447eb 100644 --- a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests.java +++ b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests.java @@ -15,25 +15,39 @@ */ package org.springframework.integration.ws.config; +import static junit.framework.Assert.assertTrue; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import javax.xml.transform.Source; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.integration.Message; import org.springframework.integration.MessageChannel; +import org.springframework.integration.core.PollableChannel; +import org.springframework.integration.history.MessageHistory; import org.springframework.integration.ws.MarshallingWebServiceInboundGateway; import org.springframework.integration.ws.SimpleWebServiceInboundGateway; import org.springframework.oxm.AbstractMarshaller; +import org.springframework.oxm.Unmarshaller; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; /** * * @author Iwein Fuld + * @author Oleg Zhurakousky * */ @RunWith(SpringJUnit4ClassRunner.class) @@ -41,8 +55,16 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class WebServiceInboundGatewayParserTests { @Autowired - @Qualifier("requests") - MessageChannel requestChannel; + @Qualifier("requestsMarshalling") + PollableChannel requestsMarshalling; + + @Autowired + @Qualifier("requestsSimple") + PollableChannel requestsSimple; + + @Autowired + @Qualifier("requestsVerySimple") + MessageChannel requestsVerySimple; @Test public void configOk() throws Exception { @@ -59,7 +81,7 @@ public class WebServiceInboundGatewayParserTests { DirectFieldAccessor accessor = new DirectFieldAccessor(simpleGateway); assertThat( (MessageChannel) accessor.getPropertyValue("requestChannel"), - is(requestChannel)); + is(requestsVerySimple)); } //extractPayload = false @@ -78,6 +100,7 @@ public class WebServiceInboundGatewayParserTests { //marshalling @Autowired MarshallingWebServiceInboundGateway marshallingGateway; + @Autowired AbstractMarshaller marshaller; @@ -90,4 +113,23 @@ public class WebServiceInboundGatewayParserTests { is(marshaller)); assertTrue("messaging gateway is not running", marshallingGateway.isRunning()); } + @Test + public void testMessageHistoryWithMarshallingGateway() throws Exception { + MessageContext context = new DefaultMessageContext(new StubMessageFactory()); + Unmarshaller unmarshaller = mock(Unmarshaller.class); + when(unmarshaller.unmarshal((Source)Mockito.any())).thenReturn("hello"); + marshallingGateway.setUnmarshaller(unmarshaller); + marshallingGateway.invoke(context); + Message message = requestsMarshalling.receive(100); + MessageHistory history = MessageHistory.read(message); + assertTrue(history.containsComponent("marshalling")); + } + @Test + public void testMessageHistoryWithSimpleGateway() throws Exception { + MessageContext context = new DefaultMessageContext(new StubMessageFactory()); + payloadExtractingGateway.invoke(context); + Message message = requestsSimple.receive(100); + MessageHistory history = MessageHistory.read(message); + assertTrue(history.containsComponent("extractsPayload")); + } } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests.java index 5e4724c841..801716ac5e 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests.java @@ -56,7 +56,7 @@ public class XsltTransformerTests { input.send(message); Message resultMessage = output.receive(); MessageHistory history = MessageHistory.read(resultMessage); - assertTrue(history.containsEntryWithName("paramHeadersWithStartWildCharacter")); + assertTrue(history.containsComponent("paramHeadersWithStartWildCharacter")); assertEquals("Wrong payload type",String.class, resultMessage.getPayload().getClass()); assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); assertFalse(((String) resultMessage.getPayload()).contains("FOO")); @@ -71,7 +71,7 @@ public class XsltTransformerTests { input.send(message); Message resultMessage = output.receive(); MessageHistory history = MessageHistory.read(resultMessage); - assertTrue(history.containsEntryWithName("paramHeadersWithEndWildCharacter")); + assertTrue(history.containsComponent("paramHeadersWithEndWildCharacter")); assertEquals("Wrong payload type",String.class, resultMessage.getPayload().getClass()); assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); assertTrue(((String) resultMessage.getPayload()).contains("FOO")); @@ -86,7 +86,7 @@ public class XsltTransformerTests { input.send(message); Message resultMessage = output.receive(); MessageHistory history = MessageHistory.read(resultMessage); - assertTrue(history.containsEntryWithName("paramHeadersWithIndividualParameters")); + assertTrue(history.containsComponent("paramHeadersWithIndividualParameters")); assertEquals("Wrong payload type",String.class, resultMessage.getPayload().getClass()); assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); assertTrue(((String) resultMessage.getPayload()).contains("FOO")); @@ -103,7 +103,7 @@ public class XsltTransformerTests { input.send(message); Message resultMessage = output.receive(); MessageHistory history = MessageHistory.read(resultMessage); - assertTrue(history.containsEntryWithName("paramHeadersComboChannel")); + assertTrue(history.containsComponent("paramHeadersComboChannel")); assertEquals("Wrong payload type",String.class, resultMessage.getPayload().getClass()); assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); assertTrue(((String) resultMessage.getPayload()).contains("FOO"));