10
"github.com/stretchr/testify/assert"
11
"github.com/wal-g/wal-g/internal"
12
"github.com/wal-g/wal-g/internal/compression"
13
"github.com/wal-g/wal-g/internal/compression/lz4"
14
"github.com/wal-g/wal-g/testtools"
15
"github.com/wal-g/wal-g/utility"
18
func GetLz4Compressor() compression.Compressor {
19
return compression.Compressors[lz4.AlgorithmName]
27
{"testing123456789", 16, 4},
30
func TestCascadeFileCloser(t *testing.T) {
31
for _, testCase := range tests {
32
b := &testtools.BufCloser{Buffer: bytes.NewBufferString(testCase.testString), Err: false}
33
lz := &utility.CascadeWriteCloser{
34
WriteCloser: GetLz4Compressor().NewWriter(b),
38
random := make([]byte, testCase.written)
39
_, err := rand.Read(random)
44
n, err := lz.Write(random)
45
assert.NoErrorf(t, err, "compress: CascadeWriteCloser expected `<nil>` but got %v", err)
46
assert.Equalf(t, n, testCase.written,
47
"compress: CascadeWriteCloser expected %d bytes written but got %d", testCase.written, n)
50
assert.NoErrorf(t, err, "compress: CascadeWriteCloser expected `<nil>` but got %v", err)
55
assert.Errorf(t, err, "compress: Underlying writer expected to close with error but got `<nil>`")
60
func TestCascadeFileCloserError(t *testing.T) {
61
mock := &testtools.ErrorWriteCloser{}
62
lz := &utility.CascadeWriteCloser{
63
WriteCloser: GetLz4Compressor().NewWriter(mock),
67
_, err := lz.Write([]byte{byte('a')})
68
assert.Errorf(t, err, "compress: CascadeWriteCloser expected error on write but got `<nil>`")
71
assert.Errorf(t, err, "compress: CascadeWriteCloser expected error on close but got `<nil>`")
74
func TestCompressAndEncrypt(t *testing.T) {
75
for _, testCase := range tests {
76
in := &testtools.BufCloser{Buffer: bytes.NewBufferString(testCase.testString), Err: false}
77
compressor := GetLz4Compressor()
78
compressed := internal.CompressAndEncrypt(in, compressor, nil)
80
decompressor := compression.GetDecompressorByCompressor(compressor)
81
decompressed, err := decompressor.Decompress(compressed)
85
defer decompressed.Close()
86
out := &testtools.BufCloser{Buffer: &bytes.Buffer{}, Err: false}
87
_, err = io.Copy(out, decompressed)
88
assert.NoError(t, err)
90
assert.Equalf(t, testCase.testString, out.String(),
91
"compress: CascadeWriteCloser expected '%s' to be written but got '%s'",
92
testCase.testString, out)
97
func TestCompressAndEncryptBigChunk(t *testing.T) {
98
L := 1024 * 1024 // 1Mb
101
in := &testtools.BufCloser{Buffer: bytes.NewBuffer(b), Err: false}
103
compressor := GetLz4Compressor()
104
compressed := internal.CompressAndEncrypt(in, compressor, nil)
106
decompressor := compression.GetDecompressorByCompressor(compressor)
107
decompressed, err := decompressor.Decompress(compressed)
111
defer decompressed.Close()
112
out := &testtools.BufCloser{Buffer: &bytes.Buffer{}, Err: false}
113
_, err = io.Copy(out, decompressed)
114
assert.NoError(t, err)
116
assert.Equalf(t, b, out.Bytes(), "Incorrect decompression")
120
type DelayedErrorReader struct {
125
func (er *DelayedErrorReader) Read(p []byte) (int, error) {
126
x, err := er.underlying.Read(p)
132
return 0, errors.New("mock reader: read error")
138
func testCompressAndEncryptErrorPropagation(compressor compression.Compressor, t *testing.T) {
142
in := &testtools.BufCloser{Buffer: bytes.NewBuffer(b), Err: false}
144
compressed := internal.CompressAndEncrypt(in, compressor, nil)
146
decompressor := compression.GetDecompressorByCompressor(compressor)
147
decompressed, err := decompressor.Decompress(&DelayedErrorReader{compressed, L})
148
assert.NoError(t, err)
149
_, err = io.ReadAll(decompressed)
150
assert.Errorf(t, err, "%v did not propagate error of the buffer", compressor.FileExtension())
153
func TestCompressAndEncryptErrorPropagation(t *testing.T) {
154
for _, compressor := range compression.Compressors {
155
go testCompressAndEncryptErrorPropagation(compressor, t)
159
func TestCompressAndEncryptError(t *testing.T) {
160
compressor := GetLz4Compressor()
161
compressed := internal.CompressAndEncrypt(&testtools.ErrorReader{}, compressor, nil)
163
_, err := io.ReadAll(compressed)
164
assert.Errorf(t, err, "compress: CompressingPipeWriter expected error but got `<nil>`")
165
if re, ok := err.(internal.CompressAndEncryptError); !ok {
166
t.Errorf("compress: CompressingPipeWriter expected CompressAndEncryptError but got %v", re)
170
func TestCompressAndEncryptWithNoCompression(t *testing.T) {
171
for _, testCase := range tests {
172
in := &testtools.BufCloser{Buffer: bytes.NewBufferString(testCase.testString), Err: false}
173
compressed := internal.CompressAndEncrypt(in, nil, nil)
175
decompressed := &testtools.BufCloser{Buffer: &bytes.Buffer{}, Err: false}
176
_, err := decompressed.ReadFrom(compressed)
181
assert.Equalf(t, testCase.testString, decompressed.String(),
182
"compress: CascadeWriteCloser expected '%s' to be written but got '%s'",
183
testCase.testString, decompressed)