Skip to content

[extend #1191] Unnecessary alloc for XML, JSON, JSONP #1199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jan 14, 2019
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Merge branch 'master' of git://github.com/labstack/echo into unnecess…
…ary_allocs

# Conflicts:
#	context_test.go
  • Loading branch information
im-kulikov committed Oct 15, 2018
commit c939bc1faa363584f2e9d726dd1200bc32064edf
134 changes: 68 additions & 66 deletions context_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
"text/template"
"time"

"github.com/stretchr/testify/assert"
testify "github.com/stretchr/testify/assert"
)

type (
Expand Down Expand Up @@ -78,7 +78,7 @@ func TestContext(t *testing.T) {
rec := httptest.NewRecorder()
c := e.NewContext(req, rec).(*context)

assert := assert.New(t)
assert := testify.New(t)

// Echo
assert.Equal(e, c.Echo())
Expand All @@ -89,9 +89,9 @@ func TestContext(t *testing.T) {
// Response
assert.NotNil(c.Response())

// --------
//--------
// Render
// --------
//--------

tmpl := &Template{
templates: template.Must(template.New("hello").Parse("Hello, {{.}}!")),
Expand All @@ -111,32 +111,32 @@ func TestContext(t *testing.T) {
rec = httptest.NewRecorder()
c = e.NewContext(req, rec).(*context)
err = c.JSON(http.StatusOK, user{1, "Jon Snow"})
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, userJSON+"\n", rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(userJSON+"\n", rec.Body.String())
}

// JSON with "?pretty"
req = httptest.NewRequest(http.MethodGet, "/?pretty", nil)
rec = httptest.NewRecorder()
c = e.NewContext(req, rec).(*context)
err = c.JSON(http.StatusOK, user{1, "Jon Snow"})
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, userJSONPretty+"\n", rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(userJSONPretty+"\n", rec.Body.String())
}
req = httptest.NewRequest(http.MethodGet, "/", nil) // reset

// JSONPretty
rec = httptest.NewRecorder()
c = e.NewContext(req, rec).(*context)
err = c.JSONPretty(http.StatusOK, user{1, "Jon Snow"}, " ")
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, userJSONPretty+"\n", rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(userJSONPretty+"\n", rec.Body.String())
}

// JSON (error)
Expand All @@ -150,10 +150,10 @@ func TestContext(t *testing.T) {
c = e.NewContext(req, rec).(*context)
callback := "callback"
err = c.JSONP(http.StatusOK, callback, user{1, "Jon Snow"})
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationJavaScriptCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, callback+"("+userJSON+"\n);", rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationJavaScriptCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(callback+"("+userJSON+"\n);", rec.Body.String())
}

// XML
Expand Down Expand Up @@ -203,6 +203,7 @@ func TestContext(t *testing.T) {

t.Run("json", func(t *testing.T) {
buf.Reset()
assert := testify.New(t)

// New JSONBlob with empty indent
rec = httptest.NewRecorder()
Expand All @@ -211,15 +212,16 @@ func TestContext(t *testing.T) {
enc.SetIndent(emptyIndent, emptyIndent)
err = enc.Encode(u)
err = c.jsonBlob(http.StatusOK, user{1, "Jon Snow"}, &emptyIndent)
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, buf.String(), rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(buf.String(), rec.Body.String())
}
})

t.Run("xml", func(t *testing.T) {
buf.Reset()
assert := testify.New(t)

// New XMLBlob with empty indent
rec = httptest.NewRecorder()
Expand All @@ -228,10 +230,10 @@ func TestContext(t *testing.T) {
enc.Indent(emptyIndent, emptyIndent)
err = enc.Encode(u)
err = c.xmlBlob(http.StatusOK, user{1, "Jon Snow"}, &emptyIndent)
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationXMLCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, xml.Header+buf.String(), rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationXMLCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(xml.Header+buf.String(), rec.Body.String())
}
})
})
Expand All @@ -240,37 +242,37 @@ func TestContext(t *testing.T) {
rec = httptest.NewRecorder()
c = e.NewContext(req, rec).(*context)
data, err := json.Marshal(user{1, "Jon Snow"})
assert.NoError(t, err)
assert.NoError(err)
err = c.JSONBlob(http.StatusOK, data)
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, userJSON, rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationJSONCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(userJSON, rec.Body.String())
}

// Legacy JSONPBlob
rec = httptest.NewRecorder()
c = e.NewContext(req, rec).(*context)
callback = "callback"
data, err = json.Marshal(user{1, "Jon Snow"})
assert.NoError(t, err)
assert.NoError(err)
err = c.JSONPBlob(http.StatusOK, callback, data)
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationJavaScriptCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, callback+"("+userJSON+");", rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationJavaScriptCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(callback+"("+userJSON+");", rec.Body.String())
}

// Legacy XMLBlob
rec = httptest.NewRecorder()
c = e.NewContext(req, rec).(*context)
data, err = xml.Marshal(user{1, "Jon Snow"})
assert.NoError(t, err)
assert.NoError(err)
err = c.XMLBlob(http.StatusOK, data)
if assert.NoError(t, err) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, MIMEApplicationXMLCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(t, xml.Header+userXML, rec.Body.String())
if assert.NoError(err) {
assert.Equal(http.StatusOK, rec.Code)
assert.Equal(MIMEApplicationXMLCharsetUTF8, rec.Header().Get(HeaderContentType))
assert.Equal(xml.Header+userXML, rec.Body.String())
}

