1// +build test unix
2
3package getter
4
5import (
6	"io/ioutil"
7	"os"
8	"path/filepath"
9	"testing"
10)
11
12// If a relative symlink is passed in as the pwd to Detect, the resulting URL
13// can have an invalid path.
14func TestFileDetector_relativeSymlink(t *testing.T) {
15	tmpDir, err := ioutil.TempDir("", "go-getter")
16	if err != nil {
17		t.Fatal(err)
18	}
19
20	defer os.RemoveAll(tmpDir)
21
22	// We may have a symlinked tmp dir,
23	// e.g. OSX uses /var -> /private/var
24	tmpDir, err = filepath.EvalSymlinks(tmpDir)
25	if err != nil {
26		t.Fatal(err)
27	}
28
29	err = os.Mkdir(filepath.Join(tmpDir, "realPWD"), 0755)
30	if err != nil {
31		t.Fatal(err)
32	}
33
34	subdir := filepath.Join(tmpDir, "subdir")
35	err = os.Mkdir(subdir, 0755)
36	if err != nil {
37		t.Fatal(err)
38	}
39
40	prevDir, err := os.Getwd()
41	if err != nil {
42		t.Fatal(err)
43	}
44	defer os.Chdir(prevDir)
45
46	err = os.Chdir(subdir)
47	if err != nil {
48		t.Fatal(err)
49	}
50
51	err = os.Symlink("../realPWD", "linkedPWD")
52	if err != nil {
53		t.Fatal(err)
54	}
55
56	// if detech doesn't fully resolve the pwd symlink, the output will be the
57	// invalid path: "file:///../modules/foo"
58	f := new(FileDetector)
59	out, ok, err := f.Detect("../modules/foo", "./linkedPWD")
60	if err != nil {
61		t.Fatalf("err: %v", err)
62	}
63	if !ok {
64		t.Fatal("not ok")
65	}
66	if out != "file://"+filepath.Join(tmpDir, "modules/foo") {
67		t.Logf("expected: %v", "file://"+filepath.Join(tmpDir, "modules/foo"))
68		t.Fatalf("bad:      %v", out)
69	}
70}
71