]> go.fuhry.dev Git - fsnotify.git/commitdiff
Add stressy test to inotify.
authorPieter Droogendijk <pieter@binky.org.uk>
Sun, 8 Feb 2015 01:36:05 +0000 (02:36 +0100)
committerNathan Youngman <git@nathany.com>
Sun, 8 Feb 2015 20:22:32 +0000 (13:22 -0700)
inotify_test.go

index 9d8e120c51717ed5aad7fab9da0a118771204bfe..32432c6c39925e221f93917587ebdde59fb8803c 100644 (file)
@@ -9,6 +9,7 @@ package fsnotify
 import (
        "os"
        "path/filepath"
+       "syscall"
        "testing"
        "time"
 )
@@ -150,3 +151,104 @@ func TestInotifyCloseCreate(t *testing.T) {
                t.Fatalf("Error adding testDir again: %v", err)
        }
 }
+
+func TestInotifyStress(t *testing.T) {
+       testDir := tempMkdir(t)
+       defer os.RemoveAll(testDir)
+       testFile := filepath.Join(testDir, "testfile")
+
+       w, err := NewWatcher()
+       if err != nil {
+               t.Fatalf("Failed to create watcher: %v", err)
+       }
+       defer w.Close()
+
+       killchan := make(chan struct{})
+       defer close(killchan)
+
+       err = w.Add(testDir)
+       if err != nil {
+               t.Fatalf("Failed to add testDir: %v", err)
+       }
+
+       proc, err := os.FindProcess(os.Getpid())
+       if err != nil {
+               t.Fatalf("Error finding process: %v", err)
+       }
+
+       go func() {
+               for {
+                       select {
+                       case <-time.After(5 * time.Millisecond):
+                               err := proc.Signal(syscall.SIGUSR1)
+                               if err != nil {
+                                       t.Fatalf("Signal failed: %v", err)
+                               }
+                       case <-killchan:
+                               return
+                       }
+               }
+       }()
+
+       go func() {
+               for {
+                       select {
+                       case <-time.After(11 * time.Millisecond):
+                               err := w.poller.wake()
+                               if err != nil {
+                                       t.Fatalf("Wake failed: %v", err)
+                               }
+                       case <-killchan:
+                               return
+                       }
+               }
+       }()
+
+       go func() {
+               for {
+                       select {
+                       case <-killchan:
+                               return
+                       default:
+                               handle, err := os.Create(testFile)
+                               if err != nil {
+                                       t.Fatalf("Create failed: %v", err)
+                               }
+                               handle.Close()
+                               time.Sleep(time.Millisecond)
+                               err = os.Remove(testFile)
+                               if err != nil {
+                                       t.Fatalf("Remove failed: %v", err)
+                               }
+                       }
+               }
+       }()
+
+       creates := 0
+       removes := 0
+       after := time.After(5 * time.Second)
+       for {
+               select {
+               case <-after:
+                       if creates-removes > 1 || creates-removes < -1 {
+                               t.Fatalf("Creates and removes should not be off by more than one: %d creates, %d removes", creates, removes)
+                       }
+                       if creates < 50 {
+                               t.Fatalf("Expected at least 50 creates, got %d", creates)
+                       }
+                       return
+               case err := <-w.Errors:
+                       t.Fatalf("Got an error from watcher: %v", err)
+               case evt := <-w.Events:
+                       if evt.Name != testFile {
+                               t.Fatalf("Got an event for an unknown file: %s", evt.Name)
+                       }
+                       if evt.Op == Create {
+                               creates++
+                       }
+                       if evt.Op == Remove {
+                               removes++
+                       }
+               }
+       }
+}