package org.limewire.rudp.messages.impl; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import junit.framework.Test; import org.limewire.rudp.messages.MessageFormatException; import org.limewire.rudp.messages.RUDPMessage; import org.limewire.rudp.messages.RUDPMessageFactory; import org.limewire.rudp.messages.SynMessage; import org.limewire.rudp.messages.SynMessage.Role; import org.limewire.util.BaseTestCase; public class SynMessageImplTest extends BaseTestCase { private Version0MessageFactory version0MessageFactory; private DefaultMessageFactory version1MessageFactory; public SynMessageImplTest(String name) { super(name); } public static Test suite() { return buildTestSuite(SynMessageImplTest.class); } @Override protected void setUp() throws Exception { version0MessageFactory = new Version0MessageFactory(); version1MessageFactory = new DefaultMessageFactory(); } public void testVersion0CanParseVersion1() { SynMessage synMessage = new SynMessageImpl((byte) 10, Role.ACCEPTOR); SynMessage readMessage = writeAndReparse(synMessage, version0MessageFactory); assertEquals(1, readMessage.getProtocolVersionNumber()); assertEquals(10, readMessage.getSenderConnectionID()); assertEquals(Role.UNDEFINED, readMessage.getRole()); synMessage = new SynMessageImpl((byte)5, (byte)7, Role.REQUESTOR); readMessage = writeAndReparse(synMessage, version0MessageFactory); assertEquals(1, readMessage.getProtocolVersionNumber()); assertEquals(5, readMessage.getSenderConnectionID()); assertEquals(7, readMessage.getConnectionID()); assertEquals(Role.UNDEFINED, readMessage.getRole()); } public void testVersion1CanParseVersion0() { SynMessage synMessage = new SynMessageImplProtocolVersion0((byte) 10); SynMessage readMessage = writeAndReparse(synMessage, version1MessageFactory); assertEquals(0, readMessage.getProtocolVersionNumber()); assertEquals(10, readMessage.getSenderConnectionID()); assertEquals(Role.UNDEFINED, readMessage.getRole()); synMessage = new SynMessageImplProtocolVersion0((byte)5, (byte)7); readMessage = writeAndReparse(synMessage, version1MessageFactory); assertEquals(0, readMessage.getProtocolVersionNumber()); assertEquals(5, readMessage.getSenderConnectionID()); assertEquals(7, readMessage.getConnectionID()); assertEquals(Role.UNDEFINED, readMessage.getRole()); } public void testVersion1CanWriteAndParseVersion1() { SynMessage synMessage = new SynMessageImpl((byte) 10, Role.ACCEPTOR); SynMessage readMessage = writeAndReparse(synMessage, version1MessageFactory); assertEquals(1, readMessage.getProtocolVersionNumber()); assertEquals(10, readMessage.getSenderConnectionID()); assertEquals(Role.ACCEPTOR, readMessage.getRole()); synMessage = new SynMessageImpl((byte)5, (byte)7, Role.REQUESTOR); readMessage = writeAndReparse(synMessage, version1MessageFactory); assertEquals(1, readMessage.getProtocolVersionNumber()); assertEquals(5, readMessage.getSenderConnectionID()); assertEquals(7, readMessage.getConnectionID()); assertEquals(Role.REQUESTOR, readMessage.getRole()); } public void testRoleCanConnectTo() { // undefined role can connect to everything for (Role role : Role.values()) { assertTrue(Role.UNDEFINED.canConnectTo(role)); assertTrue(role.canConnectTo(Role.UNDEFINED)); } assertFalse(Role.ACCEPTOR.canConnectTo(Role.ACCEPTOR)); assertFalse(Role.REQUESTOR.canConnectTo(Role.REQUESTOR)); assertTrue(Role.ACCEPTOR.canConnectTo(Role.REQUESTOR)); assertTrue(Role.REQUESTOR.canConnectTo(Role.ACCEPTOR)); } @SuppressWarnings("unchecked") private static <T extends RUDPMessage> T writeAndReparse(T message, RUDPMessageFactory factory) { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { message.write(out); return (T)factory.createMessage(ByteBuffer.wrap(out.toByteArray())); } catch (IOException e) { // cannot happen } catch (MessageFormatException e) { throw new RuntimeException(e); } return null; } }