1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-elton

Клонировать/Скачать
context_test.go 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
vicanso Отправлено 10.02.2023 15:42 54087dd
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
// MIT License
// Copyright (c) 2020 Tree Xie
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
package elton
import (
"bytes"
"io"
"mime/multipart"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestReset(t *testing.T) {
assert := assert.New(t)
params := new(RouteParams)
params.Add("key", "value")
c := Context{
Request: httptest.NewRequest("GET", "https://aslant.site/", nil),
Response: httptest.NewRecorder(),
Committed: true,
ID: "abcd",
Route: "/users/me",
Next: func() error {
return nil
},
Params: params,
StatusCode: 200,
Body: make(map[string]string),
BodyBuffer: bytes.NewBufferString("abcd"),
RequestBody: []byte("abcd"),
m: make(map[interface{}]interface{}),
realIP: "abcd",
clientIP: "abcd",
reuseStatus: ReuseContextEnabled,
}
c.Reset()
assert.Nil(c.Request)
assert.Nil(c.Response)
assert.False(c.Committed)
assert.Equal("", c.ID)
assert.Equal("", c.Route)
assert.Nil(c.Next)
assert.Empty(params.Keys)
assert.Empty(params.Values)
assert.Equal(0, c.StatusCode)
assert.Nil(c.Body)
assert.Nil(c.BodyBuffer)
assert.Nil(c.RequestBody)
assert.Nil(c.m)
assert.Equal("", c.realIP)
assert.Equal("", c.clientIP)
assert.Equal(int32(ReuseContextEnabled), c.reuseStatus)
}
func TestContext(t *testing.T) {
data := "abcd"
assert := assert.New(t)
c := NewContext(nil, nil)
assert.NotNil(c.Params)
c.WriteHeader(http.StatusBadRequest)
assert.Equal(c.StatusCode, http.StatusBadRequest)
_, err := c.Write([]byte(data))
assert.Nil(err)
assert.Equal(data, c.BodyBuffer.String())
}
func TestRemoteAddr(t *testing.T) {
assert := assert.New(t)
req := httptest.NewRequest("GET", "https://aslant.site/", nil)
req.RemoteAddr = "192.168.1.1:7000"
c := Context{
Request: req,
}
assert.Equal("192.168.1.1", c.RemoteAddr())
}
func TestRealIP(t *testing.T) {
assert := assert.New(t)
tests := []struct {
newContext func() *Context
ip string
}{
// get from cache
{
newContext: func() *Context {
req := httptest.NewRequest("GET", "/", nil)
c := NewContext(nil, req)
c.realIP = "abc"
return c
},
ip: "abc",
},
// get from x-forwarded-for
{
newContext: func() *Context {
req := httptest.NewRequest("GET", "/", nil)
req.Header.Set(HeaderXForwardedFor, "192.0.0.1, 192.168.1.1")
c := NewContext(nil, req)
return c
},
ip: "192.0.0.1",
},
// get from x-real-ip
{
newContext: func() *Context {
req := httptest.NewRequest("GET", "/", nil)
req.Header.Set(HeaderXRealIP, "192.168.0.1")
c := NewContext(nil, req)
return c
},
ip: "192.168.0.1",
},
// get real ip from remote addr
{
newContext: func() *Context {
req := httptest.NewRequest("GET", "/", nil)
req.RemoteAddr = "192.168.1.1:7000"
c := NewContext(nil, req)
return c
},
ip: "192.168.1.1",
},
}
for _, tt := range tests {
c := tt.newContext()
assert.Equal(tt.ip, c.RealIP())
}
}
func TestGetClientIP(t *testing.T) {
assert := assert.New(t)
tests := []struct {
newContext func() *Context
ip string
}{
// get from cache
{
newContext: func() *Context {
req := httptest.NewRequest("GET", "/", nil)
c := NewContext(nil, req)
c.clientIP = "abc"
return c
},
ip: "abc",
},
// get from x-forwarded-for
{
newContext: func() *Context {
req := httptest.NewRequest("GET", "/", nil)
req.Header.Set(HeaderXForwardedFor, "192.168.1.1, 1.1.1.1, 2.2.2.2")
c := NewContext(nil, req)
return c
},
ip: "2.2.2.2",
},
// get from x-real-ip
{
newContext: func() *Context {
req := httptest.NewRequest("GET", "/", nil)
req.Header.Set(HeaderXRealIP, "1.1.1.1")
c := NewContext(nil, req)
return c
},
ip: "1.1.1.1",
},
// get by remote addr
{
newContext: func() *Context {
req := httptest.NewRequest("GET", "/", nil)
req.RemoteAddr = "192.168.1.1:7000"
c := NewContext(nil, req)
return c
},
ip: "192.168.1.1",
},
}
for _, tt := range tests {
c := tt.newContext()
assert.Equal(tt.ip, c.ClientIP())
}
}
func TestParam(t *testing.T) {
assert := assert.New(t)
c := Context{}
assert.Equal(c.Param("name"), "", "params is not initialized, it should be nil")
params := new(RouteParams)
params.Add("name", "tree.xie")
c.Params = params
assert.Equal("tree.xie", c.Param("name"))
}
func TestQueryParam(t *testing.T) {
assert := assert.New(t)
req := httptest.NewRequest("GET", "https://aslant.site/?name=tree.xie", nil)
resp := httptest.NewRecorder()
c := NewContext(resp, req)
assert.Equal("tree.xie", c.QueryParam("name"))
assert.Empty(c.QueryParam("account"))
}
func TestQuery(t *testing.T) {
assert := assert.New(t)
req := httptest.NewRequest("GET", "https://aslant.site/?name=tree.xie&type=1", nil)
c := NewContext(nil, req)
q := c.Query()
assert.Equal("tree.xie", q["name"])
assert.Equal("1", q["type"])
}
func TestSetGet(t *testing.T) {
assert := assert.New(t)
c := Context{}
value, _ := c.Get("name")
assert.Nil(value, "should return nil when store is not initialized")
c.Set("name", "tree.xie")
value, _ = c.Get("name")
assert.Equal("tree.xie", value.(string))
i := 1
c.Set("int", i)
assert.Equal(i, c.GetInt("int"))
var i64 int64 = 1
c.Set("int64", i64)
assert.Equal(i64, c.GetInt64("int64"))
s := "s"
c.Set("string", s)
assert.Equal(s, c.GetString("string"))
b := true
c.Set("bool", b)
assert.Equal(b, c.GetBool("bool"))
var f32 float32 = 1.0
c.Set("float32", f32)
assert.Equal(f32, c.GetFloat32("float32"))
f64 := 1.0
c.Set("float64", f64)
assert.Equal(f64, c.GetFloat64("float64"))
now := time.Now()
c.Set("time", now)
assert.Equal(now, c.GetTime("time"))
d := time.Second
c.Set("duration", d)
assert.Equal(d, c.GetDuration("duration"))
arr := []string{
"a",
}
c.Set("stringSlice", arr)
assert.Equal(arr, c.GetStringSlice("stringSlice"))
}
func TestGetSetHeader(t *testing.T) {
newContext := func() *Context {
req := httptest.NewRequest("GET", "/", nil)
req.Header.Set("X-Token", "abc")
resp := httptest.NewRecorder()
c := NewContext(resp, req)
return c
}
t.Run("get header from request", func(t *testing.T) {
c := newContext()
assert := assert.New(t)
assert.Equal("abc", c.GetRequestHeader("X-Token"))
})
t.Run("set header to request", func(t *testing.T) {
c := newContext()
key := "X-Request-ID"
value := "1"
assert := assert.New(t)
assert.Equal(c.GetRequestHeader(key), "", "request id should be nil before set")
c.SetRequestHeader(key, value)
assert.Equal(value, c.GetRequestHeader(key))
c.SetRequestHeader(key, "")
assert.Empty(c.GetRequestHeader(key))
})
t.Run("add header to request", func(t *testing.T) {
c := newContext()
assert := assert.New(t)
key := "X-Request-Type"
c.AddRequestHeader(key, "1")
c.AddRequestHeader(key, "2")
ids := c.Request.Header[key]
assert.Equal("1,2", strings.Join(ids, ","))
})
t.Run("set header to the response", func(t *testing.T) {
c := newContext()
assert := assert.New(t)
c.SetHeader("X-Response-Id", "1")
assert.Equal("1", c.GetHeader("X-Response-Id"))
})
t.Run("get header from response", func(t *testing.T) {
c := newContext()
assert := assert.New(t)
idc := "GZ"
key := "X-IDC"
c.SetHeader(key, idc)
assert.Equal(idc, c.GetHeader(key))
})
t.Run("get header of response", func(t *testing.T) {
c := newContext()
assert := assert.New(t)
assert.NotNil(c.Header(), "response header should not be nil")
})
t.Run("reset header", func(t *testing.T) {
c := newContext()
c.SetHeader("a", "1")
assert := assert.New(t)
c.ResetHeader()
assert.Equal(0, len(c.Header()))
})
}
func TestGetKeys(t *testing.T) {
assert := assert.New(t)
c := NewContext(nil, nil)
assert.Nil(c.getKeys())
e := New()
keys := []string{
"a",
"b",
}
ssk := &SimpleSignedKeys{
keys: keys,
}
e.SignedKeys = ssk
c.elton = e
assert.Equal(keys, c.getKeys())
}
func TestCookie(t *testing.T) {
newContext := func() *Context {
req := httptest.NewRequest("GET", "/", nil)
req.AddCookie(&http.Cookie{
Name: "a",
Value: "b",
})
resp := httptest.NewRecorder()
c := NewContext(resp, req)
return c
}
t.Run("get cookie", func(t *testing.T) {
assert := assert.New(t)
c := newContext()
cookie, err := c.Cookie("a")
assert.Nil(err, "get cookie should be successful")
assert.Equal("a", cookie.Name)
assert.Equal("b", cookie.Value)
})
t.Run("set cookie", func(t *testing.T) {
assert := assert.New(t)
c := newContext()
cookie := &http.Cookie{
Name: "a",
Value: "b",
MaxAge: 300,
Secure: true,
Path: "/",
HttpOnly: true,
}
c.AddCookie(cookie)
assert.Equal("a=b; Path=/; Max-Age=300; HttpOnly; Secure", c.GetHeader(HeaderSetCookie))
})
}
func TestSignedCookie(t *testing.T) {
sk := new(RWMutexSignedKeys)
sk.SetKeys([]string{
"secret",
})
elton := &Elton{
SignedKeys: sk,
}
t.Run("set signed cookie", func(t *testing.T) {
assert := assert.New(t)
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.elton = elton
cookie := &http.Cookie{
Name: "a",
Value: "b",
MaxAge: 300,
Secure: true,
Path: "/",
HttpOnly: true,
}
c.AddSignedCookie(cookie)
assert.Equal("a=b; Path=/; Max-Age=300; HttpOnly; Secure,a.sig=jK8pWDfgnIdsDF73KVgdXnXvk63BBCDOcaqwVjasY-0; Path=/; Max-Age=300; HttpOnly; Secure", strings.Join(c.Header()[HeaderSetCookie], ","))
})
t.Run("get signed cookie", func(t *testing.T) {
assert := assert.New(t)
req := httptest.NewRequest("GET", "https://aslant.site/?name=tree.xie&type=1", nil)
req.AddCookie(&http.Cookie{
Name: "a",
Value: "b",
})
req.AddCookie(&http.Cookie{
Name: "a.sig",
Value: "jK8pWDfgnIdsDF73KVgdXnXvk63BBCDOcaqwVjasY-0",
})
resp := httptest.NewRecorder()
c := NewContext(resp, req)
_, err := c.SignedCookie("a")
assert.Equal(ErrSignKeyIsNil, err)
c.elton = elton
cookie, err := c.SignedCookie("a")
assert.Nil(err, "signed cookie should be successful")
assert.Equal("b", cookie.Value)
})
t.Run("get signed cookie(verify fail)", func(t *testing.T) {
assert := assert.New(t)
req := httptest.NewRequest("GET", "https://aslant.site/?name=tree.xie&type=1", nil)
req.AddCookie(&http.Cookie{
Name: "a",
Value: "b",
})
req.AddCookie(&http.Cookie{
Name: "a.sig",
Value: "abcd",
})
resp := httptest.NewRecorder()
c := NewContext(resp, req)
c.elton = elton
cookie, err := c.SignedCookie("a")
assert.Equal(http.ErrNoCookie, err)
assert.Nil(cookie)
})
}
func TestSendFile(t *testing.T) {
assert := assert.New(t)
tests := []struct {
newContext func() *Context
file string
err error
}{
{
newContext: func() *Context {
c := NewContext(httptest.NewRecorder(), httptest.NewRequest("GET", "/", nil))
return c
},
file: "abc.html",
err: ErrFileNotFound,
},
{
newContext: func() *Context {
c := NewContext(httptest.NewRecorder(), httptest.NewRequest("GET", "/", nil))
return c
},
file: "docs/book.json",
},
}
for _, tt := range tests {
c := tt.newContext()
err := c.SendFile(tt.file)
assert.Equal(tt.err, err)
if err == nil {
assert.NotEmpty(c.GetHeader(HeaderContentLength))
assert.NotEmpty(c.GetHeader(HeaderLastModified))
assert.NotEmpty(c.GetHeader(HeaderContentType))
assert.NotEmpty(c.Body)
}
}
}
func TestReadFile(t *testing.T) {
assert := assert.New(t)
testData := []byte("test data")
fileName := "test.txt"
// 生成http文件上传数据
var b bytes.Buffer
w := multipart.NewWriter(&b)
fw, err := w.CreateFormFile("file", fileName)
if err != nil {
return
}
_, err = io.Copy(fw, bytes.NewReader(testData))
assert.Nil(err)
err = w.Close()
assert.Nil(err)
req := httptest.NewRequest("POST", "/", bytes.NewReader(b.Bytes()))
req.Header = http.Header{
"Content-Type": []string{
w.FormDataContentType(),
},
}
c := NewContext(httptest.NewRecorder(), req)
data, fileHeader, err := c.ReadFile("file")
assert.Nil(err)
assert.Equal(fileName, fileHeader.Filename)
assert.Equal(int64(9), fileHeader.Size)
assert.Equal(testData, data)
}
func TestHTML(t *testing.T) {
assert := assert.New(t)
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
html := "<html><body></body></html>"
c.HTML(html)
assert.Equal("text/html; charset=utf-8", resp.Header().Get(HeaderContentType))
assert.Equal(html, c.BodyBuffer.String())
}
func TestRedirect(t *testing.T) {
assert := assert.New(t)
req := httptest.NewRequest("GET", "/", nil)
resp := httptest.NewRecorder()
c := NewContext(resp, req)
err := c.Redirect(299, "")
assert.Equal(err, ErrInvalidRedirect)
url := "https://aslant.site/"
err = c.Redirect(302, url)
assert.Nil(err)
assert.Equal(url, c.GetHeader(HeaderLocation))
assert.Equal(302, c.StatusCode)
}
func TestCreate(t *testing.T) {
assert := assert.New(t)
body := "abc"
c := NewContext(nil, nil)
c.Created(body)
assert.Equal(http.StatusCreated, c.StatusCode)
assert.Equal(body, c.Body.(string))
}
func TestNoContent(t *testing.T) {
assert := assert.New(t)
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.SetHeader(HeaderContentType, "a")
c.SetHeader(HeaderContentLength, "b")
c.SetHeader(HeaderTransferEncoding, "c")
c.NoContent()
assert.Equal(http.StatusNoContent, c.StatusCode)
assert.Nil(c.Body)
assert.Nil(c.BodyBuffer)
assert.Empty(c.GetHeader(HeaderContentType))
assert.Empty(c.GetHeader(HeaderContentLength))
assert.Empty(c.GetHeader(HeaderTransferEncoding))
}
func TestMergeHeader(t *testing.T) {
assert := assert.New(t)
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
h := make(http.Header)
h.Add("a", "1")
h.Add("a", "2")
c.MergeHeader(h)
assert.Equal(h, c.Header())
}
func TestNotModified(t *testing.T) {
assert := assert.New(t)
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.Body = map[string]string{}
c.BodyBuffer = bytes.NewBufferString("abc")
c.SetHeader(HeaderContentEncoding, "gzip")
c.SetHeader(HeaderContentType, "text/html")
c.NotModified()
assert.Equal(http.StatusNotModified, c.StatusCode)
assert.Nil(c.Body)
assert.Nil(c.BodyBuffer)
assert.Empty(c.GetHeader(HeaderContentEncoding))
assert.Empty(c.GetHeader(HeaderContentType))
}
func TestCacheControl(t *testing.T) {
assert := assert.New(t)
tests := []struct {
newContext func() *Context
cacheControl string
}{
// no cache
{
newContext: func() *Context {
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.NoCache()
return c
},
cacheControl: "no-cache",
},
// no store
{
newContext: func() *Context {
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.NoStore()
return c
},
cacheControl: "no-store",
},
// max-age
{
newContext: func() *Context {
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.CacheMaxAge(time.Minute)
return c
},
cacheControl: "public, max-age=60",
},
// s-maxage
{
newContext: func() *Context {
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.CacheMaxAge(time.Minute, 10*time.Second)
return c
},
cacheControl: "public, max-age=60, s-maxage=10",
},
// private max-age
{
newContext: func() *Context {
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.PrivateCacheMaxAge(time.Minute)
return c
},
cacheControl: "private, max-age=60",
},
}
for _, tt := range tests {
c := tt.newContext()
assert.Equal(tt.cacheControl, c.GetHeader("Cache-Control"))
}
}
func TestSetContentTypeByExt(t *testing.T) {
assert := assert.New(t)
tests := []struct {
newContext func() *Context
contentType string
}{
{
newContext: func() *Context {
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.SetContentTypeByExt(".html")
return c
},
contentType: "text/html; charset=utf-8",
},
{
newContext: func() *Context {
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.SetContentTypeByExt("index.html")
return c
},
contentType: "text/html; charset=utf-8",
},
{
newContext: func() *Context {
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.SetContentTypeByExt("../abcd/index.html")
return c
},
contentType: "text/html; charset=utf-8",
},
}
for _, tt := range tests {
c := tt.newContext()
assert.Equal(tt.contentType, c.GetHeader(HeaderContentType))
}
}
func TestDisableReuse(t *testing.T) {
assert := assert.New(t)
c := &Context{}
assert.True(c.isReuse())
c.DisableReuse()
assert.False(c.isReuse())
}
func TestPush(t *testing.T) {
assert := assert.New(t)
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
err := c.Push("/a.css", nil)
assert.Equal(ErrNotSupportPush, err)
}
func TestGetCod(t *testing.T) {
assert := assert.New(t)
c := NewContext(nil, nil)
c.elton = &Elton{}
assert.Equal(c.elton, c.Elton())
}
func TestNewContext(t *testing.T) {
assert := assert.New(t)
req := httptest.NewRequest("GET", "https://aslant.site/", nil)
resp := httptest.NewRecorder()
c := NewContext(resp, req)
assert.Equal(req, c.Request)
assert.Equal(resp, c.Response)
}
func TestNewTrace(t *testing.T) {
assert := assert.New(t)
req := httptest.NewRequest("GET", "https://aslant.site/", nil)
resp := httptest.NewRecorder()
c := NewContext(resp, req)
trace := c.NewTrace()
assert.Equal(trace, c.NewTrace())
}
func TestContextPass(t *testing.T) {
assert := assert.New(t)
e := New()
another := New()
another.GET("/", func(c *Context) error {
c.BodyBuffer = bytes.NewBufferString("new data")
return nil
})
req := httptest.NewRequest("GET", "https://aslant.site/", nil)
resp := httptest.NewRecorder()
e.GET("/", func(c *Context) error {
c.Pass(another)
// the data will be ignored
c.BodyBuffer = bytes.NewBufferString("original data")
return nil
})
e.ServeHTTP(resp, req)
assert.Equal(http.StatusOK, resp.Code)
assert.Equal("new data", resp.Body.String())
}
func TestContextServerTiming(t *testing.T) {
assert := assert.New(t)
traceInfos := make(TraceInfos, 0)
traceInfos = append(traceInfos, &TraceInfo{
Name: "a",
Duration: time.Microsecond * 10,
})
traceInfos = append(traceInfos, &TraceInfo{
Name: "b",
Duration: time.Millisecond + time.Microsecond,
})
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
c.ServerTiming(traceInfos, "elton-")
assert.Equal(`elton-0;dur=0.01;desc="a",elton-1;dur=1;desc="b"`, c.GetHeader(HeaderServerTiming))
}
func TestPipe(t *testing.T) {
assert := assert.New(t)
resp := httptest.NewRecorder()
c := NewContext(resp, nil)
data := []byte("abcd")
r := bytes.NewReader(data)
written, err := c.Pipe(r)
assert.Nil(err)
assert.Equal(int64(len(data)), written)
assert.Equal(data, resp.Body.Bytes())
}
func TestContextGetTrace(t *testing.T) {
assert := assert.New(t)
req, err := http.NewRequest("GET", "/", nil)
assert.Nil(err)
c := NewContext(nil, req)
assert.NotNil(c.GetTrace())
}
func TestContextIsContext(t *testing.T) {
assert := assert.New(t)
req, err := http.NewRequest("GET", "/", nil)
assert.Nil(err)
c := NewContext(nil, req)
_, ok := c.Deadline()
assert.False(ok)
assert.Nil(c.Done())
assert.Nil(c.Err())
assert.Nil(c.Value("abc"))
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-elton.git
git@api.gitlife.ru:oschina-mirror/mirrors-elton.git
oschina-mirror
mirrors-elton
mirrors-elton
master