github.com/cockroachdb/pebble@v1.1.2/sstable/compression_test.go (about) 1 // Copyright 2023 The LevelDB-Go and Pebble Authors. All rights reserved. Use 2 // of this source code is governed by a BSD-style license that can be found in 3 // the LICENSE file. 4 5 package sstable 6 7 import ( 8 "encoding/binary" 9 "math/rand" 10 "testing" 11 "time" 12 13 "github.com/cockroachdb/pebble/internal/cache" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestCompressionRoundtrip(t *testing.T) { 18 seed := time.Now().UnixNano() 19 t.Logf("seed %d", seed) 20 rng := rand.New(rand.NewSource(seed)) 21 22 for compression := DefaultCompression + 1; compression < NCompression; compression++ { 23 t.Run(compression.String(), func(t *testing.T) { 24 payload := make([]byte, rng.Intn(10<<10 /* 10 KiB */)) 25 rng.Read(payload) 26 // Create a randomly-sized buffer to house the compressed output. If it's 27 // not sufficient, compressBlock should allocate one that is. 28 compressedBuf := make([]byte, rng.Intn(1<<10 /* 1 KiB */)) 29 30 btyp, compressed := compressBlock(compression, payload, compressedBuf) 31 v, err := decompressBlock(btyp, compressed) 32 require.NoError(t, err) 33 got := payload 34 if v != nil { 35 got = v.Buf() 36 require.Equal(t, payload, got) 37 cache.Free(v) 38 } 39 }) 40 } 41 } 42 43 // TestDecompressionError tests that a decompressing a value that does not 44 // decompress returns an error. 45 func TestDecompressionError(t *testing.T) { 46 rng := rand.New(rand.NewSource(1 /* fixed seed */)) 47 48 // Create a buffer to represent a faux zstd compressed block. It's prefixed 49 // with a uvarint of the appropriate length, followed by garabge. 50 fauxCompressed := make([]byte, rng.Intn(10<<10 /* 10 KiB */)) 51 compressedPayloadLen := len(fauxCompressed) - binary.MaxVarintLen64 52 n := binary.PutUvarint(fauxCompressed, uint64(compressedPayloadLen)) 53 fauxCompressed = fauxCompressed[:n+compressedPayloadLen] 54 rng.Read(fauxCompressed[n:]) 55 56 v, err := decompressBlock(zstdCompressionBlockType, fauxCompressed) 57 t.Log(err) 58 require.Error(t, err) 59 require.Nil(t, v) 60 }