1package getter
2
3import (
4	"os"
5	"path/filepath"
6	"testing"
7)
8
9func TestFileGetter_impl(t *testing.T) {
10	var _ Getter = new(FileGetter)
11}
12
13func TestFileGetter(t *testing.T) {
14	g := new(FileGetter)
15	dst := tempDir(t)
16
17	// With a dir that doesn't exist
18	if err := g.Get(dst, testModuleURL("basic")); err != nil {
19		t.Fatalf("err: %s", err)
20	}
21
22	// Verify the destination folder is a symlink
23	fi, err := os.Lstat(dst)
24	if err != nil {
25		t.Fatalf("err: %s", err)
26	}
27	if fi.Mode()&os.ModeSymlink == 0 {
28		t.Fatal("destination is not a symlink")
29	}
30
31	// Verify the main file exists
32	mainPath := filepath.Join(dst, "main.tf")
33	if _, err := os.Stat(mainPath); err != nil {
34		t.Fatalf("err: %s", err)
35	}
36}
37
38func TestFileGetter_sourceFile(t *testing.T) {
39	g := new(FileGetter)
40	dst := tempDir(t)
41
42	// With a source URL that is a path to a file
43	u := testModuleURL("basic")
44	u.Path += "/main.tf"
45	if err := g.Get(dst, u); err == nil {
46		t.Fatal("should error")
47	}
48}
49
50func TestFileGetter_sourceNoExist(t *testing.T) {
51	g := new(FileGetter)
52	dst := tempDir(t)
53
54	// With a source URL that doesn't exist
55	u := testModuleURL("basic")
56	u.Path += "/main"
57	if err := g.Get(dst, u); err == nil {
58		t.Fatal("should error")
59	}
60}
61
62func TestFileGetter_dir(t *testing.T) {
63	g := new(FileGetter)
64	dst := tempDir(t)
65
66	if err := os.MkdirAll(dst, 0755); err != nil {
67		t.Fatalf("err: %s", err)
68	}
69
70	// With a dir that exists that isn't a symlink
71	if err := g.Get(dst, testModuleURL("basic")); err == nil {
72		t.Fatal("should error")
73	}
74}
75
76func TestFileGetter_dirSymlink(t *testing.T) {
77	g := new(FileGetter)
78	dst := tempDir(t)
79	dst2 := tempDir(t)
80
81	// Make parents
82	if err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil {
83		t.Fatalf("err: %s", err)
84	}
85	if err := os.MkdirAll(dst2, 0755); err != nil {
86		t.Fatalf("err: %s", err)
87	}
88
89	// Make a symlink
90	if err := os.Symlink(dst2, dst); err != nil {
91		t.Fatalf("err: %s", err)
92	}
93
94	// With a dir that exists that isn't a symlink
95	if err := g.Get(dst, testModuleURL("basic")); err != nil {
96		t.Fatalf("err: %s", err)
97	}
98
99	// Verify the main file exists
100	mainPath := filepath.Join(dst, "main.tf")
101	if _, err := os.Stat(mainPath); err != nil {
102		t.Fatalf("err: %s", err)
103	}
104}
105
106func TestFileGetter_GetFile(t *testing.T) {
107	g := new(FileGetter)
108	dst := tempTestFile(t)
109	defer os.RemoveAll(filepath.Dir(dst))
110
111	// With a dir that doesn't exist
112	if err := g.GetFile(dst, testModuleURL("basic-file/foo.txt")); err != nil {
113		t.Fatalf("err: %s", err)
114	}
115
116	// Verify the destination folder is a symlink
117	fi, err := os.Lstat(dst)
118	if err != nil {
119		t.Fatalf("err: %s", err)
120	}
121	if fi.Mode()&os.ModeSymlink == 0 {
122		t.Fatal("destination is not a symlink")
123	}
124
125	// Verify the main file exists
126	assertContents(t, dst, "Hello\n")
127}
128
129func TestFileGetter_GetFile_Copy(t *testing.T) {
130	g := new(FileGetter)
131	g.Copy = true
132
133	dst := tempTestFile(t)
134	defer os.RemoveAll(filepath.Dir(dst))
135
136	// With a dir that doesn't exist
137	if err := g.GetFile(dst, testModuleURL("basic-file/foo.txt")); err != nil {
138		t.Fatalf("err: %s", err)
139	}
140
141	// Verify the destination folder is a symlink
142	fi, err := os.Lstat(dst)
143	if err != nil {
144		t.Fatalf("err: %s", err)
145	}
146	if fi.Mode()&os.ModeSymlink != 0 {
147		t.Fatal("destination is a symlink")
148	}
149
150	// Verify the main file exists
151	assertContents(t, dst, "Hello\n")
152}
153
154// https://github.com/hashicorp/terraform/issues/8418
155func TestFileGetter_percent2F(t *testing.T) {
156	g := new(FileGetter)
157	dst := tempDir(t)
158
159	// With a dir that doesn't exist
160	if err := g.Get(dst, testModuleURL("basic%2Ftest")); err != nil {
161		t.Fatalf("err: %s", err)
162	}
163
164	// Verify the main file exists
165	mainPath := filepath.Join(dst, "main.tf")
166	if _, err := os.Stat(mainPath); err != nil {
167		t.Fatalf("err: %s", err)
168	}
169}
170
171func TestFileGetter_ClientMode_notexist(t *testing.T) {
172	g := new(FileGetter)
173
174	u := testURL("nonexistent")
175	if _, err := g.ClientMode(u); err == nil {
176		t.Fatal("expect source file error")
177	}
178}
179
180func TestFileGetter_ClientMode_file(t *testing.T) {
181	g := new(FileGetter)
182
183	// Check the client mode when pointed at a file.
184	mode, err := g.ClientMode(testModuleURL("basic-file/foo.txt"))
185	if err != nil {
186		t.Fatalf("err: %s", err)
187	}
188	if mode != ClientModeFile {
189		t.Fatal("expect ClientModeFile")
190	}
191}
192
193func TestFileGetter_ClientMode_dir(t *testing.T) {
194	g := new(FileGetter)
195
196	// Check the client mode when pointed at a directory.
197	mode, err := g.ClientMode(testModuleURL("basic"))
198	if err != nil {
199		t.Fatalf("err: %s", err)
200	}
201	if mode != ClientModeDir {
202		t.Fatal("expect ClientModeDir")
203	}
204}
205