7
7
"io/ioutil"
8
8
"os"
9
9
"path/filepath"
10
+ "strings"
10
11
"testing"
11
12
12
13
"github.com/go-kit/kit/log"
@@ -19,12 +20,21 @@ var (
19
20
testRoot = "testdata"
20
21
testRootMounted = "testdata/mounted"
21
22
testRootExtracted = "testdata/extracted"
23
+ testAbsPattern = "testdata_absolute"
22
24
)
23
25
24
26
func TestCreate (t * testing.T ) {
25
27
test .Ok (t , os .MkdirAll (testRootMounted , 0755 ))
26
28
test .Ok (t , os .MkdirAll (testRootExtracted , 0755 ))
27
- t .Cleanup (func () { os .RemoveAll (testRoot ) })
29
+
30
+ testAbs , err := ioutil .TempDir ("" , testAbsPattern )
31
+ test .Ok (t , err )
32
+ test .Equals (t , filepath .IsAbs (testAbs ), true )
33
+
34
+ t .Cleanup (func () {
35
+ os .RemoveAll (testRoot )
36
+ os .RemoveAll (testAbs )
37
+ })
28
38
29
39
for _ , tc := range []struct {
30
40
name string
@@ -44,7 +54,7 @@ func TestCreate(t *testing.T) {
44
54
name : "non-existing mount paths" ,
45
55
tgz : New (log .NewNopLogger (), testRootMounted , true , flate .DefaultCompression ),
46
56
srcs : []string {
47
- "iamnotexists " ,
57
+ "idonotexist " ,
48
58
"metoo" ,
49
59
},
50
60
written : 0 ,
@@ -53,7 +63,7 @@ func TestCreate(t *testing.T) {
53
63
{
54
64
name : "existing mount paths" ,
55
65
tgz : New (log .NewNopLogger (), testRootMounted , true , flate .DefaultCompression ),
56
- srcs : exampleFileTree (t , "gzip_create" ),
66
+ srcs : exampleFileTree (t , "gzip_create" , testRootMounted ),
57
67
written : 43 , // 3 x tmpfile in dir, 1 tmpfile
58
68
err : nil ,
59
69
},
@@ -71,12 +81,30 @@ func TestCreate(t *testing.T) {
71
81
written : 43 ,
72
82
err : nil ,
73
83
},
84
+ {
85
+ name : "absolute mount paths" ,
86
+ tgz : New (log .NewNopLogger (), testRootMounted , true , flate .DefaultCompression ),
87
+ srcs : exampleFileTree (t , "tar_create" , testAbs ),
88
+ written : 43 ,
89
+ err : nil ,
90
+ },
74
91
} {
75
- tc := tc // NOTE : https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables
92
+ tc := tc // NOTICE : https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables
76
93
t .Run (tc .name , func (t * testing.T ) {
77
94
t .Parallel ()
78
95
79
96
// Setup
97
+ var absSrcs []string
98
+ var relativeSrcs []string
99
+
100
+ for _ , src := range tc .srcs {
101
+ if strings .HasPrefix (src , "/" ) {
102
+ absSrcs = append (absSrcs , src )
103
+ } else {
104
+ relativeSrcs = append (relativeSrcs , src )
105
+ }
106
+ }
107
+
80
108
dstDir , dstDirClean := test .CreateTempDir (t , "gzip_create_archives" , testRootMounted )
81
109
t .Cleanup (dstDirClean )
82
110
@@ -91,30 +119,47 @@ func TestCreate(t *testing.T) {
91
119
return
92
120
}
93
121
122
+ // Test
123
+ for _ , src := range absSrcs {
124
+ test .Ok (t , os .RemoveAll (src ))
125
+ }
126
+
94
127
test .Exists (t , archivePath )
95
128
test .Assert (t , written == tc .written , "case %q: written bytes got %d want %v" , tc .name , written , tc .written )
96
129
97
130
_ , err = extract (tc .tgz , archivePath , extDir )
98
131
test .Ok (t , err )
99
- test .EqualDirs (t , extDir , testRootMounted , tc .srcs )
132
+ test .EqualDirs (t , extDir , testRootMounted , relativeSrcs )
133
+
134
+ for _ , src := range absSrcs {
135
+ test .Exists (t , src )
136
+ }
100
137
})
101
138
}
102
139
}
103
140
104
141
func TestExtract (t * testing.T ) {
105
142
test .Ok (t , os .MkdirAll (testRootMounted , 0755 ))
106
143
test .Ok (t , os .MkdirAll (testRootExtracted , 0755 ))
107
- t .Cleanup (func () { os .RemoveAll (testRoot ) })
144
+
145
+ testAbs , err := ioutil .TempDir ("" , testAbsPattern )
146
+ test .Ok (t , err )
147
+ test .Equals (t , filepath .IsAbs (testAbs ), true )
148
+
149
+ t .Cleanup (func () {
150
+ os .RemoveAll (testRoot )
151
+ os .RemoveAll (testAbs )
152
+ })
108
153
109
154
// Setup
110
155
tgz := New (log .NewNopLogger (), testRootMounted , false , flate .DefaultCompression )
111
156
112
157
arcDir , arcDirClean := test .CreateTempDir (t , "gzip_extract_archive" )
113
158
t .Cleanup (arcDirClean )
114
159
115
- files := exampleFileTree (t , "gzip_extract" )
160
+ files := exampleFileTree (t , "gzip_extract" , testRootMounted )
116
161
archivePath := filepath .Join (arcDir , "test.tar.gz" )
117
- _ , err : = create (tgz , files , archivePath )
162
+ _ , err = create (tgz , files , archivePath )
118
163
test .Ok (t , err )
119
164
120
165
nestedFiles := exampleNestedFileTree (t , "gzip_extract_nested" )
@@ -134,6 +179,11 @@ func TestExtract(t *testing.T) {
134
179
badArchivePath := filepath .Join (arcDir , "bad_test.tar.gz" )
135
180
test .Ok (t , ioutil .WriteFile (badArchivePath , []byte ("hello\n drone\n " ), 0644 ))
136
181
182
+ filesAbs := exampleFileTree (t , ".gzip_extract_absolute" , testAbs )
183
+ archiveAbsPath := filepath .Join (arcDir , "test_absolute.tar.gz" )
184
+ _ , err = create (tgz , filesAbs , archiveAbsPath )
185
+ test .Ok (t , err )
186
+
137
187
for _ , tc := range []struct {
138
188
name string
139
189
tgz * Archive
@@ -198,22 +248,49 @@ func TestExtract(t *testing.T) {
198
248
written : 43 ,
199
249
err : nil ,
200
250
},
251
+ {
252
+ name : "absolute mount paths" ,
253
+ tgz : New (log .NewNopLogger (), testRootMounted , true , flate .DefaultCompression ),
254
+ archivePath : archiveAbsPath ,
255
+ srcs : filesAbs ,
256
+ written : 43 ,
257
+ err : nil ,
258
+ },
201
259
} {
202
260
tc := tc // NOTE: https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables
203
261
t .Run (tc .name , func (t * testing.T ) {
204
262
t .Parallel ()
205
263
264
+ // Setup
265
+ var absSrcs []string
266
+ var relativeSrcs []string
267
+
268
+ for _ , src := range tc .srcs {
269
+ if strings .HasPrefix (src , "/" ) {
270
+ absSrcs = append (absSrcs , src )
271
+ } else {
272
+ relativeSrcs = append (relativeSrcs , src )
273
+ }
274
+ }
275
+
206
276
dstDir , dstDirClean := test .CreateTempDir (t , "gzip_extract_" + tc .name , testRootExtracted )
207
277
t .Cleanup (dstDirClean )
208
-
278
+ // Run
279
+ for _ , src := range absSrcs {
280
+ test .Ok (t , os .RemoveAll (src ))
281
+ }
209
282
written , err := extract (tc .tgz , tc .archivePath , dstDir )
210
283
if err != nil {
211
284
test .Expected (t , err , tc .err )
212
285
return
213
286
}
214
287
288
+ // Test
215
289
test .Assert (t , written == tc .written , "case %q: written bytes got %d want %v" , tc .name , written , tc .written )
216
- test .EqualDirs (t , dstDir , testRootMounted , tc .srcs )
290
+ for _ , src := range absSrcs {
291
+ test .Exists (t , src )
292
+ }
293
+ test .EqualDirs (t , dstDir , testRootMounted , relativeSrcs )
217
294
})
218
295
}
219
296
}
@@ -272,11 +349,11 @@ func extract(a *Archive, src string, dst string) (int64, error) {
272
349
273
350
// Fixtures
274
351
275
- func exampleFileTree (t * testing.T , name string ) []string {
276
- file , fileClean := test .CreateTempFile (t , name , []byte ("hello\n drone!\n " ), testRootMounted ) // 13 bytes
352
+ func exampleFileTree (t * testing.T , name string , in string ) []string {
353
+ file , fileClean := test .CreateTempFile (t , name , []byte ("hello\n drone!\n " ), in ) // 13 bytes
277
354
t .Cleanup (fileClean )
278
355
279
- dir , dirClean := test .CreateTempFilesInDir (t , name , []byte ("hello\n go!\n " ), testRootMounted ) // 10 bytes
356
+ dir , dirClean := test .CreateTempFilesInDir (t , name , []byte ("hello\n go!\n " ), in ) // 10 bytes
280
357
t .Cleanup (dirClean )
281
358
282
359
return []string {file , dir }
0 commit comments