Skip to content
Snippets Groups Projects
http_test.go 4.86 KiB
Newer Older
fangyincheng's avatar
fangyincheng committed
// Copyright 2016-2019 Yincheng Fang
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package jsonrpc

import (
	"context"
	"strings"
	"testing"
	"time"
)

import (
fangyincheng's avatar
fangyincheng committed
	perrors "github.com/pkg/errors"
	"github.com/stretchr/testify/assert"
)

import (
	"github.com/apache/dubbo-go/common"
	"github.com/apache/dubbo-go/common/constant"
	"github.com/apache/dubbo-go/protocol"
)

type (
	User struct {
		Id   string `json:"id"`
		Name string `json:"name"`
	}

	UserProvider struct {
		user map[string]User
	}
)

func TestHTTPClient_Call(t *testing.T) {

	methods, err := common.ServiceMap.Register("jsonrpc", &UserProvider{})
	assert.NoError(t, err)
fangyincheng's avatar
fangyincheng committed
	assert.Equal(t, "GetUser,GetUser0,GetUser1,GetUser2,GetUser3", methods)

	// Export
	proto := GetProtocol()
fangyincheng's avatar
fangyincheng committed
	url, err := common.NewURL(context.Background(), "jsonrpc://127.0.0.1:20001/com.ikurento.user.UserProvider?anyhost=true&"+
		"application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&"+
		"environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&"+
		"module=dubbogo+user-info+server&org=ikurento.com&owner=ZX&pid=1447&revision=0.0.1&"+
		"side=provider&timeout=3000&timestamp=1556509797245")
	assert.NoError(t, err)
	proto.Export(protocol.NewBaseInvoker(url))
	time.Sleep(time.Second * 2)
	client := NewHTTPClient(&HTTPOptions{})

	// call GetUser
	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, "GetUser", []interface{}{"1", "username"})
	reply := &User{}
	err = client.Call(ctx, url, req, reply)
	assert.NoError(t, err)
	assert.Equal(t, "1", reply.Id)
	assert.Equal(t, "username", reply.Name)

fangyincheng's avatar
fangyincheng committed
	// call GetUser0
	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, "GetUser0", []interface{}{"1", "username"})
	reply = &User{}
	err = client.Call(ctx, url, req, reply)
	assert.NoError(t, err)
	assert.Equal(t, "1", reply.Id)
	assert.Equal(t, "username", reply.Name)

	// call GetUser1
	ctx = context.WithValue(context.Background(), constant.DUBBOGO_CTX_KEY, map[string]string{
		"X-Proxy-Id": "dubbogo",
		"X-Services": url.Path,
		"X-Method":   "GetUser1",
	})
	req = client.NewRequest(url, "GetUser1", []interface{}{""})
	reply = &User{}
	err = client.Call(ctx, url, req, reply)
	assert.True(t, strings.Contains(err.Error(), "500 Internal Server Error"))
	assert.True(t, strings.Contains(err.Error(), "\\\"result\\\":{},\\\"error\\\":{\\\"code\\\":-32000,\\\"message\\\":\\\"error\\\"}"))

fangyincheng's avatar
fangyincheng committed
	// 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()

}

func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
	rsp.Id = req[0].(string)
	rsp.Name = req[1].(string)
	return nil
}

func (u *UserProvider) GetUser0(id string, name string) (User, error) {
	return User{Id: id, Name: name}, nil
func (u *UserProvider) GetUser1(ctx context.Context, req []interface{}, rsp *User) error {
fangyincheng's avatar
fangyincheng committed
	return perrors.New("error")
fangyincheng's avatar
fangyincheng committed
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"
}

func (u *UserProvider) Version() string {
	return ""
}