package net.jxta.impl.endpoint.netty;
import java.net.URI;
import net.jxta.endpoint.EndpointAddress;
import net.jxta.endpoint.Message;
import net.jxta.impl.endpoint.msgframing.WelcomeMessage;
import net.jxta.peer.PeerID;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.Channels;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.Sequence;
import org.jmock.integration.junit4.JMock;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(JMock.class)
public class MessageDispatchHandlerTest {
private static final PeerID PEER_ID = PeerID.create(URI.create("urn:jxta:uuid-59616261646162614E5047205032503314AAA35D8BB7416D923D8CD14576AE3F03"));
private Mockery mockContext = new JUnit4Mockery();
private MessageArrivalListener listener;
private MessageDispatchHandler handler;
private NettyChannelRegistry registry;
private FakeChannel channel;
@Before
public void setUp() throws Exception {
registry = mockContext.mock(NettyChannelRegistry.class);
listener = mockContext.mock(MessageArrivalListener.class);
handler = new MessageDispatchHandler(registry);
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("test", handler);
channel = new FakeChannel(null, null, pipeline, new FakeChannelSink());
}
@Test
public void testSendsMessageToListener() {
final Message expectedMessage = new Message();
mockContext.checking(new Expectations() {{
one(listener).messageArrived(expectedMessage);
}});
handler.setMessageArrivalListener(listener);
Channels.fireMessageReceived(channel, expectedMessage);
}
@Test
public void testMessagesAreQueuedUntilListenerAttached() {
final Sequence seq = mockContext.sequence("messages");
final Message expectedMessage1 = new Message();
final Message expectedMessage2 = new Message();
final Message expectedMessage3 = new Message();
Channels.fireMessageReceived(channel, expectedMessage1);
Channels.fireMessageReceived(channel, expectedMessage2);
Channels.fireMessageReceived(channel, expectedMessage3);
mockContext.checking(new Expectations() {{
one(listener).messageArrived(expectedMessage1); inSequence(seq);
one(listener).messageArrived(expectedMessage2); inSequence(seq);
one(listener).messageArrived(expectedMessage3); inSequence(seq);
}});
handler.setMessageArrivalListener(listener);
}
@Test
public void testWelcomeMessageTriggersNewChannelCall() {
handler.setMessageArrivalListener(listener);
final EndpointAddress expectedLogicalAddress = new EndpointAddress("jxta", PEER_ID.getUniqueValue().toString(), null, null);
final EndpointAddress directedAtAddress = new EndpointAddress("test://192.168.1.1:12345/blah");
final WelcomeMessage message = new WelcomeMessage(directedAtAddress, new EndpointAddress("test://192.168.1.2:54321"), PEER_ID, true);
mockContext.checking(new Expectations() {{
one(registry).newConnection(with(same(channel)), with(equal(directedAtAddress)), with(equal(expectedLogicalAddress)));
}});
Channels.fireMessageReceived(channel, message);
}
@Test
public void testWelcomeAndMessagesInQueue() {
final Message message1 = new Message();
final Message message2 = new Message();
Channels.fireMessageReceived(channel, message1);
Channels.fireMessageReceived(channel, message2);
final Sequence seq = mockContext.sequence("arrivals");
mockContext.checking(new Expectations() {{
one(listener).messageArrived(message1); inSequence(seq);
one(listener).messageArrived(message2); inSequence(seq);
}});
handler.setMessageArrivalListener(listener);
}
}