/*
* 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.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageEOFException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import java.util.Arrays;
import java.util.Enumeration;
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
import org.apache.activemq.artemis.jms.client.ActiveMQBytesMessage;
import org.apache.activemq.artemis.jms.client.ActiveMQMapMessage;
import org.apache.activemq.artemis.jms.client.ActiveMQMessage;
import org.apache.activemq.artemis.jms.client.ActiveMQObjectMessage;
import org.apache.activemq.artemis.jms.client.ActiveMQStreamMessage;
import org.apache.activemq.artemis.jms.client.ActiveMQTextMessage;
import org.apache.activemq.artemis.jms.tests.ActiveMQServerTestCase;
import org.apache.activemq.artemis.jms.tests.util.ProxyAssertSupport;
import org.junit.Before;
public abstract class MessageHeaderTestBase extends ActiveMQServerTestCase {
// Constants -----------------------------------------------------
// Static --------------------------------------------------------
/**
* Loads the message header fields with significant values.
*/
public static void configureMessage(final ActiveMQMessage m) throws JMSException {
m.setJMSMessageID("ID:messageID777");
m.setJMSTimestamp(123456789L);
m.setJMSCorrelationID("correlationID777");
m.setJMSReplyTo(ActiveMQJMSClient.createQueue("ReplyToQueue"));
m.setJMSDestination(ActiveMQJMSClient.createQueue("DestinationQueue"));
m.setJMSDeliveryMode(DeliveryMode.PERSISTENT);
m.setJMSExpiration(987654321L);
m.setJMSPriority(9);
m.setBooleanProperty("booleanProperty", true);
m.setByteProperty("byteProperty", (byte) 2);
m.setShortProperty("shortProperty", (short) 3);
m.setIntProperty("intProperty", 4);
m.setLongProperty("longProperty", 5L);
m.setFloatProperty("floatProperty", 6);
m.setDoubleProperty("doubleProperty", 7);
m.setStringProperty("stringPoperty", "someString");
m.setStringProperty("JMSXNaughtyProperty", "aardvark");
}
/**
* Makes sure two physically different message are equivalent: they have identical JMS fields and
* body.
*/
public static void ensureEquivalent(final Message m1, final ActiveMQMessage m2) throws JMSException {
ProxyAssertSupport.assertTrue(m1 != m2);
// Can't compare message id since not set until send
ProxyAssertSupport.assertEquals(m1.getJMSTimestamp(), m2.getJMSTimestamp());
byte[] corrIDBytes = null;
String corrIDString = null;
try {
corrIDBytes = m1.getJMSCorrelationIDAsBytes();
} catch (JMSException e) {
// correlation ID specified as String
corrIDString = m1.getJMSCorrelationID();
}
if (corrIDBytes != null) {
ProxyAssertSupport.assertTrue(Arrays.equals(corrIDBytes, m2.getJMSCorrelationIDAsBytes()));
} else if (corrIDString != null) {
ProxyAssertSupport.assertEquals(corrIDString, m2.getJMSCorrelationID());
} else {
// no correlation id
try {
byte[] corrID2 = m2.getJMSCorrelationIDAsBytes();
ProxyAssertSupport.assertNull(corrID2);
} catch (JMSException e) {
// correlatin ID specified as String
String corrID2 = m2.getJMSCorrelationID();
ProxyAssertSupport.assertNull(corrID2);
}
}
ProxyAssertSupport.assertEquals(m1.getJMSReplyTo(), m2.getJMSReplyTo());
ProxyAssertSupport.assertEquals(m1.getJMSDestination(), m2.getJMSDestination());
ProxyAssertSupport.assertEquals(m1.getJMSDeliveryMode(), m2.getJMSDeliveryMode());
// We don't check redelivered since this is always dealt with on the proxy
ProxyAssertSupport.assertEquals(m1.getJMSType(), m2.getJMSType());
ProxyAssertSupport.assertEquals(m1.getJMSExpiration(), m2.getJMSExpiration());
ProxyAssertSupport.assertEquals(m1.getJMSPriority(), m2.getJMSPriority());
int m1PropertyCount = 0, m2PropertyCount = 0;
for (Enumeration<String> p = m1.getPropertyNames(); p.hasMoreElements(); ) {
String name = p.nextElement();
if (!name.startsWith("JMSX")) {
m1PropertyCount++;
}
}
for (Enumeration p = m2.getPropertyNames(); p.hasMoreElements(); ) {
String name = (String) p.nextElement();
if (!name.startsWith("JMSX")) {
m2PropertyCount++;
}
}
ProxyAssertSupport.assertEquals(m1PropertyCount, m2PropertyCount);
for (Enumeration props = m1.getPropertyNames(); props.hasMoreElements(); ) {
boolean found = false;
String name = (String) props.nextElement();
if (name.startsWith("JMSX")) {
// ignore
continue;
}
boolean booleanProperty = false;
try {
booleanProperty = m1.getBooleanProperty(name);
found = true;
} catch (JMSException e) {
// not a boolean
}
if (found) {
ProxyAssertSupport.assertEquals(booleanProperty, m2.getBooleanProperty(name));
continue;
}
byte byteProperty = 0;
try {
byteProperty = m1.getByteProperty(name);
found = true;
} catch (JMSException e) {
// not a byte
}
if (found) {
ProxyAssertSupport.assertEquals(byteProperty, m2.getByteProperty(name));
continue;
}
short shortProperty = 0;
try {
shortProperty = m1.getShortProperty(name);
found = true;
} catch (JMSException e) {
// not a short
}
if (found) {
ProxyAssertSupport.assertEquals(shortProperty, m2.getShortProperty(name));
continue;
}
int intProperty = 0;
try {
intProperty = m1.getIntProperty(name);
found = true;
} catch (JMSException e) {
// not an int
}
if (found) {
ProxyAssertSupport.assertEquals(intProperty, m2.getIntProperty(name));
continue;
}
long longProperty = 0;
try {
longProperty = m1.getLongProperty(name);
found = true;
} catch (JMSException e) {
// not a long
}
if (found) {
ProxyAssertSupport.assertEquals(longProperty, m2.getLongProperty(name));
continue;
}
float floatProperty = 0;
try {
floatProperty = m1.getFloatProperty(name);
found = true;
} catch (JMSException e) {
// not a float
}
if (found) {
ProxyAssertSupport.assertTrue(floatProperty == m2.getFloatProperty(name));
continue;
}
double doubleProperty = 0;
try {
doubleProperty = m1.getDoubleProperty(name);
found = true;
} catch (JMSException e) {
// not a double
}
if (found) {
ProxyAssertSupport.assertTrue(doubleProperty == m2.getDoubleProperty(name));
continue;
}
String stringProperty = null;
try {
stringProperty = m1.getStringProperty(name);
found = true;
} catch (JMSException e) {
// not a String
}
if (found) {
ProxyAssertSupport.assertEquals(stringProperty, m2.getStringProperty(name));
continue;
}
ProxyAssertSupport.fail("Cannot identify property " + name);
}
}
public static void ensureEquivalent(final BytesMessage m1, final ActiveMQBytesMessage m2) throws JMSException {
MessageHeaderTestBase.ensureEquivalent((Message) m1, m2);
long len = m1.getBodyLength();
for (int i = 0; i < len; i++) {
ProxyAssertSupport.assertEquals(m1.readByte(), m2.readByte());
}
try {
m1.readByte();
ProxyAssertSupport.fail("should throw MessageEOFException");
} catch (MessageEOFException e) {
// OK
}
try {
m2.readByte();
ProxyAssertSupport.fail("should throw MessageEOFException");
} catch (MessageEOFException e) {
// OK
}
}
public static void ensureEquivalent(final MapMessage m1, final ActiveMQMapMessage m2) throws JMSException {
MessageHeaderTestBase.ensureEquivalent((Message) m1, m2);
for (Enumeration<String> e = m1.getMapNames(); e.hasMoreElements(); ) {
String name = e.nextElement();
ProxyAssertSupport.assertEquals(m1.getObject(name), m2.getObject(name));
}
for (Enumeration<String> e = m2.getMapNames(); e.hasMoreElements(); ) {
String name = e.nextElement();
ProxyAssertSupport.assertEquals(m2.getObject(name), m1.getObject(name));
}
}
public static void ensureEquivalent(final ObjectMessage m1, final ActiveMQObjectMessage m2) throws JMSException {
MessageHeaderTestBase.ensureEquivalent((Message) m1, m2);
ProxyAssertSupport.assertEquals(m1.getObject(), m2.getObject());
}
public static void ensureEquivalent(final StreamMessage m1, final ActiveMQStreamMessage m2) throws JMSException {
MessageHeaderTestBase.ensureEquivalent((Message) m1, m2);
m1.reset();
m2.reset();
boolean m1eof = false, m2eof = false;
while (true) {
byte b1, b2;
try {
b1 = m1.readByte();
} catch (MessageEOFException e) {
m1eof = true;
break;
}
try {
b2 = m2.readByte();
} catch (MessageEOFException e) {
m2eof = true;
break;
}
ProxyAssertSupport.assertEquals(b1, b2);
}
if (m1eof) {
try {
m2.readByte();
ProxyAssertSupport.fail("should throw MessageEOFException");
} catch (MessageEOFException e) {
// OK
}
}
if (m2eof) {
try {
m1.readByte();
ProxyAssertSupport.fail("should throw MessageEOFException");
} catch (MessageEOFException e) {
// OK
}
}
}
public static void ensureEquivalent(final TextMessage m1, final ActiveMQTextMessage m2) throws JMSException {
MessageHeaderTestBase.ensureEquivalent((Message) m1, m2);
ProxyAssertSupport.assertEquals(m1.getText(), m2.getText());
}
// Attributes ----------------------------------------------------
protected Connection producerConnection, consumerConnection;
protected Session queueProducerSession, queueConsumerSession;
protected MessageProducer queueProducer;
protected MessageConsumer queueConsumer;
protected Session topicProducerSession, topicConsumerSession;
protected MessageProducer topicProducer;
protected MessageConsumer topicConsumer;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
producerConnection = addConnection(getConnectionFactory().createConnection());
consumerConnection = addConnection(getConnectionFactory().createConnection());
queueProducerSession = producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queueConsumerSession = consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queueProducer = queueProducerSession.createProducer(queue1);
queueConsumer = queueConsumerSession.createConsumer(queue1);
topicProducerSession = producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
topicConsumerSession = consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
topicProducer = topicProducerSession.createProducer(ActiveMQServerTestCase.topic1);
topicConsumer = topicConsumerSession.createConsumer(ActiveMQServerTestCase.topic1);
consumerConnection.start();
}
}