@Test
 public void testToLengthTwoBytes() {
   assertEquals(messageLength.bytesToLength(new byte[] {3, 6}), 774);
 }
 @Test
 public void testToLengthTwoBytesLastNegative() {
   assertEquals(messageLength.bytesToLength(new byte[] {3, -24}), 1000);
 }
 @Test
 public void testToBytesTwoBytes() {
   assertArrayEquals(messageLength.lengthToBytes(774), new byte[] {3, 6});
 }
 @Test(expected = IllegalStateException.class)
 public void testToLengthTooLong() {
   messageLength.bytesToLength(new byte[] {-56});
 }
 @Test
 public void testToBytesTwoBytesLastNegative() {
   assertArrayEquals(messageLength.lengthToBytes(1000), new byte[] {3, -24});
 }
 @Test
 public void testToBytesTwoBytesFirstNegative() {
   assertArrayEquals(messageLength.lengthToBytes(51209), new byte[] {-56, 9});
 }
 @Test(expected = IllegalStateException.class)
 public void testToBytesNegative() {
   messageLength.lengthToBytes(-1);
 }
 @Test
 public void testToLengthForSingleNegative() {
   assertEquals(messageLength.bytesToLength(new byte[] {0, -1}), 255);
 }
 @Test
 public void testToBytes() {
   assertArrayEquals(messageLength.lengthToBytes(34), new byte[] {0, 34});
 }
 @Test
 public void testMaxLength() {
   assertEquals(messageLength.maxLength(), 65535);
 }
 @Test
 public void testToBytesForSingleNegative() {
   assertArrayEquals(messageLength.lengthToBytes(255), new byte[] {0, -1});
 }
 @Test
 public void testByteLength() {
   assertEquals(messageLength.byteLength(), 2);
 }
 @Test(expected = NullPointerException.class)
 public void testToLengthNull() {
   messageLength.bytesToLength(null);
 }
 @Test(expected = IllegalStateException.class)
 public void testToLengthShort() {
   messageLength.bytesToLength(new byte[] {-56, 9, 1});
 }
 @Test
 public void testToBytesTwoBytesBothNegative() {
   assertArrayEquals(messageLength.lengthToBytes(44444), new byte[] {-83, -100});
 }
 @Test
 public void testToLength() {
   assertEquals(messageLength.bytesToLength(new byte[] {0, 34}), 34);
 }
 @Test
 public void testToLengthTwoBytesBothNegative() {
   assertEquals(messageLength.bytesToLength(new byte[] {-83, -100}), 44444);
 }
 @Test
 public void testToBytesZero() {
   assertArrayEquals(messageLength.lengthToBytes(0), new byte[] {0, 0});
 }
 @Test
 public void testToLengthTwoBytesFirstNegative() {
   assertEquals(messageLength.bytesToLength(new byte[] {-56, 9}), 51209);
 }
 @Test
 public void testToLengthZero() {
   assertEquals(messageLength.bytesToLength(new byte[] {0, 0}), 0);
 }
 @Test(expected = IllegalStateException.class)
 public void testToBytesToBig() {
   messageLength.lengthToBytes(151209);
 }
 private void readMessage(SelectionKey sk, SocketChannel readChannel, TcpAddress incomingAddress)
     throws IOException {
   // note that socket has been used
   SocketEntry entry = (SocketEntry) sockets.get(incomingAddress);
   if (entry != null) {
     entry.used();
     ByteBuffer readBuffer = entry.getReadBuffer();
     if (readBuffer != null) {
       readChannel.read(readBuffer);
       if (readBuffer.hasRemaining()) {
         readChannel.register(selector, SelectionKey.OP_READ, entry);
       } else {
         dispatchMessage(incomingAddress, readBuffer, readBuffer.capacity());
       }
       return;
     }
   }
   ByteBuffer byteBuffer = ByteBuffer.wrap(buf);
   byteBuffer.limit(messageLengthDecoder.getMinHeaderLength());
   long bytesRead = readChannel.read(byteBuffer);
   if (logger.isDebugEnabled()) {
     logger.debug("Reading header " + bytesRead + " bytes from " + incomingAddress);
   }
   MessageLength messageLength = new MessageLength(0, Integer.MIN_VALUE);
   if (bytesRead == messageLengthDecoder.getMinHeaderLength()) {
     messageLength = messageLengthDecoder.getMessageLength(ByteBuffer.wrap(buf));
     if (logger.isDebugEnabled()) {
       logger.debug("Message length is " + messageLength);
     }
     if ((messageLength.getMessageLength() > getMaxInboundMessageSize())
         || (messageLength.getMessageLength() <= 0)) {
       logger.error(
           "Received message length "
               + messageLength
               + " is greater than inboundBufferSize "
               + getMaxInboundMessageSize());
       synchronized (entry) {
         entry.getSocket().close();
         logger.info("Socket to " + entry.getPeerAddress() + " closed due to an error");
       }
     } else {
       byteBuffer.limit(messageLength.getMessageLength());
       bytesRead += readChannel.read(byteBuffer);
       if (bytesRead == messageLength.getMessageLength()) {
         dispatchMessage(incomingAddress, byteBuffer, bytesRead);
       } else {
         byte[] message = new byte[byteBuffer.limit()];
         byteBuffer.flip();
         byteBuffer.get(message, 0, byteBuffer.limit() - byteBuffer.remaining());
         entry.setReadBuffer(ByteBuffer.wrap(message));
       }
       readChannel.register(selector, SelectionKey.OP_READ, entry);
     }
   } else if (bytesRead < 0) {
     logger.debug("Socket closed remotely");
     sk.cancel();
     readChannel.close();
     TransportStateEvent e =
         new TransportStateEvent(
             DefaultTcpTransportMapping.this,
             incomingAddress,
             TransportStateEvent.STATE_DISCONNECTED_REMOTELY,
             null);
     fireConnectionStateChanged(e);
   }
 }