package org.skyscreamer.nevado.jms.message;
import junit.framework.Assert;
import org.junit.Test;
import org.skyscreamer.nevado.jms.AbstractJMSTest;
import javax.jms.*;
import java.io.Serializable;
/**
* Test that mutable data (basically byte[]) is not just being passed as a reference. (Per JMS 1.1 sec. 3.12)
*
* @author Carter Page <carter@skyscreamer.org>
*/
public class CopyOfDataTest extends AbstractJMSTest {
@Test
public void testObjectMessage() throws JMSException {
ObjectMessage objMsg = createSession().createObjectMessage();
TestObject testObj = new TestObject();
testObj.setValue(1);
objMsg.setObject(testObj);
testObj.setValue(2);
TestObject retrievedObject = (TestObject)objMsg.getObject();
Assert.assertEquals(1, retrievedObject.getValue());
retrievedObject.setValue(3);
Assert.assertEquals(1, ((TestObject)objMsg.getObject()).getValue());
}
@Test
public void testBytesMessage() throws JMSException {
byte[] bytes = {1, 2, 3};
NevadoBytesMessage bytesMessage = (NevadoBytesMessage) createSession().createBytesMessage();
bytesMessage.writeBytes(bytes);
bytes[1] = 10; // This should not get reflected in the message
bytesMessage.onSend();
byte[] bytesOut = new byte[3];
bytesMessage.readBytes(bytesOut, 3);
Assert.assertEquals(2, bytesOut[1]);
}
@Test
public void testStreamMessage() throws JMSException {
byte[] bytes = {1, 2, 3};
NevadoStreamMessage streamMessage = (NevadoStreamMessage) createSession().createStreamMessage();
streamMessage.writeBytes(bytes);
bytes[1] = 10; // This should not get reflected in the message
streamMessage.onSend();
byte[] bytesOut = new byte[3];
streamMessage.readBytes(bytesOut);
Assert.assertEquals(2, bytesOut[1]);
}
@Test
public void testMapMessage() throws JMSException {
byte[] bytes = {1, 2, 3};
MapMessage mapMessage = createSession().createMapMessage();
mapMessage.setBytes("key", bytes);
bytes[1] = 10; // This should not get reflected in the message
byte[] bytesOut = mapMessage.getBytes("key");
Assert.assertEquals(2, bytesOut[1]);
// Make sure the read array is not a reference to the internal data
bytesOut[1] = 20;
Assert.assertEquals(2, mapMessage.getBytes("key")[1]);
}
private static class TestObject implements Serializable {
private int _value;
public int getValue() {
return _value;
}
public void setValue(int value) {
_value = value;
}
}
}