This is an automated email from the ASF dual-hosted git repository. victory pushed a commit to branch cloud-native in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 5dcf3017ddff65664ff430ebffdf51f61ba84142 Author: cvictory <shenglic...@gmail.com> AuthorDate: Mon Sep 2 14:09:33 2019 +0800 unit test for etcd serviceDiscovery --- .../dubbo/registry/etcd/EtcdServiceDiscovery.java | 12 ++- .../registry/etcd/EtcdServiceDiscoveryTest.java | 102 ++++++++++++++++++++- 2 files changed, 108 insertions(+), 6 deletions(-) diff --git a/dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java b/dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java index 1f88f7e..821d80c 100644 --- a/dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java @@ -63,9 +63,9 @@ public class EtcdServiceDiscovery implements ServiceDiscovery, EventListener<Ser private final ConcurrentMap<URL, ConcurrentMap<NotifyListener, ChildListener>> etcdListeners = new ConcurrentHashMap<>(); - private EtcdClient etcdClient; - private EventDispatcher dispatcher; - private ServiceInstance serviceInstance; + EtcdClient etcdClient; + EventDispatcher dispatcher; + ServiceInstance serviceInstance; @Override public void onEvent(ServiceInstancesChangedEvent event) { @@ -99,7 +99,9 @@ public class EtcdServiceDiscovery implements ServiceDiscovery, EventListener<Ser @Override public void destroy() { - + if (etcdClient != null && etcdClient.isConnected()) { + etcdClient.close(); + } } @Override @@ -131,7 +133,7 @@ public class EtcdServiceDiscovery implements ServiceDiscovery, EventListener<Ser public void update(ServiceInstance serviceInstance) throws RuntimeException { try { String path = toPath(serviceInstance); - etcdClient.put(path, new Gson().toJson(serviceInstance)); + etcdClient.putEphemeral(path, new Gson().toJson(serviceInstance)); services.add(serviceInstance.getServiceName()); } catch (Throwable e) { throw new RpcException("Failed to register " + serviceInstance + " to etcd " + etcdClient.getUrl() diff --git a/dubbo-registry/dubbo-registry-etcd3/src/test/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscoveryTest.java b/dubbo-registry/dubbo-registry-etcd3/src/test/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscoveryTest.java index 5955f7a..48cff97 100644 --- a/dubbo-registry/dubbo-registry-etcd3/src/test/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscoveryTest.java +++ b/dubbo-registry/dubbo-registry-etcd3/src/test/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscoveryTest.java @@ -1,8 +1,108 @@ package org.apache.dubbo.registry.etcd; +import org.apache.dubbo.common.URL; +import org.apache.dubbo.registry.client.DefaultServiceInstance; +import org.apache.dubbo.registry.client.ServiceInstance; + +import com.google.gson.Gson; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static java.lang.String.valueOf; + /** - * @author cvictory ON 2019-08-30 + * 2019-08-30 + * <p> + * There is no embedded server. so it works depend on etcd local server. */ +@Disabled public class EtcdServiceDiscoveryTest { + static EtcdServiceDiscovery etcdServiceDiscovery; + + @BeforeAll + public static void setUp() throws Exception { + URL url = URL.valueOf("etcd3://127.0.0.1:2379/org.apache.dubbo.registry.RegistryService"); + etcdServiceDiscovery = new EtcdServiceDiscovery(); + Assertions.assertNull(etcdServiceDiscovery.etcdClient); + etcdServiceDiscovery.initialize(url); + } + + @AfterAll + public static void destroy() throws Exception { +// etcdServiceDiscovery.destroy(); + } + + + @Test + public void testLifecycle() throws Exception { + URL url = URL.valueOf("etcd3://127.0.0.1:2233/org.apache.dubbo.registry.RegistryService"); + EtcdServiceDiscovery etcdServiceDiscoveryTmp = new EtcdServiceDiscovery(); + Assertions.assertNull(etcdServiceDiscoveryTmp.etcdClient); + etcdServiceDiscoveryTmp.initialize(url); + Assertions.assertNotNull(etcdServiceDiscoveryTmp.etcdClient); + Assertions.assertTrue(etcdServiceDiscoveryTmp.etcdClient.isConnected()); + etcdServiceDiscoveryTmp.destroy(); + Assertions.assertFalse(etcdServiceDiscoveryTmp.etcdClient.isConnected()); + } + + @Test + public void testRegistry() throws Exception { + ServiceInstance serviceInstance = new DefaultServiceInstance(valueOf(System.nanoTime()), "EtcdTestService", "127.0.0.1", 8080); + Assertions.assertNull(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance))); + etcdServiceDiscovery.register(serviceInstance); + Assertions.assertNotNull(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance))); + } + + @Test + public void testUnRegistry() throws Exception { + ServiceInstance serviceInstance = new DefaultServiceInstance(valueOf(System.nanoTime()), "EtcdTest2Service", "127.0.0.1", 8080); + Assertions.assertNull(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance))); + etcdServiceDiscovery.register(serviceInstance); + Assertions.assertNotNull(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance))); + etcdServiceDiscovery.unregister(serviceInstance); + Assertions.assertNull(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance))); + } + + @Test + public void testUpdate() throws Exception { + DefaultServiceInstance serviceInstance = new DefaultServiceInstance(valueOf(System.nanoTime()), "EtcdTest2Service", "127.0.0.1", 8080); + Assertions.assertNull(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance))); + etcdServiceDiscovery.register(serviceInstance); + Assertions.assertNotNull(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance))); + Assertions.assertEquals(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance)), + new Gson().toJson(serviceInstance)); + serviceInstance.setPort(9999); + etcdServiceDiscovery.update(serviceInstance); + Assertions.assertNotNull(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance))); + Assertions.assertEquals(etcdServiceDiscovery.etcdClient.getKVValue(etcdServiceDiscovery.toPath(serviceInstance)), + new Gson().toJson(serviceInstance)); + } + + @Test + public void testGetInstances() throws Exception { + String serviceName = "EtcdTest77Service"; + Assertions.assertTrue(etcdServiceDiscovery.getInstances(serviceName).isEmpty()); + etcdServiceDiscovery.register(new DefaultServiceInstance(valueOf(System.nanoTime()), serviceName, "127.0.0.1", 8080)); + etcdServiceDiscovery.register(new DefaultServiceInstance(valueOf(System.nanoTime()), serviceName, "127.0.0.1", 9809)); + Assertions.assertFalse(etcdServiceDiscovery.getInstances(serviceName).isEmpty()); + List<String> r = convertToIpPort(etcdServiceDiscovery.getInstances(serviceName)); + Assertions.assertTrue(r.contains("127.0.0.1:8080")); + Assertions.assertTrue(r.contains("127.0.0.1:9809")); + } + + private List<String> convertToIpPort(List<ServiceInstance> serviceInstances) { + List<String> result = new ArrayList<>(); + for (ServiceInstance serviceInstance : serviceInstances) { + result.add(serviceInstance.getHost() + ":" + serviceInstance.getPort()); + } + return result; + } + }