github.com/reds/docker@v1.11.2-rc1/pkg/filenotify/poller_test.go (about)

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