94 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2021 OceanBase
 | 
						|
 * OceanBase CE is licensed under Mulan PubL v2.
 | 
						|
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | 
						|
 * You may obtain a copy of Mulan PubL v2 at:
 | 
						|
 *          http://license.coscl.org.cn/MulanPubL-2.0
 | 
						|
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
 * See the Mulan PubL v2 for more details.
 | 
						|
 */
 | 
						|
 | 
						|
package server
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"testing"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/gin-gonic/gin"
 | 
						|
	. "github.com/smartystreets/goconvey/convey"
 | 
						|
)
 | 
						|
 | 
						|
func TestCounter(t *testing.T) {
 | 
						|
	count := new(Counter)
 | 
						|
	Convey("counter after init", t, func() {
 | 
						|
		So(count.sessionCount, ShouldEqual, 0)
 | 
						|
	})
 | 
						|
 | 
						|
	count.incr()
 | 
						|
	Convey("counter after incr", t, func() {
 | 
						|
		So(count.sessionCount, ShouldEqual, 1)
 | 
						|
	})
 | 
						|
 | 
						|
	count.decr()
 | 
						|
	Convey("counter after decr", t, func() {
 | 
						|
		So(count.sessionCount, ShouldEqual, 0)
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
func TestHttpServer(t *testing.T) {
 | 
						|
	server := &HttpServer{
 | 
						|
		Counter: new(Counter),
 | 
						|
		Router:  gin.Default(),
 | 
						|
		Server: &http.Server{
 | 
						|
			Addr: ":0",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	w := httptest.NewRecorder()
 | 
						|
	server.UseCounter()
 | 
						|
	server.Router.GET("/foo", fooHandler)
 | 
						|
	end := make(chan bool, 1)
 | 
						|
	handler := func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		server.Router.ServeHTTP(w, r)
 | 
						|
		time.Sleep(time.Second)
 | 
						|
	}
 | 
						|
	req := httptest.NewRequest(http.MethodGet, "/foo", nil)
 | 
						|
	go func() {
 | 
						|
		handler(w, req)
 | 
						|
		end <- true
 | 
						|
	}()
 | 
						|
 | 
						|
	time.Sleep(10 * time.Millisecond)
 | 
						|
	t.Run("handle a 1 second request", func(t *testing.T) {
 | 
						|
		Convey("session count should be 1", t, func() {
 | 
						|
			So(server.Counter.sessionCount, ShouldEqual, 1)
 | 
						|
		})
 | 
						|
 | 
						|
		err := server.Shutdown(context.Background())
 | 
						|
		Convey("server shutdown should fail", t, func() {
 | 
						|
			So(err, ShouldNotBeNil)
 | 
						|
			So(err.Error(), ShouldContainSubstring, "server shutdown failed")
 | 
						|
		})
 | 
						|
	})
 | 
						|
 | 
						|
	<-end
 | 
						|
	t.Run("handle request end", func(t *testing.T) {
 | 
						|
		Convey("session count should be 0", t, func() {
 | 
						|
			So(server.Counter.sessionCount, ShouldEqual, 0)
 | 
						|
		})
 | 
						|
		err := server.Shutdown(context.Background())
 | 
						|
		Convey("server shutdown should success", t, func() {
 | 
						|
			So(err, ShouldBeNil)
 | 
						|
		})
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
func fooHandler(c *gin.Context) {
 | 
						|
	time.Sleep(time.Second)
 | 
						|
}
 |