/* * 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.integration.bus.converter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.converter.CompositeMessageConverter; import org.springframework.messaging.support.GenericMessage; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; import org.springframework.xd.tuple.DefaultTuple; import org.springframework.xd.tuple.Tuple; import org.springframework.xd.tuple.TupleBuilder; /** * Tests for converting from a Message. * * @author David Turanski */ public class FromMessageConverterTests { private List<AbstractFromMessageConverter> converters = new ArrayList<AbstractFromMessageConverter>(); CompositeMessageConverterFactory converterFactory; @Before public void setUp() { // Order matters converters.add(new StringToByteArrayMessageConverter()); converters.add(new JavaToSerializedMessageConverter()); converters.add(new SerializedToJavaMessageConverter()); converters.add(new JsonToTupleMessageConverter()); converters.add(new TupleToJsonMessageConverter()); converters.add(new PojoToJsonMessageConverter()); converters.add(new JsonToPojoMessageConverter()); converters.add(new ByteArrayToStringMessageConverter()); converters.add(new PojoToStringMessageConverter()); converterFactory = new CompositeMessageConverterFactory(converters); } @Test public void testPojoToJsonPrettyPrint() { //OS agnostic String json = String.format("{%n \"foo\" : \"bar\"%n}"); PojoToJsonMessageConverter messageConverter = new PojoToJsonMessageConverter(); messageConverter.setPrettyPrint(true); Message<?> msg = (Message<?>) messageConverter.fromMessage(new GenericMessage<Foo>(new Foo()), String.class); assertEquals(json, msg.getPayload().toString().trim()); assertEquals(MimeTypeUtils.APPLICATION_JSON, msg.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test @SuppressWarnings("unchecked") public void testTupleToJsonPrettyPrint() { Tuple t = TupleBuilder.fromString("{\"foo\":\"bar\"}"); Message<?> msg = MessageBuilder.withPayload(t).build(); TupleToJsonMessageConverter messageConverter = new TupleToJsonMessageConverter(); messageConverter.setPrettyPrint(true); Message<String> result = (Message<String>) messageConverter.fromMessage(msg, String.class); assertTrue(result.getPayload(), result.getPayload().contains(String.format("{%n"))); assertTrue(result.getPayload(), result.getPayload().contains("\"foo\" : \"bar\"")); assertEquals(MimeTypeUtils.APPLICATION_JSON, result.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test public void testPojoToJsonString() { String json = "{\"foo\":\"bar\"}"; CompositeMessageConverter converter = converterFactory.newInstance(MimeTypeUtils.APPLICATION_JSON); Message<?> msg = (Message<?>) converter.fromMessage(new GenericMessage<Foo>(new Foo()), String.class); assertEquals(json, msg.getPayload()); assertEquals(MimeTypeUtils.APPLICATION_JSON, msg.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test public void testObjectToString() { String text = "[bar]"; CompositeMessageConverter converter = converterFactory.newInstance(MimeTypeUtils.TEXT_PLAIN); Message<?> msg = (Message<?>) converter.fromMessage(new GenericMessage<Foo>(new Foo()), String.class); assertEquals(text, msg.getPayload()); assertEquals(MimeTypeUtils.TEXT_PLAIN, msg.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test public void testJsonStringToPojo() { String json = "{\"foo\":\"bar\"}"; Message<?> msg = MessageBuilder.withPayload(json) .build(); CompositeMessageConverter converter = converterFactory.newInstance(MimeType.valueOf("application/x-java-object")); Message<?> result = (Message<?>) converter.fromMessage(msg, Foo.class); Foo foo = (Foo) result.getPayload(); assertEquals("bar", foo.getFoo()); assertEquals(MimeType.valueOf("application/x-java-object;type=" + foo.getClass().getName()), result.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test @SuppressWarnings("unchecked") public void testJsonStringToMap() { String json = "{\"foo\":\"bar\"}"; Message<?> msg = MessageBuilder.withPayload(json) .build(); CompositeMessageConverter converter = converterFactory.newInstance(MimeType.valueOf("application/x-java-object")); Message<Map<String, String>> result = (Message<Map<String, String>>) converter.fromMessage(msg, HashMap.class); Map<String, String> map = result.getPayload(); assertEquals("bar", map.get("foo")); assertEquals(MimeType.valueOf("application/x-java-object;type=" + HashMap.class.getName()), result.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test public void testJsonStringWithContentTypeHeaderToPojo() { String json = "{\"foo\":\"bar\"}"; Message<?> msg = MessageBuilder.withPayload(json).copyHeaders( Collections.singletonMap(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)) .build(); CompositeMessageConverter converter = converterFactory.newInstance(MimeType.valueOf("application/x-java-object")); Message<?> result = (Message<?>) converter.fromMessage(msg, Foo.class); Foo foo = (Foo) result.getPayload(); assertEquals("bar", foo.getFoo()); assertEquals(MimeType.valueOf("application/x-java-object;type=" + foo.getClass().getName()), result.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test public void testJsonStringWithWrongContentTypeHeaderReturnsNull() { String json = "{\"foo\":\"bar\"}"; CompositeMessageConverter converter = converterFactory.newInstance(MimeTypeUtils.APPLICATION_JSON); Message<?> msg = MessageBuilder.withPayload(json).copyHeaders( Collections.singletonMap(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_XML)) .build(); Message<?> result = (Message<?>) converter.fromMessage(msg, Foo.class); assertNull(result); } @Test public void testByteArrayToString() { String json = "{\"foo\":\"bar\"}"; Message<?> msg = MessageBuilder.withPayload(json.getBytes()).build(); CompositeMessageConverter converter = converterFactory.newInstance(MimeType.valueOf("text/plain")); Object result = converter.fromMessage(msg, String.class); assertEquals(json, result); } @Test public void testByteArrayToStringWithCharset() throws UnsupportedEncodingException { String text = "Hello \u3044\u3002"; CompositeMessageConverter converter = converterFactory.newInstance(MimeType.valueOf("application/x-xd-string")); Message<?> msg = MessageBuilder.withPayload(text.getBytes("UTF-8")).copyHeaders( Collections.singletonMap(MessageHeaders.CONTENT_TYPE, MimeType.valueOf("text/plain;Charset=UTF-8"))) .build(); Object result = converter.fromMessage(msg, String.class); assertEquals(text, result); msg = MessageBuilder.withPayload(text.getBytes("ISO-8859-1")).copyHeaders( Collections.singletonMap(MessageHeaders.CONTENT_TYPE, MimeType.valueOf("text/plain;Charset=ISO-8859-1"))) .build(); result = converter.fromMessage(msg, String.class); assertEquals("Hello ??", result); } @SuppressWarnings("unchecked") @Test public void testJsonToTuple() { String json = "{\"foo\":\"bar\"}"; Message<?> msg = MessageBuilder.withPayload(json).build(); CompositeMessageConverter converter = converterFactory.newInstance(MimeType.valueOf("application/x-xd-tuple")); Message<Tuple> result = (Message<Tuple>) converter.fromMessage(msg, DefaultTuple.class); assertEquals("bar", result.getPayload().getString("foo")); assertEquals(MessageConverterUtils.javaObjectMimeType(DefaultTuple.class), result.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @SuppressWarnings("unchecked") @Test public void testTupleToJson() { Tuple t = TupleBuilder.fromString("{\"foo\":\"bar\"}"); Message<?> msg = MessageBuilder.withPayload(t).build(); CompositeMessageConverter converter = converterFactory.newInstance(MimeTypeUtils.APPLICATION_JSON); Message<String> result = (Message<String>) converter.fromMessage(msg, String.class); assertTrue(result.getPayload(), result.getPayload().contains("\"foo\":\"bar\"")); assertEquals(MimeTypeUtils.APPLICATION_JSON, result.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test public void testJavaSerialization() { Foo foo = new Foo(); CompositeMessageConverter converter = converterFactory.newInstance(MimeType.valueOf("application/x-java-serialized-object")); Message<Foo> msg = MessageBuilder.withPayload(foo).copyHeaders( Collections.singletonMap(MessageHeaders.CONTENT_TYPE, MimeType.valueOf("application/x-java-object"))).build(); Message<?> result = (Message<?>) converter.fromMessage(msg, byte[].class); assertTrue(result.getPayload() instanceof byte[]); assertEquals(MimeType.valueOf("application/x-java-serialized-object"), result.getHeaders().get(MessageHeaders.CONTENT_TYPE)); // Now convert back converter = converterFactory.newInstance(MimeType.valueOf("application/x-java-object")); result = (Message<?>) converter.fromMessage(result, Foo.class); assertNotNull(result); assertTrue(result.getPayload() instanceof Foo); assertEquals(MimeType.valueOf("application/x-java-object;type=" + Foo.class.getName()), result.getHeaders().get(MessageHeaders.CONTENT_TYPE)); } @Test public void testStringToByteArray() throws UnsupportedEncodingException { CompositeMessageConverter converter = converterFactory.newInstance(MimeType.valueOf("application/octet-stream")); Message<String> msg = MessageBuilder.withPayload("hello").copyHeaders( Collections.singletonMap(MessageHeaders.CONTENT_TYPE, MimeType.valueOf("text/plain;charset=UTF-8"))).build(); byte[] result = (byte[]) converter.fromMessage(msg, byte[].class); assertEquals("hello", new String(result, "UTF-8")); } } @SuppressWarnings("serial") class Foo implements Serializable { private String foo = "bar"; public String getFoo() { return foo; } @Override public String toString() { return "[" + foo + "]"; } }