From 86e35ced1ef5c5a20ebadf01344ad0c29ca185f0 Mon Sep 17 00:00:00 2001 From: Joe Zou <yixian.zou@gmail.com> Date: Wed, 26 Feb 2020 23:47:19 +0800 Subject: [PATCH] add test case --- cluster/router/chain/chain.go | 3 - cluster/router/chain/chain_test.go | 110 ++++++++++++++++++++++++- cluster/router/condition/app_router.go | 7 ++ 3 files changed, 113 insertions(+), 7 deletions(-) diff --git a/cluster/router/chain/chain.go b/cluster/router/chain/chain.go index 28ff6bdcc..d48a837eb 100644 --- a/cluster/router/chain/chain.go +++ b/cluster/router/chain/chain.go @@ -80,9 +80,6 @@ func (c *RouterChain) AddRouters(routers []router.Router) { // NewRouterChain Use url to init router chain // Loop routerFactories and call NewRouter method func NewRouterChain(url *common.URL) (*RouterChain, error) { - if url == nil { - return nil, perrors.Errorf("No route URL for create router chain!") - } routerFactories := extension.GetRouterFactories() if len(routerFactories) == 0 { return nil, perrors.Errorf("No routerFactory exits , create one please") diff --git a/cluster/router/chain/chain_test.go b/cluster/router/chain/chain_test.go index 2864b35c2..0cb47c4a1 100644 --- a/cluster/router/chain/chain_test.go +++ b/cluster/router/chain/chain_test.go @@ -19,6 +19,7 @@ package chain import ( "encoding/base64" + "fmt" "strconv" "testing" "time" @@ -31,12 +32,13 @@ import ( import ( "github.com/apache/dubbo-go/cluster/router" "github.com/apache/dubbo-go/cluster/router/condition" - _ "github.com/apache/dubbo-go/cluster/router/condition" "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/config" "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/common/extension" _ "github.com/apache/dubbo-go/config_center/zookeeper" + "github.com/apache/dubbo-go/protocol" + "github.com/apache/dubbo-go/protocol/invocation" "github.com/apache/dubbo-go/remoting/zookeeper" ) @@ -86,8 +88,8 @@ conditions: func TestNewRouterChainURLNil(t *testing.T) { chain, err := NewRouterChain(nil) - assert.Error(t, err) - assert.Nil(t, chain) + assert.NoError(t, err) + assert.NotNil(t, chain) } func TestRouterChain_AddRouters(t *testing.T) { @@ -129,11 +131,111 @@ conditions: assert.Equal(t, 3, len(chain.routers)) } +func TestRouterChain_Route(t *testing.T) { + ts, z, _, err := zookeeper.NewMockZookeeperClient("test", 15*time.Second) + defer ts.Stop() + defer z.Close() + + zkUrl, _ := common.NewURL("zookeeper://127.0.0.1:" + strconv.Itoa(ts.Servers[0].Port)) + configuration, err := extension.GetConfigCenterFactory("zookeeper").GetDynamicConfiguration(&zkUrl) + config.GetEnvInstance().SetDynamicConfiguration(configuration) + + chain, err := NewRouterChain(getConditionRouteUrl("test-condition")) + assert.Nil(t, err) + assert.Equal(t, 1, len(chain.routers)) + + url := getConditionRouteUrl("test-condition") + assert.NotNil(t, url) + + invokers := []protocol.Invoker{} + dubboURL, _ := common.NewURL(fmt.Sprintf("dubbo://1.2.3.4:20000/com.foo.BarService")) + invokers = append(invokers, protocol.NewBaseInvoker(dubboURL)) + + targetURL, _ := common.NewURL(fmt.Sprintf("consumer://1.1.1.1/com.foo.BarService")) + inv := &invocation.RPCInvocation{} + finalInvokers := chain.Route(invokers, &targetURL, inv) + + assert.Equal(t, 1, len(finalInvokers)) +} + +func TestRouterChain_Route_AppRouter(t *testing.T) { + ts, z, _, err := zookeeper.NewMockZookeeperClient("test", 15*time.Second) + assert.NoError(t, err) + err = z.Create("/dubbo/config/dubbo/test-condition.condition-router") + assert.NoError(t, err) + + testyml := `enabled: true +force: true +runtime: false +conditions: + - => host = 1.1.1.1 => host != 1.2.3.4 +` + + _, err = z.Conn.Set("/dubbo/config/dubbo/test-condition.condition-router", []byte(testyml), 0) + assert.NoError(t, err) + defer ts.Stop() + defer z.Close() + + zkUrl, _ := common.NewURL("zookeeper://127.0.0.1:" + strconv.Itoa(ts.Servers[0].Port)) + configuration, err := extension.GetConfigCenterFactory("zookeeper").GetDynamicConfiguration(&zkUrl) + config.GetEnvInstance().SetDynamicConfiguration(configuration) + + chain, err := NewRouterChain(getConditionRouteUrl("test-condition")) + assert.Nil(t, err) + assert.Equal(t, 2, len(chain.routers)) + + invokers := []protocol.Invoker{} + dubboURL, _ := common.NewURL(fmt.Sprintf("dubbo://1.2.3.4:20000/com.foo.BarService")) + invokers = append(invokers, protocol.NewBaseInvoker(dubboURL)) + + targetURL, _ := common.NewURL(fmt.Sprintf("consumer://1.1.1.1/com.foo.BarService")) + inv := &invocation.RPCInvocation{} + finalInvokers := chain.Route(invokers, &targetURL, inv) + + assert.Equal(t, 0, len(finalInvokers)) +} + +func TestRouterChain_Route_NoRoute(t *testing.T) { + ts, z, _, err := zookeeper.NewMockZookeeperClient("test", 15*time.Second) + defer ts.Stop() + defer z.Close() + + zkUrl, _ := common.NewURL("zookeeper://127.0.0.1:" + strconv.Itoa(ts.Servers[0].Port)) + configuration, err := extension.GetConfigCenterFactory("zookeeper").GetDynamicConfiguration(&zkUrl) + config.GetEnvInstance().SetDynamicConfiguration(configuration) + + chain, err := NewRouterChain(getConditionNoRouteUrl("test-condition")) + assert.Nil(t, err) + assert.Equal(t, 1, len(chain.routers)) + + url := getConditionRouteUrl("test-condition") + assert.NotNil(t, url) + + invokers := []protocol.Invoker{} + dubboURL, _ := common.NewURL(fmt.Sprintf("dubbo://1.2.3.4:20000/com.foo.BarService")) + invokers = append(invokers, protocol.NewBaseInvoker(dubboURL)) + + targetURL, _ := common.NewURL(fmt.Sprintf("consumer://1.1.1.1/com.foo.BarService")) + inv := &invocation.RPCInvocation{} + finalInvokers := chain.Route(invokers, &targetURL, inv) + + assert.Equal(t, 0, len(finalInvokers)) +} + +func getConditionNoRouteUrl(applicationKey string) *common.URL { + url, _ := common.NewURL("condition://0.0.0.0/com.foo.BarService") + url.AddParam("application", applicationKey) + url.AddParam("force", "true") + rule := base64.URLEncoding.EncodeToString([]byte("host = 1.1.1.1 => host != 1.2.3.4")) + url.AddParam(constant.RULE_KEY, rule) + return &url +} + func getConditionRouteUrl(applicationKey string) *common.URL { url, _ := common.NewURL("condition://0.0.0.0/com.foo.BarService") url.AddParam("application", applicationKey) url.AddParam("force", "true") - rule := base64.URLEncoding.EncodeToString([]byte("host = 127.0.0.1 => ")) + rule := base64.URLEncoding.EncodeToString([]byte("host = 1.1.1.1 => host = 1.2.3.4")) url.AddParam(constant.RULE_KEY, rule) return &url } diff --git a/cluster/router/condition/app_router.go b/cluster/router/condition/app_router.go index a33dd679c..056e32851 100644 --- a/cluster/router/condition/app_router.go +++ b/cluster/router/condition/app_router.go @@ -17,6 +17,10 @@ package condition +import ( + perrors "github.com/pkg/errors" +) + import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/constant" @@ -34,6 +38,9 @@ type AppRouter struct { // NewAppRouter Init AppRouter by url func NewAppRouter(url *common.URL) (*AppRouter, error) { + if url == nil { + return nil, perrors.Errorf("No route URL for create app router!") + } appRouter, err := newListenableRouter(url, url.GetParam(constant.APPLICATION_KEY, "")) if err != nil { return nil, err -- GitLab