github.com/jmigpin/editor@v1.6.0/core/fswatcher/fsnwatcher_test.go (about)

     1  package fswatcher
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"testing"
     7  )
     8  
     9  //----------
    10  
    11  func mustNewFsnWatcher(t *testing.T) Watcher {
    12  	t.Helper()
    13  	w, err := NewFsnWatcher()
    14  	if err != nil {
    15  		t.Fatal(err)
    16  	}
    17  	return w
    18  }
    19  
    20  //----------
    21  
    22  func TestFsWatcher1(t *testing.T) {
    23  	tmpDir := tmpDir()
    24  	defer os.RemoveAll(tmpDir)
    25  
    26  	w := mustNewFsnWatcher(t)
    27  	defer w.Close()
    28  
    29  	dir := tmpDir
    30  	dir2 := filepath.Join(dir, "dir2")
    31  	dir3 := filepath.Join(dir2, "dir3")
    32  	dir4 := filepath.Join(dir3, "dir4")
    33  
    34  	mustAddWatch(t, w, dir)
    35  	mustMkdirAll(t, dir4)
    36  
    37  	readEvent(t, w, true, func(ev *Event) bool {
    38  		return ev.Name == dir2 && ev.Op.HasAny(Create)
    39  	})
    40  }
    41  
    42  func TestFsWatcher2(t *testing.T) {
    43  	tmpDir := tmpDir()
    44  	defer os.RemoveAll(tmpDir)
    45  
    46  	w := mustNewFsnWatcher(t)
    47  	defer w.Close()
    48  	*w.OpMask() = Create | Remove | Modify | Rename
    49  
    50  	dir := tmpDir
    51  	dir2 := filepath.Join(dir, "dir2")
    52  	dir3 := filepath.Join(dir2, "dir3")
    53  	dir4 := filepath.Join(dir3, "dir4")
    54  	file1 := filepath.Join(dir4, "file1.txt")
    55  	file2 := filepath.Join(dir4, "file2.txt")
    56  
    57  	mustMkdirAll(t, dir4)
    58  	mustCreateFile(t, file1)
    59  	mustCreateFile(t, file2)
    60  
    61  	mustAddWatch(t, w, dir4)
    62  	mustAddWatch(t, w, file1)
    63  	mustAddWatch(t, w, file2)
    64  	mustRemoveAll(t, file1)
    65  
    66  	// two equal events, one from dir4, one from file1
    67  	readEvent(t, w, true, func(ev *Event) bool {
    68  		return ev.Name == file1 && ev.Op.HasAny(Remove)
    69  	})
    70  	readEvent(t, w, true, func(ev *Event) bool {
    71  		return ev.Name == file1 && ev.Op.HasAny(Remove)
    72  	})
    73  
    74  	mustRemoveAll(t, dir4)
    75  
    76  	// 2 equal events, 1 from dir4, 1 from file1
    77  	readEvent(t, w, true, func(ev *Event) bool {
    78  		return ev.Name == file2 && ev.Op.HasAny(Remove)
    79  	})
    80  	readEvent(t, w, true, func(ev *Event) bool {
    81  		return ev.Name == file2 && ev.Op.HasAny(Remove)
    82  	})
    83  }
    84  
    85  func TestFsWatcher3(t *testing.T) {
    86  	tmpDir := tmpDir()
    87  	defer os.RemoveAll(tmpDir)
    88  
    89  	w := mustNewFsnWatcher(t)
    90  	defer w.Close()
    91  	*w.OpMask() = Create | Remove | Modify | Rename
    92  
    93  	dir := tmpDir
    94  	dir2 := filepath.Join(dir, "dir2")
    95  	dir3 := filepath.Join(dir2, "dir3")
    96  	dir4 := filepath.Join(dir3, "dir4")
    97  	file1 := filepath.Join(dir4, "file1.txt")
    98  
    99  	mustMkdirAll(t, dir4)
   100  	mustCreateFile(t, file1)
   101  
   102  	// can add same file 2 times without error
   103  	mustAddWatch(t, w, file1)
   104  	mustAddWatch(t, w, file1)
   105  
   106  	mustRemoveAll(t, dir2)
   107  
   108  	readEvent(t, w, true, func(ev *Event) bool {
   109  		return ev.Name == file1 && ev.Op.HasAny(Remove)
   110  	})
   111  
   112  	// file remove was updated, can't remove what isn't watched anymore
   113  	if err := w.Remove(file1); err == nil {
   114  		t.Fatal("there should be an error")
   115  	}
   116  
   117  	// cannot add file that doesn't exist
   118  	if err := w.Add(file1); err == nil {
   119  		t.Fatal("there should be an error")
   120  	}
   121  }
   122  
   123  func TestFsWatcher4(t *testing.T) {
   124  	tmpDir := tmpDir()
   125  	defer os.RemoveAll(tmpDir)
   126  
   127  	w := mustNewFsnWatcher(t)
   128  	defer w.Close()
   129  	*w.OpMask() = Create | Remove | Modify | Rename
   130  
   131  	dir := tmpDir
   132  	dir2 := filepath.Join(dir, "dir2")
   133  	dir3 := filepath.Join(dir2, "dir3")
   134  	dir4 := filepath.Join(dir3, "dir4")
   135  	file1 := filepath.Join(dir4, "file1.txt")
   136  	file2 := filepath.Join(dir4, "file2.txt")
   137  
   138  	mustMkdirAll(t, dir4)
   139  	mustCreateFile(t, file1)
   140  	mustCreateFile(t, file2)
   141  
   142  	mustAddWatch(t, w, file1)
   143  	mustAddWatch(t, w, file2)
   144  
   145  	mustWriteFile(t, file1)
   146  	mustWriteFile(t, file2)
   147  
   148  	readEvent(t, w, true, func(ev *Event) bool {
   149  		return ev.Name == file1 && ev.Op.HasAny(Modify)
   150  	})
   151  	readEvent(t, w, true, func(ev *Event) bool {
   152  		return ev.Name == file2 && ev.Op.HasAny(Modify)
   153  	})
   154  
   155  	mustRenameFile(t, file1, file2)
   156  
   157  	readEvent(t, w, true, func(ev *Event) bool {
   158  		return ev.Name == file1 && ev.Op.HasAny(Rename)
   159  	})
   160  	readEvent(t, w, true, func(ev *Event) bool {
   161  		return ev.Name == file2 && ev.Op.HasAny(Remove)
   162  	})
   163  }
   164  
   165  func TestFsWatcher5(t *testing.T) {
   166  	tmpDir := tmpDir()
   167  	defer os.RemoveAll(tmpDir)
   168  
   169  	w := mustNewFsnWatcher(t)
   170  	defer w.Close()
   171  	*w.OpMask() = Create | Remove | Modify | Rename
   172  
   173  	dir := tmpDir
   174  	dir2 := filepath.Join(dir, "dir2")
   175  	dir3 := filepath.Join(dir2, "dir3")
   176  	dir4 := filepath.Join(dir3, "dir4")
   177  	file1 := filepath.Join(dir4, "file1.txt")
   178  	file2 := filepath.Join(dir4, "file2.txt")
   179  
   180  	mustMkdirAll(t, dir4)
   181  	mustCreateFile(t, file1)
   182  	mustCreateFile(t, file2)
   183  	mustAddWatch(t, w, dir4)
   184  	mustAddWatch(t, w, file1)
   185  	mustAddWatch(t, w, file2)
   186  	mustRenameFile(t, file1, file2)
   187  
   188  	readEvent(t, w, true, func(ev *Event) bool {
   189  		return ev.Name == file1 && ev.Op.HasAny(Rename)
   190  	})
   191  	readEvent(t, w, true, func(ev *Event) bool {
   192  		return ev.Name == file2 && ev.Op.HasAny(Create)
   193  	})
   194  	readEvent(t, w, true, func(ev *Event) bool {
   195  		return ev.Name == file1 && ev.Op.HasAny(Rename)
   196  	})
   197  	readEvent(t, w, true, func(ev *Event) bool {
   198  		return ev.Name == file2 && ev.Op.HasAny(Remove)
   199  	})
   200  }