package org.jgroups.tests;
import org.jgroups.Global;
import org.jgroups.Message;
import org.jgroups.Address;
import org.jgroups.Version;
import org.jgroups.protocols.TpHeader;
import org.jgroups.protocols.UNICAST;
import org.jgroups.protocols.pbcast.NakAckHeader;
import org.jgroups.util.*;
import org.testng.annotations.Test;
import java.io.DataOutputStream;
/**
* Tests the size of marshalled messages (multicast, unicast)
* @author Bela Ban
*/
@Test(groups=Global.FUNCTIONAL)
public class MessageSizeTest {
private static final byte MULTICAST=2;
private static final short UDP_ID=100;
private static final short UNICAST_ID=101;
private static final short NAKACK_ID=102;
private static final int MCAST_MAX_SIZE=84;
private static final int UNICAST_MAX_SIZE=102;
/**
* Tests size of a multicast message.
* Current record: 84 bytes (March 2010)
* Prev: 166, 109, 103, 84
* @throws Exception
*/
public static void testMulticast() throws Exception {
Address src=Util.createRandomAddress();
Message msg=createMessage(null, src);
Buffer buf=marshal(msg);
System.out.println("buf = " + buf);
int len=buf.getLength();
System.out.println("len = " + len);
assert len <= MCAST_MAX_SIZE;
if(len < MCAST_MAX_SIZE) {
double percentage=compute(len, MCAST_MAX_SIZE);
System.out.println("multicast message (" + len + " bytes) is " + Util.format(percentage) +
"% smaller than previous max size (" + MCAST_MAX_SIZE + " bytes)");
}
}
/**
* Tests size of a unicast message.
* Current record: 102 (March 2010)
* Prev: 161, 127, 121, 102
* @throws Exception
*/
public static void testUnicast() throws Exception {
Address dest=Util.createRandomAddress();
Address src=Util.createRandomAddress();
Message msg=createMessage(dest, src);
Buffer buf=marshal(msg);
System.out.println("buf = " + buf);
int len=buf.getLength();
System.out.println("len = " + len);
assert len <= UNICAST_MAX_SIZE;
if(len < UNICAST_MAX_SIZE) {
double percentage=compute(len, UNICAST_MAX_SIZE);
System.out.println("multicast message (" + len + " bytes) is " + Util.format(percentage) +
"% smaller than previous max size (" + UNICAST_MAX_SIZE + " bytes)");
}
}
private static double compute(int new_length, int old_length) {
if(new_length >= old_length)
return 0.0;
return 100.0* (1.0 - (new_length / (double)old_length));
}
private static Buffer marshal(Message msg) throws Exception {
ExposedByteArrayOutputStream out_stream=new ExposedByteArrayOutputStream((int)(msg.size() + 50));
ExposedDataOutputStream dos=new ExposedDataOutputStream(out_stream);
Address dest=msg.getDest();
boolean multicast=dest == null;
writeMessage(msg, dos, multicast);
return new Buffer(out_stream.getRawBuffer(), 0, out_stream.size());
}
protected static void writeMessage(Message msg, DataOutputStream dos, boolean multicast) throws Exception {
byte flags=0;
dos.writeShort(Version.version); // write the version
if(multicast)
flags+=MULTICAST;
dos.writeByte(flags);
msg.writeTo(dos);
}
static Message createMessage(Address dest, Address src) {
Message msg=new Message(dest, src, "hello world");
msg.putHeader(NAKACK_ID, NakAckHeader.createMessageHeader(322649));
msg.putHeader(UNICAST_ID, UNICAST.UnicastHeader.createDataHeader(465784, (short)23323, true));
msg.putHeader(UDP_ID, new TpHeader("DrawDemo"));
return msg;
}
}