Skip to content

Commit

Permalink
Add unit tests for new zstd compression implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
LFrobeen committed Nov 14, 2022
1 parent e29dcb9 commit e16bec5
Showing 1 changed file with 81 additions and 21 deletions.
102 changes: 81 additions & 21 deletions pkg/v1/tarball/layer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@ import (
"bytes"
"compress/gzip"
"io"
"io/ioutil"
"os"
"testing"

"github.com/containerd/stargz-snapshotter/estargz"
"github.com/google/go-containerregistry/internal/compare"
"github.com/google/go-containerregistry/pkg/compression"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/types"
"github.com/google/go-containerregistry/pkg/v1/validate"
)
Expand All @@ -42,10 +43,19 @@ func TestLayerFromFile(t *testing.T) {
t.Fatalf("Unable to create layer from compressed tar file: %v", err)
}

tarZstdLayer, err := LayerFromFile("zstd_content.tar.zst")
if err != nil {
t.Fatalf("Unable to create layer from compressed tar file: %v", err)
}

if err := compare.Layers(tarLayer, tarGzLayer); err != nil {
t.Errorf("compare.Layers: %v", err)
}

if err := compare.Layers(tarLayer, tarZstdLayer); err != nil {
t.Errorf("compare.Layers: %v", err)
}

if err := validate.Layer(tarLayer); err != nil {
t.Errorf("validate.Layer(tarLayer): %v", err)
}
Expand All @@ -54,27 +64,38 @@ func TestLayerFromFile(t *testing.T) {
t.Errorf("validate.Layer(tarGzLayer): %v", err)
}

