mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-22 09:34:33 +08:00
Merge branch 'master' into pierre/size-to-params
This commit is contained in:
commit
171c2e4997
@ -39,7 +39,7 @@ func TestDebugPrint(t *testing.T) {
|
|||||||
SetMode(TestMode)
|
SetMode(TestMode)
|
||||||
debugPrint("DEBUG this!")
|
debugPrint("DEBUG this!")
|
||||||
SetMode(DebugMode)
|
SetMode(DebugMode)
|
||||||
debugPrint("these are %d %s\n", 2, "error messages")
|
debugPrint("these are %d %s", 2, "error messages")
|
||||||
SetMode(TestMode)
|
SetMode(TestMode)
|
||||||
})
|
})
|
||||||
assert.Equal(t, "[GIN-debug] these are 2 error messages\n", re)
|
assert.Equal(t, "[GIN-debug] these are 2 error messages\n", re)
|
||||||
|
@ -24,7 +24,9 @@ func TestBindWith(t *testing.T) {
|
|||||||
Foo string `form:"foo"`
|
Foo string `form:"foo"`
|
||||||
Bar string `form:"bar"`
|
Bar string `form:"bar"`
|
||||||
}
|
}
|
||||||
assert.NoError(t, c.BindWith(&obj, binding.Form))
|
captureOutput(t, func() {
|
||||||
|
assert.NoError(t, c.BindWith(&obj, binding.Form))
|
||||||
|
})
|
||||||
assert.Equal(t, "foo", obj.Bar)
|
assert.Equal(t, "foo", obj.Bar)
|
||||||
assert.Equal(t, "bar", obj.Foo)
|
assert.Equal(t, "bar", obj.Foo)
|
||||||
assert.Equal(t, 0, w.Body.Len())
|
assert.Equal(t, 0, w.Body.Len())
|
||||||
|
3
gin.go
3
gin.go
@ -355,8 +355,11 @@ func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
// This can be done by setting c.Request.URL.Path to your new target.
|
// This can be done by setting c.Request.URL.Path to your new target.
|
||||||
// Disclaimer: You can loop yourself to death with this, use wisely.
|
// Disclaimer: You can loop yourself to death with this, use wisely.
|
||||||
func (engine *Engine) HandleContext(c *Context) {
|
func (engine *Engine) HandleContext(c *Context) {
|
||||||
|
oldIndexValue := c.index
|
||||||
c.reset()
|
c.reset()
|
||||||
engine.handleHTTPRequest(c)
|
engine.handleHTTPRequest(c)
|
||||||
|
|
||||||
|
c.index = oldIndexValue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) handleHTTPRequest(c *Context) {
|
func (engine *Engine) handleHTTPRequest(c *Context) {
|
||||||
|
@ -188,15 +188,12 @@ func TestConcurrentHandleContext(t *testing.T) {
|
|||||||
})
|
})
|
||||||
router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") })
|
router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") })
|
||||||
|
|
||||||
ts := httptest.NewServer(router)
|
|
||||||
defer ts.Close()
|
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
iterations := 200
|
iterations := 200
|
||||||
wg.Add(iterations)
|
wg.Add(iterations)
|
||||||
for i := 0; i < iterations; i++ {
|
for i := 0; i < iterations; i++ {
|
||||||
go func() {
|
go func() {
|
||||||
testRequest(t, ts.URL+"/")
|
testGetRequestHandler(t, router, "/")
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
@ -217,3 +214,14 @@ func TestConcurrentHandleContext(t *testing.T) {
|
|||||||
|
|
||||||
// testRequest(t, "http://localhost:8033/example")
|
// testRequest(t, "http://localhost:8033/example")
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
func testGetRequestHandler(t *testing.T, h http.Handler, url string) {
|
||||||
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
h.ServeHTTP(w, req)
|
||||||
|
|
||||||
|
assert.Equal(t, "it worked", w.Body.String(), "resp body should match")
|
||||||
|
assert.Equal(t, 200, w.Code, "should get a 200")
|
||||||
|
}
|
||||||
|
68
gin_test.go
68
gin_test.go
@ -12,6 +12,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -25,18 +27,23 @@ func formatAsDate(t time.Time) string {
|
|||||||
|
|
||||||
func setupHTMLFiles(t *testing.T, mode string, tls bool, loadMethod func(*Engine)) *httptest.Server {
|
func setupHTMLFiles(t *testing.T, mode string, tls bool, loadMethod func(*Engine)) *httptest.Server {
|
||||||
SetMode(mode)
|
SetMode(mode)
|
||||||
router := New()
|
defer SetMode(TestMode)
|
||||||
router.Delims("{[{", "}]}")
|
|
||||||
router.SetFuncMap(template.FuncMap{
|
var router *Engine
|
||||||
"formatAsDate": formatAsDate,
|
captureOutput(t, func() {
|
||||||
})
|
router = New()
|
||||||
loadMethod(router)
|
router.Delims("{[{", "}]}")
|
||||||
router.GET("/test", func(c *Context) {
|
router.SetFuncMap(template.FuncMap{
|
||||||
c.HTML(http.StatusOK, "hello.tmpl", map[string]string{"name": "world"})
|
"formatAsDate": formatAsDate,
|
||||||
})
|
})
|
||||||
router.GET("/raw", func(c *Context) {
|
loadMethod(router)
|
||||||
c.HTML(http.StatusOK, "raw.tmpl", map[string]interface{}{
|
router.GET("/test", func(c *Context) {
|
||||||
"now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC),
|
c.HTML(http.StatusOK, "hello.tmpl", map[string]string{"name": "world"})
|
||||||
|
})
|
||||||
|
router.GET("/raw", func(c *Context) {
|
||||||
|
c.HTML(http.StatusOK, "raw.tmpl", map[string]interface{}{
|
||||||
|
"now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC),
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -488,6 +495,43 @@ func TestEngineHandleContext(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEngineHandleContextManyReEntries(t *testing.T) {
|
||||||
|
expectValue := 10000
|
||||||
|
|
||||||
|
var handlerCounter, middlewareCounter int64
|
||||||
|
|
||||||
|
r := New()
|
||||||
|
r.Use(func(c *Context) {
|
||||||
|
atomic.AddInt64(&middlewareCounter, 1)
|
||||||
|
})
|
||||||
|
r.GET("/:count", func(c *Context) {
|
||||||
|
countStr := c.Param("count")
|
||||||
|
count, err := strconv.Atoi(countStr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
n, err := c.Writer.Write([]byte("."))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, n)
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case count > 0:
|
||||||
|
c.Request.URL.Path = "/" + strconv.Itoa(count-1)
|
||||||
|
r.HandleContext(c)
|
||||||
|
}
|
||||||
|
}, func(c *Context) {
|
||||||
|
atomic.AddInt64(&handlerCounter, 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.NotPanics(t, func() {
|
||||||
|
w := performRequest(r, "GET", "/"+strconv.Itoa(expectValue-1)) // include 0 value
|
||||||
|
assert.Equal(t, 200, w.Code)
|
||||||
|
assert.Equal(t, expectValue, w.Body.Len())
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.Equal(t, int64(expectValue), handlerCounter)
|
||||||
|
assert.Equal(t, int64(expectValue), middlewareCounter)
|
||||||
|
}
|
||||||
|
|
||||||
func assertRoutePresent(t *testing.T, gotRoutes RoutesInfo, wantRoute RouteInfo) {
|
func assertRoutePresent(t *testing.T, gotRoutes RoutesInfo, wantRoute RouteInfo) {
|
||||||
for _, gotRoute := range gotRoutes {
|
for _, gotRoute := range gotRoutes {
|
||||||
if gotRoute.Path == wantRoute.Path && gotRoute.Method == wantRoute.Method {
|
if gotRoute.Path == wantRoute.Path && gotRoute.Method == wantRoute.Method {
|
||||||
|
@ -287,7 +287,7 @@ var githubAPI = []route{
|
|||||||
|
|
||||||
func TestShouldBindUri(t *testing.T) {
|
func TestShouldBindUri(t *testing.T) {
|
||||||
DefaultWriter = os.Stdout
|
DefaultWriter = os.Stdout
|
||||||
router := Default()
|
router := New()
|
||||||
|
|
||||||
type Person struct {
|
type Person struct {
|
||||||
Name string `uri:"name" binding:"required"`
|
Name string `uri:"name" binding:"required"`
|
||||||
@ -309,7 +309,7 @@ func TestShouldBindUri(t *testing.T) {
|
|||||||
|
|
||||||
func TestBindUri(t *testing.T) {
|
func TestBindUri(t *testing.T) {
|
||||||
DefaultWriter = os.Stdout
|
DefaultWriter = os.Stdout
|
||||||
router := Default()
|
router := New()
|
||||||
|
|
||||||
type Person struct {
|
type Person struct {
|
||||||
Name string `uri:"name" binding:"required"`
|
Name string `uri:"name" binding:"required"`
|
||||||
@ -331,7 +331,7 @@ func TestBindUri(t *testing.T) {
|
|||||||
|
|
||||||
func TestBindUriError(t *testing.T) {
|
func TestBindUriError(t *testing.T) {
|
||||||
DefaultWriter = os.Stdout
|
DefaultWriter = os.Stdout
|
||||||
router := Default()
|
router := New()
|
||||||
|
|
||||||
type Member struct {
|
type Member struct {
|
||||||
Number string `uri:"num" binding:"required,uuid"`
|
Number string `uri:"num" binding:"required,uuid"`
|
||||||
@ -361,7 +361,7 @@ func githubConfigRouter(router *Engine) {
|
|||||||
|
|
||||||
func TestGithubAPI(t *testing.T) {
|
func TestGithubAPI(t *testing.T) {
|
||||||
DefaultWriter = os.Stdout
|
DefaultWriter = os.Stdout
|
||||||
router := Default()
|
router := New()
|
||||||
githubConfigRouter(router)
|
githubConfigRouter(router)
|
||||||
|
|
||||||
for _, route := range githubAPI {
|
for _, route := range githubAPI {
|
||||||
@ -436,7 +436,7 @@ func BenchmarkParallelGithub(b *testing.B) {
|
|||||||
|
|
||||||
func BenchmarkParallelGithubDefault(b *testing.B) {
|
func BenchmarkParallelGithubDefault(b *testing.B) {
|
||||||
DefaultWriter = os.Stdout
|
DefaultWriter = os.Stdout
|
||||||
router := Default()
|
router := New()
|
||||||
githubConfigRouter(router)
|
githubConfigRouter(router)
|
||||||
|
|
||||||
req, _ := http.NewRequest("POST", "/repos/manucorporat/sse/git/blobs", nil)
|
req, _ := http.NewRequest("POST", "/repos/manucorporat/sse/git/blobs", nil)
|
||||||
|
@ -43,6 +43,7 @@ func TestPanicInHandler(t *testing.T) {
|
|||||||
assert.Equal(t, http.StatusInternalServerError, w.Code)
|
assert.Equal(t, http.StatusInternalServerError, w.Code)
|
||||||
assert.Contains(t, buffer.String(), "GET /recovery")
|
assert.Contains(t, buffer.String(), "GET /recovery")
|
||||||
|
|
||||||
|
SetMode(TestMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestPanicWithAbort assert that panic has been recovered even if context.Abort was used.
|
// TestPanicWithAbort assert that panic has been recovered even if context.Abort was used.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user