From b87b1330e3da10c8f2fd8f16fabb065cde168486 Mon Sep 17 00:00:00 2001
From: Joe Zou <yixian.zou@gmail.com>
Date: Tue, 25 Feb 2020 00:11:12 +0800
Subject: [PATCH] add UT for app_router

---
 before_ut.bat                               |   3 +-
 before_ut.sh                                |   3 +-
 cluster/router/condition/app_router_test.go | 179 ++++++++++++++++++++
 3 files changed, 183 insertions(+), 2 deletions(-)
 create mode 100644 cluster/router/condition/app_router_test.go

diff --git a/before_ut.bat b/before_ut.bat
index a5557ae1a..16281a967 100644
--- a/before_ut.bat
+++ b/before_ut.bat
@@ -19,4 +19,5 @@ md remoting\zookeeper\zookeeper-4unittest\contrib\fatjar config_center\zookeeper
 curl -L https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/%zkJar% -o remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%
 xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "config_center/zookeeper/zookeeper-4unittest/contrib/fatjar/"
 xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "registry/zookeeper/zookeeper-4unittest/contrib/fatjar/"
-xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "cluster/router/chain/zookeeper-4unittest/contrib/fatjar/"
\ No newline at end of file
+xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "cluster/router/chain/zookeeper-4unittest/contrib/fatjar/"
+xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "cluster/router/condition/zookeeper-4unittest/contrib/fatjar/"
\ No newline at end of file
diff --git a/before_ut.sh b/before_ut.sh
index 185c05274..b7223b337 100755
--- a/before_ut.sh
+++ b/before_ut.sh
@@ -19,4 +19,5 @@ mkdir -p remoting/zookeeper/zookeeper-4unittest/contrib/fatjar config_center/zoo
 wget -P "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar" https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar
 cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar config_center/zookeeper/zookeeper-4unittest/contrib/fatjar/
 cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar registry/zookeeper/zookeeper-4unittest/contrib/fatjar/
-cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar cluster/router/chain/zookeeper-4unittest/contrib/fatjar
\ No newline at end of file
+cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar cluster/router/chain/zookeeper-4unittest/contrib/fatjar
+cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar cluster/router/condition/zookeeper-4unittest/contrib/fatjar
\ No newline at end of file
diff --git a/cluster/router/condition/app_router_test.go b/cluster/router/condition/app_router_test.go
new file mode 100644
index 000000000..c875f40d4
--- /dev/null
+++ b/cluster/router/condition/app_router_test.go
@@ -0,0 +1,179 @@
+/*
+ * 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 condition
+
+import (
+	"strconv"
+	"testing"
+	"time"
+
+	"github.com/apache/dubbo-go/config_center"
+	"github.com/apache/dubbo-go/remoting"
+)
+
+import (
+	_ "github.com/apache/dubbo-go/config_center/zookeeper"
+	"github.com/stretchr/testify/assert"
+)
+
+import (
+	"github.com/apache/dubbo-go/common"
+	"github.com/apache/dubbo-go/common/config"
+	"github.com/apache/dubbo-go/common/extension"
+	"github.com/apache/dubbo-go/remoting/zookeeper"
+)
+
+func TestNewAppRouter(t *testing.T) {
+
+	testYML := `enabled: true
+force: true
+runtime: false
+conditions:
+  - => host != 172.22.3.91
+`
+	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)
+
+	_, 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)
+
+	assert.Nil(t, err)
+	assert.NotNil(t, configuration)
+
+	appRouteURL := getAppRouteURL("test-condition")
+	appRouter, err := NewAppRouter(appRouteURL)
+	assert.Nil(t, err)
+	assert.NotNil(t, appRouter)
+
+	assert.NotNil(t, appRouter)
+	assert.NotNil(t, appRouter.RouterRule())
+	rule := appRouter.RouterRule()
+	assert.Equal(t, "", rule.Scope)
+	assert.True(t, rule.Force)
+	assert.True(t, rule.Enabled)
+	assert.True(t, rule.Valid)
+
+	assert.Equal(t, testYML, rule.RawRule)
+	assert.Equal(t, false, rule.Runtime)
+	assert.Equal(t, false, rule.Dynamic)
+	assert.Equal(t, "", rule.Key)
+	assert.Equal(t, 0, rule.Priority)
+}
+
+func TestGenerateConditions(t *testing.T) {
+
+	testYML := `enabled: true
+force: true
+runtime: false
+conditions:
+  - => host != 172.22.3.91
+  - host = 192.168.199.208 => host = 192.168.199.208 
+`
+	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)
+
+	_, 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)
+
+	assert.Nil(t, err)
+	assert.NotNil(t, configuration)
+
+	appRouteURL := getAppRouteURL("test-condition")
+	appRouter, err := NewAppRouter(appRouteURL)
+	assert.Nil(t, err)
+	assert.NotNil(t, appRouter)
+
+	rule, err := Parse(testYML)
+	assert.Nil(t, err)
+	appRouter.generateConditions(rule)
+
+	assert.Equal(t, 2, len(appRouter.conditionRouters))
+}
+
+func TestProcess(t *testing.T) {
+
+	testYML := `enabled: true
+force: true
+runtime: false
+conditions:
+  - => host != 172.22.3.91
+`
+	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)
+
+	_, 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)
+
+	assert.Nil(t, err)
+	assert.NotNil(t, configuration)
+
+	appRouteURL := getAppRouteURL("test-condition")
+	appRouter, err := NewAppRouter(appRouteURL)
+	assert.Nil(t, err)
+	assert.NotNil(t, appRouter)
+
+	assert.Equal(t, 1, len(appRouter.conditionRouters))
+
+	testNewYML := `
+enabled: true
+force: true
+runtime: false
+conditions:
+  - => host != 172.22.3.91
+  - host = 192.168.199.208 => host = 192.168.199.208
+`
+
+	appRouter.Process(&config_center.ConfigChangeEvent{ConfigType: remoting.EventTypeDel})
+
+	assert.Equal(t, 0, len(appRouter.conditionRouters))
+
+	appRouter.Process(&config_center.ConfigChangeEvent{Value: testNewYML, ConfigType: remoting.EventTypeAdd})
+
+	assert.Equal(t, 2, len(appRouter.conditionRouters))
+}
+
+func getAppRouteURL(applicationKey string) *common.URL {
+	url, _ := common.NewURL("condition://0.0.0.0/com.foo.BarService")
+	url.AddParam("application", applicationKey)
+	url.AddParam("force", "true")
+	return &url
+}
-- 
GitLab