package net.jxta.impl.endpoint.netty; import static org.junit.Assert.*; import net.jxta.document.MimeMediaType; import net.jxta.document.StructuredDocumentFactory; import net.jxta.document.StructuredDocumentUtils; import net.jxta.document.XMLDocument; import net.jxta.exception.PeerGroupException; import net.jxta.id.ID; import net.jxta.impl.document.DOMXMLDocument; import net.jxta.impl.document.DOMXMLElement; import net.jxta.impl.protocol.GroupConfig; import net.jxta.impl.protocol.ModuleImplAdv; import net.jxta.impl.protocol.TCPAdv; import net.jxta.peergroup.PeerGroup; import net.jxta.platform.Module; import net.jxta.protocol.TransportAdvertisement; import org.junit.After; import org.junit.Before; import org.junit.Test; public class NettyTransportTest { private static final String[] NO_PARAMS = new String[0]; private NettyTransport transport; private FakePeerGroup group; private ID assignedID; private ModuleImplAdv standardImplAdv; private GroupConfig groupConfig; @Before public void setUp() throws Exception { transport = new NettyTransport(); group = new FakePeerGroup(); groupConfig = (GroupConfig) new GroupConfig.Instantiator().newInstance(); group.configAdv = groupConfig; TCPAdv instanceConfig = (TCPAdv) new TCPAdv.Instantiator().newInstance(); instanceConfig.setMulticastState(false); instanceConfig.setClientEnabled(true); instanceConfig.setServerEnabled(true); instanceConfig.setStartPort(7901); instanceConfig.setEndPort(7909); instanceConfig.setPort(7901); addInstanceConfigurationToGroupConfig(instanceConfig); assignedID = PeerGroup.tcpProtoClassID; standardImplAdv = createImplAdvertisement(null); } @After public void tearDown() { transport.stopApp(); } private ModuleImplAdv createImplAdvertisement(String protocolName) { ModuleImplAdv implAdv = (ModuleImplAdv) new ModuleImplAdv.Instantiator().newInstance(); implAdv.setModuleSpecID(PeerGroup.refTcpProtoSpecID); implAdv.setDescription("Reference Implementation of the JXSE 2.6+ HTTP Message Transport"); implAdv.setCode(NettyTransport.class.getName()); implAdv.setUri("http://jxta-jxse.dev.java.net/download/jxta.jar"); implAdv.setProvider("sun.com"); DOMXMLDocument staticConfiguration = (DOMXMLDocument) DOMXMLDocument.INSTANTIATOR.newInstance(MimeMediaType.XMLUTF8, "Param"); if(protocolName != null) { DOMXMLElement protoElem = staticConfiguration.createElement("Proto", protocolName); staticConfiguration.appendChild(protoElem); } implAdv.setParam(staticConfiguration); return implAdv; } private XMLDocument<?> createCloneableAdv(TransportAdvertisement instanceConfig) { XMLDocument<?> instanceConfigDoc = (XMLDocument<?>) StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, "Parm"); StructuredDocumentUtils.copyElements(instanceConfigDoc, instanceConfigDoc, (XMLDocument<?>) instanceConfig.getDocument(MimeMediaType.XMLUTF8)); return instanceConfigDoc; } @Test public void testGetProtocolName_changedThroughStaticConfig() throws PeerGroupException { transport.init(group, assignedID, createImplAdvertisement("testproto")); assertEquals("testproto", transport.getProtocolName()); } @Test public void testStartApp_returnsStalledIfEndpointServiceNotAvailable() throws PeerGroupException { group.endpointService = null; transport.init(group, assignedID, standardImplAdv); assertEquals(Module.START_AGAIN_STALLED, transport.startApp(NO_PARAMS)); group.endpointService = new FakeEndpointService(group); } @Test public void testStartApp_returnsErrorIfEndpointServiceRefusesRegistration() throws PeerGroupException { transport.init(group, assignedID, standardImplAdv); group.endpointService.refuseRegistration(); assertEquals(-1, transport.startApp(NO_PARAMS)); } // TODO: move to client and server tests // @Test // public void testStartApp_returnsDisabledIfClientAndServerDisabled() throws PeerGroupException { // HTTPAdv instanceConfig = (HTTPAdv) new HTTPAdv.Instantiator().newInstance(); // instanceConfig.setServerEnabled(false); // instanceConfig.setClientEnabled(false); // // addInstanceConfigurationToGroupConfig(instanceConfig); // // final EndpointService endpointServiceMock = mockContext.mock(EndpointService.class); // final MessengerEventListener listenerMock = mockContext.mock(MessengerEventListener.class); // mockContext.checking(new Expectations() {{ // one(group).getEndpointService(); will(returnValue(endpointServiceMock)); // one(endpointServiceMock).addMessageTransport(transport); will(returnValue(listenerMock)); // }}); // // transport.init(group, assignedID, standardImplAdv); // assertEquals(Module.START_DISABLED, transport.startApp(NO_PARAMS)); // } private void addInstanceConfigurationToGroupConfig(TCPAdv instanceConfig) { XMLDocument<?> instanceConfigDoc = createCloneableAdv(instanceConfig); groupConfig.putServiceParam(PeerGroup.tcpProtoClassID, instanceConfigDoc); } // TODO: move to client and server tests // @Test // public void testStopApp_deregistersFromEndpointService() throws PeerGroupException { // transport.init(group, assignedID, standardImplAdv); // // final EndpointService endpointServiceMock = mockContext.mock(EndpointService.class); // mockContext.checking(new Expectations() {{ // atLeast(1).of(group).getEndpointService(); will(returnValue(endpointServiceMock)); // one(endpointServiceMock).addMessageTransport(transport); // }}); // // transport.startApp(NO_PARAMS); // // mockContext.checking(new Expectations() {{ // one(endpointServiceMock).removeMessageTransport(transport); // }}); // transport.stopApp(); // } // TODO: move to client and server tests // @Test // public void testStopApp_onlyDeregistersOnce() throws PeerGroupException { // transport.init(group, assignedID, standardImplAdv); // // final EndpointService endpointServiceMock = mockContext.mock(EndpointService.class); // mockContext.checking(new Expectations() {{ // atLeast(1).of(group).getEndpointService(); will(returnValue(endpointServiceMock)); // one(endpointServiceMock).addMessageTransport(transport); // }}); // // transport.startApp(NO_PARAMS); // // mockContext.checking(new Expectations() {{ // one(endpointServiceMock).removeMessageTransport(transport); // }}); // transport.stopApp(); // // // this second call should have no effect // transport.stopApp(); // } // TODO: move to client and server tests // @Test // public void testTransportIsListedInModules() { // // TODO: check that we are listed in "/META-INF/services/net.jxta.platform.Module" // fail(); // } }