package net.jxta.impl.endpoint.netty; import static org.junit.Assert.*; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.URI; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Executors; import net.jxta.endpoint.EndpointAddress; import net.jxta.endpoint.Message; import net.jxta.endpoint.Messenger; import net.jxta.endpoint.StringMessageElement; import net.jxta.impl.endpoint.IPUtils; import net.jxta.impl.endpoint.netty.FakeEndpointService.ReceivedMessage; import net.jxta.impl.util.threads.TaskManager; import net.jxta.peer.PeerID; import net.jxta.peergroup.PeerGroup; import net.jxta.peergroup.PeerGroupID; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ServerChannelFactory; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.integration.junit4.JMock; import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(JMock.class) public class EndToEndTest { public static final String TEST_PROTO_NAME = "test"; private static final PeerID LOCAL_PEER_ID = PeerID.create(URI.create("urn:jxta:uuid-59616261646162614E5047205032503304F8E1DEBB4942C0BF16DD923DEC949803")); private static final PeerID REMOTE_PEER_ID = PeerID.create(URI.create("urn:jxta:uuid-59616261646162614E50472050325033E7E1335996F44E38BD66B16349BB1F1E03")); private Mockery mockContext = new JUnit4Mockery(); private FakeEndpointService clientEndpoint; private FakeEndpointService serverEndpoint; private PeerGroup serverGroup; private PeerGroup clientGroup; @Before public void setUp() { serverGroup = mockContext.mock(PeerGroup.class, "serverGroup"); clientGroup = mockContext.mock(PeerGroup.class, "clientGroup"); clientEndpoint = new FakeEndpointService(clientGroup); serverEndpoint = new FakeEndpointService(serverGroup); mockContext.checking(new Expectations() {{ ignoring(clientGroup).getEndpointService(); will(returnValue(clientEndpoint)); ignoring(serverGroup).getEndpointService(); will(returnValue(serverEndpoint)); ignoring(clientGroup).getPeerID(); will(returnValue(LOCAL_PEER_ID)); ignoring(serverGroup).getPeerID(); will(returnValue(REMOTE_PEER_ID)); ignoring(clientGroup).getPeerGroupID(); will(returnValue(PeerGroupID.defaultNetPeerGroupID)); ignoring(serverGroup).getPeerGroupID(); will(returnValue(PeerGroupID.defaultNetPeerGroupID)); }}); } @After public void tearDown() { TaskManager.getTaskManager().shutdown(); } @Test public void testConnectClientAndSendMessages() throws Exception { ServerChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); InetSocketAddressTranslator addrTranslator = new InetSocketAddressTranslator(TEST_PROTO_NAME); SocketAddress serverAddress = new InetSocketAddress(IPUtils.ANYADDRESS, 12345); List<SocketAddress> addresses = new LinkedList<SocketAddress>(); addresses.add(serverAddress); NettyTransportServer server = new NettyTransportServer(factory, addrTranslator, serverGroup); server.init(addresses, null, false); server.start(serverEndpoint); ChannelFactory clientFactory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); EndpointAddress clientReturnAddress = addrTranslator.toEndpointAddress(new InetSocketAddress(InetAddress.getLocalHost(), 0)); NettyTransportClient client = new NettyTransportClient(clientFactory, addrTranslator, clientGroup, clientReturnAddress); client.start(clientEndpoint); Messenger messenger = client.getMessenger(server.getPublicAddresses().next(), null); messenger.sendMessage(createTestMessage("a", "b")); messenger.sendMessage(createTestMessage("c", "d")); messenger.sendMessage(createTestMessage("e", "f")); Thread.sleep(200L); assertEquals(3, serverEndpoint.received.size()); checkReceivedMessage(serverEndpoint.received.poll(), createTestMessage("a", "b")); checkReceivedMessage(serverEndpoint.received.poll(), createTestMessage("c", "d")); checkReceivedMessage(serverEndpoint.received.poll(), createTestMessage("e", "f")); assertEquals(1, serverEndpoint.messengers.size()); Messenger serverMessenger = serverEndpoint.messengers.get(0); serverMessenger.sendMessage(createTestMessage("x", "y")); serverMessenger.sendMessage(createTestMessage("m", "n")); Thread.sleep(200L); assertEquals(2, clientEndpoint.received.size()); checkReceivedMessage(clientEndpoint.received.poll(), createTestMessage("x", "y")); checkReceivedMessage(clientEndpoint.received.poll(), createTestMessage("m", "n")); } private void checkReceivedMessage(ReceivedMessage received, Message expected) { assertEquals(expected, received.msg); } private Message createTestMessage(String key, String value) { Message msg = new Message(); msg.addMessageElement(new StringMessageElement(key, value, null)); return msg; } }