// String
Expand Down Expand Up @@ -359,7 +361,7 @@ func TestContextCookie(t *testing.T) {
rec := httptest.NewRecorder()
c := e.NewContext(req, rec).(*context)

assert := assert.New(t)
assert := testify.New(t)

// Read single
cookie, err := c.Cookie("theme")
Expand Down Expand Up @@ -404,7 +406,7 @@ func TestContextPath(t *testing.T) {
c := e.NewContext(nil, nil)
r.Find(http.MethodGet, "/users/1", c)

assert := assert.New(t)
assert := testify.New(t)

assert.Equal("/users/:id", c.Path())

Expand All @@ -421,14 +423,14 @@ func TestContextPathParam(t *testing.T) {

// ParamNames
c.SetParamNames("uid", "fid")
assert.EqualValues(t, []string{"uid", "fid"}, c.ParamNames())
testify.EqualValues(t, []string{"uid", "fid"}, c.ParamNames())

// ParamValues
c.SetParamValues("101", "501")
assert.EqualValues(t, []string{"101", "501"}, c.ParamValues())
testify.EqualValues(t, []string{"101", "501"}, c.ParamValues())

// Param
assert.Equal(t, "501", c.Param("fid"))
testify.Equal(t, "501", c.Param("fid"))
}

func TestContextFormValue(t *testing.T) {
Expand All @@ -442,13 +444,13 @@ func TestContextFormValue(t *testing.T) {
c := e.NewContext(req, nil)

// FormValue
assert.Equal(t, "Jon Snow", c.FormValue("name"))
assert.Equal(t, "[email protected]", c.FormValue("email"))
testify.Equal(t, "Jon Snow", c.FormValue("name"))
testify.Equal(t, "[email protected]", c.FormValue("email"))

// FormParams
params, err := c.FormParams()
if assert.NoError(t, err) {
assert.Equal(t, url.Values{
if testify.NoError(t, err) {
testify.Equal(t, url.Values{
"name": []string{"Jon Snow"},
"email": []string{"[email protected]"},
}, params)
Expand All @@ -464,11 +466,11 @@ func TestContextQueryParam(t *testing.T) {
c := e.NewContext(req, nil)

// QueryParam
assert.Equal(t, "Jon Snow", c.QueryParam("name"))
assert.Equal(t, "[email protected]", c.QueryParam("email"))
testify.Equal(t, "Jon Snow", c.QueryParam("name"))
testify.Equal(t, "[email protected]", c.QueryParam("email"))

// QueryParams
assert.Equal(t, url.Values{
testify.Equal(t, url.Values{
"name": []string{"Jon Snow"},
"email": []string{"[email protected]"},
}, c.QueryParams())
Expand All @@ -479,7 +481,7 @@ func TestContextFormFile(t *testing.T) {
buf := new(bytes.Buffer)
mr := multipart.NewWriter(buf)
w, err := mr.CreateFormFile("file", "test")
if assert.NoError(t, err) {
if testify.NoError(t, err) {
w.Write([]byte("test"))
}
mr.Close()
Expand All @@ -488,8 +490,8 @@ func TestContextFormFile(t *testing.T) {
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
f, err := c.FormFile("file")
if assert.NoError(t, err) {
assert.Equal(t, "test", f.Filename)
if testify.NoError(t, err) {
testify.Equal(t, "test", f.Filename)
}
}

Expand All @@ -504,8 +506,8 @@ func TestContextMultipartForm(t *testing.T) {
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
f, err := c.MultipartForm()
if assert.NoError(t, err) {
assert.NotNil(t, f)
if testify.NoError(t, err) {
testify.NotNil(t, f)
}
}

Expand All @@ -514,17 +516,17 @@ func TestContextRedirect(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/", nil)
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
assert.Equal(t, nil, c.Redirect(http.StatusMovedPermanently, "http://labstack.github.io/echo"))
assert.Equal(t, http.StatusMovedPermanently, rec.Code)
assert.Equal(t, "http://labstack.github.io/echo", rec.Header().Get(HeaderLocation))
assert.Error(t, c.Redirect(310, "http://labstack.github.io/echo"))
testify.Equal(t, nil, c.Redirect(http.StatusMovedPermanently, "http://labstack.github.io/echo"))
testify.Equal(t, http.StatusMovedPermanently, rec.Code)
testify.Equal(t, "http://labstack.github.io/echo", rec.Header().Get(HeaderLocation))
testify.Error(t, c.Redirect(310, "http://labstack.github.io/echo"))
}

func TestContextStore(t *testing.T) {
var c Context
c = new(context)
c.Set("name", "Jon Snow")
assert.Equal(t, "Jon Snow", c.Get("name"))
testify.Equal(t, "Jon Snow", c.Get("name"))
}

func TestContextHandler(t *testing.T) {
Expand All @@ -539,5 +541,5 @@ func TestContextHandler(t *testing.T) {
c := e.NewContext(nil, nil)
r.Find(http.MethodGet, "/handler", c)
c.Handler()(c)
assert.Equal(t, "handler", b.String())
testify.Equal(t, "handler", b.String())
}
You are viewing a condensed version of this merge commit. You can view the full changes here.