github.com/aloncn/graphics-go@v0.0.1/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  }