1
0
mirror of https://github.com/golang/go synced 2024-09-25 15:20:13 -06:00

internal/testenv: make MustHaveSymlink message friendly

Change-Id: If6e12ebc41152bc0534d3d383df80e960efe97f0
Reviewed-on: https://go-review.googlesource.com/27577
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Hiroshi Ioka 2016-08-24 13:22:54 +09:00 committed by Alex Brainman
parent 5bddca64a8
commit 9be2a279ee
3 changed files with 21 additions and 10 deletions

View File

@ -129,14 +129,16 @@ func MustHaveExternalNetwork(t *testing.T) {
// HasSymlink reports whether the current system can use os.Symlink.
func HasSymlink() bool {
return hasSymlink()
ok, _ := hasSymlink()
return ok
}
// MustHaveSymlink reports whether the current system can use os.Symlink.
// If not, MustHaveSymlink calls t.Skip with an explanation.
func MustHaveSymlink(t *testing.T) {
if !HasSymlink() {
t.Skipf("skipping test: cannot make symlinks on %s/%s", runtime.GOOS, runtime.GOARCH)
ok, reason := hasSymlink()
if !ok {
t.Skipf("skipping test: cannot make symlinks on %s/%s%s", runtime.GOOS, runtime.GOARCH, reason)
}
}

View File

@ -10,11 +10,11 @@ import (
"runtime"
)
func hasSymlink() bool {
func hasSymlink() (ok bool, reason string) {
switch runtime.GOOS {
case "android", "nacl", "plan9":
return false
return false, ""
}
return true
return true, ""
}

View File

@ -13,7 +13,7 @@ import (
)
var symlinkOnce sync.Once
var winHasSymlink = true
var winSymlinkErr error
func initWinHasSymlink() {
tmpdir, err := ioutil.TempDir("", "symtest")
@ -27,14 +27,23 @@ func initWinHasSymlink() {
err = err.(*os.LinkError).Err
switch err {
case syscall.EWINDOWS, syscall.ERROR_PRIVILEGE_NOT_HELD:
winHasSymlink = false
winSymlinkErr = err
}
}
os.Remove("target")
}
func hasSymlink() bool {
func hasSymlink() (ok bool, reason string) {
symlinkOnce.Do(initWinHasSymlink)
return winHasSymlink
switch winSymlinkErr {
case nil:
return true, ""
case syscall.EWINDOWS:
return false, ": symlinks are not supported on your version of Windows"
case syscall.ERROR_PRIVILEGE_NOT_HELD:
return false, ": you don't have enough privileges to create symlinks"
}
return false, ""
}