LEFT | RIGHT |
(no file at all) | |
1 // Copyright 2010 The Go Authors. All rights reserved. | 1 // Copyright 2010 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 package inotify | 5 package inotify |
6 | 6 |
7 import ( | 7 import ( |
8 "os" | 8 "os" |
| 9 "path/filepath" |
| 10 "runtime" |
9 "testing" | 11 "testing" |
10 "time" | 12 "time" |
11 ) | 13 ) |
12 | 14 |
13 func TestInotifyEvents(t *testing.T) { | 15 func TestInotifyEvents(t *testing.T) { |
14 // Create an inotify watcher instance and initialize it | 16 // Create an inotify watcher instance and initialize it |
15 watcher, err := NewWatcher() | 17 watcher, err := NewWatcher() |
16 if err != nil { | 18 if err != nil { |
17 t.Fatalf("NewWatcher() failed: %s", err) | 19 t.Fatalf("NewWatcher() failed: %s", err) |
18 } | 20 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 time.Sleep(50e6) // 50 ms | 89 time.Sleep(50e6) // 50 ms |
88 if !done { | 90 if !done { |
89 t.Fatal("double Close() test failed: second Close() call didn't
return") | 91 t.Fatal("double Close() test failed: second Close() call didn't
return") |
90 } | 92 } |
91 | 93 |
92 err := watcher.Watch("_test") | 94 err := watcher.Watch("_test") |
93 if err == nil { | 95 if err == nil { |
94 t.Fatal("expected error on Watch() after Close(), got nil") | 96 t.Fatal("expected error on Watch() after Close(), got nil") |
95 } | 97 } |
96 } | 98 } |
| 99 |
| 100 //Test that we can delete a watched directory, and add it back to the watch |
| 101 func TestInotifyDeleteReAdd(t *testing.T) { |
| 102 watcher, err := NewWatcher() |
| 103 if err != nil { |
| 104 t.Fatalf("NewWatcher() failed: %s", err) |
| 105 } |
| 106 testdir := filepath.Join("_test", "del_add_test") |
| 107 testdirpath, err := filepath.Abs(testdir) |
| 108 if err != nil { |
| 109 t.Fatalf("Error creating absolute path for: %s. Error: %s", test
dir, err) |
| 110 } |
| 111 testdirpath = filepath.Clean(testdirpath) |
| 112 testFile := filepath.Join(testdirpath, "test_file.txt") |
| 113 var eventsReceived = 0 |
| 114 var unexpectedEvent = false |
| 115 done := make(chan bool) |
| 116 |
| 117 go func() { |
| 118 for event := range watcher.Event { |
| 119 if event.Name == testFile { |
| 120 eventsReceived++ |
| 121 t.Logf("event received: %s", event) |
| 122 } else if event.Mask&IN_IGNORED == IN_IGNORED { |
| 123 //ignore· |
| 124 } else { |
| 125 unexpectedEvent = true |
| 126 t.Logf("unexpected event received: %s", event) |
| 127 } |
| 128 } |
| 129 done <- true |
| 130 }() |
| 131 |
| 132 go func() { |
| 133 for err1 := range watcher.Error { |
| 134 t.Fatalf("Error received: %v", err1) |
| 135 } |
| 136 }() |
| 137 |
| 138 createFn := func(removeAll bool, numGosched int, sleepNs int64) { |
| 139 if err = os.MkdirAll(testdir, 0777); err != nil { |
| 140 t.Fatalf("Error making temp directory: %s", err) |
| 141 } |
| 142 err = watcher.AddWatch(testdirpath, IN_CREATE|IN_DELETE) |
| 143 if err != nil { |
| 144 t.Fatalf("Error in AddWatch() for path: %s. Error: %s",
testdirpath, err) |
| 145 } |
| 146 if _, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
; err != nil { |
| 147 t.Fatalf("Unable to create file: %s. Error: %s", testFil
e, err) |
| 148 } |
| 149 if removeAll { |
| 150 if err = os.RemoveAll(testdirpath); err != nil { |
| 151 t.Fatalf("Unable to remove dir: %s. Error: %s",
testdirpath, err) |
| 152 } |
| 153 } |
| 154 //give syscall sometime to auto-remove the directory |
| 155 for j := 0; j < numGosched; j++ { |
| 156 runtime.Gosched() |
| 157 } |
| 158 if sleepNs > 0 { |
| 159 time.Sleep(time.Duration(sleepNs)) |
| 160 } |
| 161 for j := 0; j < numGosched; j++ { |
| 162 runtime.Gosched() |
| 163 } |
| 164 } |
| 165 for i := 0; i < 2; i++ { |
| 166 createFn(true, 0, 0) |
| 167 err = watcher.RemoveWatch(testdirpath) |
| 168 t.Logf("RemoveWatch() 1: expecting nil: received: %v", err) |
| 169 if err != nil { |
| 170 t.Fatalf("Unexpected Error in RemoveWatch() for path: %s
. Error: %v", testdirpath, err) |
| 171 } |
| 172 //do an add again at the end, to test that an add on a non-exist
ent file |
| 173 err = watcher.AddWatch(testdirpath, IN_CREATE|IN_DELETE) |
| 174 if err == nil { |
| 175 t.Fatalf("Expected error adding watch for non-existent p
ath: %s. Error: %s", |
| 176 testdirpath, err) |
| 177 } |
| 178 } |
| 179 createFn(true, 3, 3e8) |
| 180 err = watcher.RemoveWatch(testdirpath) |
| 181 if err != nil { |
| 182 t.Fatalf("Unexpected Error in RemoveWatch() for path: %s. Error:
%v", testdirpath, err) |
| 183 } |
| 184 err = watcher.RemoveWatch(testdirpath) |
| 185 t.Logf("RemoveWatch() 2: expecting *inotify.noWatchExistError. received:
%T, %v", err, err) |
| 186 if err == nil { |
| 187 t.Fatalf("Expecting an Error in RemoveWatch() for path: %s", tes
tdirpath) |
| 188 } else { |
| 189 switch err.(type) { |
| 190 case *noWatchExistError, noWatchExistError: |
| 191 default: |
| 192 t.Fatalf("Expecting noWatchExistError. Got: %T, %v", err
, err) |
| 193 } |
| 194 } |
| 195 |
| 196 // We expect this event to be received almost immediately, but let's wai
t 100 ms to be sure |
| 197 time.Sleep(1e8) // 100 ms |
| 198 if eventsReceived == 0 { |
| 199 t.Fatal("No inotify event hasn't been received after 1 second") |
| 200 } else if unexpectedEvent { |
| 201 t.Fatal("Unexpected event received") |
| 202 } |
| 203 |
| 204 t.Log("calling Close()") |
| 205 watcher.Close() |
| 206 t.Log("waiting for the event channel to become closed...") |
| 207 select { |
| 208 case <-done: |
| 209 t.Log("event channel closed") |
| 210 case <-time.After(5e9): |
| 211 t.Fatal("event stream was not closed after 1 second") |
| 212 } |
| 213 |
| 214 } |
LEFT | RIGHT |