From ddee9d80b6b248c7bc37fccfbf5cc682dba4c5cf Mon Sep 17 00:00:00 2001
From: fangyincheng <fangyincheng@sina.com>
Date: Sat, 25 May 2019 19:37:52 +0800
Subject: [PATCH] Fix:support []interface{}

---
 examples/dubbo/go-client/app/client.go        |  7 ++++
 examples/dubbo/go-client/app/user.go          |  1 +
 .../dubbo/go-client/profiles/dev/client.yml   |  2 +-
 .../go-client/profiles/release/client.yml     |  2 +-
 .../dubbo/go-client/profiles/test/client.yml  |  2 +-
 examples/dubbo/go-server/app/user.go          | 19 ++++++++++
 .../main/java/com/ikurento/user/Consumer.java |  2 +-
 examples/jsonrpc/go-client/app/client.go      |  9 ++++-
 examples/jsonrpc/go-client/app/user.go        |  1 +
 examples/jsonrpc/go-server/app/user.go        | 19 ++++++++++
 .../main/java/com/ikurento/user/Consumer.java |  2 +-
 go.mod                                        |  2 +-
 go.sum                                        |  4 +-
 protocol/dubbo/client_test.go                 | 38 ++++++++++++++++++-
 protocol/jsonrpc/http_test.go                 | 37 +++++++++++++++++-
 protocol/jsonrpc/jsonrpc_invoker_test.go      |  2 +-
 16 files changed, 135 insertions(+), 14 deletions(-)

diff --git a/examples/dubbo/go-client/app/client.go b/examples/dubbo/go-client/app/client.go
index 5231457f7..c95654267 100644
--- a/examples/dubbo/go-client/app/client.go
+++ b/examples/dubbo/go-client/app/client.go
@@ -83,6 +83,13 @@ func main() {
 	}
 	println("response result: %v", ret)
 
+	println("\n\n\nstart to test dubbo - GetUsers")
+	ret1, err := conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
+	if err != nil {
+		panic(err)
+	}
+	println("response result: %v", ret1)
+
 	println("\n\n\nstart to test dubbo - getUser")
 	user = &User{}
 	err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser2(context.TODO(), []interface{}{1}, user)
