This is an automated email from the ASF dual-hosted git repository.

alexstocks pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 6710138  test(loadbalance): add unittests for p2c (#1686)
6710138 is described below

commit 671013837b353698c5ef42289265bc270634a265
Author: Xuewei Niu <[email protected]>
AuthorDate: Sat Dec 25 10:06:23 2021 +0800

    test(loadbalance): add unittests for p2c (#1686)
    
    * test(loadbalance): add unittests for p2c
    
    * fix(loadbalance): fix fixed rand seed problem
    
    * style: format  imports
    
    * style: add apache license
---
 cluster/cluster/adaptivesvc/cluster_invoker.go     |   6 +-
 cluster/cluster/available/cluster_invoker.go       |   6 +-
 cluster/cluster/available/cluster_invoker_test.go  |   2 +-
 cluster/loadbalance/p2c/loadbalance.go             |  26 +--
 cluster/loadbalance/p2c/loadbalance_test.go        | 178 +++++++++++++++++++++
 cluster/metrics/local_metrics.go                   |   2 +
 cluster/metrics/mock_metrics.go                    | 144 +++++++++++++++++
 filter/seata/filter_test.go                        |   2 +-
 filter/sentinel/filter.go                          |   2 +-
 .../local/metadata_service_proxy_factory_test.go   |   2 +-
 protocol/invocation/rpcinvocation.go               |   2 +
 protocol/result.go                                 |  12 +-
 12 files changed, 352 insertions(+), 32 deletions(-)

diff --git a/cluster/cluster/adaptivesvc/cluster_invoker.go 
b/cluster/cluster/adaptivesvc/cluster_invoker.go
index 1fb65e2..30f0772 100644
--- a/cluster/cluster/adaptivesvc/cluster_invoker.go
+++ b/cluster/cluster/adaptivesvc/cluster_invoker.go
@@ -49,13 +49,13 @@ func newAdaptiveServiceClusterInvoker(directory 
directory.Directory) protocol.In
 func (ivk *adaptiveServiceClusterInvoker) Invoke(ctx context.Context, 
invocation protocol.Invocation) protocol.Result {
        invokers := ivk.Directory.List(invocation)
        if err := ivk.CheckInvokers(invokers, invocation); err != nil {
-               return protocol.NewRPCResult(nil, err)
+               return &protocol.RPCResult{Err: err}
        }
 
        // get loadBalance
        lbKey := invokers[0].GetURL().GetParam(constant.LoadbalanceKey, 
constant.LoadBalanceKeyP2C)
        if lbKey != constant.LoadBalanceKeyP2C {
-               return protocol.NewRPCResult(nil, perrors.Errorf("adaptive 
service not supports %s load balance", lbKey))
+               return &protocol.RPCResult{Err: perrors.Errorf("adaptive 
service not supports %s load balance", lbKey)}
        }
        lb := extension.GetLoadbalance(lbKey)
 
@@ -78,7 +78,7 @@ func (ivk *adaptiveServiceClusterInvoker) Invoke(ctx 
context.Context, invocation
                invocation.MethodName(), metrics.HillClimbing, 
uint64(remaining))
        if err != nil {
                logger.Warnf("adaptive service metrics update is failed, err: 
%v", err)
-               return protocol.NewRPCResult(nil, err)
+               return &protocol.RPCResult{Err: err}
        }
 
        return result
diff --git a/cluster/cluster/available/cluster_invoker.go 
b/cluster/cluster/available/cluster_invoker.go
index 7bf8375..4facd66 100644
--- a/cluster/cluster/available/cluster_invoker.go
+++ b/cluster/cluster/available/cluster_invoker.go
@@ -47,12 +47,12 @@ func (invoker *availableClusterInvoker) Invoke(ctx 
context.Context, invocation p
        invokers := invoker.Directory.List(invocation)
        err := invoker.CheckInvokers(invokers, invocation)
        if err != nil {
-               return protocol.NewRPCResult(nil, err)
+               return &protocol.RPCResult{Err: err}
        }
 
        err = invoker.CheckWhetherDestroyed()
        if err != nil {
-               return protocol.NewRPCResult(nil, err)
+               return &protocol.RPCResult{Err: err}
        }
 
        for _, ivk := range invokers {
@@ -60,5 +60,5 @@ func (invoker *availableClusterInvoker) Invoke(ctx 
context.Context, invocation p
                        return ivk.Invoke(ctx, invocation)
                }
        }
-       return protocol.NewRPCResult(nil, errors.New(fmt.Sprintf("no provider 
available in %v", invokers)))
+       return &protocol.RPCResult{Err: errors.New(fmt.Sprintf("no provider 
available in %v", invokers))}
 }
diff --git a/cluster/cluster/available/cluster_invoker_test.go 
b/cluster/cluster/available/cluster_invoker_test.go
index 730474b..70919e6 100644
--- a/cluster/cluster/available/cluster_invoker_test.go
+++ b/cluster/cluster/available/cluster_invoker_test.go
@@ -65,7 +65,7 @@ func TestAvailableClusterInvokerSuccess(t *testing.T) {
        invoker := mock.NewMockInvoker(ctrl)
        clusterInvoker := registerAvailable(invoker)
 
-       mockResult := protocol.NewRPCResult(clusterpkg.Rest{Tried: 0, Success: 
true}, nil)
+       mockResult := &protocol.RPCResult{Rest: clusterpkg.Rest{Tried: 0, 
Success: true}}
        invoker.EXPECT().IsAvailable().Return(true)
        invoker.EXPECT().Invoke(gomock.Any()).Return(mockResult)
 
diff --git a/cluster/loadbalance/p2c/loadbalance.go 
b/cluster/loadbalance/p2c/loadbalance.go
index 2adeb61..f673cbb 100644
--- a/cluster/loadbalance/p2c/loadbalance.go
+++ b/cluster/loadbalance/p2c/loadbalance.go
@@ -34,6 +34,12 @@ import (
        "dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+var (
+       randSeed = func() int64 {
+               return time.Now().Unix()
+       }
+)
+
 func init() {
        extension.SetLoadbalance(constant.LoadBalanceKeyP2C, newP2CLoadBalance)
 }
@@ -69,25 +75,23 @@ func (l *p2cLoadBalance) Select(invokers 
[]protocol.Invoker, invocation protocol
        if len(invokers) == 2 {
                i, j = 0, 1
        } else {
-               rand.Seed(time.Now().Unix())
+               rand.Seed(randSeed())
                i = rand.Intn(len(invokers))
                j = i
                for i == j {
                        j = rand.Intn(len(invokers))
                }
        }
-       logger.Debugf("[P2C select] Two invokers were selected, i: %d, j: %d, 
invoker[i]: %s, invoker[j]: %s.",
-               i, j, invokers[i], invokers[j])
+       logger.Debugf("[P2C select] Two invokers were selected, invoker[%d]: 
%s, invoker[%d]: %s.",
+               i, invokers[i], j, invokers[j])
 
-       // TODO(justxuewei): please consider how to get the real method name 
from $invoke,
-       //      see also [#1511](https://github.com/apache/dubbo-go/issues/1511)
-       methodName := invocation.MethodName()
+       methodName := invocation.ActualMethodName()
        // remainingIIface, remainingJIface means remaining capacity of node i 
and node j.
        // If one of the metrics is empty, invoke the invocation to that node 
directly.
        remainingIIface, err := m.GetMethodMetrics(invokers[i].GetURL(), 
methodName, metrics.HillClimbing)
        if err != nil {
                if errors.Is(err, metrics.ErrMetricsNotFound) {
-                       logger.Debugf("[P2C select] The invoker[i] was 
selected, because it hasn't been selected before.")
+                       logger.Debugf("[P2C select] The invoker[%d] was 
selected, because it hasn't been selected before.", i)
                        return invokers[i]
                }
                logger.Warnf("get method metrics err: %v", err)
@@ -97,7 +101,7 @@ func (l *p2cLoadBalance) Select(invokers []protocol.Invoker, 
invocation protocol
        remainingJIface, err := m.GetMethodMetrics(invokers[j].GetURL(), 
methodName, metrics.HillClimbing)
        if err != nil {
                if errors.Is(err, metrics.ErrMetricsNotFound) {
-                       logger.Debugf("[P2C select] The invoker[j] was 
selected, because it hasn't been selected before.")
+                       logger.Debugf("[P2C select] The invoker[%d] was 
selected, because it hasn't been selected before.", j)
                        return invokers[j]
                }
                logger.Warnf("get method metrics err: %v", err)
@@ -116,14 +120,14 @@ func (l *p2cLoadBalance) Select(invokers 
[]protocol.Invoker, invocation protocol
                panic(fmt.Sprintf("the type of %s expects to be uint64, but 
gets %T", metrics.HillClimbing, remainingJIface))
        }
 
-       logger.Debugf("[P2C select] The invoker[i] remaining is %d, and the 
invoker[j] is %d.", remainingI, remainingJ)
+       logger.Debugf("[P2C select] The invoker[%d] remaining is %d, and the 
invoker[%d] is %d.", i, remainingI, j, remainingJ)
 
        // For the remaining capacity, the bigger, the better.
        if remainingI > remainingJ {
-               logger.Debugf("[P2C select] The invoker[i] was selected.")
+               logger.Debugf("[P2C select] The invoker[%d] was selected.", i)
                return invokers[i]
        }
 
-       logger.Debugf("[P2C select] The invoker[j] was selected.")
+       logger.Debugf("[P2C select] The invoker[%d] was selected.", j)
        return invokers[j]
 }
diff --git a/cluster/loadbalance/p2c/loadbalance_test.go 
b/cluster/loadbalance/p2c/loadbalance_test.go
new file mode 100644
index 0000000..17092fb
--- /dev/null
+++ b/cluster/loadbalance/p2c/loadbalance_test.go
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 p2c
+
+import (
+       "testing"
+)
+
+import (
+       "github.com/golang/mock/gomock"
+
+       "github.com/stretchr/testify/assert"
+)
+
+import (
+       "dubbo.apache.org/dubbo-go/v3/cluster/metrics"
+       "dubbo.apache.org/dubbo-go/v3/common"
+       "dubbo.apache.org/dubbo-go/v3/protocol"
+       protoinvoc "dubbo.apache.org/dubbo-go/v3/protocol/invocation"
+)
+
+func TestLoadBalance(t *testing.T) {
+       lb := newP2CLoadBalance()
+       invocation := protoinvoc.NewRPCInvocation("TestMethod", 
[]interface{}{}, nil)
+       randSeed = func() int64 {
+               return 0
+       }
+
+       t.Run("no invokers", func(t *testing.T) {
+               ivk := lb.Select([]protocol.Invoker{}, invocation)
+               assert.Nil(t, ivk)
+       })
+
+       t.Run("one invoker", func(t *testing.T) {
+               url0, _ := 
common.NewURL("dubbo://192.168.1.0:20000/com.ikurento.user.UserProvider")
+
+               ivkArr := []protocol.Invoker{
+                       protocol.NewBaseInvoker(url0),
+               }
+               ivk := lb.Select(ivkArr, invocation)
+               assert.Equal(t, ivkArr[0].GetURL().String(), 
ivk.GetURL().String())
+       })
+
+       t.Run("two invokers", func(t *testing.T) {
+               ctrl := gomock.NewController(t)
+               defer ctrl.Finish()
+
+               m := metrics.NewMockMetrics(ctrl)
+               metrics.LocalMetrics = m
+
+               url0, _ := 
common.NewURL("dubbo://192.168.1.0:20000/com.ikurento.user.UserProvider")
+               url1, _ := 
common.NewURL("dubbo://192.168.1.1:20000/com.ikurento.user.UserProvider")
+
+               m.EXPECT().
+                       GetMethodMetrics(gomock.Eq(url0), 
gomock.Eq(invocation.MethodName()), gomock.Eq(metrics.HillClimbing)).
+                       Times(1).
+                       Return(uint64(10), nil)
+               m.EXPECT().
+                       GetMethodMetrics(gomock.Eq(url1), 
gomock.Eq(invocation.MethodName()), gomock.Eq(metrics.HillClimbing)).
+                       Times(1).
+                       Return(uint64(5), nil)
+
+               ivkArr := []protocol.Invoker{
+                       protocol.NewBaseInvoker(url0),
+                       protocol.NewBaseInvoker(url1),
+               }
+
+               ivk := lb.Select(ivkArr, invocation)
+
+               assert.Equal(t, ivkArr[0].GetURL().String(), 
ivk.GetURL().String())
+       })
+
+       t.Run("multiple invokers", func(t *testing.T) {
+               ctrl := gomock.NewController(t)
+               defer ctrl.Finish()
+
+               m := metrics.NewMockMetrics(ctrl)
+               metrics.LocalMetrics = m
+
+               url0, _ := 
common.NewURL("dubbo://192.168.1.0:20000/com.ikurento.user.UserProvider")
+               url1, _ := 
common.NewURL("dubbo://192.168.1.1:20000/com.ikurento.user.UserProvider")
+               url2, _ := 
common.NewURL("dubbo://192.168.1.2:20000/com.ikurento.user.UserProvider")
+
+               m.EXPECT().
+                       GetMethodMetrics(gomock.Eq(url0), 
gomock.Eq(invocation.MethodName()), gomock.Eq(metrics.HillClimbing)).
+                       Times(1).
+                       Return(uint64(10), nil)
+               m.EXPECT().
+                       GetMethodMetrics(gomock.Eq(url1), 
gomock.Eq(invocation.MethodName()), gomock.Eq(metrics.HillClimbing)).
+                       Times(1).
+                       Return(uint64(5), nil)
+
+               ivkArr := []protocol.Invoker{
+                       protocol.NewBaseInvoker(url0),
+                       protocol.NewBaseInvoker(url1),
+                       protocol.NewBaseInvoker(url2),
+               }
+
+               ivk := lb.Select(ivkArr, invocation)
+
+               assert.Equal(t, ivkArr[0].GetURL().String(), 
ivk.GetURL().String())
+       })
+
+       t.Run("metrics i not found", func(t *testing.T) {
+               ctrl := gomock.NewController(t)
+               defer ctrl.Finish()
+
+               m := metrics.NewMockMetrics(ctrl)
+               metrics.LocalMetrics = m
+
+               url0, _ := 
common.NewURL("dubbo://192.168.1.0:20000/com.ikurento.user.UserProvider")
+               url1, _ := 
common.NewURL("dubbo://192.168.1.1:20000/com.ikurento.user.UserProvider")
+               url2, _ := 
common.NewURL("dubbo://192.168.1.2:20000/com.ikurento.user.UserProvider")
+
+               m.EXPECT().
+                       GetMethodMetrics(gomock.Eq(url0), 
gomock.Eq(invocation.MethodName()), gomock.Eq(metrics.HillClimbing)).
+                       Times(1).
+                       Return(0, metrics.ErrMetricsNotFound)
+
+               ivkArr := []protocol.Invoker{
+                       protocol.NewBaseInvoker(url0),
+                       protocol.NewBaseInvoker(url1),
+                       protocol.NewBaseInvoker(url2),
+               }
+
+               ivk := lb.Select(ivkArr, invocation)
+
+               assert.Equal(t, ivkArr[0].GetURL().String(), 
ivk.GetURL().String())
+       })
+
+       t.Run("metrics j not found", func(t *testing.T) {
+               ctrl := gomock.NewController(t)
+               defer ctrl.Finish()
+
+               m := metrics.NewMockMetrics(ctrl)
+               metrics.LocalMetrics = m
+
+               url0, _ := 
common.NewURL("dubbo://192.168.1.0:20000/com.ikurento.user.UserProvider")
+               url1, _ := 
common.NewURL("dubbo://192.168.1.1:20000/com.ikurento.user.UserProvider")
+               url2, _ := 
common.NewURL("dubbo://192.168.1.2:20000/com.ikurento.user.UserProvider")
+
+               m.EXPECT().
+                       GetMethodMetrics(gomock.Eq(url0), 
gomock.Eq(invocation.MethodName()), gomock.Eq(metrics.HillClimbing)).
+                       Times(1).
+                       Return(uint64(0), nil)
+
+               m.EXPECT().
+                       GetMethodMetrics(gomock.Eq(url1), 
gomock.Eq(invocation.MethodName()), gomock.Eq(metrics.HillClimbing)).
+                       Times(1).
+                       Return(uint64(0), metrics.ErrMetricsNotFound)
+
+               ivkArr := []protocol.Invoker{
+                       protocol.NewBaseInvoker(url0),
+                       protocol.NewBaseInvoker(url1),
+                       protocol.NewBaseInvoker(url2),
+               }
+
+               ivk := lb.Select(ivkArr, invocation)
+
+               assert.Equal(t, ivkArr[1].GetURL().String(), 
ivk.GetURL().String())
+       })
+
+}
diff --git a/cluster/metrics/local_metrics.go b/cluster/metrics/local_metrics.go
index e9f976a..16c094c 100644
--- a/cluster/metrics/local_metrics.go
+++ b/cluster/metrics/local_metrics.go
@@ -32,6 +32,8 @@ func init() {
        LocalMetrics = newLocalMetrics()
 }
 
+var _ Metrics = (*localMetrics)(nil)
+
 type localMetrics struct {
        // protect metrics
        lock    *sync.RWMutex
diff --git a/cluster/metrics/mock_metrics.go b/cluster/metrics/mock_metrics.go
new file mode 100644
index 0000000..dbfb895
--- /dev/null
+++ b/cluster/metrics/mock_metrics.go
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+// Code generated by MockGen. DO NOT EDIT.
+// Source: metrics.go
+
+// Package mock_metrics is a generated GoMock package.
+package metrics
+
+import (
+       reflect "reflect"
+)
+
+import (
+       gomock "github.com/golang/mock/gomock"
+)
+
+import (
+       common "dubbo.apache.org/dubbo-go/v3/common"
+)
+
+// MockMetrics is a mock of Metrics interface.
+type MockMetrics struct {
+       ctrl     *gomock.Controller
+       recorder *MockMetricsMockRecorder
+}
+
+// MockMetricsMockRecorder is the mock recorder for MockMetrics.
+type MockMetricsMockRecorder struct {
+       mock *MockMetrics
+}
+
+// NewMockMetrics creates a new mock instance.
+func NewMockMetrics(ctrl *gomock.Controller) *MockMetrics {
+       mock := &MockMetrics{ctrl: ctrl}
+       mock.recorder = &MockMetricsMockRecorder{mock}
+       return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMetrics) EXPECT() *MockMetricsMockRecorder {
+       return m.recorder
+}
+
+// GetInstanceMetrics mocks base method.
+func (m *MockMetrics) GetInstanceMetrics(url *common.URL, key string) 
(interface{}, error) {
+       m.ctrl.T.Helper()
+       ret := m.ctrl.Call(m, "GetInstanceMetrics", url, key)
+       ret0, _ := ret[0].(interface{})
+       ret1, _ := ret[1].(error)
+       return ret0, ret1
+}
+
+// GetInstanceMetrics indicates an expected call of GetInstanceMetrics.
+func (mr *MockMetricsMockRecorder) GetInstanceMetrics(url, key interface{}) 
*gomock.Call {
+       mr.mock.ctrl.T.Helper()
+       return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, 
"GetInstanceMetrics", reflect.TypeOf((*MockMetrics)(nil).GetInstanceMetrics), 
url, key)
+}
+
+// GetInvokerMetrics mocks base method.
+func (m *MockMetrics) GetInvokerMetrics(url *common.URL, key string) 
(interface{}, error) {
+       m.ctrl.T.Helper()
+       ret := m.ctrl.Call(m, "GetInvokerMetrics", url, key)
+       ret0, _ := ret[0].(interface{})
+       ret1, _ := ret[1].(error)
+       return ret0, ret1
+}
+
+// GetInvokerMetrics indicates an expected call of GetInvokerMetrics.
+func (mr *MockMetricsMockRecorder) GetInvokerMetrics(url, key interface{}) 
*gomock.Call {
+       mr.mock.ctrl.T.Helper()
+       return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, 
"GetInvokerMetrics", reflect.TypeOf((*MockMetrics)(nil).GetInvokerMetrics), 
url, key)
+}
+
+// GetMethodMetrics mocks base method.
+func (m *MockMetrics) GetMethodMetrics(url *common.URL, methodName, key 
string) (interface{}, error) {
+       m.ctrl.T.Helper()
+       ret := m.ctrl.Call(m, "GetMethodMetrics", url, methodName, key)
+       ret0, _ := ret[0].(interface{})
+       ret1, _ := ret[1].(error)
+       return ret0, ret1
+}
+
+// GetMethodMetrics indicates an expected call of GetMethodMetrics.
+func (mr *MockMetricsMockRecorder) GetMethodMetrics(url, methodName, key 
interface{}) *gomock.Call {
+       mr.mock.ctrl.T.Helper()
+       return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, 
"GetMethodMetrics", reflect.TypeOf((*MockMetrics)(nil).GetMethodMetrics), url, 
methodName, key)
+}
+
+// SetInstanceMetrics mocks base method.
+func (m *MockMetrics) SetInstanceMetrics(url *common.URL, key string, value 
interface{}) error {
+       m.ctrl.T.Helper()
+       ret := m.ctrl.Call(m, "SetInstanceMetrics", url, key, value)
+       ret0, _ := ret[0].(error)
+       return ret0
+}
+
+// SetInstanceMetrics indicates an expected call of SetInstanceMetrics.
+func (mr *MockMetricsMockRecorder) SetInstanceMetrics(url, key, value 
interface{}) *gomock.Call {
+       mr.mock.ctrl.T.Helper()
+       return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, 
"SetInstanceMetrics", reflect.TypeOf((*MockMetrics)(nil).SetInstanceMetrics), 
url, key, value)
+}
+
+// SetInvokerMetrics mocks base method.
+func (m *MockMetrics) SetInvokerMetrics(url *common.URL, key string, value 
interface{}) error {
+       m.ctrl.T.Helper()
+       ret := m.ctrl.Call(m, "SetInvokerMetrics", url, key, value)
+       ret0, _ := ret[0].(error)
+       return ret0
+}
+
+// SetInvokerMetrics indicates an expected call of SetInvokerMetrics.
+func (mr *MockMetricsMockRecorder) SetInvokerMetrics(url, key, value 
interface{}) *gomock.Call {
+       mr.mock.ctrl.T.Helper()
+       return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, 
"SetInvokerMetrics", reflect.TypeOf((*MockMetrics)(nil).SetInvokerMetrics), 
url, key, value)
+}
+
+// SetMethodMetrics mocks base method.
+func (m *MockMetrics) SetMethodMetrics(url *common.URL, methodName, key 
string, value interface{}) error {
+       m.ctrl.T.Helper()
+       ret := m.ctrl.Call(m, "SetMethodMetrics", url, methodName, key, value)
+       ret0, _ := ret[0].(error)
+       return ret0
+}
+
+// SetMethodMetrics indicates an expected call of SetMethodMetrics.
+func (mr *MockMetricsMockRecorder) SetMethodMetrics(url, methodName, key, 
value interface{}) *gomock.Call {
+       mr.mock.ctrl.T.Helper()
+       return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, 
"SetMethodMetrics", reflect.TypeOf((*MockMetrics)(nil).SetMethodMetrics), url, 
methodName, key, value)
+}
diff --git a/filter/seata/filter_test.go b/filter/seata/filter_test.go
index 4db50b0..cdbf0a0 100644
--- a/filter/seata/filter_test.go
+++ b/filter/seata/filter_test.go
@@ -43,7 +43,7 @@ func (iv *testMockSeataInvoker) Invoke(ctx context.Context, _ 
protocol.Invocatio
                        return &protocol.RPCResult{Rest: xid}
                }
        }
-       return protocol.NewRPCResult(nil, nil)
+       return &protocol.RPCResult{}
 }
 
 func TestSeataFilter_Invoke(t *testing.T) {
diff --git a/filter/sentinel/filter.go b/filter/sentinel/filter.go
index 4b08cfa..161e2fd 100644
--- a/filter/sentinel/filter.go
+++ b/filter/sentinel/filter.go
@@ -212,7 +212,7 @@ func SetDubboProviderFallback(f DubboFallback) {
 
 func getDefaultDubboFallback() DubboFallback {
        return func(ctx context.Context, invoker protocol.Invoker, invocation 
protocol.Invocation, blockError *base.BlockError) protocol.Result {
-               return protocol.NewRPCResult(nil, blockError)
+               return &protocol.RPCResult{Err: blockError}
        }
 }
 
diff --git a/metadata/service/local/metadata_service_proxy_factory_test.go 
b/metadata/service/local/metadata_service_proxy_factory_test.go
index f38d63c..98aafce 100644
--- a/metadata/service/local/metadata_service_proxy_factory_test.go
+++ b/metadata/service/local/metadata_service_proxy_factory_test.go
@@ -91,5 +91,5 @@ func (m *mockInvoker) Destroy() {
 }
 
 func (m *mockInvoker) Invoke(context.Context, protocol.Invocation) 
protocol.Result {
-       return protocol.NewRPCResult([]string{"dubbo://localhost"}, nil)
+       return &protocol.RPCResult{Rest: []string{"dubbo://localhost"}}
 }
diff --git a/protocol/invocation/rpcinvocation.go 
b/protocol/invocation/rpcinvocation.go
index a70da17..aa1f0d9 100644
--- a/protocol/invocation/rpcinvocation.go
+++ b/protocol/invocation/rpcinvocation.go
@@ -29,6 +29,8 @@ import (
        "dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+var _ protocol.Invocation = (*RPCInvocation)(nil)
+
 // todo: is it necessary to separate fields of consumer(provider) from 
RPCInvocation
 // nolint
 type RPCInvocation struct {
diff --git a/protocol/result.go b/protocol/result.go
index 34de34c..a2169a1 100644
--- a/protocol/result.go
+++ b/protocol/result.go
@@ -42,9 +42,7 @@ type Result interface {
        Attachment(string, interface{}) interface{}
 }
 
-/////////////////////////////
-// Result Implement of RPC
-/////////////////////////////
+var _ Result = (*RPCResult)(nil)
 
 // RPCResult is default RPC result.
 type RPCResult struct {
@@ -53,14 +51,6 @@ type RPCResult struct {
        Rest  interface{}
 }
 
-func NewRPCResult(result interface{}, err error) *RPCResult {
-       return &RPCResult{
-               Rest:  result,
-               Err:   err,
-               Attrs: make(map[string]interface{}),
-       }
-}
-
 // SetError sets error.
 func (r *RPCResult) SetError(err error) {
        r.Err = err

Reply via email to