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  }