...

Source file src/github.com/klauspost/compress/s2/lz4sconvert_test.go

Documentation: github.com/klauspost/compress/s2

     1  // Copyright (c) 2023 Klaus Post. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package s2
     6  
     7  import (
     8  	"bytes"
     9  	"encoding/binary"
    10  	"path/filepath"
    11  	"testing"
    12  
    13  	"github.com/klauspost/compress/internal/lz4ref"
    14  	"github.com/klauspost/compress/internal/snapref"
    15  )
    16  
    17  func TestLZ4sConverter_ConvertBlock(t *testing.T) {
    18  	for _, tf := range testFiles {
    19  		t.Run(tf.label, func(t *testing.T) {
    20  			if err := downloadBenchmarkFiles(t, tf.filename); err != nil {
    21  				t.Fatalf("failed to download testdata: %s", err)
    22  			}
    23  
    24  			bDir := filepath.FromSlash(*benchdataDir)
    25  			data := readFile(t, filepath.Join(bDir, tf.filename))
    26  			if n := tf.sizeLimit; 0 < n && n < len(data) {
    27  				data = data[:n]
    28  			}
    29  
    30  			lz4Data := make([]byte, lz4ref.CompressBlockBound(len(data)))
    31  			n, err := lz4ref.CompressBlockLZ4s(data, lz4Data)
    32  			if err != nil {
    33  				t.Fatal(err)
    34  			}
    35  			if n == 0 {
    36  				t.Skip("incompressible")
    37  				return
    38  			}
    39  			t.Log("input size:", len(data))
    40  			t.Log("lz4 size:", n)
    41  			lz4Data = lz4Data[:n]
    42  			s2Dst := make([]byte, binary.MaxVarintLen32, MaxEncodedLen(len(data)))
    43  			s2Dst = s2Dst[:binary.PutUvarint(s2Dst, uint64(len(data)))]
    44  			hdr := len(s2Dst)
    45  
    46  			conv := LZ4sConverter{}
    47  
    48  			szS := 0
    49  			out, n, err := conv.ConvertBlockSnappy(s2Dst, lz4Data)
    50  			if err != nil {
    51  				t.Fatal(err)
    52  			}
    53  			if n != len(data) {
    54  				t.Fatalf("length mismatch: want %d, got %d", len(data), n)
    55  			}
    56  			szS = len(out) - hdr
    57  			t.Log("lz4->snappy size:", szS)
    58  
    59  			decom, err := snapref.Decode(nil, out)
    60  			if err != nil {
    61  				t.Fatal(err)
    62  			}
    63  			if !bytes.Equal(decom, data) {
    64  				t.Errorf("output mismatch")
    65  			}
    66  
    67  			sz := 0
    68  			out, n, err = conv.ConvertBlock(s2Dst, lz4Data)
    69  			if err != nil {
    70  				t.Fatal(err)
    71  			}
    72  			if n != len(data) {
    73  				t.Fatalf("length mismatch: want %d, got %d", len(data), n)
    74  			}
    75  			sz = len(out) - hdr
    76  			t.Log("lz4->s2 size:", sz)
    77  
    78  			decom, err = Decode(nil, out)
    79  			if err != nil {
    80  				t.Fatal(err)
    81  			}
    82  			if !bytes.Equal(decom, data) {
    83  				t.Errorf("output mismatch")
    84  			}
    85  
    86  			out2 := Encode(s2Dst[:0], data)
    87  			sz2 := len(out2) - hdr
    88  			t.Log("s2 (default) size:", sz2)
    89  
    90  			out2 = EncodeBetter(s2Dst[:0], data)
    91  			sz3 := len(out2) - hdr
    92  			t.Log("s2 (better) size:", sz3)
    93  
    94  			t.Log("lz4 -> s2 bytes saved:", len(lz4Data)-sz)
    95  			t.Log("lz4 -> snappy bytes saved:", len(lz4Data)-szS)
    96  			t.Log("data -> s2 (default) bytes saved:", len(lz4Data)-sz2)
    97  			t.Log("data -> s2 (better) bytes saved:", len(lz4Data)-sz3)
    98  			t.Log("direct data -> s2 (default) compared to converted from lz4:", sz-sz2)
    99  			t.Log("direct data -> s2 (better) compared to converted from lz4:", sz-sz3)
   100  		})
   101  	}
   102  }
   103  

View as plain text