|
@@ -7,8 +7,10 @@ package gin
|
|
|
import (
|
|
import (
|
|
|
"bytes"
|
|
"bytes"
|
|
|
"errors"
|
|
"errors"
|
|
|
|
|
+ "fmt"
|
|
|
"net/http"
|
|
"net/http"
|
|
|
"testing"
|
|
"testing"
|
|
|
|
|
+ "time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/assert"
|
|
|
)
|
|
)
|
|
@@ -79,7 +81,179 @@ func TestLogger(t *testing.T) {
|
|
|
assert.Contains(t, buffer.String(), "404")
|
|
assert.Contains(t, buffer.String(), "404")
|
|
|
assert.Contains(t, buffer.String(), "GET")
|
|
assert.Contains(t, buffer.String(), "GET")
|
|
|
assert.Contains(t, buffer.String(), "/notfound")
|
|
assert.Contains(t, buffer.String(), "/notfound")
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func TestLoggerWithConfig(t *testing.T) {
|
|
|
|
|
+ buffer := new(bytes.Buffer)
|
|
|
|
|
+ router := New()
|
|
|
|
|
+ router.Use(LoggerWithConfig(LoggerConfig{Output: buffer}))
|
|
|
|
|
+ router.GET("/example", func(c *Context) {})
|
|
|
|
|
+ router.POST("/example", func(c *Context) {})
|
|
|
|
|
+ router.PUT("/example", func(c *Context) {})
|
|
|
|
|
+ router.DELETE("/example", func(c *Context) {})
|
|
|
|
|
+ router.PATCH("/example", func(c *Context) {})
|
|
|
|
|
+ router.HEAD("/example", func(c *Context) {})
|
|
|
|
|
+ router.OPTIONS("/example", func(c *Context) {})
|
|
|
|
|
+
|
|
|
|
|
+ performRequest(router, "GET", "/example?a=100")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "GET")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "a=100")
|
|
|
|
|
+
|
|
|
|
|
+ // I wrote these first (extending the above) but then realized they are more
|
|
|
|
|
+ // like integration tests because they test the whole logging process rather
|
|
|
|
|
+ // than individual functions. Im not sure where these should go.
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ performRequest(router, "POST", "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "POST")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ performRequest(router, "PUT", "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "PUT")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ performRequest(router, "DELETE", "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "DELETE")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ performRequest(router, "PATCH", "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "PATCH")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ performRequest(router, "HEAD", "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "HEAD")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ performRequest(router, "OPTIONS", "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "OPTIONS")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ performRequest(router, "GET", "/notfound")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "404")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "GET")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/notfound")
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func TestLoggerWithFormatter(t *testing.T) {
|
|
|
|
|
+ buffer := new(bytes.Buffer)
|
|
|
|
|
+
|
|
|
|
|
+ d := DefaultWriter
|
|
|
|
|
+ DefaultWriter = buffer
|
|
|
|
|
+ defer func() {
|
|
|
|
|
+ DefaultWriter = d
|
|
|
|
|
+ }()
|
|
|
|
|
+
|
|
|
|
|
+ router := New()
|
|
|
|
|
+ router.Use(LoggerWithFormatter(func(param LogFormatterParams) string {
|
|
|
|
|
+ return fmt.Sprintf("[FORMATTER TEST] %v | %3d | %13v | %15s | %-7s %s\n%s",
|
|
|
|
|
+ param.TimeStamp.Format("2006/01/02 - 15:04:05"),
|
|
|
|
|
+ param.StatusCode,
|
|
|
|
|
+ param.Latency,
|
|
|
|
|
+ param.ClientIP,
|
|
|
|
|
+ param.Method,
|
|
|
|
|
+ param.Path,
|
|
|
|
|
+ param.ErrorMessage,
|
|
|
|
|
+ )
|
|
|
|
|
+ }))
|
|
|
|
|
+ router.GET("/example", func(c *Context) {})
|
|
|
|
|
+ performRequest(router, "GET", "/example?a=100")
|
|
|
|
|
+
|
|
|
|
|
+ // output test
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "[FORMATTER TEST]")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "GET")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "a=100")
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func TestLoggerWithConfigFormatting(t *testing.T) {
|
|
|
|
|
+ var gotParam LogFormatterParams
|
|
|
|
|
+ buffer := new(bytes.Buffer)
|
|
|
|
|
+
|
|
|
|
|
+ router := New()
|
|
|
|
|
+ router.Use(LoggerWithConfig(LoggerConfig{
|
|
|
|
|
+ Output: buffer,
|
|
|
|
|
+ Formatter: func(param LogFormatterParams) string {
|
|
|
|
|
+ // for assert test
|
|
|
|
|
+ gotParam = param
|
|
|
|
|
+
|
|
|
|
|
+ return fmt.Sprintf("[FORMATTER TEST] %v | %3d | %13v | %15s | %-7s %s\n%s",
|
|
|
|
|
+ param.TimeStamp.Format("2006/01/02 - 15:04:05"),
|
|
|
|
|
+ param.StatusCode,
|
|
|
|
|
+ param.Latency,
|
|
|
|
|
+ param.ClientIP,
|
|
|
|
|
+ param.Method,
|
|
|
|
|
+ param.Path,
|
|
|
|
|
+ param.ErrorMessage,
|
|
|
|
|
+ )
|
|
|
|
|
+ },
|
|
|
|
|
+ }))
|
|
|
|
|
+ router.GET("/example", func(c *Context) {
|
|
|
|
|
+ // set dummy ClientIP
|
|
|
|
|
+ c.Request.Header.Set("X-Forwarded-For", "20.20.20.20")
|
|
|
|
|
+ })
|
|
|
|
|
+ performRequest(router, "GET", "/example?a=100")
|
|
|
|
|
+
|
|
|
|
|
+ // output test
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "[FORMATTER TEST]")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "GET")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "/example")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "a=100")
|
|
|
|
|
+
|
|
|
|
|
+ // LogFormatterParams test
|
|
|
|
|
+ assert.NotNil(t, gotParam.Request)
|
|
|
|
|
+ assert.NotEmpty(t, gotParam.TimeStamp)
|
|
|
|
|
+ assert.Equal(t, 200, gotParam.StatusCode)
|
|
|
|
|
+ assert.NotEmpty(t, gotParam.Latency)
|
|
|
|
|
+ assert.Equal(t, "20.20.20.20", gotParam.ClientIP)
|
|
|
|
|
+ assert.Equal(t, "GET", gotParam.Method)
|
|
|
|
|
+ assert.Equal(t, "/example?a=100", gotParam.Path)
|
|
|
|
|
+ assert.Empty(t, gotParam.ErrorMessage)
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func TestDefaultLogFormatter(t *testing.T) {
|
|
|
|
|
+ timeStamp := time.Unix(1544173902, 0).UTC()
|
|
|
|
|
+
|
|
|
|
|
+ termFalseParam := LogFormatterParams{
|
|
|
|
|
+ TimeStamp: timeStamp,
|
|
|
|
|
+ StatusCode: 200,
|
|
|
|
|
+ Latency: time.Second * 5,
|
|
|
|
|
+ ClientIP: "20.20.20.20",
|
|
|
|
|
+ Method: "GET",
|
|
|
|
|
+ Path: "/",
|
|
|
|
|
+ ErrorMessage: "",
|
|
|
|
|
+ IsTerm: false,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ termTrueParam := LogFormatterParams{
|
|
|
|
|
+ TimeStamp: timeStamp,
|
|
|
|
|
+ StatusCode: 200,
|
|
|
|
|
+ Latency: time.Second * 5,
|
|
|
|
|
+ ClientIP: "20.20.20.20",
|
|
|
|
|
+ Method: "GET",
|
|
|
|
|
+ Path: "/",
|
|
|
|
|
+ ErrorMessage: "",
|
|
|
|
|
+ IsTerm: true,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ assert.Equal(t, "[GIN] 2018/12/07 - 09:11:42 | 200 | 5s | 20.20.20.20 | GET /\n", defaultLogFormatter(termFalseParam))
|
|
|
|
|
|
|
|
|
|
+ assert.Equal(t, "[GIN] 2018/12/07 - 09:11:42 |\x1b[97;42m 200 \x1b[0m| 5s | 20.20.20.20 |\x1b[97;44m GET \x1b[0m /\n", defaultLogFormatter(termTrueParam))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func TestColorForMethod(t *testing.T) {
|
|
func TestColorForMethod(t *testing.T) {
|
|
@@ -127,7 +301,7 @@ func TestErrorLogger(t *testing.T) {
|
|
|
assert.Equal(t, "hola!{\"error\":\"this is an error\"}", w.Body.String())
|
|
assert.Equal(t, "hola!{\"error\":\"this is an error\"}", w.Body.String())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func TestSkippingPaths(t *testing.T) {
|
|
|
|
|
|
|
+func TestLoggerWithWriterSkippingPaths(t *testing.T) {
|
|
|
buffer := new(bytes.Buffer)
|
|
buffer := new(bytes.Buffer)
|
|
|
router := New()
|
|
router := New()
|
|
|
router.Use(LoggerWithWriter(buffer, "/skipped"))
|
|
router.Use(LoggerWithWriter(buffer, "/skipped"))
|
|
@@ -142,6 +316,24 @@ func TestSkippingPaths(t *testing.T) {
|
|
|
assert.Contains(t, buffer.String(), "")
|
|
assert.Contains(t, buffer.String(), "")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func TestLoggerWithConfigSkippingPaths(t *testing.T) {
|
|
|
|
|
+ buffer := new(bytes.Buffer)
|
|
|
|
|
+ router := New()
|
|
|
|
|
+ router.Use(LoggerWithConfig(LoggerConfig{
|
|
|
|
|
+ Output: buffer,
|
|
|
|
|
+ SkipPathes: []string{"/skipped"},
|
|
|
|
|
+ }))
|
|
|
|
|
+ router.GET("/logged", func(c *Context) {})
|
|
|
|
|
+ router.GET("/skipped", func(c *Context) {})
|
|
|
|
|
+
|
|
|
|
|
+ performRequest(router, "GET", "/logged")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "200")
|
|
|
|
|
+
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ performRequest(router, "GET", "/skipped")
|
|
|
|
|
+ assert.Contains(t, buffer.String(), "")
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func TestDisableConsoleColor(t *testing.T) {
|
|
func TestDisableConsoleColor(t *testing.T) {
|
|
|
New()
|
|
New()
|
|
|
assert.False(t, disableColor)
|
|
assert.False(t, disableColor)
|