Path: blob/main/components/content-service/pkg/archive/tar_test.go
2499 views
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package archive56import (7"archive/tar"8"bytes"9"context"10"io/fs"11"os"12"path/filepath"13"syscall"14"testing"15)1617func TestExtractTarbal(t *testing.T) {18type file struct {19Name string20ContentSize int6421UID int22Mode int23}24tests := []struct {25Name string26Files []file27}{28{29Name: "simple-test",30Files: []file{31{"file.txt", 1024, 33333, 0644},32{"file2.txt", 1024, 33333, 4555},33},34},35{36Name: "empty-tar",37Files: []file{},38},39}4041for _, test := range tests {42t.Run(test.Name, func(t *testing.T) {43var (44buf = bytes.NewBuffer(nil)45tw = tar.NewWriter(buf)46)4748for _, file := range test.Files {49err := tw.WriteHeader(&tar.Header{50Name: file.Name,51Size: file.ContentSize,52Uid: file.UID,53Gid: file.UID,54Mode: int64(file.Mode),55Typeflag: tar.TypeReg,56})57if err != nil {58t.Fatalf("cannot prepare archive: %q", err)59}60_, err = tw.Write(make([]byte, file.ContentSize))61if err != nil {62t.Fatalf("cannot prepare archive: %q", err)63}64}65tw.Flush()66tw.Close()6768wd, err := os.MkdirTemp("", "")69defer os.RemoveAll(wd)70if err != nil {71t.Fatalf("cannot prepare test: %v", err)72}73targetFolder := filepath.Join(wd, "target")74err = os.MkdirAll(targetFolder, 0777)75if err != nil {76t.Fatalf("cannot extract tar content: %v", err)77}7879err = ExtractTarbal(context.Background(), buf, targetFolder)80if err != nil {81t.Fatalf("cannot extract tar content: %v", err)82}8384for _, file := range test.Files {85stat, err := os.Stat(filepath.Join(targetFolder, file.Name))86if err != nil {87t.Errorf("expected %s", file.Name)88continue89}90uid := stat.Sys().(*syscall.Stat_t).Uid91if uid != uint32(file.UID) {92t.Errorf("expected uid %d", file.UID)93continue94}95gid := stat.Sys().(*syscall.Stat_t).Gid96if gid != uint32(file.UID) {97t.Errorf("expected gid %d", file.UID)98continue99}100101expectedMode := stat.Mode()102testMode := fs.FileMode(file.Mode)103if expectedMode.String() != testMode.String() {104t.Errorf("expected fileMode %d but returned %v", testMode, expectedMode)105continue106}107108}109})110}111}112113114