Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(299)

Delta Between Two Patch Sets: src/pkg/exp/inotify/inotify_linux_test.go

Issue 5418045: code review 5418045: inotify: Fix readEntry hanging and Add/RemoveWatch fail... (Closed)
Left Patch Set: Created 12 years, 4 months ago
Right Patch Set: diff -r c8f7a5a37d09 https://code.google.com/p/go/ Created 12 years, 3 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Right: Side by side diff | Download
« no previous file with change/comment | « src/pkg/exp/inotify/inotify_linux.go ('k') | no next file » | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
(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
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 }
LEFTRIGHT

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b