fiber/client/response_test.go
Juan Calderon-Perez 0379cc59aa
fix: Inconsistent and flaky unit-tests (#2892)
* Fixes for some of the failing tests

* Add readiness check to serverStart()

* Use net/http client for tests listen test

* Use different key for this test

* Run Proxy Middleware tests in parallel. Add nil checks for potential issues pointed by nilaway

* Enable parallel client tests

* Do not run timing sensitive tests in parallel

* Remove TODO

* Revert Test_Proxy_DoTimeout_Timeout, and remove t.Parallel() for it

* Do not calculate favicon len on each handler call

* Revert logic change

* Increase timeout of SaveFile tests

* Do not run time sensitive tests in parallel

* The Agent can't be run in parallel

* Do not run time sensitive tests in parallel

* Fixes based on uber/nilaway

* Revert change to Client test

* Run parallel

* Update client_test.go

* Update client_test.go

* Update cache_test.go

* Update cookiejar_test.go

* Remove parallel for test using timeouts

* Remove t.Parallel() from logger middleware tests

* Do not use testify.require in a goroutine

* Fix import, and update golangci-lint

* Remove changes to template_chain.go

* Run more tests in parallel

* Add more parallel tests

* Add more parallel tests

* SetLogger can't run in parallel

* Run more tests in parallel, fix issue with goroutine in limiter middleware

* Update internal/storage/memory, add more benchmarks

* Increase sleep for csrf test by 100 milliseconds. Implement asserted and parallel benchmarks for Session middleware

* Add 100 milliseconds to sleep during test

* Revert name change

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

* fix: Inconsistent and flaky unit-tests

---------

Co-authored-by: M. Efe Çetin <efectn@protonmail.com>
Co-authored-by: René <rene@gofiber.io>
2024-03-08 20:03:13 +01:00

420 lines
8.1 KiB
Go

package client
import (
"bytes"
"crypto/tls"
"encoding/xml"
"io"
"net"
"os"
"testing"
"github.com/gofiber/fiber/v3/internal/tlstest"
"github.com/gofiber/fiber/v3"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_Response_Status(t *testing.T) {
t.Parallel()
setupApp := func() *testServer {
server := startTestServer(t, func(app *fiber.App) {
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("foo")
})
app.Get("/fail", func(c fiber.Ctx) error {
return c.SendStatus(407)
})
})
return server
}
t.Run("success", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example")
require.NoError(t, err)
require.Equal(t, "OK", resp.Status())
resp.Close()
})
t.Run("fail", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example/fail")
require.NoError(t, err)
require.Equal(t, "Proxy Authentication Required", resp.Status())
resp.Close()
})
}
func Test_Response_Status_Code(t *testing.T) {
t.Parallel()
setupApp := func() *testServer {
server := startTestServer(t, func(app *fiber.App) {
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("foo")
})
app.Get("/fail", func(c fiber.Ctx) error {
return c.SendStatus(407)
})
})
return server
}
t.Run("success", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example")
require.NoError(t, err)
require.Equal(t, 200, resp.StatusCode())
resp.Close()
})
t.Run("fail", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example/fail")
require.NoError(t, err)
require.Equal(t, 407, resp.StatusCode())
resp.Close()
})
}
func Test_Response_Protocol(t *testing.T) {
t.Parallel()
t.Run("http", func(t *testing.T) {
t.Parallel()
server := startTestServer(t, func(app *fiber.App) {
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("foo")
})
})
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example")
require.NoError(t, err)
require.Equal(t, "HTTP/1.1", resp.Protocol())
resp.Close()
})
t.Run("https", func(t *testing.T) {
t.Parallel()
serverTLSConf, clientTLSConf, err := tlstest.GetTLSConfigs()
require.NoError(t, err)
ln, err := net.Listen(fiber.NetworkTCP4, "127.0.0.1:0")
require.NoError(t, err)
ln = tls.NewListener(ln, serverTLSConf)
app := fiber.New()
app.Get("/", func(c fiber.Ctx) error {
return c.SendString(c.Scheme())
})
go func() {
assert.NoError(t, app.Listener(ln, fiber.ListenConfig{
DisableStartupMessage: true,
}))
}()
client := New()
resp, err := client.SetTLSConfig(clientTLSConf).Get("https://" + ln.Addr().String())
require.NoError(t, err)
require.Equal(t, clientTLSConf, client.TLSConfig())
require.Equal(t, fiber.StatusOK, resp.StatusCode())
require.Equal(t, "https", resp.String())
require.Equal(t, "HTTP/1.1", resp.Protocol())
resp.Close()
})
}
func Test_Response_Header(t *testing.T) {
t.Parallel()
server := startTestServer(t, func(app *fiber.App) {
app.Get("/", func(c fiber.Ctx) error {
c.Response().Header.Add("foo", "bar")
return c.SendString("helo world")
})
})
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com")
require.NoError(t, err)
require.Equal(t, "bar", resp.Header("foo"))
resp.Close()
}
func Test_Response_Cookie(t *testing.T) {
t.Parallel()
server := startTestServer(t, func(app *fiber.App) {
app.Get("/", func(c fiber.Ctx) error {
c.Cookie(&fiber.Cookie{
Name: "foo",
Value: "bar",
})
return c.SendString("helo world")
})
})
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com")
require.NoError(t, err)
require.Equal(t, "bar", string(resp.Cookies()[0].Value()))
resp.Close()
}
func Test_Response_Body(t *testing.T) {
t.Parallel()
setupApp := func() *testServer {
server := startTestServer(t, func(app *fiber.App) {
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("hello world")
})
app.Get("/json", func(c fiber.Ctx) error {
return c.SendString("{\"status\":\"success\"}")
})
app.Get("/xml", func(c fiber.Ctx) error {
return c.SendString("<status><name>success</name></status>")
})
})
return server
}
t.Run("raw body", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com")
require.NoError(t, err)
require.Equal(t, []byte("hello world"), resp.Body())
resp.Close()
})
t.Run("string body", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com")
require.NoError(t, err)
require.Equal(t, "hello world", resp.String())
resp.Close()
})
t.Run("json body", func(t *testing.T) {
t.Parallel()
type body struct {
Status string `json:"status"`
}
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com/json")
require.NoError(t, err)
tmp := &body{}
err = resp.JSON(tmp)
require.NoError(t, err)
require.Equal(t, "success", tmp.Status)
resp.Close()
})
t.Run("xml body", func(t *testing.T) {
t.Parallel()
type body struct {
Name xml.Name `xml:"status"`
Status string `xml:"name"`
}
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com/xml")
require.NoError(t, err)
tmp := &body{}
err = resp.XML(tmp)
require.NoError(t, err)
require.Equal(t, "success", tmp.Status)
resp.Close()
})
}
func Test_Response_Save(t *testing.T) {
t.Parallel()
setupApp := func() *testServer {
server := startTestServer(t, func(app *fiber.App) {
app.Get("/json", func(c fiber.Ctx) error {
return c.SendString("{\"status\":\"success\"}")
})
})
return server
}
t.Run("file path", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com/json")
require.NoError(t, err)
err = resp.Save("./test/tmp.json")
require.NoError(t, err)
defer func() {
_, err := os.Stat("./test/tmp.json")
require.NoError(t, err)
err = os.RemoveAll("./test")
require.NoError(t, err)
}()
file, err := os.Open("./test/tmp.json")
require.NoError(t, err)
defer func(file *os.File) {
err := file.Close()
require.NoError(t, err)
}(file)
data, err := io.ReadAll(file)
require.NoError(t, err)
require.Equal(t, "{\"status\":\"success\"}", string(data))
})
t.Run("io.Writer", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com/json")
require.NoError(t, err)
buf := &bytes.Buffer{}
err = resp.Save(buf)
require.NoError(t, err)
require.Equal(t, "{\"status\":\"success\"}", buf.String())
})
t.Run("error type", func(t *testing.T) {
t.Parallel()
server := setupApp()
defer server.stop()
client := New().SetDial(server.dial())
resp, err := AcquireRequest().
SetClient(client).
Get("http://example.com/json")
require.NoError(t, err)
err = resp.Save(nil)
require.Error(t, err)
})
}