OSDN Git Service

Update Go compiler, library, and testsuite on gcc 4.7 branch.
[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 // +build windows
6
7 package winfsnotify
8
9 import (
10         "io/ioutil"
11         "os"
12         "testing"
13         "time"
14 )
15
16 func expect(t *testing.T, eventstream <-chan *Event, name string, mask uint32) {
17         t.Logf(`expected: "%s": 0x%x`, name, mask)
18         select {
19         case event := <-eventstream:
20                 if event == nil {
21                         t.Fatal("nil event received")
22                 }
23                 t.Logf("received: %s", event)
24                 if event.Name != name || event.Mask != mask {
25                         t.Fatal("did not receive expected event")
26                 }
27         case <-time.After(1 * time.Second):
28                 t.Fatal("timed out waiting for event")
29         }
30 }
31
32 func TestNotifyEvents(t *testing.T) {
33         watcher, err := NewWatcher()
34         if err != nil {
35                 t.Fatalf("NewWatcher() failed: %s", err)
36         }
37
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
42
43         // Add a watch for testDir
44         os.RemoveAll(testDir)
45         if err = os.Mkdir(testDir, 0777); err != nil {
46                 t.Fatalf("Failed to create test directory: %s", err)
47         }
48         defer os.RemoveAll(testDir)
49         err = watcher.AddWatch(testDir, mask)
50         if err != nil {
51                 t.Fatalf("Watcher.Watch() failed: %s", err)
52         }
53
54         // Receive errors on the error channel on a separate goroutine
55         go func() {
56                 for err := range watcher.Error {
57                         t.Fatalf("error received: %s", err)
58                 }
59         }()
60
61         // Create a file
62         file, err := os.Create(testFile)
63         if err != nil {
64                 t.Fatalf("creating test file failed: %s", err)
65         }
66         expect(t, watcher.Event, testFile, FS_CREATE)
67
68         err = watcher.AddWatch(testFile, mask)
69         if err != nil {
70                 t.Fatalf("Watcher.Watch() failed: %s", err)
71         }
72
73         if _, err = file.WriteString("hello, world"); err != nil {
74                 t.Fatalf("failed to write to test file: %s", err)
75         }
76         if err = file.Close(); err != nil {
77                 t.Fatalf("failed to close test file: %s", err)
78         }
79         expect(t, watcher.Event, testFile, FS_MODIFY)
80         expect(t, watcher.Event, testFile, FS_MODIFY)
81
82         if err = os.Rename(testFile, testFile2); err != nil {
83                 t.Fatalf("failed to rename test file: %s", err)
84         }
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)
88
89         if err = os.RemoveAll(testDir); err != nil {
90                 t.Fatalf("failed to remove test directory: %s", err)
91         }
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)
97
98         t.Log("calling Close()")
99         if err = watcher.Close(); err != nil {
100                 t.Fatalf("failed to close watcher: %s", err)
101         }
102 }
103
104 func TestNotifyClose(t *testing.T) {
105         watcher, _ := NewWatcher()
106         watcher.Close()
107
108         done := false
109         go func() {
110                 watcher.Close()
111                 done = true
112         }()
113
114         time.Sleep(50 * time.Millisecond)
115         if !done {
116                 t.Fatal("double Close() test failed: second Close() call didn't return")
117         }
118
119         dir, err := ioutil.TempDir("", "wininotify")
120         if err != nil {
121                 t.Fatalf("TempDir failed: %s", err)
122         }
123         defer os.RemoveAll(dir)
124
125         err = watcher.Watch(dir)
126         if err == nil {
127                 t.Fatal("expected error on Watch() after Close(), got nil")
128         }
129 }