Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'package:scheduled_test/scheduled_test.dart'; | 5 import 'package:scheduled_test/scheduled_test.dart'; |
| 6 import 'package:watcher/src/utils.dart'; | |
| 6 | 7 |
| 7 import '../utils.dart'; | 8 import '../utils.dart'; |
| 8 | 9 |
| 9 sharedTests() { | 10 sharedTests() { |
| 10 test('does not notify for files that already exist when started', () { | 11 test('does not notify for files that already exist when started', () { |
| 11 // Make some pre-existing files. | 12 // Make some pre-existing files. |
| 12 writeFile("a.txt"); | 13 writeFile("a.txt"); |
| 13 writeFile("b.txt"); | 14 writeFile("b.txt"); |
| 14 | 15 |
| 15 startWatcher(); | 16 startWatcher(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 51 expectModifyEvent("file.txt"); | 52 expectModifyEvent("file.txt"); |
| 52 }); | 53 }); |
| 53 | 54 |
| 54 test('notifies even if the file contents are unchanged', () { | 55 test('notifies even if the file contents are unchanged', () { |
| 55 writeFile("a.txt", contents: "same"); | 56 writeFile("a.txt", contents: "same"); |
| 56 writeFile("b.txt", contents: "before"); | 57 writeFile("b.txt", contents: "before"); |
| 57 startWatcher(); | 58 startWatcher(); |
| 58 | 59 |
| 59 writeFile("a.txt", contents: "same"); | 60 writeFile("a.txt", contents: "same"); |
| 60 writeFile("b.txt", contents: "after"); | 61 writeFile("b.txt", contents: "after"); |
| 61 inAnyOrder(() { | 62 inAnyOrder([ |
| 62 expectModifyEvent("a.txt"); | 63 isModifyEvent("a.txt"), |
| 63 expectModifyEvent("b.txt"); | 64 isModifyEvent("b.txt") |
| 64 }); | 65 ]); |
| 65 }); | 66 }); |
| 66 | 67 |
| 67 test('when the watched directory is deleted, removes all files', () { | 68 test('when the watched directory is deleted, removes all files', () { |
| 68 writeFile("dir/a.txt"); | 69 writeFile("dir/a.txt"); |
| 69 writeFile("dir/b.txt"); | 70 writeFile("dir/b.txt"); |
| 70 | 71 |
| 71 startWatcher(dir: "dir"); | 72 startWatcher(dir: "dir"); |
| 72 | 73 |
| 73 deleteDir("dir"); | 74 deleteDir("dir"); |
| 74 inAnyOrder(() { | 75 inAnyOrder([ |
| 75 expectRemoveEvent("dir/a.txt"); | 76 isRemoveEvent("dir/a.txt"), |
| 76 expectRemoveEvent("dir/b.txt"); | 77 isRemoveEvent("dir/b.txt"), |
| 77 }); | 78 ]); |
| 78 }); | 79 }); |
| 79 | 80 |
| 80 group("moves", () { | 81 group("moves", () { |
| 81 test('notifies when a file is moved within the watched directory', () { | 82 test('notifies when a file is moved within the watched directory', () { |
| 82 writeFile("old.txt"); | 83 writeFile("old.txt"); |
| 83 startWatcher(); | 84 startWatcher(); |
| 84 renameFile("old.txt", "new.txt"); | 85 renameFile("old.txt", "new.txt"); |
| 85 | 86 |
| 86 inAnyOrder(() { | 87 inAnyOrder([ |
| 87 expectAddEvent("new.txt"); | 88 isAddEvent("new.txt"), |
| 88 expectRemoveEvent("old.txt"); | 89 isRemoveEvent("old.txt"), |
| 89 }); | 90 ]); |
| 90 }); | 91 }); |
| 91 | 92 |
| 92 test('notifies when a file is moved from outside the watched directory', | 93 test('notifies when a file is moved from outside the watched directory', |
| 93 () { | 94 () { |
| 94 writeFile("old.txt"); | 95 writeFile("old.txt"); |
| 95 createDir("dir"); | 96 createDir("dir"); |
| 96 startWatcher(dir: "dir"); | 97 startWatcher(dir: "dir"); |
| 97 | 98 |
| 98 renameFile("old.txt", "dir/new.txt"); | 99 renameFile("old.txt", "dir/new.txt"); |
| 99 expectAddEvent("dir/new.txt"); | 100 expectAddEvent("dir/new.txt"); |
| 100 }); | 101 }); |
| 101 | 102 |
| 102 test('notifies when a file is moved outside the watched directory', () { | 103 test('notifies when a file is moved outside the watched directory', () { |
| 103 writeFile("dir/old.txt"); | 104 writeFile("dir/old.txt"); |
| 104 startWatcher(dir: "dir"); | 105 startWatcher(dir: "dir"); |
| 105 | 106 |
| 106 renameFile("dir/old.txt", "new.txt"); | 107 renameFile("dir/old.txt", "new.txt"); |
| 107 expectRemoveEvent("dir/old.txt"); | 108 expectRemoveEvent("dir/old.txt"); |
| 108 }); | 109 }); |
| 109 }); | 110 }); |
| 110 | 111 |
| 111 group("clustered changes", () { | 112 group("clustered changes", () { |
| 112 test("doesn't notify when a file is created and then immediately removed", | 113 test("doesn't notify when a file is created and then immediately removed", |
| 113 () { | 114 () { |
| 114 startWatcher(); | 115 startWatcher(); |
| 115 writeFile("file.txt"); | 116 writeFile("file.txt"); |
| 116 deleteFile("file.txt"); | 117 deleteFile("file.txt"); |
| 117 | 118 |
| 118 // [startWatcher] will assert that no events were fired. | 119 startClosingEventStream(); |
| 120 | |
| 121 allowEvents(() { | |
| 122 expectAddEvent("file.txt"); | |
| 123 expectRemoveEvent("file.txt"); | |
|
Bob Nystrom
2014/01/09 00:34:22
Seems like this contradicts the test description.
nweiz
2014/01/09 21:59:20
In theory this could happen with any watcher; they
Bob Nystrom
2014/01/09 22:49:19
Has it actually been seen to happen with the other
nweiz
2014/01/10 01:05:31
No, but it could in theory. I don't want to disall
| |
| 124 }); | |
| 119 }); | 125 }); |
| 120 | 126 |
| 121 test("reports a modification when a file is deleted and then immediately " | 127 test("reports a modification when a file is deleted and then immediately " |
| 122 "recreated", () { | 128 "recreated", () { |
| 123 writeFile("file.txt"); | 129 writeFile("file.txt"); |
| 124 startWatcher(); | 130 startWatcher(); |
| 125 | 131 |
| 126 deleteFile("file.txt"); | 132 deleteFile("file.txt"); |
| 127 writeFile("file.txt", contents: "re-created"); | 133 writeFile("file.txt", contents: "re-created"); |
| 128 expectModifyEvent("file.txt"); | 134 |
| 135 allowEither(() { | |
| 136 expectModifyEvent("file.txt"); | |
| 137 }, () { | |
| 138 expectRemoveEvent("file.txt"); | |
| 139 expectAddEvent("file.txt"); | |
| 140 }); | |
| 129 }); | 141 }); |
| 130 | 142 |
| 131 test("reports a modification when a file is moved and then immediately " | 143 test("reports a modification when a file is moved and then immediately " |
| 132 "recreated", () { | 144 "recreated", () { |
| 133 writeFile("old.txt"); | 145 writeFile("old.txt"); |
| 134 startWatcher(); | 146 startWatcher(); |
| 135 | 147 |
| 136 renameFile("old.txt", "new.txt"); | 148 renameFile("old.txt", "new.txt"); |
| 137 writeFile("old.txt", contents: "re-created"); | 149 writeFile("old.txt", contents: "re-created"); |
| 138 inAnyOrder(() { | 150 |
| 139 expectModifyEvent("old.txt"); | 151 allowEither(() { |
| 152 inAnyOrder([ | |
| 153 isModifyEvent("old.txt"), | |
| 154 isAddEvent("new.txt"), | |
| 155 ]); | |
| 156 }, () { | |
| 157 expectRemoveEvent("old.txt"); | |
| 140 expectAddEvent("new.txt"); | 158 expectAddEvent("new.txt"); |
| 159 expectAddEvent("old.txt"); | |
|
Bob Nystrom
2014/01/09 00:34:22
Some docs explaining why/where this behavior can s
nweiz
2014/01/09 21:59:20
Added a comment at the top of the "clustered chang
| |
| 141 }); | 160 }); |
| 142 }); | 161 }); |
| 143 | 162 |
| 144 test("reports a removal when a file is modified and then immediately " | 163 test("reports a removal when a file is modified and then immediately " |
| 145 "removed", () { | 164 "removed", () { |
| 146 writeFile("file.txt"); | 165 writeFile("file.txt"); |
| 147 startWatcher(); | 166 startWatcher(); |
| 148 | 167 |
| 149 writeFile("file.txt", contents: "modified"); | 168 writeFile("file.txt", contents: "modified"); |
| 150 deleteFile("file.txt"); | 169 deleteFile("file.txt"); |
| 170 | |
| 171 allowModifyEvent("file.txt"); | |
| 151 expectRemoveEvent("file.txt"); | 172 expectRemoveEvent("file.txt"); |
| 152 }); | 173 }); |
| 153 | 174 |
| 154 test("reports an add when a file is added and then immediately modified", | 175 test("reports an add when a file is added and then immediately modified", |
| 155 () { | 176 () { |
| 156 startWatcher(); | 177 startWatcher(); |
| 157 | 178 |
| 158 writeFile("file.txt"); | 179 writeFile("file.txt"); |
| 159 writeFile("file.txt", contents: "modified"); | 180 writeFile("file.txt", contents: "modified"); |
| 181 | |
| 160 expectAddEvent("file.txt"); | 182 expectAddEvent("file.txt"); |
| 183 startClosingEventStream(); | |
| 184 allowModifyEvent("file.txt"); | |
| 161 }); | 185 }); |
| 162 }); | 186 }); |
| 163 | 187 |
| 164 group("subdirectories", () { | 188 group("subdirectories", () { |
| 165 test('watches files in subdirectories', () { | 189 test('watches files in subdirectories', () { |
| 166 startWatcher(); | 190 startWatcher(); |
| 167 writeFile("a/b/c/d/file.txt"); | 191 writeFile("a/b/c/d/file.txt"); |
| 168 expectAddEvent("a/b/c/d/file.txt"); | 192 expectAddEvent("a/b/c/d/file.txt"); |
| 169 }); | 193 }); |
| 170 | 194 |
| 171 test('notifies when a subdirectory is moved within the watched directory ' | 195 test('notifies when a subdirectory is moved within the watched directory ' |
| 172 'and then its contents are modified', () { | 196 'and then its contents are modified', () { |
| 173 writeFile("old/file.txt"); | 197 writeFile("old/file.txt"); |
| 174 startWatcher(); | 198 startWatcher(); |
| 175 | 199 |
| 176 renameDir("old", "new"); | 200 renameDir("old", "new"); |
| 177 inAnyOrder(() { | 201 inAnyOrder([ |
| 178 expectRemoveEvent("old/file.txt"); | 202 isRemoveEvent("old/file.txt"), |
| 179 expectAddEvent("new/file.txt"); | 203 isAddEvent("new/file.txt"), |
|
Bob Nystrom
2014/01/09 00:34:22
Ditch trailing ",".
nweiz
2014/01/09 21:59:20
Done.
| |
| 180 }); | 204 ]); |
| 181 | 205 |
| 182 writeFile("new/file.txt", contents: "modified"); | 206 writeFile("new/file.txt", contents: "modified"); |
| 183 expectModifyEvent("new/file.txt"); | 207 expectModifyEvent("new/file.txt"); |
| 184 }); | 208 }); |
| 185 | 209 |
| 186 test('emits events for many nested files added at once', () { | 210 test('emits events for many nested files added at once', () { |
| 187 withPermutations((i, j, k) => | 211 withPermutations((i, j, k) => |
| 188 writeFile("sub/sub-$i/sub-$j/file-$k.txt")); | 212 writeFile("sub/sub-$i/sub-$j/file-$k.txt")); |
| 189 | 213 |
| 190 createDir("dir"); | 214 createDir("dir"); |
| 191 startWatcher(dir: "dir"); | 215 startWatcher(dir: "dir"); |
| 192 renameDir("sub", "dir/sub"); | 216 renameDir("sub", "dir/sub"); |
| 193 | 217 |
| 194 inAnyOrder(() { | 218 inAnyOrder(withPermutations((i, j, k) => |
| 195 withPermutations((i, j, k) => | 219 isAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"))); |
| 196 expectAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")); | |
| 197 }); | |
| 198 }); | 220 }); |
| 199 | 221 |
| 200 test('emits events for many nested files removed at once', () { | 222 test('emits events for many nested files removed at once', () { |
| 201 withPermutations((i, j, k) => | 223 withPermutations((i, j, k) => |
| 202 writeFile("dir/sub/sub-$i/sub-$j/file-$k.txt")); | 224 writeFile("dir/sub/sub-$i/sub-$j/file-$k.txt")); |
| 203 | 225 |
| 204 createDir("dir"); | 226 createDir("dir"); |
| 205 startWatcher(dir: "dir"); | 227 startWatcher(dir: "dir"); |
| 206 | 228 |
| 207 // Rename the directory rather than deleting it because native watchers | 229 // Rename the directory rather than deleting it because native watchers |
| 208 // report a rename as a single DELETE event for the directory, whereas | 230 // report a rename as a single DELETE event for the directory, whereas |
| 209 // they report recursive deletion with DELETE events for every file in the | 231 // they report recursive deletion with DELETE events for every file in the |
| 210 // directory. | 232 // directory. |
| 211 renameDir("dir/sub", "sub"); | 233 renameDir("dir/sub", "sub"); |
| 212 | 234 |
| 213 inAnyOrder(() { | 235 inAnyOrder(withPermutations((i, j, k) => |
| 214 withPermutations((i, j, k) => | 236 isRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"))); |
| 215 expectRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")); | |
| 216 }); | |
| 217 }); | 237 }); |
| 218 | 238 |
| 219 test('emits events for many nested files moved at once', () { | 239 test('emits events for many nested files moved at once', () { |
| 220 withPermutations((i, j, k) => | 240 withPermutations((i, j, k) => |
| 221 writeFile("dir/old/sub-$i/sub-$j/file-$k.txt")); | 241 writeFile("dir/old/sub-$i/sub-$j/file-$k.txt")); |
| 222 | 242 |
| 223 createDir("dir"); | 243 createDir("dir"); |
| 224 startWatcher(dir: "dir"); | 244 startWatcher(dir: "dir"); |
| 225 renameDir("dir/old", "dir/new"); | 245 renameDir("dir/old", "dir/new"); |
| 226 | 246 |
| 227 inAnyOrder(() { | 247 inAnyOrder(unionAll(withPermutations((i, j, k) { |
| 228 withPermutations((i, j, k) { | 248 return new Set.from([ |
| 229 expectRemoveEvent("dir/old/sub-$i/sub-$j/file-$k.txt"); | 249 isRemoveEvent("dir/old/sub-$i/sub-$j/file-$k.txt"), |
| 230 expectAddEvent("dir/new/sub-$i/sub-$j/file-$k.txt"); | 250 isAddEvent("dir/new/sub-$i/sub-$j/file-$k.txt"), |
| 231 }); | 251 ]); |
| 232 }); | 252 }))); |
| 233 }); | 253 }); |
| 234 | 254 |
| 235 test("emits events for many files added at once in a subdirectory with the " | 255 test("emits events for many files added at once in a subdirectory with the " |
| 236 "same name as a removed file", () { | 256 "same name as a removed file", () { |
| 237 writeFile("dir/sub"); | 257 writeFile("dir/sub"); |
| 238 withPermutations((i, j, k) => | 258 withPermutations((i, j, k) => |
| 239 writeFile("old/sub-$i/sub-$j/file-$k.txt")); | 259 writeFile("old/sub-$i/sub-$j/file-$k.txt")); |
| 240 startWatcher(dir: "dir"); | 260 startWatcher(dir: "dir"); |
| 241 | 261 |
| 242 deleteFile("dir/sub"); | 262 deleteFile("dir/sub"); |
| 243 renameDir("old", "dir/sub"); | 263 renameDir("old", "dir/sub"); |
| 244 inAnyOrder(() { | 264 |
| 245 expectRemoveEvent("dir/sub"); | 265 var events = withPermutations((i, j, k) => |
| 246 withPermutations((i, j, k) => | 266 isAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")); |
| 247 expectAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")); | 267 events.add(isRemoveEvent("dir/sub")); |
| 248 }); | 268 inAnyOrder(events); |
| 249 }); | 269 }); |
| 250 }); | 270 }); |
| 251 } | 271 } |
| OLD | NEW |