2019-05-21 05:36:23 +08:00
|
|
|
package internal
|
|
|
|
|
|
|
|
|
|
import (
|
2020-05-05 07:26:05 +08:00
|
|
|
"bytes"
|
2021-09-29 05:16:32 +08:00
|
|
|
"io"
|
2023-06-09 21:28:14 +08:00
|
|
|
"strings"
|
2019-05-21 05:36:23 +08:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
2023-04-14 23:14:55 +08:00
|
|
|
const maxDecompressionSize = 1024
|
|
|
|
|
|
2019-05-21 05:36:23 +08:00
|
|
|
func TestGzipEncodeDecode(t *testing.T) {
|
2023-06-09 21:28:14 +08:00
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(t, err)
|
2022-11-09 03:04:12 +08:00
|
|
|
dec := NewGzipDecoder()
|
2019-05-21 05:36:23 +08:00
|
|
|
|
|
|
|
|
payload, err := enc.Encode([]byte("howdy"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2023-04-14 23:14:55 +08:00
|
|
|
actual, err := dec.Decode(payload, maxDecompressionSize)
|
2019-05-21 05:36:23 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, "howdy", string(actual))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestGzipReuse(t *testing.T) {
|
2023-06-09 21:28:14 +08:00
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(t, err)
|
2022-11-09 03:04:12 +08:00
|
|
|
dec := NewGzipDecoder()
|
2019-05-21 05:36:23 +08:00
|
|
|
|
|
|
|
|
payload, err := enc.Encode([]byte("howdy"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2023-04-14 23:14:55 +08:00
|
|
|
actual, err := dec.Decode(payload, maxDecompressionSize)
|
2019-05-21 05:36:23 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, "howdy", string(actual))
|
|
|
|
|
|
|
|
|
|
payload, err = enc.Encode([]byte("doody"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2023-04-14 23:14:55 +08:00
|
|
|
actual, err = dec.Decode(payload, maxDecompressionSize)
|
2019-05-21 05:36:23 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, "doody", string(actual))
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-08 00:38:19 +08:00
|
|
|
func TestZlibEncodeDecode(t *testing.T) {
|
2023-06-09 21:28:14 +08:00
|
|
|
enc, err := NewZlibEncoder()
|
|
|
|
|
require.NoError(t, err)
|
2022-11-09 03:04:12 +08:00
|
|
|
dec := NewZlibDecoder()
|
2022-01-08 00:38:19 +08:00
|
|
|
|
|
|
|
|
payload, err := enc.Encode([]byte("howdy"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2023-04-14 23:14:55 +08:00
|
|
|
actual, err := dec.Decode(payload, maxDecompressionSize)
|
2022-01-08 00:38:19 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, "howdy", string(actual))
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-14 23:14:55 +08:00
|
|
|
func TestZlibEncodeDecodeWithTooLargeMessage(t *testing.T) {
|
2023-06-09 21:28:14 +08:00
|
|
|
enc, err := NewZlibEncoder()
|
|
|
|
|
require.NoError(t, err)
|
2023-04-14 23:14:55 +08:00
|
|
|
dec := NewZlibDecoder()
|
|
|
|
|
|
|
|
|
|
payload, err := enc.Encode([]byte("howdy"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
_, err = dec.Decode(payload, 3)
|
|
|
|
|
require.ErrorContains(t, err, "size of decoded data exceeds allowed size 3")
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-21 05:36:23 +08:00
|
|
|
func TestIdentityEncodeDecode(t *testing.T) {
|
|
|
|
|
enc := NewIdentityEncoder()
|
|
|
|
|
dec := NewIdentityDecoder()
|
|
|
|
|
|
|
|
|
|
payload, err := enc.Encode([]byte("howdy"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2023-04-14 23:14:55 +08:00
|
|
|
actual, err := dec.Decode(payload, maxDecompressionSize)
|
2019-05-21 05:36:23 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, "howdy", string(actual))
|
|
|
|
|
}
|
2020-05-05 07:26:05 +08:00
|
|
|
|
|
|
|
|
func TestStreamIdentityDecode(t *testing.T) {
|
|
|
|
|
var r bytes.Buffer
|
|
|
|
|
n, err := r.Write([]byte("howdy"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.Equal(t, 5, n)
|
|
|
|
|
|
|
|
|
|
dec, err := NewStreamContentDecoder("identity", &r)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2021-09-29 05:16:32 +08:00
|
|
|
data, err := io.ReadAll(dec)
|
2020-05-05 07:26:05 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, []byte("howdy"), data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestStreamGzipDecode(t *testing.T) {
|
2023-06-09 21:28:14 +08:00
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(t, err)
|
2020-05-05 07:26:05 +08:00
|
|
|
written, err := enc.Encode([]byte("howdy"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
w := bytes.NewBuffer(written)
|
|
|
|
|
|
|
|
|
|
dec, err := NewStreamContentDecoder("gzip", w)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
b := make([]byte, 10)
|
|
|
|
|
n, err := dec.Read(b)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.Equal(t, 5, n)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, []byte("howdy"), b[:n])
|
|
|
|
|
}
|
2023-06-09 21:28:14 +08:00
|
|
|
|
|
|
|
|
func BenchmarkGzipEncode(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 64))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewGzipDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
_, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkGzipDecode(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 64))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewGzipDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
_, err = dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkGzipEncodeDecode(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 64))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewGzipDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
|
|
|
|
|
_, err = dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkGzipEncodeBig(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 1024*1024))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewGzipDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
_, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkGzipDecodeBig(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 1024*1024))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewGzipDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
_, err = dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkGzipEncodeDecodeBig(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 1024*1024))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewGzipEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewGzipDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
|
|
|
|
|
_, err = dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkZlibEncode(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 64))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewZlibEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewZlibDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
_, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkZlibDecode(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 64))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewZlibEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewZlibDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
_, err = dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkZlibEncodeDecode(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 64))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc, err := NewZlibEncoder()
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
dec := NewZlibDecoder()
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
|
|
|
|
|
_, err = dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkIdentityEncodeDecode(b *testing.B) {
|
|
|
|
|
data := []byte(strings.Repeat("-howdy stranger-", 64))
|
|
|
|
|
dataLen := int64(len(data)) + 1
|
|
|
|
|
|
|
|
|
|
enc := NewIdentityEncoder()
|
|
|
|
|
dec := NewIdentityDecoder()
|
|
|
|
|
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
actual, err := dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
require.Equal(b, data, actual)
|
|
|
|
|
|
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
|
|
|
payload, err := enc.Encode(data)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
|
|
|
|
|
_, err = dec.Decode(payload, dataLen)
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
}
|
|
|
|
|
}
|