/*
* 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.objectweb.jtests.jms.conform.message.headers;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.TemporaryQueue;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;
import org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory;
import org.junit.Assert;
import org.junit.Test;
import org.objectweb.jtests.jms.framework.PTPTestCase;
import org.objectweb.jtests.jms.framework.TestConfig;
/**
* Test the headers of a message
*/
public class MessageHeaderTest extends PTPTestCase {
/**
* Test that the <code>MessageProducer.setPriority()</code> changes effectively
* priority of the message.
*/
@Test
public void testJMSPriority_2() {
try {
Message message = senderSession.createMessage();
sender.send(message);
sender.setPriority(9);
sender.send(message);
Assert.assertEquals("sec. 3.4.9 After completion of the send it holds the value specified by the " + "method sending the message.\n", 9, message.getJMSPriority());
receiver.receive(TestConfig.TIMEOUT);
} catch (JMSException e) {
fail(e);
}
}
/**
* Test that the priority set by <code>Message.setJMSPriority()</code> is ignored when a
* message is sent and that it holds the value specified when sending the message (i.e.
* <code>Message.DEFAULT_PRIORITY</code> in this test).
*/
@Test
public void testJMSPriority_1() {
try {
Message message = senderSession.createMessage();
message.setJMSPriority(0);
sender.send(message);
Assert.assertTrue("sec. 3.4.9 When a message is sent this value is ignored.\n", message.getJMSPriority() != 0);
Assert.assertEquals("sec. 3.4.9 After completion of the send it holds the value specified by the " + "method sending the message.\n", Message.DEFAULT_PRIORITY, message.getJMSPriority());
receiver.receive(TestConfig.TIMEOUT);
} catch (JMSException e) {
fail(e);
}
}
/**
* Test that the value of the <code>JMSExpiration<code> header field is the same
* for the sent message and the received one.
*/
@Test
public void testJMSExpiration() {
try {
Message message = senderSession.createMessage();
sender.send(message);
Message msg = receiver.receive(TestConfig.TIMEOUT);
Assert.assertEquals("sec. 3.4.9 When a message is received its JMSExpiration header field contains this same " + "value [i.e. set on return of the send method].\n", message.getJMSExpiration(), msg.getJMSExpiration());
} catch (JMSException e) {
fail(e);
}
}
/**
* Test that the <code>JMSMessageID</code> is set by the provider when the <code>send</code> method returns
* and that it starts with <code>"ID:"</code>.
*/
@Test
public void testJMSMessageID_2() {
try {
Message message = senderSession.createMessage();
sender.send(message);
Assert.assertTrue("sec. 3.4.3 When the send method returns it contains a provider-assigned value.\n", message.getJMSMessageID() != null);
Assert.assertTrue("sec. 3.4.3 All JMSMessageID values must start with the prefix 'ID:'.\n", message.getJMSMessageID().startsWith("ID:"));
Message msg = receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("sec. 3.4.3 All JMSMessageID values must start with the prefix 'ID:'.\n", msg.getJMSMessageID().startsWith("ID:"));
} catch (JMSException e) {
fail(e);
}
}
/**
* Test that the <code>JMSMessageID</code> header field value is
* ignored when the message is sent.
*/
@Test
public void testJMSMessageID_1() {
try {
Message message = senderSession.createMessage();
message.setJMSMessageID("ID:foo");
sender.send(message);
Assert.assertTrue("sec. 3.4.3 When a message is sent this value is ignored.\n", !message.getJMSMessageID().equals("ID:foo"));
receiver.receive(TestConfig.TIMEOUT);
} catch (JMSException e) {
fail(e);
}
}
/**
* Test that the <code>JMSDeliveryMode</code> header field value is ignored
* when the message is sent and that it holds the value specified by the sending
* method (i.e. <code>Message.DEFAULT_ROUTING_TYPE</code> in this test when the message is received.
*/
@Test
public void testJMSDeliveryMode() {
try {
// sender has been created with the DEFAULT_ROUTING_TYPE which is PERSISTENT
Assert.assertEquals(DeliveryMode.PERSISTENT, sender.getDeliveryMode());
Message message = senderSession.createMessage();
// send a message specfiying NON_PERSISTENT for the JMSDeliveryMode header field
message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
sender.send(message);
Assert.assertTrue("sec. 3.4.2 When a message is sent this value is ignored", message.getJMSDeliveryMode() != DeliveryMode.NON_PERSISTENT);
Assert.assertEquals("sec. 3.4.2 After completion of the send it holds the delivery mode specified " + "by the sending method (persistent by default).\n", Message.DEFAULT_DELIVERY_MODE, message.getJMSDeliveryMode());
receiver.receive(TestConfig.TIMEOUT);
} catch (JMSException e) {
fail(e);
}
}
/**
* Test that the <code>JMSDestination</code> header field value is ignored when the message
* is sent and that after completion of the sending method, it holds the <code>Destination</code>
* specified by the sending method.
* Also test that the value of the header on the received message is the same that on the sent message.
*/
@Test
public void testJMSDestination() {
try {
admin.createQueue("anotherQueue");
Hashtable<String, String> props = new Hashtable<>();
props.put(Context.INITIAL_CONTEXT_FACTORY, ActiveMQInitialContextFactory.class.getName());
props.put("queue.anotherQueue", "anotherQueue");
Context ctx = new InitialContext(props);
Queue anotherQueue = (Queue) ctx.lookup("anotherQueue");
Assert.assertTrue(anotherQueue != senderQueue);
// set the JMSDestination header field to the anotherQueue Destination
Message message = senderSession.createMessage();
message.setJMSDestination(anotherQueue);
sender.send(message);
Assert.assertTrue("sec. 3.4.1 When a message is sent this value is ignored.\n", message.getJMSDestination() != anotherQueue);
Assert.assertEquals("sec. 3.4.1 After completion of the send it holds the destination object specified " + "by the sending method.\n", senderQueue, message.getJMSDestination());
Message msg = receiver.receive(TestConfig.TIMEOUT);
String one = ((Queue) message.getJMSDestination()).getQueueName();
String two = ((Queue) msg.getJMSDestination()).getQueueName();
Assert.assertEquals("sec. 3.4.1 When a message is received, its destination value must be equivalent " + " to the value assigned when it was sent.\n", one, two);
admin.deleteQueue("anotherQueue");
} catch (JMSException e) {
fail(e);
} catch (NamingException e) {
Assert.fail(e.getMessage());
}
}
/**
* Test that a <code>Destination</code> set by the <code>setJMSReplyTo()</code>
* method on a sended message corresponds to the <code>Destination</code> get by
* the </code>getJMSReplyTo()</code> method.
*/
@Test
public void testJMSReplyTo_1() {
try {
Message message = senderSession.createMessage();
message.setJMSReplyTo(senderQueue);
sender.send(message);
Message msg = receiver.receive(TestConfig.TIMEOUT);
Destination dest = msg.getJMSReplyTo();
Assert.assertTrue("JMS ReplyTo header field should be a Queue", dest instanceof Queue);
Queue replyTo = (Queue) dest;
Assert.assertEquals("JMS ReplyTo header field should be equals to the sender queue", replyTo.getQueueName(), senderQueue.getQueueName());
} catch (JMSException e) {
fail(e);
}
}
/**
* Test that if the JMS ReplyTo header field has been set as a <code>TemporaryQueue</code>,
* it will be rightly get also as a <code>TemporaryQueue</code>
* (and not only as a <code>Queue</code>).
*/
@Test
public void testJMSReplyTo_2() {
try {
TemporaryQueue tempQueue = senderSession.createTemporaryQueue();
Message message = senderSession.createMessage();
message.setJMSReplyTo(tempQueue);
sender.send(message);
Message msg = receiver.receive(TestConfig.TIMEOUT);
Destination dest = msg.getJMSReplyTo();
Assert.assertTrue("JMS ReplyTo header field should be a TemporaryQueue", dest instanceof TemporaryQueue);
Queue replyTo = (Queue) dest;
Assert.assertEquals("JMS ReplyTo header field should be equals to the temporary queue", replyTo.getQueueName(), tempQueue.getQueueName());
} catch (JMSException e) {
fail(e);
}
}
}