package org.limewire.rudp.messages.impl; import java.nio.ByteBuffer; import java.util.Random; import junit.framework.Test; import org.limewire.rudp.messages.MessageFormatException; import org.limewire.rudp.messages.RUDPMessageFactory; import org.limewire.rudp.messages.RUDPMessage.OpCode; import org.limewire.util.BaseTestCase; public class DefaultMessageFactoryTest extends BaseTestCase { DefaultMessageFactory factory; public DefaultMessageFactoryTest(String name) { super(name); } @Override protected void setUp() throws Exception { factory = new DefaultMessageFactory(); } public static Test suite() { return buildTestSuite(DefaultMessageFactoryTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public void testCreateMessages() throws Exception { // empty messages that should not fail for (OpCode opcode : OpCode.values()) { ByteBuffer data = createMessage(opcode, 0); factory.createMessage(data); } // messages that have barely the length to succeed for (OpCode opcode : OpCode.values()) { ByteBuffer data = createMessage(opcode, 4); factory.createMessage(data); } // some single tests factory.createMessage(createMessage(OpCode.OP_SYN, 3)); factory.createMessage(createMessage(OpCode.OP_FIN, 1)); // messages that have the full length for (OpCode opcode : OpCode.values()) { ByteBuffer data = createMessage(opcode, 12); factory.createMessage(data); } // messages that are too long by one for (OpCode opcode : OpCode.values()) { ByteBuffer data = createMessage(opcode, 13); assertCreationFails(factory, data, MessageFormatException.class); } } public static void assertCreationFails(RUDPMessageFactory factory, ByteBuffer data, Class exception) { try { factory.createMessage(data); fail("Exception of type " + exception.getName() + " should have been thrown"); } catch (Throwable t) { assertEquals(exception, t.getClass()); } } private static ByteBuffer createMessage(OpCode opcode, int length) { ByteBuffer message = ByteBuffer.allocate(23); Random random = new Random(); message.put((byte)random.nextInt()); int opcodeAndLength = ((opcode.toByte() & 0x0F) << 4) | ((byte)length & 0x0F); message.put((byte)opcodeAndLength); message.putShort((short)random.nextInt()); message.position(0); assertEquals(23, message.remaining()); return message; } }