github.com/raspbian-packages/golang-1.7@v0.0.0-20220428143849-125e7816f968/src/os/os_windows_test.go (about) 1 // Copyright 2014 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 os_test 6 7 import ( 8 "io/ioutil" 9 "os" 10 osexec "os/exec" 11 "path/filepath" 12 "sort" 13 "strings" 14 "syscall" 15 "testing" 16 ) 17 18 var supportJunctionLinks = true 19 20 func init() { 21 tmpdir, err := ioutil.TempDir("", "symtest") 22 if err != nil { 23 panic("failed to create temp directory: " + err.Error()) 24 } 25 defer os.RemoveAll(tmpdir) 26 27 err = os.Symlink("target", filepath.Join(tmpdir, "symlink")) 28 if err != nil { 29 err = err.(*os.LinkError).Err 30 switch err { 31 case syscall.EWINDOWS, syscall.ERROR_PRIVILEGE_NOT_HELD: 32 supportsSymlinks = false 33 } 34 } 35 defer os.Remove("target") 36 37 b, _ := osexec.Command("cmd", "/c", "mklink", "/?").Output() 38 if !strings.Contains(string(b), " /J ") { 39 supportJunctionLinks = false 40 } 41 } 42 43 func TestSameWindowsFile(t *testing.T) { 44 temp, err := ioutil.TempDir("", "TestSameWindowsFile") 45 if err != nil { 46 t.Fatal(err) 47 } 48 defer os.RemoveAll(temp) 49 50 wd, err := os.Getwd() 51 if err != nil { 52 t.Fatal(err) 53 } 54 err = os.Chdir(temp) 55 if err != nil { 56 t.Fatal(err) 57 } 58 defer os.Chdir(wd) 59 60 f, err := os.Create("a") 61 if err != nil { 62 t.Fatal(err) 63 } 64 f.Close() 65 66 ia1, err := os.Stat("a") 67 if err != nil { 68 t.Fatal(err) 69 } 70 71 path, err := filepath.Abs("a") 72 if err != nil { 73 t.Fatal(err) 74 } 75 ia2, err := os.Stat(path) 76 if err != nil { 77 t.Fatal(err) 78 } 79 if !os.SameFile(ia1, ia2) { 80 t.Errorf("files should be same") 81 } 82 83 p := filepath.VolumeName(path) + filepath.Base(path) 84 if err != nil { 85 t.Fatal(err) 86 } 87 ia3, err := os.Stat(p) 88 if err != nil { 89 t.Fatal(err) 90 } 91 if !os.SameFile(ia1, ia3) { 92 t.Errorf("files should be same") 93 } 94 } 95 96 func TestStatJunctionLink(t *testing.T) { 97 if !supportJunctionLinks { 98 t.Skip("skipping because junction links are not supported") 99 } 100 101 dir, err := ioutil.TempDir("", "go-build") 102 if err != nil { 103 t.Fatalf("failed to create temp directory: %v", err) 104 } 105 defer os.RemoveAll(dir) 106 107 link := filepath.Join(filepath.Dir(dir), filepath.Base(dir)+"-link") 108 109 output, err := osexec.Command("cmd", "/c", "mklink", "/J", link, dir).CombinedOutput() 110 if err != nil { 111 t.Fatalf("failed to run mklink %v %v: %v %q", link, dir, err, output) 112 } 113 defer os.Remove(link) 114 115 fi, err := os.Stat(link) 116 if err != nil { 117 t.Fatalf("failed to stat link %v: %v", link, err) 118 } 119 expected := filepath.Base(dir) 120 got := fi.Name() 121 if !fi.IsDir() || expected != got { 122 t.Fatalf("link should point to %v but points to %v instead", expected, got) 123 } 124 } 125 126 func TestStartProcessAttr(t *testing.T) { 127 p, err := os.StartProcess(os.Getenv("COMSPEC"), []string{"/c", "cd"}, new(os.ProcAttr)) 128 if err != nil { 129 return 130 } 131 defer p.Wait() 132 t.Fatalf("StartProcess expected to fail, but succeeded.") 133 } 134 135 func TestShareNotExistError(t *testing.T) { 136 if testing.Short() { 137 t.Skip("slow test that uses network; skipping") 138 } 139 _, err := os.Stat(`\\no_such_server\no_such_share\no_such_file`) 140 if err == nil { 141 t.Fatal("stat succeeded, but expected to fail") 142 } 143 if !os.IsNotExist(err) { 144 t.Fatalf("os.Stat failed with %q, but os.IsNotExist(err) is false", err) 145 } 146 } 147 148 func TestBadNetPathError(t *testing.T) { 149 const ERROR_BAD_NETPATH = syscall.Errno(53) 150 if !os.IsNotExist(ERROR_BAD_NETPATH) { 151 t.Fatal("os.IsNotExist(syscall.Errno(53)) is false, but want true") 152 } 153 } 154 155 func TestStatDir(t *testing.T) { 156 defer chtmpdir(t)() 157 158 f, err := os.Open(".") 159 if err != nil { 160 t.Fatal(err) 161 } 162 defer f.Close() 163 164 fi, err := f.Stat() 165 if err != nil { 166 t.Fatal(err) 167 } 168 169 err = os.Chdir("..") 170 if err != nil { 171 t.Fatal(err) 172 } 173 174 fi2, err := f.Stat() 175 if err != nil { 176 t.Fatal(err) 177 } 178 179 if !os.SameFile(fi, fi2) { 180 t.Fatal("race condition occurred") 181 } 182 } 183 184 func TestOpenVolumeName(t *testing.T) { 185 tmpdir, err := ioutil.TempDir("", "TestOpenVolumeName") 186 if err != nil { 187 t.Fatal(err) 188 } 189 defer os.RemoveAll(tmpdir) 190 191 wd, err := os.Getwd() 192 if err != nil { 193 t.Fatal(err) 194 } 195 err = os.Chdir(tmpdir) 196 if err != nil { 197 t.Fatal(err) 198 } 199 defer os.Chdir(wd) 200 201 want := []string{"file1", "file2", "file3", "gopher.txt"} 202 sort.Strings(want) 203 for _, name := range want { 204 err := ioutil.WriteFile(filepath.Join(tmpdir, name), nil, 0777) 205 if err != nil { 206 t.Fatal(err) 207 } 208 } 209 210 f, err := os.Open(filepath.VolumeName(tmpdir)) 211 if err != nil { 212 t.Fatal(err) 213 } 214 defer f.Close() 215 216 have, err := f.Readdirnames(-1) 217 if err != nil { 218 t.Fatal(err) 219 } 220 sort.Strings(have) 221 222 if strings.Join(want, "/") != strings.Join(have, "/") { 223 t.Fatalf("unexpected file list %q, want %q", have, want) 224 } 225 } 226 227 func TestDeleteReadOnly(t *testing.T) { 228 tmpdir, err := ioutil.TempDir("", "TestDeleteReadOnly") 229 if err != nil { 230 t.Fatal(err) 231 } 232 defer os.RemoveAll(tmpdir) 233 p := filepath.Join(tmpdir, "a") 234 // This sets FILE_ATTRIBUTE_READONLY. 235 f, err := os.OpenFile(p, os.O_CREATE, 0400) 236 if err != nil { 237 t.Fatal(err) 238 } 239 f.Close() 240 241 if err = os.Chmod(p, 0400); err != nil { 242 t.Fatal(err) 243 } 244 if err = os.Remove(p); err != nil { 245 t.Fatal(err) 246 } 247 }