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 }