diff --git a/build.gradle b/build.gradle index e4106589ef..540e8f545b 100644 --- a/build.gradle +++ b/build.gradle @@ -807,6 +807,7 @@ project('spring-integration-stream') { dependencies { compile project(":spring-integration-core") compile "org.springframework:spring-context:$springVersion" + testCompile project(":spring-integration-test") } bundlor { bundleSymbolicName = 'org.springframework.integration.stream' diff --git a/spring-integration-stream/src/test/java/org/springframework/integration/stream/config/consoleOutboundChannelAdapterParserTests.xml b/spring-integration-stream/src/test/java/org/springframework/integration/stream/config/ConsoleOutboundChannelAdapterParserTests-context.xml similarity index 94% rename from spring-integration-stream/src/test/java/org/springframework/integration/stream/config/consoleOutboundChannelAdapterParserTests.xml rename to spring-integration-stream/src/test/java/org/springframework/integration/stream/config/ConsoleOutboundChannelAdapterParserTests-context.xml index f70f1c265e..bafc4932f4 100644 --- a/spring-integration-stream/src/test/java/org/springframework/integration/stream/config/consoleOutboundChannelAdapterParserTests.xml +++ b/spring-integration-stream/src/test/java/org/springframework/integration/stream/config/ConsoleOutboundChannelAdapterParserTests-context.xml @@ -20,7 +20,7 @@ - + diff --git a/spring-integration-stream/src/test/java/org/springframework/integration/stream/config/ConsoleOutboundChannelAdapterParserTests.java b/spring-integration-stream/src/test/java/org/springframework/integration/stream/config/ConsoleOutboundChannelAdapterParserTests.java index 13e17b20e0..e3d57bea77 100644 --- a/spring-integration-stream/src/test/java/org/springframework/integration/stream/config/ConsoleOutboundChannelAdapterParserTests.java +++ b/spring-integration-stream/src/test/java/org/springframework/integration/stream/config/ConsoleOutboundChannelAdapterParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2013 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. @@ -17,89 +17,110 @@ package org.springframework.integration.stream.config; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import java.io.BufferedWriter; -import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.OutputStreamWriter; -import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.io.Writer; - import java.nio.charset.Charset; +import java.util.List; -import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.core.MessageHandler; +import org.springframework.integration.handler.MessageHandlerChain; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.stream.CharacterStreamWritingMessageHandler; +import org.springframework.integration.test.util.TestUtils; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Mark Fisher * @author Gary Russell * @author Artem Bilan */ + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration public class ConsoleOutboundChannelAdapterParserTests { - private final ByteArrayOutputStream err = new ByteArrayOutputStream(); + @Autowired + @Qualifier("stdoutAdapterWithDefaultCharset.handler") + private MessageHandler stdoutAdapterWithDefaultCharsetHandler; - private final ByteArrayOutputStream out = new ByteArrayOutputStream(); + @Autowired + @Qualifier("stdoutAdapterWithProvidedCharset.handler") + private MessageHandler stdoutAdapterWithProvidedCharsetHandler; + @Autowired + @Qualifier("stderrAdapter.handler") + private MessageHandler stderrAdapterHandler; - @Before - public void setupStreams() { - System.setErr(new PrintStream(this.err)); - System.setOut(new PrintStream(this.out)); - } + @Autowired + @Qualifier("newlineAdapter.handler") + private MessageHandler newlineAdapterHandler; - private void resetStreams() { - this.err.reset(); - this.out.reset(); - } + @Autowired + @Qualifier("stdoutChain.handler") + private MessageHandler stdoutChainHandler; + + @Autowired + private MessageChannel stdoutInsideNestedChain; @Test - public void stdoutAdapterWithDefaultCharset() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( - "consoleOutboundChannelAdapterParserTests.xml", ConsoleOutboundChannelAdapterParserTests.class); - Object adapter = context.getBean("stdoutAdapterWithDefaultCharset"); - CharacterStreamWritingMessageHandler handler = (CharacterStreamWritingMessageHandler) - new DirectFieldAccessor(adapter).getPropertyValue("handler"); - DirectFieldAccessor accessor = new DirectFieldAccessor(handler); - Writer bufferedWriter = (Writer) accessor.getPropertyValue("writer"); - assertEquals(BufferedWriter.class, bufferedWriter.getClass()); - DirectFieldAccessor bufferedWriterAccessor = new DirectFieldAccessor(bufferedWriter); - Writer writer = (Writer) bufferedWriterAccessor.getPropertyValue("out"); + public void stdoutAdapterWithDefaultCharset() throws IOException { + BufferedWriter bufferedWriter = TestUtils.getPropertyValue(this.stdoutAdapterWithDefaultCharsetHandler, "writer", BufferedWriter.class); + Writer writer = TestUtils.getPropertyValue(bufferedWriter, "out", Writer.class); assertEquals(OutputStreamWriter.class, writer.getClass()); Charset writerCharset = Charset.forName(((OutputStreamWriter) writer).getEncoding()); assertEquals(Charset.defaultCharset(), writerCharset); - this.resetStreams(); - handler.handleMessage(new GenericMessage("foo")); - assertEquals("foo", out.toString()); - assertEquals("", err.toString()); - assertEquals(23, accessor.getPropertyValue("order")); + + Object lock = TestUtils.getPropertyValue(writer, "lock"); + assertEquals(System.out, lock); + + bufferedWriter = Mockito.spy(bufferedWriter); + + DirectFieldAccessor dfa = new DirectFieldAccessor(this.stdoutAdapterWithDefaultCharsetHandler); + dfa.setPropertyValue("writer", bufferedWriter); + + this.stdoutAdapterWithDefaultCharsetHandler.handleMessage(new GenericMessage("foo")); + + verify(bufferedWriter, times(1)).write(eq("foo")); + assertEquals(23, TestUtils.getPropertyValue(this.stdoutAdapterWithDefaultCharsetHandler, "order")); } @Test - public void stdoutAdapterWithProvidedCharset() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( - "consoleOutboundChannelAdapterParserTests.xml", ConsoleOutboundChannelAdapterParserTests.class); - Object adapter = context.getBean("stdoutAdapterWithProvidedCharset"); - CharacterStreamWritingMessageHandler handler = (CharacterStreamWritingMessageHandler) - new DirectFieldAccessor(adapter).getPropertyValue("handler"); - DirectFieldAccessor accessor = new DirectFieldAccessor(handler); - Writer bufferedWriter = (Writer) accessor.getPropertyValue("writer"); - assertEquals(BufferedWriter.class, bufferedWriter.getClass()); - DirectFieldAccessor bufferedWriterAccessor = new DirectFieldAccessor(bufferedWriter); - Writer writer = (Writer) bufferedWriterAccessor.getPropertyValue("out"); + public void stdoutAdapterWithProvidedCharset() throws IOException { + BufferedWriter bufferedWriter = TestUtils.getPropertyValue(this.stdoutAdapterWithProvidedCharsetHandler, "writer", BufferedWriter.class); + Writer writer = TestUtils.getPropertyValue(bufferedWriter, "out", Writer.class); assertEquals(OutputStreamWriter.class, writer.getClass()); Charset writerCharset = Charset.forName(((OutputStreamWriter) writer).getEncoding()); assertEquals(Charset.forName("UTF-8"), writerCharset); - this.resetStreams(); - handler.handleMessage(new GenericMessage("bar")); - assertEquals("bar", out.toString()); - assertEquals("", err.toString()); + + Object lock = TestUtils.getPropertyValue(writer, "lock"); + assertEquals(System.out, lock); + + bufferedWriter = Mockito.spy(bufferedWriter); + + DirectFieldAccessor dfa = new DirectFieldAccessor(this.stdoutAdapterWithProvidedCharsetHandler); + dfa.setPropertyValue("writer", bufferedWriter); + + this.stdoutAdapterWithProvidedCharsetHandler.handleMessage(new GenericMessage("bar")); + + verify(bufferedWriter, times(1)).write(eq("bar")); } @Test @@ -117,54 +138,78 @@ public class ConsoleOutboundChannelAdapterParserTests { } @Test - public void stderrAdapter() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( - "consoleOutboundChannelAdapterParserTests.xml", ConsoleOutboundChannelAdapterParserTests.class); - Object adapter = context.getBean("stderrAdapter"); - CharacterStreamWritingMessageHandler handler = (CharacterStreamWritingMessageHandler) - new DirectFieldAccessor(adapter).getPropertyValue("handler"); - DirectFieldAccessor accessor = new DirectFieldAccessor(handler); - Writer bufferedWriter = (Writer) accessor.getPropertyValue("writer"); - assertEquals(BufferedWriter.class, bufferedWriter.getClass()); - DirectFieldAccessor bufferedWriterAccessor = new DirectFieldAccessor(bufferedWriter); - Writer writer = (Writer) bufferedWriterAccessor.getPropertyValue("out"); + public void stderrAdapter() throws IOException { + BufferedWriter bufferedWriter = TestUtils.getPropertyValue(this.stderrAdapterHandler, "writer", BufferedWriter.class); + Writer writer = TestUtils.getPropertyValue(bufferedWriter, "out", Writer.class); assertEquals(OutputStreamWriter.class, writer.getClass()); Charset writerCharset = Charset.forName(((OutputStreamWriter) writer).getEncoding()); assertEquals(Charset.defaultCharset(), writerCharset); - this.resetStreams(); - handler.handleMessage(new GenericMessage("bad")); - assertEquals("", out.toString()); - assertEquals("bad", err.toString()); - assertEquals(34, accessor.getPropertyValue("order")); + + Object lock = TestUtils.getPropertyValue(writer, "lock"); + assertEquals(System.err, lock); + + bufferedWriter = Mockito.spy(bufferedWriter); + + DirectFieldAccessor dfa = new DirectFieldAccessor(this.stderrAdapterHandler); + dfa.setPropertyValue("writer", bufferedWriter); + + + this.stderrAdapterHandler.handleMessage(new GenericMessage("bar")); + + verify(bufferedWriter, times(1)).write(eq("bar")); + + assertEquals(34, TestUtils.getPropertyValue(this.stderrAdapterHandler, "order")); } @Test - public void stdoutAdatperWithAppendNewLine() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( - "consoleOutboundChannelAdapterParserTests.xml", ConsoleOutboundChannelAdapterParserTests.class); - Object adapter = context.getBean("newlineAdapter"); - CharacterStreamWritingMessageHandler handler = (CharacterStreamWritingMessageHandler) - new DirectFieldAccessor(adapter).getPropertyValue("handler"); - DirectFieldAccessor accessor = new DirectFieldAccessor(handler); - Writer bufferedWriter = (Writer) accessor.getPropertyValue("writer"); - assertEquals(BufferedWriter.class, bufferedWriter.getClass()); - DirectFieldAccessor bufferedWriterAccessor = new DirectFieldAccessor(bufferedWriter); - Writer writer = (Writer) bufferedWriterAccessor.getPropertyValue("out"); + public void stdoutAdatperWithAppendNewLine() throws IOException { + BufferedWriter bufferedWriter = TestUtils.getPropertyValue(this.newlineAdapterHandler, "writer", BufferedWriter.class); + Writer writer = TestUtils.getPropertyValue(bufferedWriter, "out", Writer.class); assertEquals(OutputStreamWriter.class, writer.getClass()); Charset writerCharset = Charset.forName(((OutputStreamWriter) writer).getEncoding()); assertEquals(Charset.defaultCharset(), writerCharset); - this.resetStreams(); - handler.handleMessage(new GenericMessage("foo")); - assertEquals("foo" + System.getProperty("line.separator"), out.toString()); + + Object lock = TestUtils.getPropertyValue(writer, "lock"); + assertEquals(System.out, lock); + + bufferedWriter = Mockito.spy(bufferedWriter); + + DirectFieldAccessor dfa = new DirectFieldAccessor(this.newlineAdapterHandler); + dfa.setPropertyValue("writer", bufferedWriter); + + this.newlineAdapterHandler.handleMessage(new GenericMessage("bar")); + + verify(bufferedWriter, times(1)).write(eq("bar")); + verify(bufferedWriter, times(1)).newLine(); + } @Test //INT-2275 - public void stdoutInsideNestedChain() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( - "consoleOutboundChannelAdapterParserTests.xml", ConsoleOutboundChannelAdapterParserTests.class); - DirectChannel channel = context.getBean("stdoutInsideNestedChain", DirectChannel.class); - this.resetStreams(); - channel.send(new GenericMessage("foo")); - assertEquals("foobar", out.toString()); + public void stdoutInsideNestedChain() throws IOException { + List handlers = TestUtils.getPropertyValue(this.stdoutChainHandler, "handlers", List.class); + assertEquals(2, handlers.size()); + Object chainHandler = handlers.get(1); + assertTrue(chainHandler instanceof MessageHandlerChain); + List nestedChainHandlers = TestUtils.getPropertyValue(chainHandler, "handlers", List.class); + assertEquals(1, nestedChainHandlers.size()); + Object stdoutHandler = nestedChainHandlers.get(0); + assertTrue(stdoutHandler instanceof CharacterStreamWritingMessageHandler); + + BufferedWriter bufferedWriter = TestUtils.getPropertyValue(stdoutHandler, "writer", BufferedWriter.class); + Writer writer = TestUtils.getPropertyValue(bufferedWriter, "out", Writer.class); + assertEquals(OutputStreamWriter.class, writer.getClass()); + Charset writerCharset = Charset.forName(((OutputStreamWriter) writer).getEncoding()); + assertEquals(Charset.defaultCharset(), writerCharset); + + Object lock = TestUtils.getPropertyValue(writer, "lock"); + assertEquals(System.out, lock); + + bufferedWriter = Mockito.spy(bufferedWriter); + + DirectFieldAccessor dfa = new DirectFieldAccessor(stdoutHandler); + dfa.setPropertyValue("writer", bufferedWriter); + + this.stdoutInsideNestedChain.send(new GenericMessage("foo")); + verify(bufferedWriter, times(1)).write(eq("foobar")); } } diff --git a/spring-integration-stream/src/test/resources/.svnignore b/spring-integration-stream/src/test/resources/.svnignore deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-integration-stream/src/test/resources/log4j.properties b/spring-integration-stream/src/test/resources/log4j.properties new file mode 100644 index 0000000000..f0a738122e --- /dev/null +++ b/spring-integration-stream/src/test/resources/log4j.properties @@ -0,0 +1,7 @@ +log4j.rootCategory=WARN, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%c{1}: %m%n + +log4j.category.org.springframework.integration.stream=DEBUG