blob: 9bc469ae54305f578131fe8e824a064ca6159e30 [file]
package zstd
import (
"bytes"
"strconv"
"testing"
)
func TestEncoderLevelFromString(t *testing.T) {
type args struct {
s string
}
tests := []struct {
name string
args args
want bool
want1 EncoderLevel
}{
{
name: "fastest",
args: args{s: "fastest"},
want: true,
want1: SpeedFastest,
},
{
name: "fastest-upper",
args: args{s: "FASTEST"},
want: true,
want1: SpeedFastest,
},
{
name: "default",
args: args{s: "default"},
want: true,
want1: SpeedDefault,
},
{
name: "default-UPPER",
args: args{s: "Default"},
want: true,
want1: SpeedDefault,
},
{
name: "invalid",
args: args{s: "invalid"},
want: false,
want1: SpeedDefault,
},
{
name: "unknown",
args: args{s: "unknown"},
want: false,
want1: SpeedDefault,
},
{
name: "empty",
args: args{s: ""},
want: false,
want1: SpeedDefault,
},
{
name: "fastest-string",
args: args{s: SpeedFastest.String()},
want: true,
want1: SpeedFastest,
},
{
name: "default-string",
args: args{s: SpeedDefault.String()},
want: true,
want1: SpeedDefault,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, got1 := EncoderLevelFromString(tt.args.s)
if got != tt.want {
t.Errorf("EncoderLevelFromString() got = %v, want %v", got, tt.want)
}
if got1 != tt.want1 {
t.Errorf("EncoderLevelFromString() got1 = %v, want %v", got1, tt.want1)
}
})
}
}
func TestEncoderLevelFromZstd(t *testing.T) {
type args struct {
level int
}
tests := []struct {
name string
args args
want EncoderLevel
}{
{
name: "level-1",
args: args{level: 1},
want: SpeedFastest,
},
{
name: "level-minus1",
args: args{level: -1},
want: SpeedFastest,
},
{
name: "level-3",
args: args{level: 3},
want: SpeedDefault,
},
{
name: "level-4",
args: args{level: 4},
want: SpeedDefault,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := EncoderLevelFromZstd(tt.args.level); got != tt.want {
t.Errorf("EncoderLevelFromZstd() = %v, want %v", got, tt.want)
}
})
}
}
func TestWindowSize(t *testing.T) {
tests := []struct {
windowSize int
err bool
}{
{1 << 9, true},
{1 << 10, false},
{(1 << 10) + 1, true},
{(1 << 10) * 3, true},
{MaxWindowSize, false},
}
for _, tt := range tests {
t.Run(strconv.Itoa(tt.windowSize), func(t *testing.T) {
var options encoderOptions
err := WithWindowSize(tt.windowSize)(&options)
if tt.err {
if err == nil {
t.Error("did not get error for invalid window size")
}
} else {
if err != nil {
t.Error("got error for valid window size")
}
if options.windowSize != tt.windowSize {
t.Error("failed to set window size")
}
}
})
}
}
func TestEncoderResetWithOptions(t *testing.T) {
var buf bytes.Buffer
enc, err := NewWriter(&buf, WithEncoderLevel(SpeedFastest), WithEncoderCRC(true))
if err != nil {
t.Fatal(err)
}
defer enc.Close()
// Test changing safe options
t.Run("change-crc", func(t *testing.T) {
err := enc.ResetWithOptions(&buf, WithEncoderCRC(false))
if err != nil {
t.Errorf("ResetWithOptions should allow changing CRC: %v", err)
}
})
t.Run("change-padding", func(t *testing.T) {
err := enc.ResetWithOptions(&buf, WithEncoderPadding(64))
if err != nil {
t.Errorf("ResetWithOptions should allow changing padding: %v", err)
}
})
// Test error when changing unsafe options
t.Run("change-level-error", func(t *testing.T) {
err := enc.ResetWithOptions(&buf, WithEncoderLevel(SpeedBestCompression))
if err == nil {
t.Error("ResetWithOptions should error when changing level")
}
})
t.Run("change-concurrency-error", func(t *testing.T) {
err := enc.ResetWithOptions(&buf, WithEncoderConcurrency(99))
if err == nil {
t.Error("ResetWithOptions should error when changing concurrency")
}
})
t.Run("change-window-error", func(t *testing.T) {
err := enc.ResetWithOptions(&buf, WithWindowSize(1<<15))
if err == nil {
t.Error("ResetWithOptions should error when changing window size")
}
})
t.Run("change-lowmem-error", func(t *testing.T) {
err := enc.ResetWithOptions(&buf, WithLowerEncoderMem(true))
if err == nil {
t.Error("ResetWithOptions should error when changing lowMem")
}
})
// Test same value is allowed
t.Run("same-level-ok", func(t *testing.T) {
err := enc.ResetWithOptions(&buf, WithEncoderLevel(SpeedFastest))
if err != nil {
t.Errorf("ResetWithOptions should allow same level: %v", err)
}
})
}
func TestEncoderDictDelete(t *testing.T) {
var buf bytes.Buffer
dictContent := []byte("test dictionary content for compression")
enc, err := NewWriter(&buf, WithEncoderDictRaw(123, dictContent))
if err != nil {
t.Fatal(err)
}
defer enc.Close()
if enc.o.dict == nil {
t.Fatal("dict should be set")
}
err = enc.ResetWithOptions(&buf, WithEncoderDictDelete())
if err != nil {
t.Fatal(err)
}
if enc.o.dict != nil {
t.Error("dict should be nil after delete")
}
}