diff --git a/core/src/main/java/io/servicecomb/core/Transport.java b/core/src/main/java/io/servicecomb/core/Transport.java index 125c3f8ecbe..0fac7918ddd 100644 --- a/core/src/main/java/io/servicecomb/core/Transport.java +++ b/core/src/main/java/io/servicecomb/core/Transport.java @@ -22,6 +22,14 @@ public interface Transport { String getName(); + default int getOrder() { + return 0; + } + + default boolean canInit() { + return true; + } + boolean init() throws Exception; /** @@ -34,7 +42,6 @@ public interface Transport { */ Endpoint getEndpoint() throws Exception; - /** * 用于上报到服务中心,要求是其他节点可访问的地址 */ diff --git a/core/src/main/java/io/servicecomb/core/transport/AbstractTransport.java b/core/src/main/java/io/servicecomb/core/transport/AbstractTransport.java index 7c4e77c7ee0..37e2b763b14 100644 --- a/core/src/main/java/io/servicecomb/core/transport/AbstractTransport.java +++ b/core/src/main/java/io/servicecomb/core/transport/AbstractTransport.java @@ -68,7 +68,7 @@ public Endpoint getPublishEndpoint() { } @Override - public Endpoint getEndpoint() throws Exception { + public Endpoint getEndpoint() { return endpoint; } @@ -99,7 +99,7 @@ protected void setListenAddressWithoutSchema(String addressWithoutSchema, } this.endpoint = new Endpoint(this, NetUtils.getRealListenAddress(getName(), addressWithoutSchema)); if (this.endpoint.getEndpoint() != null) { - this.publishEndpoint = new Endpoint(this, RegistryUtils.getPublishAddress(getName(), + this.publishEndpoint = new Endpoint(this, RegistryUtils.getPublishAddress(getName(), addressWithoutSchema)); } else { this.publishEndpoint = null; diff --git a/core/src/main/java/io/servicecomb/core/transport/TransportManager.java b/core/src/main/java/io/servicecomb/core/transport/TransportManager.java index 988d8fc55b2..23003fcfc85 100644 --- a/core/src/main/java/io/servicecomb/core/transport/TransportManager.java +++ b/core/src/main/java/io/servicecomb/core/transport/TransportManager.java @@ -16,9 +16,11 @@ package io.servicecomb.core.transport; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import javax.inject.Inject; @@ -28,6 +30,7 @@ import io.servicecomb.core.Endpoint; import io.servicecomb.core.Transport; +import io.servicecomb.foundation.common.exceptions.ServiceCombException; import io.servicecomb.serviceregistry.RegistryUtils; import io.servicecomb.serviceregistry.api.registry.Microservice; @@ -36,12 +39,18 @@ public class TransportManager { private static final Logger LOGGER = LoggerFactory.getLogger(TransportManager.class); @Inject - private List transportList; + private List transports; private Map transportMap = new HashMap<>(); + public void setTransports(List transports) { + this.transports = transports; + } + public void init() throws Exception { - for (Transport transport : transportList) { + buildTransportMap(); + + for (Transport transport : transportMap.values()) { transportMap.put(transport.getName(), transport); if (transport.init()) { @@ -56,6 +65,61 @@ public void init() throws Exception { } } + protected void buildTransportMap() { + Map> groups = groupByName(); + + for (Entry> entry : groups.entrySet()) { + List group = entry.getValue(); + + checkTransportGroup(group); + Transport transport = chooseOneTransport(group); + if (transport != null) { + transportMap.put(transport.getName(), transport); + } + } + } + + protected Transport chooseOneTransport(List group) { + group.sort((t1, t2) -> { + return t1.getOrder() - t2.getOrder(); + }); + + for (Transport transport : group) { + if (transport.canInit()) { + LOGGER.info("choose {} for {}.", transport.getClass().getName(), transport.getName()); + return transport; + } + } + + LOGGER.info("all transport named {} refused to init.", group.get(0).getName()); + return null; + } + + protected void checkTransportGroup(List group) { + // order value must be different, otherwise, maybe will choose a random transport + Map orderMap = new HashMap<>(); + for (Transport transport : group) { + Transport existTransport = orderMap.putIfAbsent(transport.getOrder(), transport); + if (existTransport != null) { + throw new ServiceCombException(String.format("%s and %s have the same order %d", + existTransport.getClass().getName(), + transport.getClass().getName(), + transport.getOrder())); + } + } + } + + protected Map> groupByName() { + Map> groups = new HashMap<>(); + for (Transport transport : transports) { + List list = groups.computeIfAbsent(transport.getName(), name -> { + return new ArrayList<>(); + }); + list.add(transport); + } + return groups; + } + public Transport findTransport(String transportName) { return transportMap.get(transportName); } diff --git a/core/src/test/java/io/servicecomb/core/transport/TestTransportManager.java b/core/src/test/java/io/servicecomb/core/transport/TestTransportManager.java index c38827cd32d..bcf71073d28 100644 --- a/core/src/test/java/io/servicecomb/core/transport/TestTransportManager.java +++ b/core/src/test/java/io/servicecomb/core/transport/TestTransportManager.java @@ -16,17 +16,18 @@ package io.servicecomb.core.transport; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; import org.junit.Assert; import org.junit.Test; import io.servicecomb.core.Endpoint; import io.servicecomb.core.Transport; +import io.servicecomb.foundation.common.exceptions.ServiceCombException; import io.servicecomb.serviceregistry.RegistryUtils; import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance; -import mockit.Deencapsulation; import mockit.Expectations; import mockit.Injectable; import mockit.Mocked; @@ -40,13 +41,14 @@ public void testTransportManagerInitFail(@Injectable Transport transport) throws result = "test"; transport.init(); result = false; + transport.canInit(); + result = true; } }; - List transports = new ArrayList<>(); - transports.add(transport); + List transports = Arrays.asList(transport); TransportManager manager = new TransportManager(); - Deencapsulation.setField(manager, "transportList", transports); + manager.setTransports(transports); manager.init(); Assert.assertEquals(manager.findTransport("test"), transport); @@ -59,19 +61,177 @@ public void testTransportManagerInitSucc(@Injectable Transport transport, @Injec { transport.getName(); result = "test"; + transport.canInit(); + result = true; transport.init(); result = true; transport.getPublishEndpoint(); result = endpoint; } }; - List transports = new ArrayList<>(); - transports.add(transport); + List transports = Arrays.asList(transport); TransportManager manager = new TransportManager(); - Deencapsulation.setField(manager, "transportList", transports); + manager.setTransports(transports); manager.init(); Assert.assertEquals(manager.findTransport("test"), transport); } + + @Test + public void testGroupByName(@Mocked Transport t1, @Mocked Transport t2_1, @Mocked Transport t2_2) { + new Expectations() { + { + t1.getName(); + result = "t1"; + + t2_1.getName(); + result = "t2"; + t2_2.getName(); + result = "t2"; + } + }; + + TransportManager manager = new TransportManager(); + manager.setTransports(Arrays.asList(t1, t2_1, t2_2)); + + Map> groups = manager.groupByName(); + Assert.assertEquals(2, groups.size()); + Assert.assertEquals(1, groups.get("t1").size()); + Assert.assertEquals(t1, groups.get("t1").get(0)); + Assert.assertEquals(2, groups.get("t2").size()); + Assert.assertEquals(t2_1, groups.get("t2").get(0)); + Assert.assertEquals(t2_2, groups.get("t2").get(1)); + } + + @Test + public void testCheckTransportGroupInvalid(@Mocked Transport t1, @Mocked Transport t2) { + new Expectations() { + { + t1.getOrder(); + result = 1; + + t2.getOrder(); + result = 1; + } + }; + + TransportManager manager = new TransportManager(); + List group = Arrays.asList(t1, t2); + + try { + manager.checkTransportGroup(group); + Assert.fail("must throw exception"); + } catch (ServiceCombException e) { + Assert.assertEquals( + "io.servicecomb.core.$Impl_Transport and io.servicecomb.core.$Impl_Transport have the same order 1", + e.getMessage()); + } + } + + @Test + public void testCheckTransportGroupValid(@Mocked Transport t1, @Mocked Transport t2) { + new Expectations() { + { + t1.getOrder(); + result = 1; + + t2.getOrder(); + result = 2; + } + }; + + TransportManager manager = new TransportManager(); + List group = Arrays.asList(t1, t2); + + try { + manager.checkTransportGroup(group); + } catch (ServiceCombException e) { + Assert.fail("must not throw exception: " + e.getMessage()); + } + } + + @Test + public void testChooseOneTransportFirst(@Mocked Transport t1, @Mocked Transport t2) { + new Expectations() { + { + t1.getOrder(); + result = 1; + t1.canInit(); + result = true; + + t2.getOrder(); + result = 2; + } + }; + + TransportManager manager = new TransportManager(); + List group = Arrays.asList(t1, t2); + + Assert.assertEquals(t1, manager.chooseOneTransport(group)); + } + + @Test + public void testChooseOneTransportSecond(@Mocked Transport t1, @Mocked Transport t2) { + new Expectations() { + { + t1.getOrder(); + result = 1; + t1.canInit(); + result = false; + + t2.getOrder(); + result = 2; + t2.canInit(); + result = true; + } + }; + + TransportManager manager = new TransportManager(); + List group = Arrays.asList(t1, t2); + + Assert.assertEquals(t2, manager.chooseOneTransport(group)); + } + + @Test + public void testChooseOneTransportNone(@Mocked Transport t1, @Mocked Transport t2) { + new Expectations() { + { + t1.getName(); + result = "t"; + t1.getOrder(); + result = 1; + t1.canInit(); + result = false; + + t2.getOrder(); + result = 2; + t2.canInit(); + result = false; + } + }; + + TransportManager manager = new TransportManager(); + List group = Arrays.asList(t1, t2); + + Assert.assertNull(manager.chooseOneTransport(group)); + } + + @Test + public void testBuildTransportMapChooseNull(@Mocked Transport t1) { + new Expectations() { + { + t1.getName(); + result = "t1"; + t1.canInit(); + result = false; + } + }; + + TransportManager manager = new TransportManager(); + manager.setTransports(Arrays.asList(t1)); + + manager.buildTransportMap(); + Assert.assertEquals(null, manager.findTransport("t1")); + } } diff --git a/demo/demo-schema/pom.xml b/demo/demo-schema/pom.xml index bc4c3ceaa3f..a97140424b5 100644 --- a/demo/demo-schema/pom.xml +++ b/demo/demo-schema/pom.xml @@ -41,6 +41,10 @@ io.servicecomb transport-rest-vertx + + io.servicecomb + transport-rest-servlet + javax.servlet javax.servlet-api diff --git a/demo/demo-server-servlet/pom.xml b/demo/demo-server-servlet/pom.xml index 90710b7a6bf..47709298f95 100644 --- a/demo/demo-server-servlet/pom.xml +++ b/demo/demo-server-servlet/pom.xml @@ -28,20 +28,9 @@ war - - io.servicecomb - transport-rest-servlet - - io.servicecomb.demo pojo-server - - - io.servicecomb - transport-rest-vertx - - diff --git a/foundations/foundation-common/src/main/java/io/servicecomb/foundation/common/net/NetUtils.java b/foundations/foundation-common/src/main/java/io/servicecomb/foundation/common/net/NetUtils.java index b19d81d4c61..5763ec84d54 100644 --- a/foundations/foundation-common/src/main/java/io/servicecomb/foundation/common/net/NetUtils.java +++ b/foundations/foundation-common/src/main/java/io/servicecomb/foundation/common/net/NetUtils.java @@ -16,10 +16,12 @@ package io.servicecomb.foundation.common.net; +import java.io.IOException; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; +import java.net.ServerSocket; import java.net.SocketException; import java.net.URI; import java.net.URISyntaxException; @@ -184,4 +186,12 @@ public static InetAddress ensureGetInterfaceAddress(String interfaceName) { } return address; } + + public static boolean canTcpListen(InetAddress address, int port) { + try (ServerSocket ss = new ServerSocket(port, 0, address)) { + return true; + } catch (IOException e) { + return false; + } + } } diff --git a/foundations/foundation-common/src/test/java/io/servicecomb/foundation/common/net/TestNetUtils.java b/foundations/foundation-common/src/test/java/io/servicecomb/foundation/common/net/TestNetUtils.java index 4a1df0d5d72..8dc3a88de50 100644 --- a/foundations/foundation-common/src/test/java/io/servicecomb/foundation/common/net/TestNetUtils.java +++ b/foundations/foundation-common/src/test/java/io/servicecomb/foundation/common/net/TestNetUtils.java @@ -16,7 +16,9 @@ package io.servicecomb.foundation.common.net; +import java.io.IOException; import java.net.InetAddress; +import java.net.ServerSocket; import java.util.HashMap; import java.util.Map; @@ -83,4 +85,22 @@ public void testNetworkInterface() { Deencapsulation.setField(NetUtils.class, "allInterfaceAddresses", org); } + + @Test + public void testCanTcpListenNo() throws IOException { + try (ServerSocket ss = new ServerSocket(0)) { + InetAddress address = InetAddress.getByName("127.0.0.1"); + Assert.assertFalse(NetUtils.canTcpListen(address, ss.getLocalPort())); + } + } + + @Test + public void testCanTcpListenYes() throws IOException { + ServerSocket ss = new ServerSocket(0); + int port = ss.getLocalPort(); + ss.close(); + + InetAddress address = InetAddress.getByName("127.0.0.1"); + Assert.assertTrue(NetUtils.canTcpListen(address, port)); + } } diff --git a/java-chassis-dependencies/pom.xml b/java-chassis-dependencies/pom.xml index bd0731e5710..3ef903c867b 100644 --- a/java-chassis-dependencies/pom.xml +++ b/java-chassis-dependencies/pom.xml @@ -814,7 +814,6 @@ foundation-metrics 0.1.1-SNAPSHOT - com.fasterxml.jackson.dataformat jackson-dataformat-yaml diff --git a/transports/transport-rest/transport-rest-servlet/src/main/java/io/servicecomb/transport/rest/servlet/ServletConfig.java b/transports/transport-rest/transport-rest-servlet/src/main/java/io/servicecomb/transport/rest/servlet/ServletConfig.java index d095c40466a..8c7bf931b1b 100644 --- a/transports/transport-rest/transport-rest-servlet/src/main/java/io/servicecomb/transport/rest/servlet/ServletConfig.java +++ b/transports/transport-rest/transport-rest-servlet/src/main/java/io/servicecomb/transport/rest/servlet/ServletConfig.java @@ -24,8 +24,6 @@ public final class ServletConfig { private static final long DEFAULT_TIMEOUT = 3000; - private static final String DEFAULT_LISTEN_ADDRESS = "0.0.0.0:8080"; - private ServletConfig() { } @@ -37,7 +35,7 @@ public static long getServerTimeout() { public static String getLocalServerAddress() { DynamicStringProperty address = - DynamicPropertyFactory.getInstance().getStringProperty("cse.rest.address", DEFAULT_LISTEN_ADDRESS); + DynamicPropertyFactory.getInstance().getStringProperty("cse.rest.address", null); return address.get(); } } diff --git a/transports/transport-rest/transport-rest-servlet/src/main/java/io/servicecomb/transport/rest/servlet/ServletRestTransport.java b/transports/transport-rest/transport-rest-servlet/src/main/java/io/servicecomb/transport/rest/servlet/ServletRestTransport.java index 650d5ab165f..5777debafd8 100644 --- a/transports/transport-rest/transport-rest-servlet/src/main/java/io/servicecomb/transport/rest/servlet/ServletRestTransport.java +++ b/transports/transport-rest/transport-rest-servlet/src/main/java/io/servicecomb/transport/rest/servlet/ServletRestTransport.java @@ -16,31 +16,48 @@ package io.servicecomb.transport.rest.servlet; -import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import io.servicecomb.core.Const; import io.servicecomb.core.Invocation; import io.servicecomb.core.transport.AbstractTransport; -import io.servicecomb.transport.rest.client.RestTransportClient; -import io.servicecomb.transport.rest.client.RestTransportClientManager; +import io.servicecomb.foundation.common.net.NetUtils; import io.servicecomb.foundation.common.net.URIEndpointObject; import io.servicecomb.swagger.invocation.AsyncResponse; +import io.servicecomb.transport.rest.client.RestTransportClient; +import io.servicecomb.transport.rest.client.RestTransportClientManager; @Component public class ServletRestTransport extends AbstractTransport { + private static final Logger LOGGER = LoggerFactory.getLogger(ServletRestTransport.class); + @Override public String getName() { return Const.RESTFUL; } @Override - public boolean init() throws Exception { + public boolean canInit() { String listenAddress = ServletConfig.getLocalServerAddress(); - if (!StringUtils.isEmpty(listenAddress)) { - setListenAddressWithoutSchema(listenAddress); + setListenAddressWithoutSchema(listenAddress); + + URIEndpointObject ep = (URIEndpointObject) getEndpoint().getAddress(); + if (ep == null) { + return true; } + if (NetUtils.canTcpListen(ep.getSocketAddress().getAddress(), ep.getPort())) { + LOGGER.info("{} is not listened, skip {}.", ep.getSocketAddress(), this.getClass().getName()); + return false; + } + + return true; + } + + @Override + public boolean init() { return deployClient(); } diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/io/servicecomb/transport/rest/servlet/TestServletConfig.java b/transports/transport-rest/transport-rest-servlet/src/test/java/io/servicecomb/transport/rest/servlet/TestServletConfig.java index 35f8967b6ca..6ed5cf2e07e 100644 --- a/transports/transport-rest/transport-rest-servlet/src/test/java/io/servicecomb/transport/rest/servlet/TestServletConfig.java +++ b/transports/transport-rest/transport-rest-servlet/src/test/java/io/servicecomb/transport/rest/servlet/TestServletConfig.java @@ -22,7 +22,7 @@ public class TestServletConfig { @Test public void testGetLocalServerAddress() { - Assert.assertNotNull(ServletConfig.getLocalServerAddress()); + Assert.assertNull(ServletConfig.getLocalServerAddress()); } @Test diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/io/servicecomb/transport/rest/servlet/TestServletRestTransport.java b/transports/transport-rest/transport-rest-servlet/src/test/java/io/servicecomb/transport/rest/servlet/TestServletRestTransport.java index 776d396ec3f..b068941fe0d 100644 --- a/transports/transport-rest/transport-rest-servlet/src/test/java/io/servicecomb/transport/rest/servlet/TestServletRestTransport.java +++ b/transports/transport-rest/transport-rest-servlet/src/test/java/io/servicecomb/transport/rest/servlet/TestServletRestTransport.java @@ -16,6 +16,9 @@ package io.servicecomb.transport.rest.servlet; +import java.io.IOException; +import java.net.ServerSocket; + import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -24,20 +27,14 @@ import io.servicecomb.core.Invocation; import io.servicecomb.foundation.common.net.URIEndpointObject; import io.servicecomb.swagger.invocation.AsyncResponse; +import mockit.Expectations; public class TestServletRestTransport { ServletRestTransport transport = new ServletRestTransport(); @Test public void testInit() { - boolean status = true; - try { - transport.init(); - } catch (Exception exce) { - Assert.assertNotNull(exce); - status = false; - } - Assert.assertTrue(status); + Assert.assertTrue(transport.init()); } @Test @@ -57,4 +54,58 @@ public void testSendException() { } Assert.assertFalse(status); } + + @Test + public void testGetOrder() { + ServletRestTransport transport = new ServletRestTransport(); + Assert.assertEquals(0, transport.getOrder()); + } + + @Test + public void testCanInitNullAddress() throws IOException { + new Expectations(ServletConfig.class) { + { + ServletConfig.getLocalServerAddress(); + result = null; + } + }; + + ServletRestTransport transport = new ServletRestTransport(); + Assert.assertTrue(transport.canInit()); + } + + @Test + public void testCanInitListened() throws IOException { + ServerSocket ss = new ServerSocket(0); + int port = ss.getLocalPort(); + + new Expectations(ServletConfig.class) { + { + ServletConfig.getLocalServerAddress(); + result = "0.0.0.0:" + port; + } + }; + + ServletRestTransport transport = new ServletRestTransport(); + Assert.assertTrue(transport.canInit()); + + ss.close(); + } + + @Test + public void testCanInitNotListened() throws IOException { + ServerSocket ss = new ServerSocket(0); + int port = ss.getLocalPort(); + ss.close(); + + new Expectations(ServletConfig.class) { + { + ServletConfig.getLocalServerAddress(); + result = "0.0.0.0:" + port; + } + }; + + ServletRestTransport transport = new ServletRestTransport(); + Assert.assertFalse(transport.canInit()); + } } diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/io/servicecomb/transport/rest/vertx/VertxRestTransport.java b/transports/transport-rest/transport-rest-vertx/src/main/java/io/servicecomb/transport/rest/vertx/VertxRestTransport.java index f97cc009c8e..3ba2ea3ab00 100644 --- a/transports/transport-rest/transport-rest-vertx/src/main/java/io/servicecomb/transport/rest/vertx/VertxRestTransport.java +++ b/transports/transport-rest/transport-rest-vertx/src/main/java/io/servicecomb/transport/rest/vertx/VertxRestTransport.java @@ -16,9 +16,14 @@ package io.servicecomb.transport.rest.vertx; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + import io.servicecomb.core.Const; import io.servicecomb.core.Invocation; import io.servicecomb.core.transport.AbstractTransport; +import io.servicecomb.foundation.common.net.NetUtils; import io.servicecomb.foundation.common.net.URIEndpointObject; import io.servicecomb.foundation.vertx.SimpleJsonObject; import io.servicecomb.foundation.vertx.VertxUtils; @@ -26,23 +31,42 @@ import io.servicecomb.transport.rest.client.RestTransportClient; import io.servicecomb.transport.rest.client.RestTransportClientManager; import io.vertx.core.DeploymentOptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; @Component public class VertxRestTransport extends AbstractTransport { private static final Logger log = LoggerFactory.getLogger(VertxRestTransport.class); + @Override public String getName() { return Const.RESTFUL; } + @Override + public int getOrder() { + return -1000; + } + + @Override + public boolean canInit() { + setListenAddressWithoutSchema(TransportConfig.getAddress()); + + URIEndpointObject ep = (URIEndpointObject) getEndpoint().getAddress(); + if (ep == null) { + return true; + } + + if (!NetUtils.canTcpListen(ep.getSocketAddress().getAddress(), ep.getPort())) { + log.info("can not listen {}, skip {}.", ep.getSocketAddress(), this.getClass().getName()); + return false; + } + + return true; + } + @Override public boolean init() throws Exception { // 部署transport server DeploymentOptions options = new DeploymentOptions().setInstances(TransportConfig.getThreadCount()); - setListenAddressWithoutSchema(TransportConfig.getAddress()); SimpleJsonObject json = new SimpleJsonObject(); json.put(ENDPOINT_KEY, getEndpoint()); options.setConfig(json); diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/io/servicecomb/transport/rest/vertx/TestVertxRestTransport.java b/transports/transport-rest/transport-rest-vertx/src/test/java/io/servicecomb/transport/rest/vertx/TestVertxRestTransport.java index 5b33371046d..235df8e58e9 100644 --- a/transports/transport-rest/transport-rest-vertx/src/test/java/io/servicecomb/transport/rest/vertx/TestVertxRestTransport.java +++ b/transports/transport-rest/transport-rest-vertx/src/test/java/io/servicecomb/transport/rest/vertx/TestVertxRestTransport.java @@ -16,6 +16,9 @@ package io.servicecomb.transport.rest.vertx; +import java.io.IOException; +import java.net.ServerSocket; + import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -29,6 +32,7 @@ import io.vertx.core.DeploymentOptions; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; +import mockit.Expectations; import mockit.Mock; import mockit.MockUp; @@ -90,4 +94,57 @@ public void testSendException() { Assert.assertFalse(validAssert); } + @Test + public void testGetOrder() { + VertxRestTransport transport = new VertxRestTransport(); + Assert.assertEquals(-1000, transport.getOrder()); + } + + @Test + public void testCanInitNullAddress() throws IOException { + new Expectations(TransportConfig.class) { + { + TransportConfig.getAddress(); + result = null; + } + }; + + VertxRestTransport transport = new VertxRestTransport(); + Assert.assertTrue(transport.canInit()); + } + + @Test + public void testCanInitListened() throws IOException { + ServerSocket ss = new ServerSocket(0); + int port = ss.getLocalPort(); + + new Expectations(TransportConfig.class) { + { + TransportConfig.getAddress(); + result = "0.0.0.0:" + port; + } + }; + + VertxRestTransport transport = new VertxRestTransport(); + Assert.assertFalse(transport.canInit()); + + ss.close(); + } + + @Test + public void testCanInitNotListened() throws IOException { + ServerSocket ss = new ServerSocket(0); + int port = ss.getLocalPort(); + ss.close(); + + new Expectations(TransportConfig.class) { + { + TransportConfig.getAddress(); + result = "0.0.0.0:" + port; + } + }; + + VertxRestTransport transport = new VertxRestTransport(); + Assert.assertTrue(transport.canInit()); + } }