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 }