// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package inotify import ( "os" "time" "testing" ) func TestInotifyEvents(t *testing.T) { // Create an inotify watcher instance and initialize it watcher, err := NewWatcher() if err != nil { t.Fatalf("NewWatcher() failed: %s", err) } // Add a watch for "_test" err = watcher.Watch("_test") if err != nil { t.Fatalf("Watcher.Watch() failed: %s", err) } // Receive errors on the error channel on a separate goroutine go func() { for err := range watcher.Error { t.Fatalf("error received: %s", err) } }() const testFile string = "_test/TestInotifyEvents.testfile" // Receive events on the event channel on a separate goroutine eventstream := watcher.Event var eventsReceived = 0 done := make(chan bool) go func() { for event := range eventstream { // Only count relevant events if event.Name == testFile { eventsReceived++ t.Logf("event received: %s", event) } else { t.Logf("unexpected event received: %s", event) } } done <- true }() // Create a file // This should add at least one event to the inotify event queue _, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { t.Fatalf("creating test file failed: %s", err) } // We expect this event to be received almost immediately, but let's wait 1 s to be sure time.Sleep(1000e6) // 1000 ms if eventsReceived == 0 { t.Fatal("inotify event hasn't been received after 1 second") } // Try closing the inotify instance t.Log("calling Close()") watcher.Close() t.Log("waiting for the event channel to become closed...") select { case <-done: t.Log("event channel closed") case <-time.After(1e9): t.Fatal("event stream was not closed after 1 second") } } func TestInotifyClose(t *testing.T) { watcher, _ := NewWatcher() watcher.Close() done := false go func() { watcher.Close() done = true }() time.Sleep(50e6) // 50 ms if !done { t.Fatal("double Close() test failed: second Close() call didn't return") } err := watcher.Watch("_test") if err == nil { t.Fatal("expected error on Watch() after Close(), got nil") } }