/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.activemq.artemis.jms.tests.message; import javax.jms.BytesMessage; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.MessageFormatException; import java.io.File; import java.io.Serializable; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Test; public class BodyIsAssignableFromTest extends MessageBodyTestCase { @Test public void testText() throws JMSException { bodyAssignableFrom(JmsMessageType.TEXT, String.class, CharSequence.class, Comparable.class, Serializable.class); bodyNotAssignableFrom(JmsMessageType.TEXT, List.class, StringBuilder.class, Map.class, File.class); } @Test public void testMap() throws JMSException { bodyAssignableFrom(JmsMessageType.MAP, Map.class, Object.class); bodyNotAssignableFrom(JmsMessageType.MAP, String.class, CharSequence.class, Comparable.class, Serializable.class); } @Test public void testStream() throws JMSException { bodyNotAssignableFrom(JmsMessageType.STREAM, Object.class, Serializable.class); } @Test public void testByte() throws JMSException { bodyAssignableFrom(JmsMessageType.BYTE, Object.class, byte[].class); bodyNotAssignableFrom(JmsMessageType.BYTE, String.class, CharSequence.class, Comparable.class); } @Test public void testObject() throws JMSException { bodyAssignableFrom(JmsMessageType.OBJECT, Object.class, Serializable.class, Comparable.class, Double.class); // we are sending a Double in the body, so the de-serialized Object will be an instanceof these: bodyAssignableFrom(JmsMessageType.OBJECT, Comparable.class, Double.class); bodyNotAssignableFrom(JmsMessageType.OBJECT, String.class, CharSequence.class, List.class); } private void bodyAssignableFrom(JmsMessageType type, Class... clazz) throws JMSException { bodyAssignableFrom(type, true, clazz); } /** * @param type * @param clazz * @param bool * @throws JMSException */ private void bodyAssignableFrom(final JmsMessageType type, final boolean bool, Class... clazz) throws JMSException { Assert.assertNotNull("clazz!=null", clazz); Assert.assertTrue("clazz[] not empty", clazz.length > 0); Object body = createBodySendAndReceive(type); Message msg = queueConsumer.receive(500); Assert.assertNotNull("must have a msg", msg); Assert.assertEquals(type.toString(), msg.getStringProperty("type")); for (Class<?> c : clazz) { Assert.assertEquals(msg + " " + type + " & " + c + ": " + bool, bool, msg.isBodyAssignableTo(c)); if (bool) { Object receivedBody = msg.getBody(c); Assert.assertTrue("correct type " + c, c.isInstance(receivedBody)); if (body.getClass().isAssignableFrom(byte[].class)) { Arrays.equals((byte[]) body, (byte[]) receivedBody); } else { Assert.assertEquals("clazz=" + c + ", bodies must match.. " + body.equals(receivedBody), body, receivedBody); } } else { try { Object foo = msg.getBody(c); Assert.fail("expected a " + MessageFormatException.class); } catch (MessageFormatException e) { // expected } } } } /** * @param type * @throws JMSException */ private Object createBodySendAndReceive(JmsMessageType type) throws JMSException { Object res = null; Message msg = null; switch (type) { case BYTE: BytesMessage mByte = queueProducerSession.createBytesMessage(); final int size = 20; byte[] resByte = new byte[size]; for (int i = 0; i < size; i++) { resByte[i] = (byte) i; mByte.writeByte((byte) i); } msg = mByte; res = resByte; break; case TEXT: res = "JMS2"; msg = queueProducerSession.createTextMessage("JMS2"); break; case STREAM: msg = queueProducerSession.createStreamMessage(); break; case OBJECT: res = new Double(37.6); msg = queueProducerSession.createObjectMessage(new Double(37.6)); break; case MAP: MapMessage msg1 = queueProducerSession.createMapMessage(); msg1.setInt("int", 13); msg1.setLong("long", 37L); msg1.setString("string", "crocodile"); msg = msg1; Map<String, Object> map = new HashMap<>(); map.put("int", Integer.valueOf(13)); map.put("long", Long.valueOf(37L)); map.put("string", "crocodile"); res = map; break; default: Assert.fail("no default..."); } Assert.assertNotNull(msg); msg.setStringProperty("type", type.toString()); queueProducer.send(msg); return res; } private void bodyNotAssignableFrom(JmsMessageType type, Class... clazz) throws JMSException { bodyAssignableFrom(type, false, clazz); } }