178 lines
4.4 KiB
Go
178 lines
4.4 KiB
Go
package fasthttp
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"testing"
|
|
)
|
|
|
|
func TestBrotliBytesSerial(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if err := testBrotliBytes(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestBrotliBytesConcurrent(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if err := testConcurrent(10, testBrotliBytes); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func testBrotliBytes() error {
|
|
for _, s := range compressTestcases {
|
|
if err := testBrotliBytesSingleCase(s); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func testBrotliBytesSingleCase(s string) error {
|
|
prefix := []byte("foobar")
|
|
brotlipedS := AppendBrotliBytes(prefix, []byte(s))
|
|
if !bytes.Equal(brotlipedS[:len(prefix)], prefix) {
|
|
return fmt.Errorf("unexpected prefix when compressing %q: %q. Expecting %q", s, brotlipedS[:len(prefix)], prefix)
|
|
}
|
|
|
|
unbrotliedS, err := AppendUnbrotliBytes(prefix, brotlipedS[len(prefix):])
|
|
if err != nil {
|
|
return fmt.Errorf("unexpected error when uncompressing %q: %w", s, err)
|
|
}
|
|
if !bytes.Equal(unbrotliedS[:len(prefix)], prefix) {
|
|
return fmt.Errorf("unexpected prefix when uncompressing %q: %q. Expecting %q", s, unbrotliedS[:len(prefix)], prefix)
|
|
}
|
|
unbrotliedS = unbrotliedS[len(prefix):]
|
|
if string(unbrotliedS) != s {
|
|
return fmt.Errorf("unexpected uncompressed string %q. Expecting %q", unbrotliedS, s)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func TestBrotliCompressSerial(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if err := testBrotliCompress(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestBrotliCompressConcurrent(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if err := testConcurrent(10, testBrotliCompress); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func testBrotliCompress() error {
|
|
for _, s := range compressTestcases {
|
|
if err := testBrotliCompressSingleCase(s); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func testBrotliCompressSingleCase(s string) error {
|
|
var buf bytes.Buffer
|
|
zw := acquireStacklessBrotliWriter(&buf, CompressDefaultCompression)
|
|
if _, err := zw.Write([]byte(s)); err != nil {
|
|
return fmt.Errorf("unexpected error: %w. s=%q", err, s)
|
|
}
|
|
releaseStacklessBrotliWriter(zw, CompressDefaultCompression)
|
|
|
|
zr, err := acquireBrotliReader(&buf)
|
|
if err != nil {
|
|
return fmt.Errorf("unexpected error: %w. s=%q", err, s)
|
|
}
|
|
body, err := io.ReadAll(zr)
|
|
if err != nil {
|
|
return fmt.Errorf("unexpected error: %w. s=%q", err, s)
|
|
}
|
|
if string(body) != s {
|
|
return fmt.Errorf("unexpected string after decompression: %q. Expecting %q", body, s)
|
|
}
|
|
releaseBrotliReader(zr)
|
|
return nil
|
|
}
|
|
|
|
func TestCompressHandlerBrotliLevel(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
expectedBody := createFixedBody(2e4)
|
|
h := CompressHandlerBrotliLevel(func(ctx *RequestCtx) {
|
|
ctx.Write(expectedBody) //nolint:errcheck
|
|
}, CompressBrotliDefaultCompression, CompressDefaultCompression)
|
|
|
|
var ctx RequestCtx
|
|
var resp Response
|
|
|
|
// verify uncompressed response
|
|
h(&ctx)
|
|
s := ctx.Response.String()
|
|
br := bufio.NewReader(bytes.NewBufferString(s))
|
|
if err := resp.Read(br); err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
ce := resp.Header.ContentEncoding()
|
|
if len(ce) != 0 {
|
|
t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "")
|
|
}
|
|
body := resp.Body()
|
|
if !bytes.Equal(body, expectedBody) {
|
|
t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody)
|
|
}
|
|
|
|
// verify gzip-compressed response
|
|
ctx.Request.Reset()
|
|
ctx.Response.Reset()
|
|
ctx.Request.Header.Set("Accept-Encoding", "gzip, deflate, sdhc")
|
|
|
|
h(&ctx)
|
|
s = ctx.Response.String()
|
|
br = bufio.NewReader(bytes.NewBufferString(s))
|
|
if err := resp.Read(br); err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
ce = resp.Header.ContentEncoding()
|
|
if string(ce) != "gzip" {
|
|
t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "gzip")
|
|
}
|
|
body, err := resp.BodyGunzip()
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if !bytes.Equal(body, expectedBody) {
|
|
t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody)
|
|
}
|
|
|
|
// verify brotli-compressed response
|
|
ctx.Request.Reset()
|
|
ctx.Response.Reset()
|
|
ctx.Request.Header.Set("Accept-Encoding", "gzip, deflate, sdhc, br")
|
|
|
|
h(&ctx)
|
|
s = ctx.Response.String()
|
|
br = bufio.NewReader(bytes.NewBufferString(s))
|
|
if err := resp.Read(br); err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
ce = resp.Header.ContentEncoding()
|
|
if string(ce) != "br" {
|
|
t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "br")
|
|
}
|
|
body, err = resp.BodyUnbrotli()
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if !bytes.Equal(body, expectedBody) {
|
|
t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody)
|
|
}
|
|
}
|