/usr/share/gocode/src/golang.org/x/exp/winfsnotify/winfsnotify_test.go is in golang-golang-x-exp-dev 0.0~git20150826.1.eb7c1fa-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | // Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build windows
package winfsnotify
import (
"io/ioutil"
"os"
"sync/atomic"
"testing"
"time"
)
func expect(t *testing.T, eventstream <-chan *Event, name string, mask uint32) {
t.Logf(`expected: "%s": 0x%x`, name, mask)
select {
case event := <-eventstream:
if event == nil {
t.Fatal("nil event received")
}
t.Logf("received: %s", event)
if event.Name != name || event.Mask != mask {
t.Fatal("did not receive expected event")
}
case <-time.After(1 * time.Second):
t.Fatal("timed out waiting for event")
}
}
func TestNotifyEvents(t *testing.T) {
watcher, err := NewWatcher()
if err != nil {
t.Fatalf("NewWatcher() failed: %s", err)
}
testDir := "TestNotifyEvents.testdirectory"
testFile := testDir + "/TestNotifyEvents.testfile"
testFile2 := testFile + ".new"
const mask = FS_ALL_EVENTS & ^(FS_ATTRIB|FS_CLOSE) | FS_IGNORED
// Add a watch for testDir
os.RemoveAll(testDir)
if err = os.Mkdir(testDir, 0777); err != nil {
t.Fatalf("Failed to create test directory: %s", err)
}
defer os.RemoveAll(testDir)
err = watcher.AddWatch(testDir, mask)
if err != nil {
t.Fatalf("Watcher.Watch() failed: %s", err)
}
// Receive errors on the error channel on a separate goroutine
go func() {
for err := range watcher.Error {
t.Fatalf("error received: %s", err)
}
}()
// Create a file
file, err := os.Create(testFile)
if err != nil {
t.Fatalf("creating test file failed: %s", err)
}
expect(t, watcher.Event, testFile, FS_CREATE)
err = watcher.AddWatch(testFile, mask)
if err != nil {
t.Fatalf("Watcher.Watch() failed: %s", err)
}
if _, err = file.WriteString("hello, world"); err != nil {
t.Fatalf("failed to write to test file: %s", err)
}
if err = file.Close(); err != nil {
t.Fatalf("failed to close test file: %s", err)
}
expect(t, watcher.Event, testFile, FS_MODIFY)
expect(t, watcher.Event, testFile, FS_MODIFY)
if err = os.Rename(testFile, testFile2); err != nil {
t.Fatalf("failed to rename test file: %s", err)
}
expect(t, watcher.Event, testFile, FS_MOVED_FROM)
expect(t, watcher.Event, testFile2, FS_MOVED_TO)
expect(t, watcher.Event, testFile, FS_MOVE_SELF)
if err = os.RemoveAll(testDir); err != nil {
t.Fatalf("failed to remove test directory: %s", err)
}
expect(t, watcher.Event, testFile2, FS_DELETE_SELF)
expect(t, watcher.Event, testFile2, FS_IGNORED)
expect(t, watcher.Event, testFile2, FS_DELETE)
expect(t, watcher.Event, testDir, FS_DELETE_SELF)
expect(t, watcher.Event, testDir, FS_IGNORED)
t.Log("calling Close()")
if err = watcher.Close(); err != nil {
t.Fatalf("failed to close watcher: %s", err)
}
}
func TestNotifyClose(t *testing.T) {
watcher, _ := NewWatcher()
watcher.Close()
var done int32
go func() {
watcher.Close()
atomic.StoreInt32(&done, 1)
}()
time.Sleep(50 * time.Millisecond)
if atomic.LoadInt32(&done) == 0 {
t.Fatal("double Close() test failed: second Close() call didn't return")
}
dir, err := ioutil.TempDir("", "wininotify")
if err != nil {
t.Fatalf("TempDir failed: %s", err)
}
defer os.RemoveAll(dir)
err = watcher.Watch(dir)
if err == nil {
t.Fatal("expected error on Watch() after Close(), got nil")
}
}
|