Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/content-service/pkg/archive/tar_test.go
2499 views
1
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package archive
6
7
import (
8
"archive/tar"
9
"bytes"
10
"context"
11
"io/fs"
12
"os"
13
"path/filepath"
14
"syscall"
15
"testing"
16
)
17
18
func TestExtractTarbal(t *testing.T) {
19
type file struct {
20
Name string
21
ContentSize int64
22
UID int
23
Mode int
24
}
25
tests := []struct {
26
Name string
27
Files []file
28
}{
29
{
30
Name: "simple-test",
31
Files: []file{
32
{"file.txt", 1024, 33333, 0644},
33
{"file2.txt", 1024, 33333, 4555},
34
},
35
},
36
{
37
Name: "empty-tar",
38
Files: []file{},
39
},
40
}
41
42
for _, test := range tests {
43
t.Run(test.Name, func(t *testing.T) {
44
var (
45
buf = bytes.NewBuffer(nil)
46
tw = tar.NewWriter(buf)
47
)
48
49
for _, file := range test.Files {
50
err := tw.WriteHeader(&tar.Header{
51
Name: file.Name,
52
Size: file.ContentSize,
53
Uid: file.UID,
54
Gid: file.UID,
55
Mode: int64(file.Mode),
56
Typeflag: tar.TypeReg,
57
})
58
if err != nil {
59
t.Fatalf("cannot prepare archive: %q", err)
60
}
61
_, err = tw.Write(make([]byte, file.ContentSize))
62
if err != nil {
63
t.Fatalf("cannot prepare archive: %q", err)
64
}
65
}
66
tw.Flush()
67
tw.Close()
68
69
wd, err := os.MkdirTemp("", "")
70
defer os.RemoveAll(wd)
71
if err != nil {
72
t.Fatalf("cannot prepare test: %v", err)
73
}
74
targetFolder := filepath.Join(wd, "target")
75
err = os.MkdirAll(targetFolder, 0777)
76
if err != nil {
77
t.Fatalf("cannot extract tar content: %v", err)
78
}
79
80
err = ExtractTarbal(context.Background(), buf, targetFolder)
81
if err != nil {
82
t.Fatalf("cannot extract tar content: %v", err)
83
}
84
85
for _, file := range test.Files {
86
stat, err := os.Stat(filepath.Join(targetFolder, file.Name))
87
if err != nil {
88
t.Errorf("expected %s", file.Name)
89
continue
90
}
91
uid := stat.Sys().(*syscall.Stat_t).Uid
92
if uid != uint32(file.UID) {
93
t.Errorf("expected uid %d", file.UID)
94
continue
95
}
96
gid := stat.Sys().(*syscall.Stat_t).Gid
97
if gid != uint32(file.UID) {
98
t.Errorf("expected gid %d", file.UID)
99
continue
100
}
101
102
expectedMode := stat.Mode()
103
testMode := fs.FileMode(file.Mode)
104
if expectedMode.String() != testMode.String() {
105
t.Errorf("expected fileMode %d but returned %v", testMode, expectedMode)
106
continue
107
}
108
109
}
110
})
111
}
112
}
113
114