From f09ee2c65847b4aa56ccf3888c6dc7289d5e5d44 Mon Sep 17 00:00:00 2001 From: "tony.chenl" Date: Wed, 9 Nov 2011 12:56:14 +0000 Subject: [PATCH] =?UTF-8?q?DUBBO-44=20=E4=BF=AE=E6=94=B9=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E6=97=B6=E4=B8=8E1.0=20url=E6=97=A0path=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@222 1a56cb94-b969-4eaa-88fa-be21384802f2 --- .../registry/dubbo/RegistryDirectoryTest.java | 816 +++++++++--------- .../registry/support/RegistryDirectory.java | 3 +- 2 files changed, 430 insertions(+), 389 deletions(-) diff --git a/dubbo-registry-default/src/test/java/com/alibaba/dubbo/registry/dubbo/RegistryDirectoryTest.java b/dubbo-registry-default/src/test/java/com/alibaba/dubbo/registry/dubbo/RegistryDirectoryTest.java index b5b33c49b3..2c8205a09e 100644 --- a/dubbo-registry-default/src/test/java/com/alibaba/dubbo/registry/dubbo/RegistryDirectoryTest.java +++ b/dubbo-registry-default/src/test/java/com/alibaba/dubbo/registry/dubbo/RegistryDirectoryTest.java @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.dubbo.registry.dubbo; - +package com.alibaba.dubbo.registry.dubbo; + import static org.junit.Assert.fail; import java.lang.reflect.Field; @@ -47,85 +47,90 @@ import com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance; import com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance; import com.alibaba.dubbo.rpc.cluster.router.ScriptRouter; import com.alibaba.dubbo.rpc.cluster.router.ScriptRouterFactory; - -@SuppressWarnings({ "rawtypes", "unchecked" }) -public class RegistryDirectoryTest { - RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension(); - Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); - String service = DemoService.class.getName(); - RpcInvocation invocation = new RpcInvocation(); - - URL noMeaningUrl = URL.valueOf("notsupport:/"+service); - URL SERVICEURL= URL.valueOf("dubbo://127.0.0.1:9091/"+service+"?lazy=true"); - URL SERVICEURL2= URL.valueOf("dubbo://127.0.0.1:9092/"+service+"?lazy=true"); - URL SERVICEURL3= URL.valueOf("dubbo://127.0.0.1:9093/"+service+"?lazy=true"); - URL SERVICEURL_DUBBO_NOPATH= URL.valueOf("dubbo://127.0.0.1:9092"+"?lazy=true"); - + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class RegistryDirectoryTest { + + RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension(); + Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); + String service = DemoService.class.getName(); + RpcInvocation invocation = new RpcInvocation(); + + URL noMeaningUrl = URL.valueOf("notsupport:/" + service+"?interface="+service); + URL SERVICEURL = URL.valueOf("dubbo://127.0.0.1:9091/" + service + "?lazy=true"); + URL SERVICEURL2 = URL.valueOf("dubbo://127.0.0.1:9092/" + service + "?lazy=true"); + URL SERVICEURL3 = URL.valueOf("dubbo://127.0.0.1:9093/" + service + "?lazy=true"); + URL SERVICEURL_DUBBO_NOPATH = URL.valueOf("dubbo://127.0.0.1:9092" + "?lazy=true"); + @Before public void setUp() { } - - private RegistryDirectory getRegistryDirectory (URL url){ + + private RegistryDirectory getRegistryDirectory(URL url) { RegistryDirectory registryDirectory = new RegistryDirectory(URL.class, url); registryDirectory.setProtocol(protocol); - //asert empty + // asert empty List invokers = registryDirectory.list(invocation); - Assert.assertEquals(0,invokers.size()); + Assert.assertEquals(0, invokers.size()); Assert.assertEquals(false, registryDirectory.isAvailable()); return registryDirectory; } - private RegistryDirectory getRegistryDirectory (){ + + private RegistryDirectory getRegistryDirectory() { return getRegistryDirectory(noMeaningUrl); } - + @Test - public void test_Constructor_WithErrorParam(){ - try{ + public void test_Constructor_WithErrorParam() { + try { new RegistryDirectory(null, null); fail(); - }catch (IllegalArgumentException e) { - + } catch (IllegalArgumentException e) { + } - try{ - //null url + try { + // null url new RegistryDirectory(null, noMeaningUrl); fail(); - }catch (IllegalArgumentException e) { - + } catch (IllegalArgumentException e) { + } - try{ - //no servicekey + try { + // no servicekey new RegistryDirectory(RegistryDirectoryTest.class, URL.valueOf("dubbo://10.20.30.40:9090")); fail(); - }catch (IllegalArgumentException e) { - + } catch (IllegalArgumentException e) { + } } + @Test - public void test_Constructor_CheckStatus() throws Exception{ - URL url = URL.valueOf("notsupported://10.20.30.40/"+service+"?a=b").addParameterAndEncoded(RpcConstants.REFER_KEY, "foo=bar"); + public void test_Constructor_CheckStatus() throws Exception { + URL url = URL.valueOf("notsupported://10.20.30.40/" + service + "?a=b").addParameterAndEncoded(RpcConstants.REFER_KEY, + "foo=bar"); RegistryDirectory reg = getRegistryDirectory(url); Field field = reg.getClass().getDeclaredField("queryMap"); field.setAccessible(true); - Map queryMap = (Map)field.get(reg); + Map queryMap = (Map) field.get(reg); Assert.assertEquals("bar", queryMap.get("foo")); Assert.assertEquals(url.removeParameter(RpcConstants.REFER_KEY), reg.getUrl()); - } - - @Test + } + + @Test public void testNotified_Normal() { - RegistryDirectory registryDirectory = getRegistryDirectory(); - test_Notified2invokers(registryDirectory); - test_Notified1invokers(registryDirectory); - test_Notified3invokers(registryDirectory); + RegistryDirectory registryDirectory = getRegistryDirectory(); + test_Notified2invokers(registryDirectory); + test_Notified1invokers(registryDirectory); + test_Notified3invokers(registryDirectory); testforbid(registryDirectory); } + @Test public void testNotified_WithError() { RegistryDirectory registryDirectory = getRegistryDirectory(); - List serviceUrls = new ArrayList (); - //ignore error log - URL badurl = URL.valueOf("notsupported://127.0.0.1/"+service); + List serviceUrls = new ArrayList(); + // ignore error log + URL badurl = URL.valueOf("notsupported://127.0.0.1/" + service); serviceUrls.add(badurl); serviceUrls.add(SERVICEURL); @@ -134,11 +139,11 @@ public class RegistryDirectoryTest { List invokers = registryDirectory.list(invocation); Assert.assertEquals(1, invokers.size()); } - + @Test public void testNotified_WithDuplicateUrls() { - List serviceUrls = new ArrayList (); - //ignore error log + List serviceUrls = new ArrayList(); + // ignore error log serviceUrls.add(SERVICEURL); serviceUrls.add(SERVICEURL); @@ -147,420 +152,455 @@ public class RegistryDirectoryTest { List invokers = registryDirectory.list(invocation); Assert.assertEquals(1, invokers.size()); } - - //forbid - private void testforbid(RegistryDirectory registryDirectory){ - invocation = new RpcInvocation(); - List serviceUrls = new ArrayList (); + + // forbid + private void testforbid(RegistryDirectory registryDirectory) { + invocation = new RpcInvocation(); + List serviceUrls = new ArrayList(); registryDirectory.notify(serviceUrls); - Assert.assertEquals("invokers size=0 ,then the registry directory is not available", false, registryDirectory.isAvailable()); - try { - registryDirectory.list(invocation); - fail("forbid must throw RpcException"); - } catch (RpcException e) { + Assert.assertEquals("invokers size=0 ,then the registry directory is not available", false, + registryDirectory.isAvailable()); + try { + registryDirectory.list(invocation); + fail("forbid must throw RpcException"); + } catch (RpcException e) { Assert.assertEquals(RpcException.FORBIDDEN_EXCEPTION, e.getCode()); - } - } - - //notify one invoker - private void test_Notified1invokers(RegistryDirectory registryDirectory){ - - List serviceUrls = new ArrayList (); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1"));//.addParameter("refer.autodestroy", "true") + } + } + + //测试调用和registry url的path无关 + @Test + public void test_NotifiedDubbo1() { + URL errorPathUrl = URL.valueOf("notsupport:/" + "xxx"+"?interface="+service); + RegistryDirectory registryDirectory = getRegistryDirectory(errorPathUrl); + List serviceUrls = new ArrayList(); + URL Dubbo1URL = URL.valueOf("dubbo://127.0.0.1:9098?lazy=true"); + serviceUrls.add(Dubbo1URL.addParameter("methods", "getXXX")); registryDirectory.notify(serviceUrls); Assert.assertEquals(true, registryDirectory.isAvailable()); invocation = new RpcInvocation(); - - List invokers = registryDirectory.list(invocation); - Assert.assertEquals(1,invokers.size()); - + + List> invokers = registryDirectory.list(invocation); + Assert.assertEquals(1, invokers.size()); + invocation.setMethodName("getXXX"); invokers = registryDirectory.list(invocation); - Assert.assertEquals(1,invokers.size()); - + Assert.assertEquals(1, invokers.size()); + Assert.assertEquals(DemoService.class.getName(), invokers.get(0).getUrl().getPath()); + } + + // notify one invoker + private void test_Notified1invokers(RegistryDirectory registryDirectory) { + + List serviceUrls = new ArrayList(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1"));// .addParameter("refer.autodestroy", "true") + registryDirectory.notify(serviceUrls); + Assert.assertEquals(true, registryDirectory.isAvailable()); + + invocation = new RpcInvocation(); + + List invokers = registryDirectory.list(invocation); + Assert.assertEquals(1, invokers.size()); + + invocation.setMethodName("getXXX"); + invokers = registryDirectory.list(invocation); + Assert.assertEquals(1, invokers.size()); + invocation.setMethodName("getXXX1"); invokers = registryDirectory.list(invocation); - Assert.assertEquals(1,invokers.size()); - + Assert.assertEquals(1, invokers.size()); + invocation.setMethodName("getXXX2"); invokers = registryDirectory.list(invocation); - Assert.assertEquals(1,invokers.size()); - } - - //两个invoker=================================== - private void test_Notified2invokers(RegistryDirectory registryDirectory){ - List serviceUrls = new ArrayList (); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); - serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); - serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); - + Assert.assertEquals(1, invokers.size()); + } + + // 两个invoker=================================== + private void test_Notified2invokers(RegistryDirectory registryDirectory) { + List serviceUrls = new ArrayList(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); + serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); + serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); + registryDirectory.notify(serviceUrls); - Assert.assertEquals(true, registryDirectory.isAvailable()); - - - invocation = new RpcInvocation(); - - List invokers = registryDirectory.list(invocation); - Assert.assertEquals(2,invokers.size()); - - invocation.setMethodName("getXXX"); - invokers = registryDirectory.list(invocation); - Assert.assertEquals(2,invokers.size()); - - invocation.setMethodName("getXXX1"); - invokers = registryDirectory.list(invocation); - Assert.assertEquals(2,invokers.size()); - - invocation.setMethodName("getXXX2"); - invokers = registryDirectory.list(invocation); - Assert.assertEquals(1,invokers.size()); - } - - //通知成3个invoker=================================== - private void test_Notified3invokers(RegistryDirectory registryDirectory){ - List serviceUrls = new ArrayList (); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); - serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); - serviceUrls.add(SERVICEURL3.addParameter("methods", "getXXX1,getXXX2,getXXX3")); - + Assert.assertEquals(true, registryDirectory.isAvailable()); + + invocation = new RpcInvocation(); + + List invokers = registryDirectory.list(invocation); + Assert.assertEquals(2, invokers.size()); + + invocation.setMethodName("getXXX"); + invokers = registryDirectory.list(invocation); + Assert.assertEquals(2, invokers.size()); + + invocation.setMethodName("getXXX1"); + invokers = registryDirectory.list(invocation); + Assert.assertEquals(2, invokers.size()); + + invocation.setMethodName("getXXX2"); + invokers = registryDirectory.list(invocation); + Assert.assertEquals(1, invokers.size()); + } + + // 通知成3个invoker=================================== + private void test_Notified3invokers(RegistryDirectory registryDirectory) { + List serviceUrls = new ArrayList(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); + serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); + serviceUrls.add(SERVICEURL3.addParameter("methods", "getXXX1,getXXX2,getXXX3")); + registryDirectory.notify(serviceUrls); - Assert.assertEquals(true, registryDirectory.isAvailable()); - - invocation = new RpcInvocation(); - - List invokers = registryDirectory.list(invocation); - Assert.assertEquals(3,invokers.size()); - - - invocation.setMethodName("getXXX"); - invokers = registryDirectory.list(invocation); - Assert.assertEquals(3,invokers.size()); - - invocation.setMethodName("getXXX1"); - invokers = registryDirectory.list(invocation); - Assert.assertEquals(3,invokers.size()); - - invocation.setMethodName("getXXX2"); - invokers = registryDirectory.list(invocation); - Assert.assertEquals(2,invokers.size()); - - invocation.setMethodName("getXXX3"); - invokers = registryDirectory.list(invocation); - Assert.assertEquals(1,invokers.size()); - } - - @Test - public void testParametersMerge(){ + Assert.assertEquals(true, registryDirectory.isAvailable()); + + invocation = new RpcInvocation(); + + List invokers = registryDirectory.list(invocation); + Assert.assertEquals(3, invokers.size()); + + invocation.setMethodName("getXXX"); + invokers = registryDirectory.list(invocation); + Assert.assertEquals(3, invokers.size()); + + invocation.setMethodName("getXXX1"); + invokers = registryDirectory.list(invocation); + Assert.assertEquals(3, invokers.size()); + + invocation.setMethodName("getXXX2"); + invokers = registryDirectory.list(invocation); + Assert.assertEquals(2, invokers.size()); + + invocation.setMethodName("getXXX3"); + invokers = registryDirectory.list(invocation); + Assert.assertEquals(1, invokers.size()); + } + + @Test + public void testParametersMerge() { RegistryDirectory registryDirectory = getRegistryDirectory(); - URL regurl= noMeaningUrl - .addParameter("test", "reg") - .addParameterAndEncoded(RpcConstants.REFER_KEY,"key=query&" + Constants.LOADBALANCE_KEY + "=" + LeastActiveLoadBalance.NAME); - RegistryDirectory registryDirectory2 = new RegistryDirectory(RegistryDirectoryTest.class, regurl); - registryDirectory2.setProtocol(protocol); - - List serviceUrls = new ArrayList (); - //检验注册中心的参数需要被清除 - { - serviceUrls.clear(); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); - registryDirectory.notify(serviceUrls); - - invocation = new RpcInvocation(); - List invokers = registryDirectory.list(invocation); - - Invoker invoker = (Invoker) invokers.get(0); - URL url = invoker.getUrl(); - Assert.assertEquals(null, url.getParameter("key")); - } - //检验服务提供方的参数需要merge - { - serviceUrls.clear(); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX2").addParameter("key", "provider")); - - registryDirectory.notify(serviceUrls); - invocation = new RpcInvocation(); - List invokers = registryDirectory.list(invocation); - - Invoker invoker = (Invoker) invokers.get(0); - URL url = invoker.getUrl(); - Assert.assertEquals("provider",url.getParameter("key")); - } - //检验服务query的参数需要与providermerge 。 - { - serviceUrls.clear(); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX3").addParameter("key", "provider")); - - registryDirectory2.notify(serviceUrls); - invocation = new RpcInvocation(); - List invokers = registryDirectory2.list(invocation); - - Invoker invoker = (Invoker) invokers.get(0); - URL url = invoker.getUrl(); - Assert.assertEquals("query",url.getParameter("key")); - } - - { - serviceUrls.clear(); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); - registryDirectory.notify(serviceUrls); - - invocation = new RpcInvocation(); - List invokers = registryDirectory.list(invocation); - - Invoker invoker = (Invoker) invokers.get(0); - URL url = invoker.getUrl(); - Assert.assertEquals(false,url.getParameter(Constants.CHECK_KEY, false)); - } - { - serviceUrls.clear(); - serviceUrls.add(SERVICEURL.addParameter(Constants.LOADBALANCE_KEY, RoundRobinLoadBalance.NAME)); - registryDirectory2.notify(serviceUrls); - - invocation = new RpcInvocation(); - invocation.setMethodName("get"); - List invokers = registryDirectory2.list(invocation); - - Invoker invoker = (Invoker) invokers.get(0); - URL url = invoker.getUrl(); - Assert.assertEquals(LeastActiveLoadBalance.NAME,url.getMethodParameter("get",Constants.LOADBALANCE_KEY)); - } - } - - /** - * When destroying, RegistryDirectory should: - * 1. be disconnected from Registry - * 2. destroy all invokers - */ - @Test - public void testDestroy(){ + URL regurl = noMeaningUrl.addParameter("test", "reg").addParameterAndEncoded(RpcConstants.REFER_KEY, + "key=query&" + + Constants.LOADBALANCE_KEY + + "=" + + LeastActiveLoadBalance.NAME); + RegistryDirectory registryDirectory2 = new RegistryDirectory( + RegistryDirectoryTest.class, + regurl); + registryDirectory2.setProtocol(protocol); + + List serviceUrls = new ArrayList(); + // 检验注册中心的参数需要被清除 + { + serviceUrls.clear(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); + registryDirectory.notify(serviceUrls); + + invocation = new RpcInvocation(); + List invokers = registryDirectory.list(invocation); + + Invoker invoker = (Invoker) invokers.get(0); + URL url = invoker.getUrl(); + Assert.assertEquals(null, url.getParameter("key")); + } + // 检验服务提供方的参数需要merge + { + serviceUrls.clear(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX2").addParameter("key", "provider")); + + registryDirectory.notify(serviceUrls); + invocation = new RpcInvocation(); + List invokers = registryDirectory.list(invocation); + + Invoker invoker = (Invoker) invokers.get(0); + URL url = invoker.getUrl(); + Assert.assertEquals("provider", url.getParameter("key")); + } + // 检验服务query的参数需要与providermerge 。 + { + serviceUrls.clear(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX3").addParameter("key", "provider")); + + registryDirectory2.notify(serviceUrls); + invocation = new RpcInvocation(); + List invokers = registryDirectory2.list(invocation); + + Invoker invoker = (Invoker) invokers.get(0); + URL url = invoker.getUrl(); + Assert.assertEquals("query", url.getParameter("key")); + } + + { + serviceUrls.clear(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); + registryDirectory.notify(serviceUrls); + + invocation = new RpcInvocation(); + List invokers = registryDirectory.list(invocation); + + Invoker invoker = (Invoker) invokers.get(0); + URL url = invoker.getUrl(); + Assert.assertEquals(false, url.getParameter(Constants.CHECK_KEY, false)); + } + { + serviceUrls.clear(); + serviceUrls.add(SERVICEURL.addParameter(Constants.LOADBALANCE_KEY, RoundRobinLoadBalance.NAME)); + registryDirectory2.notify(serviceUrls); + + invocation = new RpcInvocation(); + invocation.setMethodName("get"); + List invokers = registryDirectory2.list(invocation); + + Invoker invoker = (Invoker) invokers.get(0); + URL url = invoker.getUrl(); + Assert.assertEquals(LeastActiveLoadBalance.NAME, url.getMethodParameter("get", Constants.LOADBALANCE_KEY)); + } + } + + /** + * When destroying, RegistryDirectory should: 1. be disconnected from Registry 2. destroy all invokers + */ + @Test + public void testDestroy() { RegistryDirectory registryDirectory = getRegistryDirectory(); - - List serviceUrls = new ArrayList (); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); - serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); - serviceUrls.add(SERVICEURL3.addParameter("methods", "getXXX1,getXXX2,getXXX3")); - + + List serviceUrls = new ArrayList(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); + serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); + serviceUrls.add(SERVICEURL3.addParameter("methods", "getXXX1,getXXX2,getXXX3")); + registryDirectory.notify(serviceUrls); List invokers = registryDirectory.list(invocation); Assert.assertEquals(true, registryDirectory.isAvailable()); Assert.assertEquals(true, invokers.get(0).isAvailable()); - + registryDirectory.destroy(); Assert.assertEquals(false, registryDirectory.isAvailable()); Assert.assertEquals(false, invokers.get(0).isAvailable()); registryDirectory.destroy(); - - - Map>> methodInvokerMap = registryDirectory.getMethodInvokerMap(); - Map> urlInvokerMap = registryDirectory.getUrlInvokerMap(); - - Assert.assertTrue(methodInvokerMap == null); - Assert.assertEquals(0, urlInvokerMap.size()); - //List urls = mockRegistry.getSubscribedUrls(); - - RpcInvocation inv = new RpcInvocation(); + + Map>> methodInvokerMap = registryDirectory.getMethodInvokerMap(); + Map> urlInvokerMap = registryDirectory.getUrlInvokerMap(); + + Assert.assertTrue(methodInvokerMap == null); + Assert.assertEquals(0, urlInvokerMap.size()); + // List urls = mockRegistry.getSubscribedUrls(); + + RpcInvocation inv = new RpcInvocation(); try { registryDirectory.list(inv); fail(); } catch (RpcException e) { Assert.assertTrue(e.getMessage().contains("already destroyed")); - } + } } - + @Test - public void testDestroy_WithDestroyRegistry(){ + public void testDestroy_WithDestroyRegistry() { RegistryDirectory registryDirectory = getRegistryDirectory(); CountDownLatch latch = new CountDownLatch(1); registryDirectory.setRegistry(new MockRegistry(latch)); registryDirectory.destroy(); Assert.assertEquals(0, latch.getCount()); } - + @Test - public void testDestroy_WithDestroyRegistry_WithError(){ + public void testDestroy_WithDestroyRegistry_WithError() { RegistryDirectory registryDirectory = getRegistryDirectory(); registryDirectory.setRegistry(new MockRegistry(true)); registryDirectory.destroy(); - } - - @Test - public void testDubbo1UrlWithGenericInvocation(){ - - RegistryDirectory registryDirectory = getRegistryDirectory(); - - List serviceUrls = new ArrayList (); - URL serviceURL = SERVICEURL_DUBBO_NOPATH.addParameter("methods", "getXXX1,getXXX2,getXXX3"); - serviceUrls.add(serviceURL); - - registryDirectory.notify(serviceUrls); - - //Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException; - invocation = new RpcInvocation(Constants.$INVOKE, - new Class[]{String.class, String[].class, Object[].class}, - new Object[]{"getXXX1", "", new Object[]{}}); - - List invokers = registryDirectory.list(invocation); - - Assert.assertEquals(1, invokers.size()); - Assert.assertEquals(serviceURL.setPath(service), invokers.get(0).getUrl()); - - } - - enum Param{ - MORGAN, - }; - - /** - * When the first arg of a method is String or Enum, Registry server - * can do parameter-value-based routing. - */ - @Test - public void testParmeterRoute(){ - RegistryDirectory registryDirectory = getRegistryDirectory(); - List serviceUrls = new ArrayList (); - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1.napoli")); - serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1.MORGAN,getXXX2")); - serviceUrls.add(SERVICEURL3.addParameter("methods", "getXXX1.morgan,getXXX2,getXXX3")); - - registryDirectory.notify(serviceUrls); - - invocation = new RpcInvocation(Constants.$INVOKE, - new Class[]{String.class, String[].class, Object[].class}, - new Object[]{"getXXX1", new String[]{"Enum"}, new Object[]{Param.MORGAN}}); - - List invokers = registryDirectory.list(invocation); - Assert.assertEquals(1, invokers.size()); - } - - /** - * Empty notify cause forbidden, non-empty notify cancels forbidden state - */ - @Test - public void testEmptyNotifyCauseForbidden(){ - RegistryDirectory registryDirectory = getRegistryDirectory(); - List invokers = null; - - List serviceUrls = new ArrayList (); - registryDirectory.notify(serviceUrls); - - RpcInvocation inv = new RpcInvocation(); - try{ - invokers = registryDirectory.list(inv); - }catch(RpcException e){ - Assert.assertEquals(RpcException.FORBIDDEN_EXCEPTION, e.getCode()); - Assert.assertEquals(false, registryDirectory.isAvailable()); - } - - serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); - serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); - serviceUrls.add(SERVICEURL3.addParameter("methods", "getXXX1,getXXX2,getXXX3")); - - registryDirectory.notify(serviceUrls); - inv.setMethodName("getXXX2"); - invokers = registryDirectory.list(inv); - Assert.assertEquals(true, registryDirectory.isAvailable()); - Assert.assertEquals(2, invokers.size()); - } - - private static boolean isScriptUnsupported = new ScriptEngineManager().getEngineByName("javascript") == null; - /** - * 1. notify twice, the second time notified router rules should completely replace the former one. - * 2. notify with no router url, do nothing to current routers - * 3. notify with only one router url, with router=clean, clear all current routers - */ - @Test - public void testNotifyRouterUrls(){ - if (isScriptUnsupported) return; - RegistryDirectory registryDirectory = getRegistryDirectory(); - URL routerurl= URL.valueOf(RpcConstants.ROUTE_PROTOCOL + "://127.0.0.1:9096/"); - URL routerurl2= URL.valueOf(RpcConstants.ROUTE_PROTOCOL + "://127.0.0.1:9097/"); - - List serviceUrls = new ArrayList (); - // without ROUTER_KEY, the first router should not be created. - serviceUrls.add(routerurl.addParameter(RpcConstants.TYPE_KEY, "javascript") - .addParameter(RpcConstants.ROUTER_KEY, "notsupported") - .addParameter(RpcConstants.RULE_KEY, "function test1(){}")); - serviceUrls.add(routerurl2.addParameter(RpcConstants.TYPE_KEY, "javascript") - .addParameter(RpcConstants.ROUTER_KEY, ScriptRouterFactory.NAME) - .addParameter(RpcConstants.RULE_KEY, "function test1(){}")); - - registryDirectory.notify(serviceUrls); - List routers = registryDirectory.getRouters(); - Assert.assertEquals(1, routers.size()); - Assert.assertEquals(ScriptRouter.class, routers.get(0).getClass()); - - registryDirectory.notify(new ArrayList()); - routers = registryDirectory.getRouters(); - Assert.assertEquals(1, routers.size()); - Assert.assertEquals(ScriptRouter.class, routers.get(0).getClass()); - - serviceUrls.clear(); - serviceUrls.add(routerurl.addParameter(RpcConstants.ROUTER_KEY, RpcConstants.ROUTER_TYPE_CLEAR)); - registryDirectory.notify(serviceUrls); - routers = registryDirectory.getRouters(); - Assert.assertEquals(0, routers.size()); } - + @Test - public void testNotifyRouterUrls_Clean(){ + public void testDubbo1UrlWithGenericInvocation() { + + RegistryDirectory registryDirectory = getRegistryDirectory(); + + List serviceUrls = new ArrayList(); + URL serviceURL = SERVICEURL_DUBBO_NOPATH.addParameter("methods", "getXXX1,getXXX2,getXXX3"); + serviceUrls.add(serviceURL); + + registryDirectory.notify(serviceUrls); + + // Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException; + invocation = new RpcInvocation(Constants.$INVOKE, new Class[] { String.class, String[].class, Object[].class }, + new Object[] { "getXXX1", "", new Object[] {} }); + + List invokers = registryDirectory.list(invocation); + + Assert.assertEquals(1, invokers.size()); + Assert.assertEquals(serviceURL.setPath(service), invokers.get(0).getUrl()); + + } + + enum Param { + MORGAN, + }; + + /** + * When the first arg of a method is String or Enum, Registry server can do parameter-value-based routing. + */ + @Test + public void testParmeterRoute() { + RegistryDirectory registryDirectory = getRegistryDirectory(); + List serviceUrls = new ArrayList(); + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1.napoli")); + serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1.MORGAN,getXXX2")); + serviceUrls.add(SERVICEURL3.addParameter("methods", "getXXX1.morgan,getXXX2,getXXX3")); + + registryDirectory.notify(serviceUrls); + + invocation = new RpcInvocation( + Constants.$INVOKE, + new Class[] { String.class, String[].class, Object[].class }, + new Object[] { "getXXX1", new String[] { "Enum" }, new Object[] { Param.MORGAN } }); + + List invokers = registryDirectory.list(invocation); + Assert.assertEquals(1, invokers.size()); + } + + /** + * Empty notify cause forbidden, non-empty notify cancels forbidden state + */ + @Test + public void testEmptyNotifyCauseForbidden() { + RegistryDirectory registryDirectory = getRegistryDirectory(); + List invokers = null; + + List serviceUrls = new ArrayList(); + registryDirectory.notify(serviceUrls); + + RpcInvocation inv = new RpcInvocation(); + try { + invokers = registryDirectory.list(inv); + } catch (RpcException e) { + Assert.assertEquals(RpcException.FORBIDDEN_EXCEPTION, e.getCode()); + Assert.assertEquals(false, registryDirectory.isAvailable()); + } + + serviceUrls.add(SERVICEURL.addParameter("methods", "getXXX1")); + serviceUrls.add(SERVICEURL2.addParameter("methods", "getXXX1,getXXX2")); + serviceUrls.add(SERVICEURL3.addParameter("methods", "getXXX1,getXXX2,getXXX3")); + + registryDirectory.notify(serviceUrls); + inv.setMethodName("getXXX2"); + invokers = registryDirectory.list(inv); + Assert.assertEquals(true, registryDirectory.isAvailable()); + Assert.assertEquals(2, invokers.size()); + } + + private static boolean isScriptUnsupported = new ScriptEngineManager().getEngineByName("javascript") == null; + + /** + * 1. notify twice, the second time notified router rules should completely replace the former one. 2. notify with + * no router url, do nothing to current routers 3. notify with only one router url, with router=clean, clear all + * current routers + */ + @Test + public void testNotifyRouterUrls() { if (isScriptUnsupported) return; RegistryDirectory registryDirectory = getRegistryDirectory(); - URL routerurl= URL.valueOf(RpcConstants.ROUTE_PROTOCOL + "://127.0.0.1:9096/") - .addParameter(RpcConstants.ROUTER_KEY, "javascript") - .addParameter(RpcConstants.RULE_KEY, "function test1(){}") - .addParameter(RpcConstants.ROUTER_KEY, "script"); //FIX BAD - - List serviceUrls = new ArrayList (); + URL routerurl = URL.valueOf(RpcConstants.ROUTE_PROTOCOL + "://127.0.0.1:9096/"); + URL routerurl2 = URL.valueOf(RpcConstants.ROUTE_PROTOCOL + "://127.0.0.1:9097/"); + + List serviceUrls = new ArrayList(); // without ROUTER_KEY, the first router should not be created. - serviceUrls.add(routerurl); + serviceUrls.add(routerurl.addParameter(RpcConstants.TYPE_KEY, "javascript").addParameter(RpcConstants.ROUTER_KEY, + "notsupported").addParameter(RpcConstants.RULE_KEY, + "function test1(){}")); + serviceUrls.add(routerurl2.addParameter(RpcConstants.TYPE_KEY, "javascript").addParameter(RpcConstants.ROUTER_KEY, + ScriptRouterFactory.NAME).addParameter(RpcConstants.RULE_KEY, + "function test1(){}")); + registryDirectory.notify(serviceUrls); - List routers = registryDirectory.getRouters(); + List routers = registryDirectory.getRouters(); Assert.assertEquals(1, routers.size()); - + Assert.assertEquals(ScriptRouter.class, routers.get(0).getClass()); + + registryDirectory.notify(new ArrayList()); + routers = registryDirectory.getRouters(); + Assert.assertEquals(1, routers.size()); + Assert.assertEquals(ScriptRouter.class, routers.get(0).getClass()); + serviceUrls.clear(); serviceUrls.add(routerurl.addParameter(RpcConstants.ROUTER_KEY, RpcConstants.ROUTER_TYPE_CLEAR)); registryDirectory.notify(serviceUrls); routers = registryDirectory.getRouters(); Assert.assertEquals(0, routers.size()); - } - - - private static interface DemoService {} - private static class MockRegistry implements Registry{ - CountDownLatch latch ; - boolean destroyWithError ; - public MockRegistry(CountDownLatch latch) { + } + + @Test + public void testNotifyRouterUrls_Clean() { + if (isScriptUnsupported) return; + RegistryDirectory registryDirectory = getRegistryDirectory(); + URL routerurl = URL.valueOf(RpcConstants.ROUTE_PROTOCOL + "://127.0.0.1:9096/").addParameter(RpcConstants.ROUTER_KEY, + "javascript").addParameter(RpcConstants.RULE_KEY, + "function test1(){}").addParameter(RpcConstants.ROUTER_KEY, + "script"); // FIX + // BAD + + List serviceUrls = new ArrayList(); + // without ROUTER_KEY, the first router should not be created. + serviceUrls.add(routerurl); + registryDirectory.notify(serviceUrls); + List routers = registryDirectory.getRouters(); + Assert.assertEquals(1, routers.size()); + + serviceUrls.clear(); + serviceUrls.add(routerurl.addParameter(RpcConstants.ROUTER_KEY, RpcConstants.ROUTER_TYPE_CLEAR)); + registryDirectory.notify(serviceUrls); + routers = registryDirectory.getRouters(); + Assert.assertEquals(0, routers.size()); + } + + private static interface DemoService { + } + + private static class MockRegistry implements Registry { + + CountDownLatch latch; + boolean destroyWithError; + + public MockRegistry(CountDownLatch latch){ this.latch = latch; } - public MockRegistry(boolean destroyWithError) { + + public MockRegistry(boolean destroyWithError){ this.destroyWithError = destroyWithError; } + public void register(URL url) { - + } + public void unregister(URL url) { - + } + public void subscribe(URL url, NotifyListener listener) { - + } + public void unsubscribe(URL url, NotifyListener listener) { latch.countDown(); } + public List lookup(URL url) { return null; } + public URL getUrl() { return null; } + public boolean isAvailable() { return true; } + public void destroy() { - if (destroyWithError){ + if (destroyWithError) { throw new RpcException("test exception ignore."); } } - } -} \ No newline at end of file + } +} diff --git a/dubbo-registry/src/main/java/com/alibaba/dubbo/registry/support/RegistryDirectory.java b/dubbo-registry/src/main/java/com/alibaba/dubbo/registry/support/RegistryDirectory.java index 622182e35a..b867331456 100644 --- a/dubbo-registry/src/main/java/com/alibaba/dubbo/registry/support/RegistryDirectory.java +++ b/dubbo-registry/src/main/java/com/alibaba/dubbo/registry/support/RegistryDirectory.java @@ -236,7 +236,8 @@ public class RegistryDirectory extends AbstractDirectory implements Notify try { if ((url.getPath() == null || url.getPath().length() == 0) && "dubbo".equals(url.getProtocol())) { // 兼容1.0 - String path = directoryUrl.getPath(); + //fix by tony.chenl DUBBO-44 + String path = directoryUrl.getParameter(Constants.INTERFACE_KEY); int i = path.indexOf('/'); if (i >= 0) { path = path.substring(i + 1);