blob: 974244b23558b74be5e6ed4776b2d9278d22a05b [file] [log] [blame]
/*
* Copyright 2009 Red Hat, Inc.
* Red Hat 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.selector;
import javax.jms.DeliveryMode;
import javax.jms.TextMessage;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.objectweb.jtests.jms.framework.PTPTestCase;
import org.objectweb.jtests.jms.framework.TestConfig;
/**
* Test the message selector features of JMS
*
* @author Jeff Mesnil (jmesnil@)
* @version $Id: SelectorTest.java,v 1.3 2007/10/02 14:59:35 csuconic Exp $
*/
public class SelectorTest extends PTPTestCase
{
/**
* Test that an empty string as a message selector indicates that there
* is no message selector for the message consumer.
*/
public void testEmptyStringAsSelector() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "");
TextMessage message = senderSession.createTextMessage();
message.setText("testEmptyStringAsSelector");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("No message was received", msg != null);
Assert.assertEquals("testEmptyStringAsSelector", msg.getText());
}
/**
* Tats that String literals are well handled by the message selector.
* <br />
* <ul>
* <li><code>"string = 'literal''s;"</code> is <code>true</code> for "literal's" and <code>false</code> for "literal"</li>
* </ul>
*/
public void testStringLiterals() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "string = 'literal''s'");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setStringProperty("string", "literal");
dummyMessage.setText("testStringLiterals:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setStringProperty("string", "literal's");
message.setText("testStringLiterals:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("No message was received", msg != null);
Assert.assertEquals("testStringLiterals:2", msg.getText());
}
/**
* Test that the JMS property <code>JMSDeliveryMode</code> is treated as having the values <code>'PERSISTENT'</code>
* or <code>'NON_PERSISTENT'</code> when used in a message selector (chapter 3.8.1.3).
*/
public void testJMSDeliveryModeInSelector() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "JMSDeliveryMode = 'PERSISTENT'");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setText("testJMSDeliveryModeInSelector:1");
// send a dummy message in *non persistent* mode
sender.send(dummyMessage, DeliveryMode.NON_PERSISTENT, sender.getPriority(), sender.getTimeToLive());
TextMessage message = senderSession.createTextMessage();
message.setText("testJMSDeliveryModeInSelector:2");
// send a message in *persistent*
sender.send(message, DeliveryMode.PERSISTENT, sender.getPriority(), sender.getTimeToLive());
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("No message was received", msg != null);
// only the message sent in persistent mode should be received.
Assert.assertEquals(DeliveryMode.PERSISTENT, msg.getJMSDeliveryMode());
Assert.assertEquals("testJMSDeliveryModeInSelector:2", msg.getText());
}
/**
* Test that conversions that apply to the <code>get</code> methods for properties do not
* apply when a property is used in a message selector expression.
* Based on the example of chapter 3.8.1.1 about identifiers.
*/
public void testIdentifierConversion() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "NumberOfOrders > 1");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setStringProperty("NumberOfOrders", "2");
dummyMessage.setText("testIdentifierConversion:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setIntProperty("NumberOfOrders", 2);
message.setText("testIdentifierConversion:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertEquals("testIdentifierConversion:2", msg.getText());
}
/**
* Test the message selector using the filter example provided by the JMS specifications.
* <br />
* <ul>
* <li><code>"JMSType = 'car' AND color = 'blue' AND weight > 2500"</code></li>
* </ul>
*/
public void testSelectorExampleFromSpecs() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "JMSType = 'car' AND color = 'blue' AND weight > 2500");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setJMSType("car");
dummyMessage.setStringProperty("color", "red");
dummyMessage.setLongProperty("weight", 3000);
dummyMessage.setText("testSelectorExampleFromSpecs:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setJMSType("car");
message.setStringProperty("color", "blue");
message.setLongProperty("weight", 3000);
message.setText("testSelectorExampleFromSpecs:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertEquals("testSelectorExampleFromSpecs:2", msg.getText());
}
/**
* Test the ">" condition in message selector.
* <br />
* <ul>
* <li><code>"weight > 2500"</code> is <code>true</code> for 3000 and <code>false</code> for 1000</li>
* </ul>
*/
public void testGreaterThan() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "weight > 2500");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setLongProperty("weight", 1000);
dummyMessage.setText("testGreaterThan:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setLongProperty("weight", 3000);
message.setText("testGreaterThan:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertEquals("testGreaterThan:2", msg.getText());
}
/**
* Test the "=" condition in message selector.
* <br />
* <ul>
* <li><code>"weight = 2500"</code> is <code>true</code> for 2500 and <code>false</code> for 1000</li>
* </ul>
*/
public void testEquals() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "weight = 2500");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setLongProperty("weight", 1000);
dummyMessage.setText("testEquals:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setLongProperty("weight", 2500);
message.setText("testEquals:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertEquals("testEquals:2", msg.getText());
}
/**
* Test the "<>" (not equal) condition in message selector.
* <br />
* <ul>
* <li><code>"weight <> 2500"</code> is <code>true</code> for 1000 and <code>false</code> for 2500</li>
* </ul>
*/
public void testNotEquals() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "weight <> 2500");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setLongProperty("weight", 2500);
dummyMessage.setText("testEquals:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setLongProperty("weight", 1000);
message.setText("testEquals:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertEquals("testEquals:2", msg.getText());
}
/**
* Test the BETWEEN condition in message selector.
* <br />
* <ul>
* <li>"age BETWEEN 15 and 19" is <code>true</code> for 17 and <code>false</code> for 20</li>
* </ul>
*/
public void testBetween() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "age BETWEEN 15 and 19");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setIntProperty("age", 20);
dummyMessage.setText("testBetween:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setIntProperty("age", 17);
message.setText("testBetween:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("Message not received", msg != null);
Assert.assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testBetween"));
Assert.assertEquals("testBetween:2", msg.getText());
}
/**
* Test the IN condition in message selector.
* <br />
* <ul>
* <li>"Country IN ('UK', 'US', 'France')" is <code>true</code> for 'UK' and <code>false</code> for 'Peru'</li>
* </ul>
*/
public void testIn() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "Country IN ('UK', 'US', 'France')");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setStringProperty("Country", "Peru");
dummyMessage.setText("testIn:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setStringProperty("Country", "UK");
message.setText("testIn:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("Message not received", msg != null);
Assert.assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testIn"));
Assert.assertEquals("testIn:2", msg.getText());
}
/**
* Test the LIKE ... ESCAPE condition in message selector
* <br />
* <ul>
* <li>"underscored LIKE '\_%' ESCAPE '\'" is <code>true</code> for '_foo' and <code>false</code> for 'bar'</li>
* </ul>
*/
public void testLikeEscape() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "underscored LIKE '\\_%' ESCAPE '\\'");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setStringProperty("underscored", "bar");
dummyMessage.setText("testLikeEscape:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setStringProperty("underscored", "_foo");
message.setText("testLikeEscape:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("Message not received", msg != null);
Assert.assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testLikeEscape"));
Assert.assertEquals("testLikeEscape:2", msg.getText());
}
/**
* Test the LIKE condition with '_' in the pattern.
* <br />
* <ul>
* <li>"word LIKE 'l_se'" is <code>true</code> for 'lose' and <code>false</code> for 'loose'</li>
* </ul>
*/
public void testLike_2() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "word LIKE 'l_se'");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setStringProperty("word", "loose");
dummyMessage.setText("testLike_2:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setStringProperty("word", "lose");
message.setText("testLike_2:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("Message not received", msg != null);
Assert.assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testLike_2"));
Assert.assertEquals("testLike_2:2", msg.getText());
}
/**
* Test the LIKE condition with '%' in the pattern.
* <br />
* <ul>
* <li>"phone LIKE '12%3'" is <code>true</code> for '12993' and <code>false</code> for '1234'</li>
* </ul>
*/
public void testLike_1() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "phone LIKE '12%3'");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setStringProperty("phone", "1234");
dummyMessage.setText("testLike_1:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setStringProperty("phone", "12993");
message.setText("testLike_1:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue("Message not received", msg != null);
Assert.assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testLike_1"));
Assert.assertEquals("testLike_1:2", msg.getText());
}
/**
* Test the <code>NULL</code> value in message selector.
* <br />
* <ul>
* <li><code>"prop IS NULL"</code></li>
* </ul>
*/
public void testNull() throws Exception
{
if (receiver != null)
{
receiver.close();
}
receiver = receiverSession.createReceiver(receiverQueue, "prop_name IS NULL");
TextMessage dummyMessage = senderSession.createTextMessage();
dummyMessage.setStringProperty("prop_name", "not null");
dummyMessage.setText("testNull:1");
sender.send(dummyMessage);
TextMessage message = senderSession.createTextMessage();
message.setText("testNull:2");
sender.send(message);
TextMessage msg = (TextMessage)receiver.receive(TestConfig.TIMEOUT);
Assert.assertTrue(msg != null);
Assert.assertEquals("testNull:2", msg.getText());
}
/**
* Method to use this class in a Test suite
*/
public static Test suite()
{
return new TestSuite(SelectorTest.class);
}
public SelectorTest(final String name)
{
super(name);
}
}