lib/protocol: Write uncompressible messages uncompressed (#7790)
This commit is contained in:
@@ -17,6 +17,7 @@ import (
|
||||
"testing/quick"
|
||||
"time"
|
||||
|
||||
lz4 "github.com/bkaradzic/go-lz4"
|
||||
"github.com/syncthing/syncthing/lib/rand"
|
||||
"github.com/syncthing/syncthing/lib/testutils"
|
||||
)
|
||||
@@ -439,9 +440,42 @@ func testMarshal(t *testing.T, prefix string, m1, m2 message) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func TestLZ4Compression(t *testing.T) {
|
||||
c := new(rawConnection)
|
||||
func TestWriteCompressed(t *testing.T) {
|
||||
for _, random := range []bool{false, true} {
|
||||
buf := new(bytes.Buffer)
|
||||
c := &rawConnection{
|
||||
cr: &countingReader{Reader: buf},
|
||||
cw: &countingWriter{Writer: buf},
|
||||
compression: CompressionAlways,
|
||||
}
|
||||
|
||||
msg := &Response{Data: make([]byte, 10240)}
|
||||
if random {
|
||||
// This should make the message uncompressible.
|
||||
rand.Read(msg.Data)
|
||||
}
|
||||
|
||||
if err := c.writeMessage(msg); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
got, err := c.readMessage(make([]byte, 4))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !bytes.Equal(got.(*Response).Data, msg.Data) {
|
||||
t.Error("received the wrong message")
|
||||
}
|
||||
|
||||
hdr := Header{Type: c.typeOf(msg)}
|
||||
size := int64(2 + hdr.ProtoSize() + 4 + msg.ProtoSize())
|
||||
if c.cr.tot > size {
|
||||
t.Errorf("compression enlarged message from %d to %d",
|
||||
size, c.cr.tot)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestLZ4Compression(t *testing.T) {
|
||||
for i := 0; i < 10; i++ {
|
||||
dataLen := 150 + rand.Intn(150)
|
||||
data := make([]byte, dataLen)
|
||||
@@ -449,13 +483,15 @@ func TestLZ4Compression(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
comp, err := c.lz4Compress(data)
|
||||
|
||||
comp := make([]byte, lz4.CompressBound(dataLen))
|
||||
compLen, err := lz4Compress(data, comp)
|
||||
if err != nil {
|
||||
t.Errorf("compressing %d bytes: %v", dataLen, err)
|
||||
continue
|
||||
}
|
||||
|
||||
res, err := c.lz4Decompress(comp)
|
||||
res, err := lz4Decompress(comp[:compLen])
|
||||
if err != nil {
|
||||
t.Errorf("decompressing %d bytes to %d: %v", len(comp), dataLen, err)
|
||||
continue
|
||||
@@ -470,38 +506,6 @@ func TestLZ4Compression(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestStressLZ4CompressGrows(t *testing.T) {
|
||||
c := new(rawConnection)
|
||||
success := 0
|
||||
for i := 0; i < 100; i++ {
|
||||
// Create a slize that is precisely one min block size, fill it with
|
||||
// random data. This shouldn't compress at all, so will in fact
|
||||
// become larger when LZ4 does its thing.
|
||||
data := make([]byte, MinBlockSize)
|
||||
if _, err := rand.Reader.Read(data); err != nil {
|
||||
t.Fatal("randomness failure")
|
||||
}
|
||||
|
||||
comp, err := c.lz4Compress(data)
|
||||
if err != nil {
|
||||
t.Fatal("unexpected compression error: ", err)
|
||||
}
|
||||
if len(comp) < len(data) {
|
||||
// data size should grow. We must have been really unlucky in
|
||||
// the random generation, try again.
|
||||
continue
|
||||
}
|
||||
|
||||
// Putting it into the buffer pool shouldn't panic because the block
|
||||
// should come from there to begin with.
|
||||
BufferPool.Put(comp)
|
||||
success++
|
||||
}
|
||||
if success == 0 {
|
||||
t.Fatal("unable to find data that grows when compressed")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckFilename(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
|
||||
Reference in New Issue
Block a user