// behaviour too.
t.Skip("broken on macOS")
}
+ if !internal.HasPrivilegesForSymlink() {
+ t.Skip("does not have privileges for symlink on this OS")
+ }
file := join(tmp, "file")
link := join(tmp, "link")
// behaviour too.
t.Skip("broken on macOS")
}
+ if !internal.HasPrivilegesForSymlink() {
+ t.Skip("does not have privileges for symlink on this OS")
+ }
dir := join(tmp, "dir")
link := join(tmp, "link")
// Links
{"create new symlink to file", func(t *testing.T, w *Watcher, tmp string) {
+ if !internal.HasPrivilegesForSymlink() {
+ t.Skip("does not have privileges for symlink on this OS")
+ }
touch(t, tmp, "file")
addWatch(t, w, tmp)
symlink(t, join(tmp, "file"), tmp, "link")
create /link
`},
{"create new symlink to directory", func(t *testing.T, w *Watcher, tmp string) {
+ if !internal.HasPrivilegesForSymlink() {
+ t.Skip("does not have privileges for symlink on this OS")
+ }
addWatch(t, w, tmp)
symlink(t, tmp, tmp, "link")
}, `
}
func TestWatchSymlink(t *testing.T) {
+ if !internal.HasPrivilegesForSymlink() {
+ t.Skip("does not have privileges for symlink on this OS")
+ }
+
tests := []testCase{
{"create unresolvable symlink", func(t *testing.T, w *Watcher, tmp string) {
addWatch(t, w, tmp)
import (
"errors"
+
+ "golang.org/x/sys/windows"
)
// Just a dummy.
func Maxfiles() uint64 { return 1<<64 - 1 }
func Mkfifo(path string, mode uint32) error { return errors.New("no FIFOs on Windows") }
func Mknod(path string, mode uint32, dev int) error { return errors.New("no device nodes on Windows") }
+
+func HasPrivilegesForSymlink() bool {
+ var sid *windows.SID
+ err := windows.AllocateAndInitializeSid(
+ &windows.SECURITY_NT_AUTHORITY,
+ 2,
+ windows.SECURITY_BUILTIN_DOMAIN_RID,
+ windows.DOMAIN_ALIAS_RID_ADMINS,
+ 0, 0, 0, 0, 0, 0,
+ &sid)
+ if err != nil {
+ return false
+ }
+ defer windows.FreeSid(sid)
+ token := windows.Token(0)
+ member, err := token.IsMember(sid)
+ if err != nil {
+ return false
+ }
+ return member || token.IsElevated()
+}