1package getter
2
3import (
4	"io/ioutil"
5	"os"
6	"path/filepath"
7	"runtime"
8	"testing"
9	"time"
10)
11
12func TestTar(t *testing.T) {
13	mtime := time.Unix(0, 0)
14	cases := []TestDecompressCase{
15		{
16			"extended_header.tar",
17			true,
18			false,
19			[]string{"directory/", "directory/a", "directory/b"},
20			"",
21			nil,
22		},
23		{
24			"implied_dir.tar",
25			true,
26			false,
27			[]string{"directory/", "directory/sub/", "directory/sub/a", "directory/sub/b"},
28			"",
29			nil,
30		},
31		{
32			"unix_time_0.tar",
33			true,
34			false,
35			[]string{"directory/", "directory/sub/", "directory/sub/a", "directory/sub/b"},
36			"",
37			&mtime,
38		},
39	}
40
41	for i, tc := range cases {
42		cases[i].Input = filepath.Join("./testdata", "decompress-tar", tc.Input)
43	}
44
45	TestDecompressor(t, new(tarDecompressor), cases)
46}
47
48// testDecompressPermissions decompresses a directory and checks the permissions of the expanded files
49func testDecompressorPermissions(t *testing.T, d Decompressor, input string, expected map[string]int, umask os.FileMode) {
50	td, err := ioutil.TempDir("", "getter")
51	if err != nil {
52		t.Fatalf("err: %s", err)
53	}
54
55	// Destination is always joining result so that we have a new path
56	dst := filepath.Join(td, "subdir", "result")
57
58	err = d.Decompress(dst, input, true, umask)
59	if err != nil {
60		t.Fatalf("err: %s", err)
61	}
62
63	defer os.RemoveAll(dst)
64
65	for name, mode := range expected {
66		fi, err := os.Stat(filepath.Join(dst, name))
67		if err != nil {
68			t.Fatalf("err: %s", err)
69		}
70
71		real := fi.Mode()
72		if real != os.FileMode(mode) {
73			t.Fatalf("err: %s expected mode %o got %o", name, mode, real)
74		}
75	}
76}
77
78func TestDecompressTarPermissions(t *testing.T) {
79	d := new(tarDecompressor)
80	input := "./test-fixtures/decompress-tar/permissions.tar"
81
82	var expected map[string]int
83	var masked int
84
85	if runtime.GOOS == "windows" {
86		expected = map[string]int{
87			"directory/public":  0666,
88			"directory/private": 0666,
89			"directory/exec":    0666,
90			"directory/setuid":  0666,
91		}
92		masked = 0666
93	} else {
94		expected = map[string]int{
95			"directory/public":  0666,
96			"directory/private": 0600,
97			"directory/exec":    0755,
98			"directory/setuid":  040000755,
99		}
100		masked = 0755
101	}
102
103	testDecompressorPermissions(t, d, input, expected, os.FileMode(0))
104
105	expected["directory/setuid"] = masked
106	testDecompressorPermissions(t, d, input, expected, os.FileMode(060000000))
107}
108