// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package compressutil import ( "bytes" "compress/gzip" "testing" ) func TestCompressUtil_CompressDecompress(t *testing.T) { t.Parallel() tests := []struct { compressionType string compressionConfig CompressionConfig canary byte }{ { "GZIP default implicit", CompressionConfig{Type: CompressionTypeGzip}, CompressionCanaryGzip, }, { "GZIP default explicit", CompressionConfig{Type: CompressionTypeGzip, GzipCompressionLevel: gzip.DefaultCompression}, CompressionCanaryGzip, }, { "GZIP best speed", CompressionConfig{Type: CompressionTypeGzip, GzipCompressionLevel: gzip.BestSpeed}, CompressionCanaryGzip, }, { "GZIP best compression", CompressionConfig{Type: CompressionTypeGzip, GzipCompressionLevel: gzip.BestCompression}, CompressionCanaryGzip, }, { "Snappy", CompressionConfig{Type: CompressionTypeSnappy}, CompressionCanarySnappy, }, { "LZ4", CompressionConfig{Type: CompressionTypeLZ4}, CompressionCanaryLZ4, }, { "LZW", CompressionConfig{Type: CompressionTypeLZW}, CompressionCanaryLZW, }, } inputJSONBytes := []byte(`{"sample":"data","verification":"process"}`) for _, test := range tests { // Compress the input compressedJSONBytes, err := Compress(inputJSONBytes, &test.compressionConfig) if err != nil { t.Fatalf("compress error (%s): %s", test.compressionType, err) } if len(compressedJSONBytes) == 0 { t.Fatalf("failed to compress data in %s format", test.compressionType) } // Check the presence of the canary if compressedJSONBytes[0] != test.canary { t.Fatalf("bad (%s): compression canary: expected: %d actual: %d", test.compressionType, test.canary, compressedJSONBytes[0]) } decompressedJSONBytes, wasNotCompressed, err := Decompress(compressedJSONBytes) if err != nil { t.Fatalf("decompress error (%s): %s", test.compressionType, err) } // Check if the input for decompress was not compressed in the first place if wasNotCompressed { t.Fatalf("bad (%s): expected compressed bytes", test.compressionType) } if len(decompressedJSONBytes) == 0 { t.Fatalf("bad (%s): expected decompressed bytes", test.compressionType) } // Compare the value after decompression if !bytes.Equal(inputJSONBytes, decompressedJSONBytes) { t.Fatalf("bad (%s): decompressed value;\nexpected: %q\nactual: %q", test.compressionType, string(inputJSONBytes), string(decompressedJSONBytes)) } decompressedJSONBytes, compressionType, wasNotCompressed, err := DecompressWithCanary(compressedJSONBytes) if err != nil { t.Fatalf("decompress error (%s): %s", test.compressionType, err) } if compressionType != test.compressionConfig.Type { t.Fatalf("bad compressionType value;\nexpected: %q\naction: %q", test.compressionConfig.Type, compressionType) } } } func TestCompressUtil_InvalidConfigurations(t *testing.T) { t.Parallel() inputJSONBytes := []byte(`{"sample":"data","verification":"process"}`) // Test nil configuration if _, err := Compress(inputJSONBytes, nil); err == nil { t.Fatal("expected an error") } // Test invalid configuration if _, err := Compress(inputJSONBytes, &CompressionConfig{}); err == nil { t.Fatal("expected an error") } }