github.com/sean-/go@v0.0.0-20151219100004-97f854cd7bb6/src/path/filepath/path_windows_test.go (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package filepath_test 6 7 import ( 8 "io/ioutil" 9 "os" 10 "os/exec" 11 "path/filepath" 12 "reflect" 13 "strings" 14 "syscall" 15 "testing" 16 ) 17 18 func init() { 19 tmpdir, err := ioutil.TempDir("", "symtest") 20 if err != nil { 21 panic("failed to create temp directory: " + err.Error()) 22 } 23 defer os.RemoveAll(tmpdir) 24 25 err = os.Symlink("target", filepath.Join(tmpdir, "symlink")) 26 if err == nil { 27 return 28 } 29 30 err = err.(*os.LinkError).Err 31 switch err { 32 case syscall.EWINDOWS, syscall.ERROR_PRIVILEGE_NOT_HELD: 33 supportsSymlinks = false 34 } 35 } 36 37 func TestWinSplitListTestsAreValid(t *testing.T) { 38 comspec := os.Getenv("ComSpec") 39 if comspec == "" { 40 t.Fatal("%ComSpec% must be set") 41 } 42 43 for ti, tt := range winsplitlisttests { 44 testWinSplitListTestIsValid(t, ti, tt, comspec) 45 } 46 } 47 48 func testWinSplitListTestIsValid(t *testing.T, ti int, tt SplitListTest, 49 comspec string) { 50 51 const ( 52 cmdfile = `printdir.cmd` 53 perm os.FileMode = 0700 54 ) 55 56 tmp, err := ioutil.TempDir("", "testWinSplitListTestIsValid") 57 if err != nil { 58 t.Fatalf("TempDir failed: %v", err) 59 } 60 defer os.RemoveAll(tmp) 61 62 for i, d := range tt.result { 63 if d == "" { 64 continue 65 } 66 if cd := filepath.Clean(d); filepath.VolumeName(cd) != "" || 67 cd[0] == '\\' || cd == ".." || (len(cd) >= 3 && cd[0:3] == `..\`) { 68 t.Errorf("%d,%d: %#q refers outside working directory", ti, i, d) 69 return 70 } 71 dd := filepath.Join(tmp, d) 72 if _, err := os.Stat(dd); err == nil { 73 t.Errorf("%d,%d: %#q already exists", ti, i, d) 74 return 75 } 76 if err = os.MkdirAll(dd, perm); err != nil { 77 t.Errorf("%d,%d: MkdirAll(%#q) failed: %v", ti, i, dd, err) 78 return 79 } 80 fn, data := filepath.Join(dd, cmdfile), []byte("@echo "+d+"\r\n") 81 if err = ioutil.WriteFile(fn, data, perm); err != nil { 82 t.Errorf("%d,%d: WriteFile(%#q) failed: %v", ti, i, fn, err) 83 return 84 } 85 } 86 87 for i, d := range tt.result { 88 if d == "" { 89 continue 90 } 91 exp := []byte(d + "\r\n") 92 cmd := &exec.Cmd{ 93 Path: comspec, 94 Args: []string{`/c`, cmdfile}, 95 Env: []string{`Path=` + tt.list}, 96 Dir: tmp, 97 } 98 out, err := cmd.CombinedOutput() 99 switch { 100 case err != nil: 101 t.Errorf("%d,%d: execution error %v\n%q", ti, i, err, out) 102 return 103 case !reflect.DeepEqual(out, exp): 104 t.Errorf("%d,%d: expected %#q, got %#q", ti, i, exp, out) 105 return 106 default: 107 // unshadow cmdfile in next directory 108 err = os.Remove(filepath.Join(tmp, d, cmdfile)) 109 if err != nil { 110 t.Fatalf("Remove test command failed: %v", err) 111 } 112 } 113 } 114 } 115 116 // TestEvalSymlinksCanonicalNames verify that EvalSymlinks 117 // returns "canonical" path names on windows. 118 func TestEvalSymlinksCanonicalNames(t *testing.T) { 119 tmp, err := ioutil.TempDir("", "evalsymlinkcanonical") 120 if err != nil { 121 t.Fatal("creating temp dir:", err) 122 } 123 defer os.RemoveAll(tmp) 124 125 // ioutil.TempDir might return "non-canonical" name. 126 cTmpName, err := filepath.EvalSymlinks(tmp) 127 if err != nil { 128 t.Errorf("EvalSymlinks(%q) error: %v", tmp, err) 129 } 130 131 dirs := []string{ 132 "test", 133 "test/dir", 134 "testing_long_dir", 135 "TEST2", 136 } 137 138 for _, d := range dirs { 139 dir := filepath.Join(cTmpName, d) 140 err := os.Mkdir(dir, 0755) 141 if err != nil { 142 t.Fatal(err) 143 } 144 cname, err := filepath.EvalSymlinks(dir) 145 if err != nil { 146 t.Errorf("EvalSymlinks(%q) error: %v", dir, err) 147 continue 148 } 149 if dir != cname { 150 t.Errorf("EvalSymlinks(%q) returns %q, but should return %q", dir, cname, dir) 151 continue 152 } 153 // test non-canonical names 154 test := strings.ToUpper(dir) 155 p, err := filepath.EvalSymlinks(test) 156 if err != nil { 157 t.Errorf("EvalSymlinks(%q) error: %v", test, err) 158 continue 159 } 160 if p != cname { 161 t.Errorf("EvalSymlinks(%q) returns %q, but should return %q", test, p, cname) 162 continue 163 } 164 // another test 165 test = strings.ToLower(dir) 166 p, err = filepath.EvalSymlinks(test) 167 if err != nil { 168 t.Errorf("EvalSymlinks(%q) error: %v", test, err) 169 continue 170 } 171 if p != cname { 172 t.Errorf("EvalSymlinks(%q) returns %q, but should return %q", test, p, cname) 173 continue 174 } 175 } 176 }