f67d7a90c4
*gin.Context implements standard context.Context methods, but always returns data as context is still valid. Since Go 1.7, http.Request now contains a context.Context object, which can be controlled by the http.Server to indicates that the context is now closed, and persue of request should be canceled. This implements the propagation of http.Request context methods inside gin.Context to have HTTP context cancelation information at gin.Context level. Signed-off-by: Romain Beuque <romain.beuque@corp.ovh.com>
77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
// Copyright 2018 Gin Core Team. All rights reserved.
|
|
// Use of this source code is governed by a MIT style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build go1.7
|
|
|
|
package gin
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// Tests that the response is serialized as JSON
|
|
// and Content-Type is set to application/json
|
|
// and special HTML characters are preserved
|
|
func TestContextRenderPureJSON(t *testing.T) {
|
|
w := httptest.NewRecorder()
|
|
c, _ := CreateTestContext(w)
|
|
c.PureJSON(http.StatusCreated, H{"foo": "bar", "html": "<b>"})
|
|
assert.Equal(t, http.StatusCreated, w.Code)
|
|
assert.Equal(t, "{\"foo\":\"bar\",\"html\":\"<b>\"}\n", w.Body.String())
|
|
assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type"))
|
|
}
|
|
|
|
func TestContextHTTPContext(t *testing.T) {
|
|
c, _ := CreateTestContext(httptest.NewRecorder())
|
|
req, _ := http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
|
|
ctx, cancelFunc := context.WithCancel(context.Background())
|
|
defer cancelFunc()
|
|
c.Request = req.WithContext(ctx)
|
|
|
|
assert.NoError(t, c.Err())
|
|
assert.NotNil(t, c.Done())
|
|
select {
|
|
case <-c.Done():
|
|
assert.Fail(t, "context should not be canceled")
|
|
default:
|
|
}
|
|
|
|
ti, ok := c.Deadline()
|
|
assert.Equal(t, ti, time.Time{})
|
|
assert.False(t, ok)
|
|
assert.Equal(t, c.Value(0), c.Request)
|
|
|
|
cancelFunc()
|
|
assert.NotNil(t, c.Done())
|
|
select {
|
|
case <-c.Done():
|
|
default:
|
|
assert.Fail(t, "context should be canceled")
|
|
}
|
|
}
|
|
|
|
func TestContextHTTPContextWithDeadline(t *testing.T) {
|
|
c, _ := CreateTestContext(httptest.NewRecorder())
|
|
req, _ := http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
|
|
location, _ := time.LoadLocation("Europe/Paris")
|
|
assert.NotNil(t, location)
|
|
date := time.Date(2031, 12, 27, 16, 00, 00, 00, location)
|
|
ctx, cancelFunc := context.WithDeadline(context.Background(), date)
|
|
defer cancelFunc()
|
|
c.Request = req.WithContext(ctx)
|
|
|
|
assert.NoError(t, c.Err())
|
|
|
|
ti, ok := c.Deadline()
|
|
assert.Equal(t, ti, date)
|
|
assert.True(t, ok)
|
|
}
|