diff --git a/examples/dubbo/go-client/app/user.go b/examples/dubbo/go-client/app/user.go
index 9ac1974d3..7e9d3daed 100644
--- a/examples/dubbo/go-client/app/user.go
+++ b/examples/dubbo/go-client/app/user.go
@@ -93,6 +93,7 @@ func (User) JavaClassName() string {
 }
 
 type UserProvider struct {
+	GetUsers func(req []interface{}) ([]interface{}, error)
 	GetUser  func(ctx context.Context, req []interface{}, rsp *User) error
 	GetUser0 func(id string, name string) (User, error)
 	GetUser1 func(ctx context.Context, req []interface{}, rsp *User) error
diff --git a/examples/dubbo/go-client/profiles/dev/client.yml b/examples/dubbo/go-client/profiles/dev/client.yml
index 5e58f4cc6..93ce354c9 100644
--- a/examples/dubbo/go-client/profiles/dev/client.yml
+++ b/examples/dubbo/go-client/profiles/dev/client.yml
@@ -62,5 +62,5 @@ protocol_conf:
       tcp_read_timeout: "1s"
       tcp_write_timeout: "5s"
       wait_timeout: "1s"
-      max_msg_len: 1024
+      max_msg_len: 10240
       session_name: "client"
diff --git a/examples/dubbo/go-client/profiles/release/client.yml b/examples/dubbo/go-client/profiles/release/client.yml
index 269e9cbac..cb36b6946 100644
--- a/examples/dubbo/go-client/profiles/release/client.yml
+++ b/examples/dubbo/go-client/profiles/release/client.yml
@@ -62,5 +62,5 @@ protocol_conf:
       tcp_read_timeout: "1s"
       tcp_write_timeout: "5s"
       wait_timeout: "1s"
-      max_msg_len: 1024
+      max_msg_len: 10240
       session_name: "client"
diff --git a/examples/dubbo/go-client/profiles/test/client.yml b/examples/dubbo/go-client/profiles/test/client.yml
index 269e9cbac..cb36b6946 100644
--- a/examples/dubbo/go-client/profiles/test/client.yml
+++ b/examples/dubbo/go-client/profiles/test/client.yml
@@ -62,5 +62,5 @@ protocol_conf:
       tcp_read_timeout: "1s"
       tcp_write_timeout: "5s"
       wait_timeout: "1s"
-      max_msg_len: 1024
+      max_msg_len: 10240
       session_name: "client"
diff --git a/examples/dubbo/go-server/app/user.go b/examples/dubbo/go-server/app/user.go
index 12119b0b6..427125bd1 100644
--- a/examples/dubbo/go-server/app/user.go
+++ b/examples/dubbo/go-server/app/user.go
@@ -156,6 +156,25 @@ func (u *UserProvider) GetUser0(id string, name string) (User, error) {
 	return *user, err
 }
 
+func (u *UserProvider) GetUsers(req []interface{}) ([]interface{}, error) {
+	var err error
+
+	println("req:%s", req)
+	t := req[0].([]interface{})
+	user, err := u.getUser(t[0].(string))
+	if err != nil {
+		return nil, err
+	}
+	println("user:%v", user)
+	user1, err := u.getUser(t[1].(string))
+	if err != nil {
+		return nil, err
+	}
+	println("user1:%v", user1)
+
+	return []interface{}{user, user1}, err
+}
+
 func (u *UserProvider) Service() string {
 	return "com.ikurento.user.UserProvider"
 }
diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
index 69229943f..b410813c7 100644
--- a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
+++ b/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
@@ -79,7 +79,7 @@ public class Consumer {
     //启动consumer的入口函数(在配置文件中指定)
     public void start() throws Exception {
         testGetUser();
-        // testGetUsers();
+        testGetUsers();
 //        Thread.sleep(120000);
 Thread.sleep(2000);
     }
diff --git a/examples/jsonrpc/go-client/app/client.go b/examples/jsonrpc/go-client/app/client.go
index b693d05ee..b71f0efa2 100644
--- a/examples/jsonrpc/go-client/app/client.go
+++ b/examples/jsonrpc/go-client/app/client.go
@@ -72,13 +72,20 @@ func main() {
 	}
 	println("response result: %v", user)
 
-	println("\n\n\nstart to test dubbo - GetUser0")
+	println("\n\n\nstart to test jsonrpc - GetUser0")
 	ret, err := conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser0("A003", "Moorse")
 	if err != nil {
 		panic(err)
 	}
 	println("response result: %v", ret)
 
+	println("\n\n\nstart to test jsonrpc - GetUsers")
+	ret1, err := conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
+	if err != nil {
+		panic(err)
+	}
+	println("response result: %v", ret1)
+
 	println("\n\n\nstart to test jsonrpc - getUser")
 	user = &JsonRPCUser{}
 	err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser2(context.TODO(), []interface{}{1}, user)
diff --git a/examples/jsonrpc/go-client/app/user.go b/examples/jsonrpc/go-client/app/user.go
index 17a24dbec..0d1598761 100644
--- a/examples/jsonrpc/go-client/app/user.go
+++ b/examples/jsonrpc/go-client/app/user.go
@@ -44,6 +44,7 @@ func (u JsonRPCUser) String() string {
 }
 
 type UserProvider struct {
+	GetUsers func(req []interface{}) ([]JsonRPCUser, error)
 	GetUser  func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
 	GetUser0 func(id string, name string) (JsonRPCUser, error)
 	GetUser1 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
diff --git a/examples/jsonrpc/go-server/app/user.go b/examples/jsonrpc/go-server/app/user.go
index 5adcde0cc..9170de431 100644
--- a/examples/jsonrpc/go-server/app/user.go
+++ b/examples/jsonrpc/go-server/app/user.go
@@ -124,6 +124,25 @@ func (u *UserProvider) GetUser0(id string, name string) (User, error) {
 	return *user, err
 }
 
+func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) {
+	var err error
+
+	println("req:%s", req)
+	t := req[0].([]interface{})
+	user, err := u.getUser(t[0].(string))
+	if err != nil {
+		return nil, err
+	}
+	println("user:%v", user)
+	user1, err := u.getUser(t[1].(string))
+	if err != nil {
+		return nil, err
+	}
+	println("user1:%v", user1)
+
+	return []User{*user, *user1}, err
+}
+
 func (u *UserProvider) Service() string {
 	return "com.ikurento.user.UserProvider"
 }
diff --git a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java
index 832f78e85..b2b8e95f9 100644
--- a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java
+++ b/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java
@@ -83,7 +83,7 @@ public class Consumer {
     //启动consumer的入口函数(在配置文件中指定)
     public void start() throws Exception {
         testGetUser();
-        // testGetUsers();
+        testGetUsers();
 //        Thread.sleep(120000);
 Thread.sleep(2000);
     }
diff --git a/go.mod b/go.mod
index e41f99068..b03fcd5e5 100644
--- a/go.mod
+++ b/go.mod
@@ -2,7 +2,7 @@ module github.com/dubbo/go-for-apache-dubbo
 
 require (
 	github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53
-	github.com/dubbogo/hessian2 v0.0.0-20190521184416-2dbe10487e1d
+	github.com/dubbogo/hessian2 v0.0.0-20190525165532-d994415a90c3
 	github.com/pkg/errors v0.8.1
 	github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec
 	github.com/stretchr/testify v1.3.0
diff --git a/go.sum b/go.sum
index d53a88c49..e7f6c3037 100644
--- a/go.sum
+++ b/go.sum
@@ -6,8 +6,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53 h1:bniSNoC4xnAbrx4estwc9F0qkWnh6ZDsAS0y9d7mPos=
 github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53/go.mod h1:cRMSuoCmwc5lULFFnYZTxyCfZhObmRTNbS7XRnPNHSo=
-github.com/dubbogo/hessian2 v0.0.0-20190521184416-2dbe10487e1d h1:t4xwsC+7Vqh/a9IvNQehzI6coThd7+DLi5MKdleFA64=
-github.com/dubbogo/hessian2 v0.0.0-20190521184416-2dbe10487e1d/go.mod h1:XFGDn4oSZX26zkcfhkM/fCJrOqwQJxk/xgWW1KMJBKM=
+github.com/dubbogo/hessian2 v0.0.0-20190525165532-d994415a90c3 h1:qK0t4cWXFAng5VoPRdvnUyRyB9TdE+Q7G3ROOEY86tE=
+github.com/dubbogo/hessian2 v0.0.0-20190525165532-d994415a90c3/go.mod h1:XFGDn4oSZX26zkcfhkM/fCJrOqwQJxk/xgWW1KMJBKM=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
diff --git a/protocol/dubbo/client_test.go b/protocol/dubbo/client_test.go
index 2938f569d..216d2e10d 100644
--- a/protocol/dubbo/client_test.go
+++ b/protocol/dubbo/client_test.go
@@ -16,13 +16,13 @@ package dubbo
 
 import (
 	"context"
+	"github.com/dubbogo/hessian2"
 	"sync"
 	"testing"
 	"time"
 )
 
 import (
-	"github.com/dubbogo/hessian2"
 	perrors "github.com/pkg/errors"
 	"github.com/stretchr/testify/assert"
 )
@@ -79,6 +79,26 @@ func TestClient_Call(t *testing.T) {
 	assert.NoError(t, err)
 	assert.Equal(t, User{Id: "1", Name: "username"}, *user)
 
+	user = &User{}
+	err = c.Call("127.0.0.1:20000", url, "GetUser1", []interface{}{"1", "username"}, user)
+	assert.EqualError(t, err, "java exception:error")
+
+	user2 := []interface{}{}
+	err = c.Call("127.0.0.1:20000", url, "GetUser2", []interface{}{"1", "username"}, &user2)
+	assert.NoError(t, err)
+	assert.Equal(t, &User{Id: "1", Name: "username"}, user2[0])
+
+	user2 = []interface{}{}
+	err = c.Call("127.0.0.1:20000", url, "GetUser3", []interface{}{[]interface{}{"1", "username"}}, &user2)
+	assert.NoError(t, err)
+	assert.Equal(t, &User{Id: "1", Name: "username"}, user2[0])
+
+	user3 := map[interface{}]interface{}{}
+	err = c.Call("127.0.0.1:20000", url, "GetUser4", []interface{}{map[interface{}]interface{}{"id": "1", "name": "username"}}, &user3)
+	assert.NoError(t, err)
+	assert.NotNil(t, user3)
+	assert.Equal(t, &User{Id: "1", Name: "username"}, user3["key"])
+
 	// destroy
 	proto.Destroy()
 }
@@ -114,7 +134,7 @@ func InitTest(t *testing.T) (protocol.Protocol, common.URL) {
 
 	methods, err := common.ServiceMap.Register("dubbo", &UserProvider{})
 	assert.NoError(t, err)
-	assert.Equal(t, "GetUser,GetUser0,GetUser1", methods)
+	assert.Equal(t, "GetUser,GetUser0,GetUser1,GetUser2,GetUser3,GetUser4", methods)
 
 	// config
 	SetClientConf(ClientConfig{
@@ -191,6 +211,20 @@ func (u *UserProvider) GetUser1(ctx context.Context, req []interface{}, rsp *Use
 	return perrors.New("error")
 }
 
+func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *[]interface{}) error {
+	*rsp = append(*rsp, User{Id: req[0].(string), Name: req[1].(string)})
+	return nil
+}
+
+func (u *UserProvider) GetUser3(ctx context.Context, req []interface{}) ([]interface{}, error) {
+
+	return []interface{}{User{Id: req[0].([]interface{})[0].(string), Name: req[0].([]interface{})[1].(string)}}, nil
+}
+
+func (u *UserProvider) GetUser4(ctx context.Context, req []interface{}) (map[interface{}]interface{}, error) {
+	return map[interface{}]interface{}{"key": User{Id: req[0].(map[interface{}]interface{})["id"].(string), Name: req[0].(map[interface{}]interface{})["name"].(string)}}, nil
+}
+
 func (u *UserProvider) Service() string {
 	return "com.ikurento.user.UserProvider"
 }
diff --git a/protocol/jsonrpc/http_test.go b/protocol/jsonrpc/http_test.go
index e70d5b83f..55f86f454 100644
--- a/protocol/jsonrpc/http_test.go
+++ b/protocol/jsonrpc/http_test.go
@@ -47,7 +47,7 @@ func TestHTTPClient_Call(t *testing.T) {
 
 	methods, err := common.ServiceMap.Register("jsonrpc", &UserProvider{})
 	assert.NoError(t, err)
-	assert.Equal(t, "GetUser,GetUser0,GetUser1", methods)
+	assert.Equal(t, "GetUser,GetUser0,GetUser1,GetUser2,GetUser3", methods)
 
 	// Export
 	proto := GetProtocol()
@@ -75,7 +75,7 @@ func TestHTTPClient_Call(t *testing.T) {
 	assert.Equal(t, "1", reply.Id)
 	assert.Equal(t, "username", reply.Name)
 
-	// call GetUser
+	// call GetUser0
 	ctx = context.WithValue(context.Background(), constant.DUBBOGO_CTX_KEY, map[string]string{
 		"X-Proxy-Id": "dubbogo",
 		"X-Services": url.Path,
@@ -100,6 +100,30 @@ func TestHTTPClient_Call(t *testing.T) {
 	assert.True(t, strings.Contains(err.Error(), "500 Internal Server Error"))
 	assert.True(t, strings.Contains(err.Error(), "\\\"result\\\":{},\\\"error\\\":{\\\"code\\\":-32000,\\\"message\\\":\\\"error\\\"}"))
 
+	// call GetUser2
+	ctx = context.WithValue(context.Background(), constant.DUBBOGO_CTX_KEY, map[string]string{
+		"X-Proxy-Id": "dubbogo",
+		"X-Services": url.Path,
+		"X-Method":   "GetUser",
+	})
+	req = client.NewRequest(url, "GetUser2", []interface{}{"1", "username"})
+	reply1 := []User{}
+	err = client.Call(ctx, url, req, &reply1)
+	assert.NoError(t, err)
+	assert.Equal(t, User{Id: "1", Name: "username"}, reply1[0])
+
+	// call GetUser3
+	ctx = context.WithValue(context.Background(), constant.DUBBOGO_CTX_KEY, map[string]string{
+		"X-Proxy-Id": "dubbogo",
+		"X-Services": url.Path,
+		"X-Method":   "GetUser",
+	})
+	req = client.NewRequest(url, "GetUser3", []interface{}{"1", "username"})
+	reply1 = []User{}
+	err = client.Call(ctx, url, req, &reply1)
+	assert.NoError(t, err)
+	assert.Equal(t, User{Id: "1", Name: "username"}, reply1[0])
+
 	// destroy
 	proto.Destroy()
 
@@ -119,6 +143,15 @@ func (u *UserProvider) GetUser1(ctx context.Context, req []interface{}, rsp *Use
 	return perrors.New("error")
 }
 
+func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *[]User) error {
+	*rsp = append(*rsp, User{Id: req[0].(string), Name: req[1].(string)})
+	return nil
+}
+
+func (u *UserProvider) GetUser3(ctx context.Context, req []interface{}) ([]User, error) {
+	return []User{{Id: req[0].(string), Name: req[1].(string)}}, nil
+}
+
 func (u *UserProvider) Service() string {
 	return "com.ikurento.user.UserProvider"
 }
diff --git a/protocol/jsonrpc/jsonrpc_invoker_test.go b/protocol/jsonrpc/jsonrpc_invoker_test.go
index 3bc4a29af..2d248469e 100644
--- a/protocol/jsonrpc/jsonrpc_invoker_test.go
+++ b/protocol/jsonrpc/jsonrpc_invoker_test.go
@@ -34,7 +34,7 @@ func TestJsonrpcInvoker_Invoke(t *testing.T) {
 
 	methods, err := common.ServiceMap.Register("jsonrpc", &UserProvider{})
 	assert.NoError(t, err)
-	assert.Equal(t, "GetUser,GetUser0,GetUser1", methods)
+	assert.Equal(t, "GetUser,GetUser0,GetUser1,GetUser2,GetUser3", methods)
 
 	// Export
 	proto := GetProtocol()
-- 
GitLab