|
| 1 | +// Copyright 2025 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 block |
| 6 | + |
| 7 | +import ( |
| 8 | + "math/rand/v2" |
| 9 | + "testing" |
| 10 | + |
| 11 | + "github.com/cockroachdb/pebble/internal/compression" |
| 12 | + "github.com/stretchr/testify/require" |
| 13 | +) |
| 14 | + |
| 15 | +func TestCompressionStatsString(t *testing.T) { |
| 16 | + var stats CompressionStats |
| 17 | + |
| 18 | + stats.add(compression.None, CompressionStatsForSetting{CompressedBytes: 100, UncompressedBytes: 100}) |
| 19 | + require.Equal(t, "NoCompression:100/100", stats.String()) |
| 20 | + |
| 21 | + stats.add(compression.Snappy, CompressionStatsForSetting{CompressedBytes: 100, UncompressedBytes: 200}) |
| 22 | + require.Equal(t, "NoCompression:100/100,Snappy:100/200", stats.String()) |
| 23 | + |
| 24 | + stats.add(compression.Snappy, CompressionStatsForSetting{CompressedBytes: 100, UncompressedBytes: 200}) |
| 25 | + require.Equal(t, "NoCompression:100/100,Snappy:200/400", stats.String()) |
| 26 | + |
| 27 | + stats.add(compression.MinLZFastest, CompressionStatsForSetting{CompressedBytes: 1000, UncompressedBytes: 4000}) |
| 28 | + require.Equal(t, "MinLZ1:1000/4000,NoCompression:100/100,Snappy:200/400", stats.String()) |
| 29 | + |
| 30 | + stats.add(compression.ZstdLevel1, CompressionStatsForSetting{CompressedBytes: 10000, UncompressedBytes: 80000}) |
| 31 | + require.Equal(t, "MinLZ1:1000/4000,NoCompression:100/100,Snappy:200/400,ZSTD1:10000/80000", stats.String()) |
| 32 | + |
| 33 | + stats = CompressionStats{} |
| 34 | + stats.add(compression.MinLZFastest, CompressionStatsForSetting{CompressedBytes: 1000, UncompressedBytes: 4000}) |
| 35 | + require.Equal(t, "MinLZ1:1000/4000", stats.String()) |
| 36 | + |
| 37 | + stats = CompressionStats{} |
| 38 | + stats.add(compression.Snappy, CompressionStatsForSetting{CompressedBytes: 1000, UncompressedBytes: 4000}) |
| 39 | + require.Equal(t, "Snappy:1000/4000", stats.String()) |
| 40 | +} |
| 41 | + |
| 42 | +func TestCompressionStatsRoundtrip(t *testing.T) { |
| 43 | + settings := []compression.Setting{compression.None, compression.Snappy, compression.MinLZFastest, compression.ZstdLevel1, compression.ZstdLevel3} |
| 44 | + for n := 0; n < 1000; n++ { |
| 45 | + var stats CompressionStats |
| 46 | + for _, i := range rand.Perm(len(settings))[:rand.IntN(len(settings)+1)] { |
| 47 | + compressed := rand.Uint64N(1_000_000) |
| 48 | + uncompressed := compressed |
| 49 | + if settings[i] != compression.None { |
| 50 | + uncompressed += compressed * rand.Uint64N(20) / 10 |
| 51 | + } |
| 52 | + stats.add(settings[i], CompressionStatsForSetting{CompressedBytes: compressed, UncompressedBytes: uncompressed}) |
| 53 | + str := stats.String() |
| 54 | + stats2, err := ParseCompressionStats(str) |
| 55 | + require.NoError(t, err) |
| 56 | + str2 := stats2.String() |
| 57 | + require.Equal(t, str, str2) |
| 58 | + } |
| 59 | + } |
| 60 | +} |
| 61 | + |
| 62 | +func TestParseCompressionStatsUnknown(t *testing.T) { |
| 63 | + stats, err := ParseCompressionStats("MinLZ1:100/200,ZSTD9:100/500,MiddleOut10:13/150000,Magic:15/10000000") |
| 64 | + require.NoError(t, err) |
| 65 | + expected := "MinLZ1:100/200,ZSTD9:100/500,unknown:28/10150000" |
| 66 | + require.Equal(t, expected, stats.String()) |
| 67 | +} |
0 commit comments