github.com/kubeshop/testkube@v1.17.23/pkg/archive/tarball_test.go (about)

     1  package archive
     2  
     3  import (
     4  	"archive/tar"
     5  	"bytes"
     6  	"compress/gzip"
     7  	"io"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  func TestTarball_Extract(t *testing.T) {
    15  	t.Parallel()
    16  
    17  	// create a test tarball
    18  	var buf bytes.Buffer
    19  	tarball := NewTarballService()
    20  	content := "testfile\n"
    21  	files := []*File{
    22  		{Name: "testfile.txt", Mode: 0644, Size: 9, ModTime: time.Now(), Data: bytes.NewBufferString(content)},
    23  		{Name: "../hack.txt", Mode: 0644, Size: 9, ModTime: time.Now(), Data: bytes.NewBufferString(content)},
    24  	}
    25  	if err := tarball.Create(&buf, files); err != nil {
    26  		t.Fatalf("error creating tarball: %v", err)
    27  	}
    28  
    29  	files, err := tarball.Extract(&buf)
    30  	if err != nil {
    31  		t.Fatalf("Extract() error: %v", err)
    32  	}
    33  	assert.Equalf(t, "testfile.txt", files[0].Name, "Extract() returned file with name %s, expected testfile.txt", files[0].Name)
    34  	assert.Equalf(t, int64(0644), files[0].Mode, "Extract() returned file with mode %o, expected 0644", files[0].Mode)
    35  	if files[0].Mode != 0644 {
    36  		t.Fatalf("Extract() returned file with mode %o, expected 0644", files[0].Mode)
    37  	}
    38  	assert.Equalf(t, int64(len(content)), files[0].Size, "Extract() returned file with size %d, expected %d", files[0].Size, len(content))
    39  	if files[0].ModTime.IsZero() {
    40  		t.Fatalf("Extract() returned file with zero modtime")
    41  	}
    42  	assert.Equalf(t, content, files[0].Data.String(), "Extract() returned file with content %s, expected %s", files[0].Data.String(), content)
    43  	// assert extracted filepaths are sanitized
    44  	assert.Equalf(t, "hack.txt", files[1].Name, "filepath is not sanitized: %s", files[1].Name)
    45  	// assert there are 2 files in the tarball
    46  	assert.Lenf(t, files, 2, "Extract() returned %d files, expected 2", len(files))
    47  
    48  }
    49  
    50  func TestTarball_Create(t *testing.T) {
    51  	t.Parallel()
    52  
    53  	files := []*File{
    54  		{Name: "testfile.txt", Mode: 0644, Size: 9, ModTime: time.Now(), Data: bytes.NewBufferString("testdata\n")},
    55  	}
    56  
    57  	var buf bytes.Buffer
    58  	tarball := NewTarballService()
    59  	if err := tarball.Create(&buf, files); err != nil {
    60  		t.Fatalf("error creating tarball: %v", err)
    61  	}
    62  
    63  	// read the tarball back
    64  	gzipReader, err := gzip.NewReader(&buf)
    65  	if err != nil {
    66  		t.Fatalf("error creating gzip reader: %v", err)
    67  	}
    68  	tr := tar.NewReader(gzipReader)
    69  	header, err := tr.Next()
    70  	if err != nil {
    71  		t.Fatalf("error reading tarball: %v", err)
    72  	}
    73  	assert.Equalf(t, "testfile.txt", header.Name, "unexpected file in tarball: %s", header.Name)
    74  	assert.Equalf(t, int64(0644), header.Mode, "unexpected file mode in tarball: %o", header.Mode)
    75  	assert.Equalf(t, int64(9), header.Size, "unexpected file size in tarball: %d", header.Size)
    76  
    77  	//buf.Reset()
    78  	var decoded bytes.Buffer
    79  	if _, err = io.Copy(&decoded, tr); err != nil {
    80  		t.Fatalf("error copying tarball contents: %v", err)
    81  	}
    82  	assert.Equalf(t, "testdata\n", decoded.String(), "unexpected file contents in tarball: %s", decoded.String())
    83  }