This is an automated email from the ASF dual-hosted git repository.
liujun pushed a commit to branch 3.x-dev
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/3.x-dev by this push:
new 91554bc Fix problem caused by merge in InvokerTelnetHandlerTest
91554bc is described below
commit 91554bc84b8a1f022f6430a8767739673ac60449
Author: ken.lj <[email protected]>
AuthorDate: Thu Mar 28 11:02:17 2019 +0800
Fix problem caused by merge in InvokerTelnetHandlerTest
---
.../dubbo/telnet/InvokerTelnetHandlerTest.java | 211 +++++++++++++--------
1 file changed, 136 insertions(+), 75 deletions(-)
diff --git
a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/InvokerTelnetHandlerTest.java
b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/InvokerTelnetHandlerTest.java
index c8029c7..a947829 100644
---
a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/InvokerTelnetHandlerTest.java
+++
b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/InvokerTelnetHandlerTest.java
@@ -16,8 +16,10 @@
*/
package org.apache.dubbo.rpc.protocol.dubbo.telnet;
+import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.remoting.Channel;
+import org.apache.dubbo.remoting.ChannelHandler;
import org.apache.dubbo.remoting.RemotingException;
import org.apache.dubbo.remoting.telnet.TelnetHandler;
import org.apache.dubbo.rpc.model.ApplicationModel;
@@ -30,18 +32,23 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
/**
- * CountTelnetHandlerTest.java
+ * InvokeTelnetHandlerTest.java
*/
public class InvokerTelnetHandlerTest {
private static TelnetHandler invoke = new InvokeTelnetHandler();
+ private static TelnetHandler select = new SelectTelnetHandler();
private Channel mockChannel;
@BeforeEach
@@ -56,136 +63,104 @@ public class InvokerTelnetHandlerTest {
@SuppressWarnings("unchecked")
@Test
- public void testInvokeDefaultSService() throws RemotingException {
+ public void testInvokeDefaultService() throws RemotingException {
mockChannel = mock(Channel.class);
-
given(mockChannel.getAttribute("telnet.service")).willReturn("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService");
+
given(mockChannel.getAttribute("telnet.service")).willReturn(DemoService.class.getName());
given(mockChannel.getLocalAddress()).willReturn(NetUtils.toAddress("127.0.0.1:5555"));
given(mockChannel.getRemoteAddress()).willReturn(NetUtils.toAddress("127.0.0.1:20886"));
ProviderModel providerModel = new
ProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
"Dubbo", "1.0.0", new DemoServiceImpl(), DemoService.class);
-
ApplicationModel.initProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
providerModel);
+ ApplicationModel.initProviderModel(DemoService.class.getName(),
providerModel);
- String result = invoke.telnet(mockChannel, "DemoService.echo(\"ok\")");
- assertTrue(result.contains("Use default service
org.apache.dubbo.rpc.protocol.dubbo.support.DemoService.\r\n\"ok\"\r\n"));
+ String result = invoke.telnet(mockChannel, "echo(\"ok\")");
+ assertTrue(result.contains("result: \"ok\""));
}
@SuppressWarnings("unchecked")
@Test
- public void testInvokeByPassingNullValue() throws RemotingException {
+ public void testInvokeWithSpecifyService() throws RemotingException {
mockChannel = mock(Channel.class);
-
given(mockChannel.getAttribute("telnet.service")).willReturn("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService");
+ given(mockChannel.getAttribute("telnet.service")).willReturn(null);
given(mockChannel.getLocalAddress()).willReturn(NetUtils.toAddress("127.0.0.1:5555"));
given(mockChannel.getRemoteAddress()).willReturn(NetUtils.toAddress("127.0.0.1:20886"));
ProviderModel providerModel = new
ProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
"Dubbo", "1.0.0", new DemoServiceImpl(), DemoService.class);
ApplicationModel.initProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
providerModel);
- // pass null value to parameter of primitive type
- try {
- invoke.telnet(mockChannel, "DemoService.add(null, 2)");
- fail("It should cause a NullPointerException by the above code.");
- } catch (NullPointerException ex) {
- String message = ex.getMessage();
- assertEquals("The type of No.1 parameter is primitive(int), but
the value passed is null.", message);
- }
-
- try {
- invoke.telnet(mockChannel, "DemoService.add(1, null)");
- fail("It should cause a NullPointerException by the above code.");
- } catch (NullPointerException ex) {
- String message = ex.getMessage();
- assertEquals("The type of No.2 parameter is primitive(long), but
the value passed is null.", message);
- }
-
- // pass null value to parameter of object type
- try {
- invoke.telnet(mockChannel, "DemoService.sayHello(null)");
- } catch (NullPointerException ex) {
- fail("It shouldn't cause a NullPointerException by the above
code.");
- }
+ String result = invoke.telnet(mockChannel, "DemoService.echo(\"ok\")");
+ assertTrue(result.contains("result: \"ok\""));
}
+ @SuppressWarnings("unchecked")
@Test
- public void testInvokeByPassingEnumValue() throws RemotingException {
+ public void testInvokeByPassingNullValue() {
mockChannel = mock(Channel.class);
- given(mockChannel.getAttribute("telnet.service")).willReturn(null);
+
given(mockChannel.getAttribute("telnet.service")).willReturn(DemoService.class.getName());
given(mockChannel.getLocalAddress()).willReturn(NetUtils.toAddress("127.0.0.1:5555"));
given(mockChannel.getRemoteAddress()).willReturn(NetUtils.toAddress("127.0.0.1:20886"));
ProviderModel providerModel = new
ProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
"Dubbo", "1.0.0", new DemoServiceImpl(), DemoService.class);
ApplicationModel.initProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
providerModel);
- String result = invoke.telnet(mockChannel, "getType(\"High\")");
- assertTrue(result.contains("High"));
+ // pass null value to parameter of primitive type
+ try {
+ invoke.telnet(mockChannel, "sayHello(null)");
+ } catch (Exception ex) {
+ assertTrue(ex instanceof NullPointerException);
+ }
}
-
- @SuppressWarnings("unchecked")
@Test
- public void testComplexParamWithoutSpecifyParamType() throws
RemotingException {
+ public void testInvokeByPassingEnumValue() throws RemotingException {
mockChannel = mock(Channel.class);
-
given(mockChannel.getAttribute("telnet.service")).willReturn("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService");
+ given(mockChannel.getAttribute("telnet.service")).willReturn(null);
given(mockChannel.getLocalAddress()).willReturn(NetUtils.toAddress("127.0.0.1:5555"));
given(mockChannel.getRemoteAddress()).willReturn(NetUtils.toAddress("127.0.0.1:20886"));
ProviderModel providerModel = new
ProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
"Dubbo", "1.0.0", new DemoServiceImpl(), DemoService.class);
ApplicationModel.initProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
providerModel);
- // pass json value to parameter of Person type
-
- String result = invoke.telnet(mockChannel,
"DemoService.getPerson({\"name\":\"zhangsan\",\"age\":12})");
- assertTrue(result.contains("No such method getPerson in service
DemoService"));
+ String result = invoke.telnet(mockChannel, "getType(\"High\")");
+ assertTrue(result.contains("result: \"High\""));
}
+
@SuppressWarnings("unchecked")
@Test
- public void testComplexParamSpecifyParamType() throws RemotingException {
+ public void testOverriddenMethodWithSpecifyParamType() throws
RemotingException {
mockChannel = mock(Channel.class);
-
given(mockChannel.getAttribute("telnet.service")).willReturn("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService");
+
given(mockChannel.getAttribute("telnet.service")).willReturn(DemoService.class.getName());
given(mockChannel.getLocalAddress()).willReturn(NetUtils.toAddress("127.0.0.1:5555"));
given(mockChannel.getRemoteAddress()).willReturn(NetUtils.toAddress("127.0.0.1:20886"));
ProviderModel providerModel = new
ProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
"Dubbo", "1.0.0", new DemoServiceImpl(), DemoService.class);
ApplicationModel.initProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
providerModel);
- // pass json value to parameter of Person type and specify it's type
- // one parameter with type of Person
- String result = invoke.telnet(mockChannel,
"DemoService.getPerson({\"name\":\"zhangsan\",\"age\":12}) -p
org.apache.dubbo.rpc.protocol.dubbo.support.Person");
- assertTrue(result.contains("Use default service
org.apache.dubbo.rpc.protocol.dubbo.support.DemoService.\r\n1\r\n"));
-
- // two parameter with type of Person
- result = invoke.telnet(mockChannel,
"DemoService.getPerson({\"name\":\"zhangsan\",\"age\":12},{\"name\":\"lisi\",\"age\":12})
" +
- "-p org.apache.dubbo.rpc.protocol.dubbo.support.Person " +
- "org.apache.dubbo.rpc.protocol.dubbo.support.Person");
- assertTrue(result.contains("Use default service
org.apache.dubbo.rpc.protocol.dubbo.support.DemoService.\r\n2\r\n"));
+ String result = invoke.telnet(mockChannel,
"getPerson({\"name\":\"zhangsan\",\"age\":12,\"class\":\"org.apache.dubbo.rpc.protocol.dubbo.support.Person\"})");
+ assertTrue(result.contains("result: 12"));
}
- @SuppressWarnings("unchecked")
@Test
- public void testComplexParamSpecifyWrongParamType() throws
RemotingException {
- mockChannel = mock(Channel.class);
-
given(mockChannel.getAttribute("telnet.service")).willReturn("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService");
+ public void testInvokeOverriddenMethodBySelect() throws RemotingException {
+ //create a real instance to keep the attribute values;
+ mockChannel = spy(getChannelInstance());
+
given(mockChannel.getAttribute("telnet.service")).willReturn(DemoService.class.getName());
given(mockChannel.getLocalAddress()).willReturn(NetUtils.toAddress("127.0.0.1:5555"));
given(mockChannel.getRemoteAddress()).willReturn(NetUtils.toAddress("127.0.0.1:20886"));
ProviderModel providerModel = new
ProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
"Dubbo", "1.0.0", new DemoServiceImpl(), DemoService.class);
ApplicationModel.initProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
providerModel);
- // pass json value to parameter of Person type
- // wrong name of parameter class
- String result = invoke.telnet(mockChannel,
"DemoService.getPerson({\"name\":\"zhangsan\",\"age\":12}) -p wrongType");
- assertEquals("Unknown parameter class for name wrongType", result);
-
- // wrong number of parameter class
- result = invoke.telnet(mockChannel,
"DemoService.getPerson({\"name\":\"zhangsan\",\"age\":12},{\"name\":\"lisi\",\"age\":12})
" +
- "-p org.apache.dubbo.rpc.protocol.dubbo.support.Person");
- assertEquals("Parameter's number does not match the number of
parameter class", result);
+ String param = "{\"name\":\"Dubbo\",\"age\":8}";
+ String result = invoke.telnet(mockChannel, "getPerson(" + param + ")");
+ assertTrue(result.contains("Please use the select command to select
the method you want to invoke. eg: select 1"));
+ result = select.telnet(mockChannel, "1");
+ //result dependent on method order.
+ assertTrue(result.contains("result: 8") || result.contains("result:
\"Dubbo\""));
}
-
- @SuppressWarnings("unchecked")
@Test
- public void testInvokeAutoFindMethod() throws RemotingException {
+ public void testInvokeMultiJsonParamMethod() throws RemotingException {
mockChannel = mock(Channel.class);
given(mockChannel.getAttribute("telnet.service")).willReturn(null);
given(mockChannel.getLocalAddress()).willReturn(NetUtils.toAddress("127.0.0.1:5555"));
@@ -194,8 +169,9 @@ public class InvokerTelnetHandlerTest {
ProviderModel providerModel = new
ProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
"Dubbo", "1.0.0", new DemoServiceImpl(), DemoService.class);
ApplicationModel.initProviderModel("org.apache.dubbo.rpc.protocol.dubbo.support.DemoService",
providerModel);
- String result = invoke.telnet(mockChannel, "echo(\"ok\")");
- assertTrue(result.contains("ok"));
+ String param =
"{\"name\":\"Dubbo\",\"age\":8},{\"name\":\"Apache\",\"age\":20}";
+ String result = invoke.telnet(mockChannel, "getPerson(" + param + ")");
+ assertTrue(result.contains("result: 28"));
}
@Test
@@ -212,8 +188,93 @@ public class InvokerTelnetHandlerTest {
public void testInvalidMessage() throws RemotingException {
mockChannel = mock(Channel.class);
given(mockChannel.getAttribute("telnet.service")).willReturn(null);
-
String result = invoke.telnet(mockChannel, "(");
assertEquals("Invalid parameters, format: service.method(args)",
result);
}
+
+ private Channel getChannelInstance() {
+ return new Channel() {
+ private final Map<String, Object> attributes = new
ConcurrentHashMap<String, Object>();
+
+ @Override
+ public InetSocketAddress getRemoteAddress() {
+ return null;
+ }
+
+ @Override
+ public boolean isConnected() {
+ return false;
+ }
+
+ @Override
+ public boolean hasAttribute(String key) {
+ return attributes.containsKey(key);
+ }
+
+ @Override
+ public Object getAttribute(String key) {
+ return attributes.get(key);
+ }
+
+ @Override
+ public void setAttribute(String key, Object value) {
+ if (value == null) { // The null value unallowed in the
ConcurrentHashMap.
+ attributes.remove(key);
+ } else {
+ attributes.put(key, value);
+ }
+ }
+
+ @Override
+ public void removeAttribute(String key) {
+ attributes.remove(key);
+ }
+
+
+ @Override
+ public URL getUrl() {
+ return null;
+ }
+
+ @Override
+ public ChannelHandler getChannelHandler() {
+ return null;
+ }
+
+ @Override
+ public InetSocketAddress getLocalAddress() {
+ return null;
+ }
+
+ @Override
+ public void send(Object message) throws RemotingException {
+
+ }
+
+ @Override
+ public void send(Object message, boolean sent) throws
RemotingException {
+
+ }
+
+ @Override
+ public void close() {
+
+ }
+
+ @Override
+ public void close(int timeout) {
+
+ }
+
+ @Override
+ public void startClose() {
+
+ }
+
+ @Override
+ public boolean isClosed() {
+ return false;
+ }
+ };
+ }
}