/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.jbossmessaging.test;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import org.jboss.test.JBossJMSTestCase;
import org.jboss.test.util.jms.JMSDestinationsUtil;
/**
* Tests message bodies.
*
* @author <a href="mailto:richard.achmatowicz@jboss.com">Richard Achmatowicz</a>
* @author Loren Rosen (submitted patch)
* @author <a href="mailto:jason@planet57.com">Jason Dillon</a>
* @version $Revision: 105321 $
*/
public class MessageBodyUnitTestCase extends JBossJMSTestCase
{
// Provider specific
public static final String QUEUE_FACTORY = "ConnectionFactory";
public static final String TEST_QUEUE = "queue/testQueue";
Context context;
QueueConnection queueConnection;
QueueSession session;
Queue queue;
QueueReceiver receiver;
QueueSender sender;
public MessageBodyUnitTestCase(String name) throws Exception
{
super(name);
}
protected void setUp() throws Exception
{
// call setUp() in the superclass
super.setUp() ;
JMSDestinationsUtil.setupBasicDestinations();
connect();
}
protected void tearDown() throws Exception
{
disconnect();
JMSDestinationsUtil.destroyDestinations();
// call tearDown() in the superclass to cleanup
super.tearDown() ;
}
protected void connect() throws Exception
{
getLog().debug("connecting");
if (context == null)
{
context = getInitialContext();
}
QueueConnectionFactory queueFactory = (QueueConnectionFactory) context.lookup(QUEUE_FACTORY);
queueConnection = queueFactory.createQueueConnection();
getLog().debug("connected");
queueConnection.start();
session = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
getLog().debug("session established");
queue = (Queue) context.lookup(TEST_QUEUE);
receiver = session.createReceiver(queue);
sender = session.createSender(queue);
getLog().debug("sender established");
drainQueue();
getLog().debug("end of connect call");
}
protected void disconnect() throws Exception
{
queueConnection.close();
}
private void drainQueue() throws Exception
{
getLog().debug("draining queue");
Message message = receiver.receive(2000);
int c = 0;
while (message != null)
{
message = receiver.receive(2000);
c++;
}
if (c != 0)
getLog().debug("Drained " + c + " messages from the queue");
getLog().debug("drained queue");
}
protected void validate(String payload) throws Exception
{
getLog().debug("validating text |" + payload + "|");
TextMessage outMessage = session.createTextMessage();
outMessage.setText(payload);
getLog().debug("sending |" + payload + "|");
sender.send(outMessage);
getLog().debug("receiving |" + payload + "|");
TextMessage inMessage = (TextMessage) receiver.receive();
getLog().debug("received |" + payload + "|");
String inPayload = inMessage.getText();
assertEquals("Message body text test", payload, inPayload);
getLog().debug("validated text " + payload);
}
public void testTextMessageBody() throws Exception
{
getLog().debug("testing text");
validate("ordinary text");
validate(" ");
validate("");
// very long strings, non-printable ASCII strings
char c[] = new char[1024 * 32];
Arrays.fill(c, 'x');
validate(new String(c));
Arrays.fill(c, '\u0130'); // I with dot
validate(new String(c));
Arrays.fill(c, '\u0008');
validate(new String(c));
getLog().debug("tested text");
}
protected void validate(java.io.Serializable payload) throws Exception
{
ObjectMessage outMessage = session.createObjectMessage();
outMessage.setObject(payload);
sender.send(outMessage);
ObjectMessage inMessage = (ObjectMessage) receiver.receive();
Object inPayload = inMessage.getObject();
assertEquals("Message body object test", payload, inPayload);
}
public void testObjectMessageBody() throws Exception
{
getLog().debug("testing object");
validate(new Integer(0));
validate(new Integer(1));
validate(new Integer(-1));
validate(new Integer(Integer.MAX_VALUE));
validate(new Integer(Integer.MIN_VALUE));
validate(new Integer(-1));
validate(new Float(1.0));
validate(new Float(0.0));
validate(new Float(-1.0));
validate(new Float(Float.MAX_VALUE));
validate(new Float(Float.MIN_VALUE));
validate(new Float(Float.NaN));
validate(new Float(Float.POSITIVE_INFINITY));
validate(new Float(Float.NEGATIVE_INFINITY));
validate(new Float(1.0));
HashMap m = new HashMap(); // Fill with serializable stuff
m.put("file", new java.io.File("somefile.txt"));
m.put("url", new java.net.URL("http://example.net"));
validate(m);
validate((java.io.Serializable)Collections.nCopies(10000, "Repeat"));
}
/**
* Test null properties.
*/
public void testNullProperties() throws Exception
{
TextMessage message = session.createTextMessage();
message.setStringProperty("THE_PROP", null);
message.setObjectProperty("THE_PROP2", null);
try
{
message.setStringProperty("", null);
fail("empty string property");
}
catch (IllegalArgumentException e) {}
try
{
message.setStringProperty(null, null);
fail("null property");
}
catch (IllegalArgumentException e) {}
}
public void testInvalidPropertyName() throws Exception
{
Message message = session.createMessage();
String[] invalid = new String[]
{
"invalid-hyphen",
"1digitfirst",
"NULL",
"TRUE",
"FALSE",
"NOT",
"AND",
"OR",
"BETWEEN",
"LIKE",
"IN",
"IS",
"ESCAPE"
};
for (int i = 0; i < invalid.length; ++i)
{
try
{
message.setStringProperty(invalid[i], "whatever");
fail("expected error for invalid property name " + invalid[i]);
}
catch (IllegalArgumentException expected)
{
}
}
String[] valid = new String[]
{
"identifier",
"_",
"$",
"_xSx",
"$x_x",
"A1",
"null",
"true",
"false",
"not",
"and",
"or",
"between",
"like",
"in",
"is",
"escape"
};
for (int i = 0; i < invalid.length; ++i)
message.setStringProperty(valid[i], "whatever");
}
}