gopkg.in/docker/docker.v20@v20.10.27/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  }