OSDN Git Service

Update Go library to last weekly.
[pf3gnuchains/gcc-fork.git] / libgo / go / exp / winfsnotify / winfsnotify_test.go
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.
4
5 package winfsnotify
6
7 import (
8         "os"
9         "time"
10         "testing"
11 )
12
13 func expect(t *testing.T, eventstream <-chan *Event, name string, mask uint32) {
14         t.Logf(`expected: "%s": 0x%x`, name, mask)
15         select {
16         case event := <-eventstream:
17                 if event == nil {
18                         t.Fatal("nil event received")
19                 }
20                 t.Logf("received: %s", event)
21                 if event.Name != name || event.Mask != mask {
22                         t.Fatal("did not receive expected event")
23                 }
24         case <-time.After(1e9):
25                 t.Fatal("timed out waiting for event")
26         }
27 }
28
29 func TestNotifyEvents(t *testing.T) {
30         watcher, err := NewWatcher()
31         if err != nil {
32                 t.Fatalf("NewWatcher() failed: %s", err)
33         }
34
35         testDir := "TestNotifyEvents.testdirectory"
36         testFile := testDir + "/TestNotifyEvents.testfile"
37         testFile2 := testFile + ".new"
38         const mask = FS_ALL_EVENTS & ^(FS_ATTRIB|FS_CLOSE) | FS_IGNORED
39
40         // Add a watch for testDir
41         os.RemoveAll(testDir)
42         if err = os.Mkdir(testDir, 0777); err != nil {
43                 t.Fatalf("Failed to create test directory", err)
44         }
45         defer os.RemoveAll(testDir)
46         err = watcher.AddWatch(testDir, mask)
47         if err != nil {
48                 t.Fatalf("Watcher.Watch() failed: %s", err)
49         }
50
51         // Receive errors on the error channel on a separate goroutine
52         go func() {
53                 for err := range watcher.Error {
54                         t.Fatalf("error received: %s", err)
55                 }
56         }()
57
58         // Create a file
59         file, err := os.Create(testFile)
60         if err != nil {
61                 t.Fatalf("creating test file failed: %s", err)
62         }
63         expect(t, watcher.Event, testFile, FS_CREATE)
64
65         err = watcher.AddWatch(testFile, mask)
66         if err != nil {
67                 t.Fatalf("Watcher.Watch() failed: %s", err)
68         }
69
70         if _, err = file.WriteString("hello, world"); err != nil {
71                 t.Fatalf("failed to write to test file: %s", err)
72         }
73         if err = file.Sync(); err != nil {
74                 t.Fatalf("failed to sync test file: %s", err)
75         }
76         expect(t, watcher.Event, testFile, FS_MODIFY)
77         expect(t, watcher.Event, testFile, FS_MODIFY)
78
79         if err = file.Close(); err != nil {
80                 t.Fatalf("failed to close test file: %s", err)
81         }
82
83         if err = os.Rename(testFile, testFile2); err != nil {
84                 t.Fatalf("failed to rename test file: %s", err)
85         }
86         expect(t, watcher.Event, testFile, FS_MOVED_FROM)
87         expect(t, watcher.Event, testFile2, FS_MOVED_TO)
88         expect(t, watcher.Event, testFile, FS_MOVE_SELF)
89
90         if err = os.RemoveAll(testDir); err != nil {
91                 t.Fatalf("failed to remove test directory: %s", err)
92         }
93         expect(t, watcher.Event, testFile2, FS_DELETE_SELF)
94         expect(t, watcher.Event, testFile2, FS_IGNORED)
95         expect(t, watcher.Event, testFile2, FS_DELETE)
96         expect(t, watcher.Event, testDir, FS_DELETE_SELF)
97         expect(t, watcher.Event, testDir, FS_IGNORED)
98
99         t.Log("calling Close()")
100         if err = watcher.Close(); err != nil {
101                 t.Fatalf("failed to close watcher: %s", err)
102         }
103 }
104
105 func TestNotifyClose(t *testing.T) {
106         watcher, _ := NewWatcher()
107         watcher.Close()
108
109         done := false
110         go func() {
111                 watcher.Close()
112                 done = true
113         }()
114
115         time.Sleep(50e6) // 50 ms
116         if !done {
117                 t.Fatal("double Close() test failed: second Close() call didn't return")
118         }
119
120         err := watcher.Watch("_test")
121         if err == nil {
122                 t.Fatal("expected error on Watch() after Close(), got nil")
123         }
124 }