From b79ef401042753102ab8b80d2bc0ce3238c03100 Mon Sep 17 00:00:00 2001
From: Ming Deng <mindeng@ebay.com>
Date: Thu, 14 Nov 2019 22:55:58 +0800
Subject: [PATCH] Add UT

---
 config/graceful_shutdown.go                   |  4 +-
 config/graceful_shutdown_config.go            |  4 +-
 ...nFilter.go => graceful_shutdown_filter.go} |  8 +-
 filter/impl/graceful_shutdown_filter_test.go  | 74 +++++++++++++++++++
 protocol/rpc_status.go                        | 14 ----
 5 files changed, 84 insertions(+), 20 deletions(-)
 rename filter/impl/{GracefulShutdownFilter.go => graceful_shutdown_filter.go} (93%)
 create mode 100644 filter/impl/graceful_shutdown_filter_test.go

diff --git a/config/graceful_shutdown.go b/config/graceful_shutdown.go
index 7e072d628..eeb559b78 100644
--- a/config/graceful_shutdown.go
+++ b/config/graceful_shutdown.go
@@ -21,10 +21,11 @@ import (
 	"os"
 	"os/signal"
 	"runtime/debug"
-	"sync"
 	"syscall"
 	"time"
+)
 
+import (
 	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/common/logger"
@@ -45,7 +46,6 @@ import (
  * So this signal will be ignored.
  *
  */
-var gracefulShutdownOnce = sync.Once{}
 
 func GracefulShutdownInit() {
 
diff --git a/config/graceful_shutdown_config.go b/config/graceful_shutdown_config.go
index c5c16add0..c16123624 100644
--- a/config/graceful_shutdown_config.go
+++ b/config/graceful_shutdown_config.go
@@ -20,10 +20,10 @@ package config
 import (
 	"strconv"
 	"time"
-
+)
+import (
 	"github.com/apache/dubbo-go/common/logger"
 )
-
 const (
 	defaultTimeout  = 60 * time.Second
 	defaultStepTimeout = 10 * time.Second
diff --git a/filter/impl/GracefulShutdownFilter.go b/filter/impl/graceful_shutdown_filter.go
similarity index 93%
rename from filter/impl/GracefulShutdownFilter.go
rename to filter/impl/graceful_shutdown_filter.go
index 7337b20d0..285fe11da 100644
--- a/filter/impl/GracefulShutdownFilter.go
+++ b/filter/impl/graceful_shutdown_filter.go
@@ -19,7 +19,9 @@ package impl
 
 import (
 	"sync/atomic"
+)
 
+import (
 	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/common/logger"
@@ -34,7 +36,9 @@ func init() {
 		activeCount:    0,
 		shutdownConfig: config.GetConsumerConfig().ShutdownConfig,
 	}
-	var providerFilter = &gracefulShutdownFilter{activeCount: 0}
+	var providerFilter = &gracefulShutdownFilter{activeCount: 0,
+		shutdownConfig: config.GetProviderConfig().ShutdownConfig,
+	}
 
 	extension.SetFilter(constant.CONSUMER_SHUTDOWN_FILTER, func() filter.Filter {
 		return consumerFiler
@@ -62,7 +66,7 @@ func (gf *gracefulShutdownFilter) Invoke(invoker protocol.Invoker, invocation pr
 func (gf *gracefulShutdownFilter) OnResponse(result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	atomic.AddInt32(&gf.activeCount, -1)
 	// although this isn't thread safe, it won't be a problem if the gf.rejectNewRequest() is true.
-	if gf.activeCount <= 0 {
+	if gf.shutdownConfig != nil && gf.activeCount <= 0 {
 		gf.shutdownConfig.RequestsFinished = true
 	}
 	return result
diff --git a/filter/impl/graceful_shutdown_filter_test.go b/filter/impl/graceful_shutdown_filter_test.go
new file mode 100644
index 000000000..61a301dc5
--- /dev/null
+++ b/filter/impl/graceful_shutdown_filter_test.go
@@ -0,0 +1,74 @@
+/*
+ * 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 impl
+
+import (
+	"net/url"
+	"testing"
+)
+import (
+	"github.com/stretchr/testify/assert"
+)
+import (
+	"github.com/apache/dubbo-go/common"
+	"github.com/apache/dubbo-go/common/constant"
+	"github.com/apache/dubbo-go/common/extension"
+	"github.com/apache/dubbo-go/config"
+	filterCommon "github.com/apache/dubbo-go/filter/common"
+	"github.com/apache/dubbo-go/filter/common/impl"
+	"github.com/apache/dubbo-go/protocol"
+	"github.com/apache/dubbo-go/protocol/invocation"
+)
+
+func TestGenericFilter_Invoke(t *testing.T) {
+	invoc := invocation.NewRPCInvocation("GetUser", []interface{}{"OK"}, make(map[string]string, 0))
+
+	invokeUrl := common.NewURLWithOptions(
+		common.WithParams(url.Values{}), )
+
+	shutdownFilter := extension.GetFilter(constant.PROVIDER_SHUTDOWN_FILTER).(*gracefulShutdownFilter)
+
+	providerConfig := config.GetProviderConfig()
+
+	assert.False(t, shutdownFilter.rejectNewRequest())
+	assert.Nil(t, providerConfig.ShutdownConfig)
+
+	assert.Equal(t, extension.GetRejectedExecutionHandler(constant.DEFAULT_KEY),
+		shutdownFilter.getRejectHandler())
+
+	result := shutdownFilter.Invoke(protocol.NewBaseInvoker(*invokeUrl), invoc)
+	assert.NotNil(t, result)
+	assert.Nil(t, result.Error())
+
+	providerConfig.ShutdownConfig = &config.ShutdownConfig{
+		RejectRequest:        true,
+		RejectRequestHandler: "mock",
+	}
+	shutdownFilter.shutdownConfig = providerConfig.ShutdownConfig
+
+	assert.True(t, shutdownFilter.rejectNewRequest())
+	result = shutdownFilter.OnResponse(nil, protocol.NewBaseInvoker(*invokeUrl), invoc)
+
+	rejectHandler := &impl.OnlyLogRejectedExecutionHandler{}
+	extension.SetRejectedExecutionHandler("mock", func() filterCommon.RejectedExecutionHandler {
+		return rejectHandler
+	})
+	assert.True(t, providerConfig.ShutdownConfig.RequestsFinished)
+	assert.Equal(t, rejectHandler, shutdownFilter.getRejectHandler())
+
+}
diff --git a/protocol/rpc_status.go b/protocol/rpc_status.go
index 4f7e63f9f..3a8bfbc87 100644
--- a/protocol/rpc_status.go
+++ b/protocol/rpc_status.go
@@ -73,17 +73,3 @@ func beginCount0(rpcStatus *RpcStatus) {
 func endCount0(rpcStatus *RpcStatus) {
 	atomic.AddInt32(&rpcStatus.active, -1)
 }
-
-func GetTotalActive() int32 {
-	var result int32 = 0
-	methodStatistics.Range(func(_, value interface{}) bool {
-		statics := value.(*sync.Map)
-		statics.Range(func(_, value interface{}) bool {
-			rpcStatus := value.(*RpcStatus)
-			result = result + rpcStatus.active
-			return true
-		})
-		return true
-	})
-	return result
-}
-- 
GitLab