diff options
Diffstat (limited to 'src/pkg/path/filepath/path_test.go')
-rw-r--r-- | src/pkg/path/filepath/path_test.go | 147 |
1 files changed, 140 insertions, 7 deletions
diff --git a/src/pkg/path/filepath/path_test.go b/src/pkg/path/filepath/path_test.go index 8f887f00b..b3b6eb5ab 100644 --- a/src/pkg/path/filepath/path_test.go +++ b/src/pkg/path/filepath/path_test.go @@ -9,6 +9,7 @@ import ( "path/filepath" "reflect" "runtime" + "strings" "testing" ) @@ -68,7 +69,7 @@ var cleantests = []PathTest{ func TestClean(t *testing.T) { for _, test := range cleantests { - if s := filepath.Clean(test.path); s != test.result { + if s := filepath.ToSlash(filepath.Clean(test.path)); s != test.result { t.Errorf("Clean(%q) = %q, want %q", test.path, s, test.result) } } @@ -161,6 +162,14 @@ var jointests = []JoinTest{ {[]string{"", ""}, ""}, } +var winjointests = []JoinTest{ + {[]string{`directory`, `file`}, `directory\file`}, + {[]string{`C:\Windows\`, `System32`}, `C:\Windows\System32`}, + {[]string{`C:\Windows\`, ``}, `C:\Windows`}, + {[]string{`C:\`, `Windows`}, `C:\Windows`}, + {[]string{`C:`, `Windows`}, `C:\Windows`}, +} + // join takes a []string and passes it to Join. func join(elem []string, args ...string) string { args = elem @@ -168,8 +177,11 @@ func join(elem []string, args ...string) string { } func TestJoin(t *testing.T) { + if runtime.GOOS == "windows" { + jointests = append(jointests, winjointests...) + } for _, test := range jointests { - if p := join(test.elem); p != test.path { + if p := join(test.elem); p != filepath.FromSlash(test.path) { t.Errorf("join(%q) = %q, want %q", test.elem, p, test.path) } } @@ -237,7 +249,7 @@ func walkTree(n *Node, path string, f func(path string, n *Node)) { func makeTree(t *testing.T) { walkTree(tree, tree.name, func(path string, n *Node) { if n.entries == nil { - fd, err := os.Open(path, os.O_CREAT, 0660) + fd, err := os.Create(path) if err != nil { t.Errorf("makeTree: %v", err) } @@ -261,6 +273,7 @@ func checkMarks(t *testing.T) { // Assumes that each node name is unique. Good enough for a test. func mark(name string) { + name = filepath.ToSlash(name) walkTree(tree, tree.name, func(path string, n *Node) { if n.name == name { n.mark++ @@ -302,7 +315,7 @@ func TestWalk(t *testing.T) { } checkMarks(t) - if os.Getuid() != 0 { + if os.Getuid() > 0 { // introduce 2 errors: chmod top-level directories to 0 os.Chmod(filepath.Join(tree.name, tree.entries[1].name), 0) os.Chmod(filepath.Join(tree.name, tree.entries[3].name), 0) @@ -361,7 +374,7 @@ var basetests = []PathTest{ func TestBase(t *testing.T) { for _, test := range basetests { - if s := filepath.Base(test.path); s != test.result { + if s := filepath.ToSlash(filepath.Base(test.path)); s != test.result { t.Errorf("Base(%q) = %q, want %q", test.path, s, test.result) } } @@ -372,7 +385,7 @@ type IsAbsTest struct { isAbs bool } -var isAbsTests = []IsAbsTest{ +var isabstests = []IsAbsTest{ {"", false}, {"/", true}, {"/usr/bin/gcc", true}, @@ -383,10 +396,130 @@ var isAbsTests = []IsAbsTest{ {"lala", false}, } +var winisabstests = []IsAbsTest{ + {`C:\`, true}, + {`c\`, false}, + {`c::`, false}, + {`/`, true}, + {`\`, true}, + {`\Windows`, true}, +} + func TestIsAbs(t *testing.T) { - for _, test := range isAbsTests { + if runtime.GOOS == "windows" { + isabstests = append(isabstests, winisabstests...) + } + for _, test := range isabstests { if r := filepath.IsAbs(test.path); r != test.isAbs { t.Errorf("IsAbs(%q) = %v, want %v", test.path, r, test.isAbs) } } } + +type EvalSymlinksTest struct { + path, dest string +} + +var EvalSymlinksTestDirs = []EvalSymlinksTest{ + {"test", ""}, + {"test/dir", ""}, + {"test/dir/link3", "../../"}, + {"test/link1", "../test"}, + {"test/link2", "dir"}, +} + +var EvalSymlinksTests = []EvalSymlinksTest{ + {"test", "test"}, + {"test/dir", "test/dir"}, + {"test/dir/../..", "."}, + {"test/link1", "test"}, + {"test/link2", "test/dir"}, + {"test/link1/dir", "test/dir"}, + {"test/link2/..", "test"}, + {"test/dir/link3", "."}, + {"test/link2/link3/test", "test"}, +} + +func TestEvalSymlinks(t *testing.T) { + // Symlinks are not supported under windows. + if runtime.GOOS == "windows" { + return + } + defer os.RemoveAll("test") + for _, d := range EvalSymlinksTestDirs { + var err os.Error + if d.dest == "" { + err = os.Mkdir(d.path, 0755) + } else { + err = os.Symlink(d.dest, d.path) + } + if err != nil { + t.Fatal(err) + } + } + // relative + for _, d := range EvalSymlinksTests { + if p, err := filepath.EvalSymlinks(d.path); err != nil { + t.Errorf("EvalSymlinks(%q) error: %v", d.path, err) + } else if p != d.dest { + t.Errorf("EvalSymlinks(%q)=%q, want %q", d.path, p, d.dest) + } + } + // absolute + goroot, err := filepath.EvalSymlinks(os.Getenv("GOROOT")) + if err != nil { + t.Fatalf("EvalSymlinks(%q) error: %v", os.Getenv("GOROOT"), err) + } + testroot := filepath.Join(goroot, "src", "pkg", "path", "filepath") + for _, d := range EvalSymlinksTests { + a := EvalSymlinksTest{ + filepath.Join(testroot, d.path), + filepath.Join(testroot, d.dest), + } + if p, err := filepath.EvalSymlinks(a.path); err != nil { + t.Errorf("EvalSymlinks(%q) error: %v", a.path, err) + } else if p != a.dest { + t.Errorf("EvalSymlinks(%q)=%q, want %q", a.path, p, a.dest) + } + } +} + +// Test paths relative to $GOROOT/src +var abstests = []string{ + "../AUTHORS", + "pkg/../../AUTHORS", + "Make.pkg", + "pkg/Makefile", + + // Already absolute + "$GOROOT/src/Make.pkg", +} + +func TestAbs(t *testing.T) { + oldwd, err := os.Getwd() + if err != nil { + t.Fatal("Getwd failed: " + err.String()) + } + defer os.Chdir(oldwd) + goroot := os.Getenv("GOROOT") + cwd := filepath.Join(goroot, "src") + os.Chdir(cwd) + for _, path := range abstests { + path = strings.Replace(path, "$GOROOT", goroot, -1) + abspath, err := filepath.Abs(path) + if err != nil { + t.Errorf("Abs(%q) error: %v", path, err) + } + info, err := os.Stat(path) + if err != nil { + t.Errorf("%s: %s", path, err) + } + absinfo, err := os.Stat(abspath) + if err != nil || absinfo.Ino != info.Ino { + t.Errorf("Abs(%q)=%q, not the same file", path, abspath) + } + if !filepath.IsAbs(abspath) { + t.Errorf("Abs(%q)=%q, not an absolute path", path, abspath) + } + } +} |