OSDN Git Service

Update to current version of Go library.
[pf3gnuchains/gcc-fork.git] / libgo / go / os / inotify / inotify_linux_test.go
1 // Copyright 2010 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 inotify
6
7 import (
8         "os"
9         "time"
10         "testing"
11 )
12
13 func TestInotifyEvents(t *testing.T) {
14         // Create an inotify watcher instance and initialize it
15         watcher, err := NewWatcher()
16         if err != nil {
17                 t.Fatalf("NewWatcher() failed: %s", err)
18         }
19
20         // Add a watch for "_test"
21         err = watcher.Watch("_test")
22         if err != nil {
23                 t.Fatalf("Watcher.Watch() failed: %s", err)
24         }
25
26         // Receive errors on the error channel on a separate goroutine
27         go func() {
28                 for err := range watcher.Error {
29                         t.Fatalf("error received: %s", err)
30                 }
31         }()
32
33         const testFile string = "_test/TestInotifyEvents.testfile"
34
35         // Receive events on the event channel on a separate goroutine
36         eventstream := watcher.Event
37         var eventsReceived = 0
38         done := make(chan bool)
39         go func() {
40                 for event := range eventstream {
41                         // Only count relevant events
42                         if event.Name == testFile {
43                                 eventsReceived++
44                                 t.Logf("event received: %s", event)
45                         } else {
46                                 t.Logf("unexpected event received: %s", event)
47                         }
48                 }
49                 done <- true
50         }()
51
52         // Create a file
53         // This should add at least one event to the inotify event queue
54         _, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
55         if err != nil {
56                 t.Fatalf("creating test file failed: %s", err)
57         }
58
59         // We expect this event to be received almost immediately, but let's wait 1 s to be sure
60         time.Sleep(1000e6) // 1000 ms
61         if eventsReceived == 0 {
62                 t.Fatal("inotify event hasn't been received after 1 second")
63         }
64
65         // Try closing the inotify instance
66         t.Log("calling Close()")
67         watcher.Close()
68         t.Log("waiting for the event channel to become closed...")
69         select {
70         case <-done:
71                 t.Log("event channel closed")
72         case <-time.After(1e9):
73                 t.Fatal("event stream was not closed after 1 second")
74         }
75 }
76
77
78 func TestInotifyClose(t *testing.T) {
79         watcher, _ := NewWatcher()
80         watcher.Close()
81
82         done := false
83         go func() {
84                 watcher.Close()
85                 done = true
86         }()
87
88         time.Sleep(50e6) // 50 ms
89         if !done {
90                 t.Fatal("double Close() test failed: second Close() call didn't return")
91         }
92
93         err := watcher.Watch("_test")
94         if err == nil {
95                 t.Fatal("expected error on Watch() after Close(), got nil")
96         }
97 }