github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/pkg/filenotify/poller_test.go (about) 1 package filenotify // import "github.com/docker/docker/pkg/filenotify" 2 3 import ( 4 "fmt" 5 "os" 6 "runtime" 7 "testing" 8 "time" 9 10 "github.com/fsnotify/fsnotify" 11 ) 12 13 func TestPollerAddRemove(t *testing.T) { 14 w := NewPollingWatcher() 15 16 if err := w.Add("no-such-file"); err == nil { 17 t.Fatal("should have gotten error when adding a non-existent file") 18 } 19 if err := w.Remove("no-such-file"); err == nil { 20 t.Fatal("should have gotten error when removing non-existent watch") 21 } 22 23 f, err := os.CreateTemp("", "asdf") 24 if err != nil { 25 t.Fatal(err) 26 } 27 defer os.RemoveAll(f.Name()) 28 29 if err := w.Add(f.Name()); err != nil { 30 t.Fatal(err) 31 } 32 33 if err := w.Remove(f.Name()); err != nil { 34 t.Fatal(err) 35 } 36 } 37 38 func TestPollerEvent(t *testing.T) { 39 if runtime.GOOS == "windows" { 40 t.Skip("No chmod on Windows") 41 } 42 w := NewPollingWatcher() 43 44 f, err := os.CreateTemp("", "test-poller") 45 if err != nil { 46 t.Fatal("error creating temp file") 47 } 48 defer os.RemoveAll(f.Name()) 49 f.Close() 50 51 if err := w.Add(f.Name()); err != nil { 52 t.Fatal(err) 53 } 54 55 select { 56 case <-w.Events(): 57 t.Fatal("got event before anything happened") 58 case <-w.Errors(): 59 t.Fatal("got error before anything happened") 60 default: 61 } 62 63 if err := os.WriteFile(f.Name(), []byte("hello"), 0600); err != nil { 64 t.Fatal(err) 65 } 66 assertFileMode(t, f.Name(), 0600) 67 if err := assertEvent(w, fsnotify.Write); err != nil { 68 t.Fatal(err) 69 } 70 71 if err := os.Chmod(f.Name(), 0644); err != nil { 72 t.Fatal(err) 73 } 74 assertFileMode(t, f.Name(), 0644) 75 if err := assertEvent(w, fsnotify.Chmod); err != nil { 76 t.Fatal(err) 77 } 78 79 if err := os.Remove(f.Name()); err != nil { 80 t.Fatal(err) 81 } 82 if err := assertEvent(w, fsnotify.Remove); err != nil { 83 t.Fatal(err) 84 } 85 } 86 87 func TestPollerClose(t *testing.T) { 88 w := NewPollingWatcher() 89 if err := w.Close(); err != nil { 90 t.Fatal(err) 91 } 92 // test double-close 93 if err := w.Close(); err != nil { 94 t.Fatal(err) 95 } 96 97 f, err := os.CreateTemp("", "asdf") 98 if err != nil { 99 t.Fatal(err) 100 } 101 defer os.RemoveAll(f.Name()) 102 if err := w.Add(f.Name()); err == nil { 103 t.Fatal("should have gotten error adding watch for closed watcher") 104 } 105 } 106 107 func assertFileMode(t *testing.T, fileName string, mode uint32) { 108 t.Helper() 109 f, err := os.Stat(fileName) 110 if err != nil { 111 t.Fatal(err) 112 } 113 if f.Mode() != os.FileMode(mode) { 114 t.Fatalf("expected file %s to have mode %#o, but got %#o", fileName, mode, f.Mode()) 115 } 116 } 117 118 func assertEvent(w FileWatcher, eType fsnotify.Op) error { 119 var err error 120 select { 121 case e := <-w.Events(): 122 if e.Op != eType { 123 err = fmt.Errorf("got wrong event type, expected %q: %v", eType, e.Op) 124 } 125 case e := <-w.Errors(): 126 err = fmt.Errorf("got unexpected error waiting for events %v: %v", eType, e) 127 case <-time.After(watchWaitTime * 3): 128 err = fmt.Errorf("timeout waiting for event %v", eType) 129 } 130 return err 131 }