github.com/nycdavid/zeus@v0.0.0-20201208104106-9ba439429e03/go/filemonitor/filemonitor_test.go (about) 1 package filemonitor_test 2 3 import ( 4 "errors" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "reflect" 10 "sort" 11 "testing" 12 "time" 13 14 "github.com/burke/zeus/go/filemonitor" 15 ) 16 17 func writeTestFiles(dir string, count int) ([]string, error) { 18 files := make([]string, count) 19 20 dir, err := filepath.EvalSymlinks(dir) 21 if err != nil { 22 return nil, err 23 } 24 25 for i := range files { 26 fn := filepath.Join(dir, fmt.Sprintf("file%d", i)) 27 28 if err := ioutil.WriteFile(fn, []byte("foo"), 0644); err != nil { 29 return nil, err 30 } 31 32 files[i] = fn 33 } 34 35 return files, nil 36 } 37 38 func TestFileMonitorFiles(t *testing.T) { 39 count := 10 40 dir, err := ioutil.TempDir("", "zeus_test_many_files") 41 if err != nil { 42 t.Fatal(err) 43 } 44 defer os.RemoveAll(dir) 45 46 files, err := writeTestFiles(dir, count) 47 if err != nil { 48 t.Fatal(err) 49 } 50 51 fm, err := filemonitor.NewFileMonitor(filemonitor.DefaultFileChangeDelay) 52 if err != nil { 53 t.Fatal(err) 54 } 55 defer fm.Close() 56 57 watched := files[0:count] 58 for i, file := range watched { 59 err = fm.Add(file) 60 if err != nil { 61 t.Fatalf("%d, %v", i, err) 62 } 63 } 64 65 changes := fm.Listen() 66 67 // Without a short sleep we get notified for the original 68 // file creation using FSEvents 69 time.Sleep(20 * time.Millisecond) 70 71 for i, file := range files { 72 if err := ioutil.WriteFile(file, []byte("baz"), 0); err != nil { 73 t.Fatalf("%d: %v", i, err) 74 } 75 } 76 77 if err := expectChanges(changes, watched); err != nil { 78 t.Fatal(err) 79 } 80 } 81 82 func expectChanges(changeCh <-chan []string, expect []string) error { 83 // Copy the input before sorting 84 expectSorted := make([]string, len(expect)) 85 copy(expectSorted, expect) 86 sort.StringSlice(expectSorted).Sort() 87 expect = expectSorted 88 89 select { 90 case changes := <-changeCh: 91 sort.StringSlice(changes).Sort() 92 93 if !reflect.DeepEqual(changes, expect) { 94 return fmt.Errorf("expected changes in %v, got %v", expect[0], changes) 95 } 96 case <-time.After(time.Second): 97 return errors.New("Timeout waiting for change notification") 98 } 99 100 return nil 101 }