tarLayerDefaultCompression, err := LayerFromFile("testdata/content.tar", WithCompressionLevel(gzip.DefaultCompression))
if err != nil {
t.Fatalf("Unable to create layer with 'Default' compression from tar file: %v", err)
if err := validate.Layer(tarZstdLayer); err != nil {
t.Errorf("validate.Layer(tarZstdLayer): %v", err)
}

defaultDigest, err := tarLayerDefaultCompression.Digest()
if err != nil {
t.Fatal("Unable to generate digest with 'Default' compression", err)
getTestDigest := func(testName string, opts ...LayerOption) v1.Hash {
layer, err := LayerFromFile("testdata/content.tar", opts...)
if err != nil {
t.Fatalf("Unable to create layer with '%s' compression from tar file: %v", testName, err)
}

digest, err := layer.Digest()
if err != nil {
t.Fatalf("Unable to generate digest with '%s' compression: %v", testName, err)
}

return digest
}

tarLayerSpeedCompression, err := LayerFromFile("testdata/content.tar", WithCompressionLevel(gzip.BestSpeed))
if err != nil {
t.Fatalf("Unable to create layer with 'BestSpeed' compression from tar file: %v", err)
defaultDigest := getTestDigest("Gzip Default", WithCompressionLevel(gzip.DefaultCompression))
speedDigest := getTestDigest("Gzip BestSpeed", WithCompressionLevel(gzip.BestSpeed))
zstdDigest := getTestDigest("Zstd Default", WithCompression(compression.ZStd))
zstdDigest1 := getTestDigest("Zstd BestSpeed", WithCompression(compression.ZStd), WithCompressionLevel(1))

if defaultDigest.String() == speedDigest.String() {
t.Errorf("expected digests to differ: %s", defaultDigest.String())
}

speedDigest, err := tarLayerSpeedCompression.Digest()
if err != nil {
t.Fatal("Unable to generate digest with 'BestSpeed' compression", err)
if defaultDigest.String() == zstdDigest.String() {
t.Errorf("expected digests to differ: %s", defaultDigest.String())
}

if defaultDigest.String() == speedDigest.String() {
if defaultDigest.String() == zstdDigest1.String() {
t.Errorf("expected digests to differ: %s", defaultDigest.String())
}
}
Expand Down Expand Up @@ -172,14 +193,14 @@ func TestLayerFromOpenerReader(t *testing.T) {
setupFixtures(t)
defer teardownFixtures(t)

ucBytes, err := ioutil.ReadFile("testdata/content.tar")
ucBytes, err := os.ReadFile("testdata/content.tar")
if err != nil {
t.Fatalf("Unable to read tar file: %v", err)
}
count := 0
ucOpener := func() (io.ReadCloser, error) {
count++
return ioutil.NopCloser(bytes.NewReader(ucBytes)), nil
return io.NopCloser(bytes.NewReader(ucBytes)), nil
}
tarLayer, err := LayerFromOpener(ucOpener, WithCompressedCaching)
if err != nil {
Expand Down Expand Up @@ -209,12 +230,12 @@ func TestLayerFromOpenerReader(t *testing.T) {
t.Errorf("count = %d, wanted %d", count, cachedCount+10)
}

gzBytes, err := ioutil.ReadFile("gzip_content.tgz")
gzBytes, err := os.ReadFile("gzip_content.tgz")
if err != nil {
t.Fatalf("Unable to read tar file: %v", err)
}
gzOpener := func() (io.ReadCloser, error) {
return ioutil.NopCloser(bytes.NewReader(gzBytes)), nil
return io.NopCloser(bytes.NewReader(gzBytes)), nil
}
tarGzLayer, err := LayerFromOpener(gzOpener)
if err != nil {
Expand All @@ -224,6 +245,22 @@ func TestLayerFromOpenerReader(t *testing.T) {
if err := compare.Layers(tarLayer, tarGzLayer); err != nil {
t.Errorf("compare.Layers: %v", err)
}

zstdBytes, err := os.ReadFile("zstd_content.tar.zst")
if err != nil {
t.Fatalf("Unable to read tar file: %v", err)
}
zstdOpener := func() (io.ReadCloser, error) {
return io.NopCloser(bytes.NewReader(zstdBytes)), nil
}
tarZstdLayer, err := LayerFromOpener(zstdOpener)
if err != nil {
t.Fatalf("Unable to create layer from tar file: %v", err)
}

if err := compare.Layers(tarLayer, tarZstdLayer); err != nil {
t.Errorf("compare.Layers: %v", err)
}
}

func TestWithMediaType(t *testing.T) {
Expand Down Expand Up @@ -259,7 +296,7 @@ func TestLayerFromReader(t *testing.T) {
setupFixtures(t)
defer teardownFixtures(t)

ucBytes, err := ioutil.ReadFile("testdata/content.tar")
ucBytes, err := os.ReadFile("testdata/content.tar")
if err != nil {
t.Fatalf("Unable to read tar file: %v", err)
}
Expand All @@ -268,7 +305,7 @@ func TestLayerFromReader(t *testing.T) {
t.Fatalf("Unable to create layer from tar file: %v", err)
}

gzBytes, err := ioutil.ReadFile("gzip_content.tgz")
gzBytes, err := os.ReadFile("gzip_content.tgz")
if err != nil {
t.Fatalf("Unable to read tar file: %v", err)
}
Expand All @@ -280,6 +317,19 @@ func TestLayerFromReader(t *testing.T) {
if err := compare.Layers(tarLayer, tarGzLayer); err != nil {
t.Errorf("compare.Layers: %v", err)
}

zstdBytes, err := os.ReadFile("zstd_content.tar.zst")
if err != nil {
t.Fatalf("Unable to read tar file: %v", err)
}
tarZstdLayer, err := LayerFromReader(bytes.NewReader(zstdBytes))
if err != nil {
t.Fatalf("Unable to create layer from tar file: %v", err)
}

if err := compare.Layers(tarLayer, tarZstdLayer); err != nil {
t.Errorf("compare.Layers: %v", err)
}
}

// Compression settings matter in order for the digest, size,
Expand All @@ -291,14 +341,20 @@ func TestLayerFromReader(t *testing.T) {
func setupFixtures(t *testing.T) {
t.Helper()

setupCompressedTar(t, "gzip_content.tgz")
setupCompressedTar(t, "zstd_content.tar.zst")
}

func setupCompressedTar(t *testing.T, fileName string) {
t.Helper()
in, err := os.Open("testdata/content.tar")
if err != nil {
t.Errorf("Error setting up fixtures: %v", err)
}

defer in.Close()

out, err := os.Create("gzip_content.tgz")
out, err := os.Create(fileName)
if err != nil {
t.Errorf("Error setting up fixtures: %v", err)
}
Expand All @@ -315,7 +371,11 @@ func setupFixtures(t *testing.T) {
}

func teardownFixtures(t *testing.T) {
t.Helper()
if err := os.Remove("gzip_content.tgz"); err != nil {
t.Errorf("Error tearing down fixtures: %v", err)
}
if err := os.Remove("zstd_content.tar.zst"); err != nil {
t.Errorf("Error tearing down fixtures: %v", err)
}
}

0 comments on commit e16bec5

Please sign in to comment.