1 // Copyright 2011 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.
16 func expect(t *testing.T, eventstream <-chan *Event, name string, mask uint32) {
17 t.Logf(`expected: "%s": 0x%x`, name, mask)
19 case event := <-eventstream:
21 t.Fatal("nil event received")
23 t.Logf("received: %s", event)
24 if event.Name != name || event.Mask != mask {
25 t.Fatal("did not receive expected event")
27 case <-time.After(1 * time.Second):
28 t.Fatal("timed out waiting for event")
32 func TestNotifyEvents(t *testing.T) {
33 watcher, err := NewWatcher()
35 t.Fatalf("NewWatcher() failed: %s", err)
38 testDir := "TestNotifyEvents.testdirectory"
39 testFile := testDir + "/TestNotifyEvents.testfile"
40 testFile2 := testFile + ".new"
41 const mask = FS_ALL_EVENTS & ^(FS_ATTRIB|FS_CLOSE) | FS_IGNORED
43 // Add a watch for testDir
45 if err = os.Mkdir(testDir, 0777); err != nil {
46 t.Fatalf("Failed to create test directory: %s", err)
48 defer os.RemoveAll(testDir)
49 err = watcher.AddWatch(testDir, mask)
51 t.Fatalf("Watcher.Watch() failed: %s", err)
54 // Receive errors on the error channel on a separate goroutine
56 for err := range watcher.Error {
57 t.Fatalf("error received: %s", err)
62 file, err := os.Create(testFile)
64 t.Fatalf("creating test file failed: %s", err)
66 expect(t, watcher.Event, testFile, FS_CREATE)
68 err = watcher.AddWatch(testFile, mask)
70 t.Fatalf("Watcher.Watch() failed: %s", err)
73 if _, err = file.WriteString("hello, world"); err != nil {
74 t.Fatalf("failed to write to test file: %s", err)
76 if err = file.Close(); err != nil {
77 t.Fatalf("failed to close test file: %s", err)
79 expect(t, watcher.Event, testFile, FS_MODIFY)
80 expect(t, watcher.Event, testFile, FS_MODIFY)
82 if err = os.Rename(testFile, testFile2); err != nil {
83 t.Fatalf("failed to rename test file: %s", err)
85 expect(t, watcher.Event, testFile, FS_MOVED_FROM)
86 expect(t, watcher.Event, testFile2, FS_MOVED_TO)
87 expect(t, watcher.Event, testFile, FS_MOVE_SELF)
89 if err = os.RemoveAll(testDir); err != nil {
90 t.Fatalf("failed to remove test directory: %s", err)
92 expect(t, watcher.Event, testFile2, FS_DELETE_SELF)
93 expect(t, watcher.Event, testFile2, FS_IGNORED)
94 expect(t, watcher.Event, testFile2, FS_DELETE)
95 expect(t, watcher.Event, testDir, FS_DELETE_SELF)
96 expect(t, watcher.Event, testDir, FS_IGNORED)
98 t.Log("calling Close()")
99 if err = watcher.Close(); err != nil {
100 t.Fatalf("failed to close watcher: %s", err)
104 func TestNotifyClose(t *testing.T) {
105 watcher, _ := NewWatcher()
114 time.Sleep(50 * time.Millisecond)
116 t.Fatal("double Close() test failed: second Close() call didn't return")
119 dir, err := ioutil.TempDir("", "wininotify")
121 t.Fatalf("TempDir failed: %s", err)
123 defer os.RemoveAll(dir)
125 err = watcher.Watch(dir)
127 t.Fatal("expected error on Watch() after Close(), got nil")