github.com/robhaswell/grandperspective-scan@v0.1.0/test/go-go1.7.1/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  }