package org.skyscreamer.nevado.jms.message;
import org.activemq.message.ActiveMQObjectMessage;
import org.junit.Assert;
import org.junit.Test;
import org.skyscreamer.nevado.jms.AbstractJMSTest;
import org.skyscreamer.nevado.jms.util.RandomData;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import java.io.Serializable;
import java.util.*;
/**
* Created by IntelliJ IDEA.
* User: Carter Page
* Date: 3/25/12
* Time: 11:26 AM
*/
public class ObjectMessageTest extends AbstractJMSTest {
@Test
public void testObjectMessage() throws JMSException {
ObjectMessage msg = createSession().createObjectMessage();
testObjectMessage(msg);
}
@Test
public void testAlienObjectMessage() throws JMSException {
ObjectMessage msg = new ActiveMQObjectMessage();
testObjectMessage(msg);
}
private void testObjectMessage(ObjectMessage msg) throws JMSException {
TestObject testObject = new TestObject();
msg.setObject(testObject);
Message msgOut = sendAndReceive(msg);
Assert.assertTrue("Should be an object message", msgOut instanceof ObjectMessage);
Assert.assertEquals("Object should be equal", testObject, ((ObjectMessage)msgOut).getObject());
}
@Test
public void testObjectMessage2() throws JMSException {
TestObject testObject = new TestObject();
ObjectMessage msg = createSession().createObjectMessage(testObject);
Message msgOut = sendAndReceive(msg);
Assert.assertTrue("Should be an object message", msgOut instanceof ObjectMessage);
Assert.assertEquals("Object should be equal", testObject, ((ObjectMessage)msgOut).getObject());
}
@Test
public void testBadObjectMessage() throws JMSException {
TestObject testObject = new TestObject();
ObjectMessage msg = createSession().createObjectMessage();
msg.setObject(testObject);
Message msgOut = sendAndReceive(msg);
Assert.assertTrue("Should be an object message", msgOut instanceof ObjectMessage);
// To be paranoid, let's check pulling something out and see that it fails
((Map)testObject._map.get("c")).remove("d");
Assert.assertFalse("Object should be equal", testObject.equals(((ObjectMessage)msgOut).getObject()));
}
private static class TestObject implements Serializable {
private final String _string = UUID.randomUUID().toString();
private final int _int = (new Random()).nextInt();
private final Map<String, Object> _map = new HashMap<String, Object>();
private final List<Object> _list = new ArrayList<Object>();
private TestObject() {
_map.put("a", RandomData.readString());
_map.put("b", RandomData.readString());
Map<String, Object> subMap = new HashMap<String, Object>();
subMap.put("d", RandomData.readString());
subMap.put("e", RandomData.readString());
_map.put("c", subMap);
_list.add(RandomData.readString());
_list.add(RandomData.readInt());
List<Object> subList = new ArrayList<Object>();
subList.add(RandomData.readInt());
subList.add(RandomData.readString());
_list.add(subList);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TestObject that = (TestObject) o;
if (_int != that._int) return false;
if (!_list.equals(that._list)) return false;
if (!_map.equals(that._map)) return false;
if (_string != null ? !_string.equals(that._string) : that._string != null) return false;
return true;
}
}
}