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