| Index: pkg/watcher/test/directory_watcher/shared.dart
|
| diff --git a/pkg/watcher/test/directory_watcher/shared.dart b/pkg/watcher/test/directory_watcher/shared.dart
|
| index 2e0186f5206b52c7b9c9173a0bce0b75e0ed194d..849cea00dcc1580c90e2680c9f6a1327b50985db 100644
|
| --- a/pkg/watcher/test/directory_watcher/shared.dart
|
| +++ b/pkg/watcher/test/directory_watcher/shared.dart
|
| @@ -3,6 +3,7 @@
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| import 'package:scheduled_test/scheduled_test.dart';
|
| +import 'package:watcher/src/utils.dart';
|
|
|
| import '../utils.dart';
|
|
|
| @@ -58,10 +59,10 @@ sharedTests() {
|
|
|
| writeFile("a.txt", contents: "same");
|
| writeFile("b.txt", contents: "after");
|
| - inAnyOrder(() {
|
| - expectModifyEvent("a.txt");
|
| - expectModifyEvent("b.txt");
|
| - });
|
| + inAnyOrder([
|
| + isModifyEvent("a.txt"),
|
| + isModifyEvent("b.txt")
|
| + ]);
|
| });
|
|
|
| test('when the watched directory is deleted, removes all files', () {
|
| @@ -71,10 +72,10 @@ sharedTests() {
|
| startWatcher(dir: "dir");
|
|
|
| deleteDir("dir");
|
| - inAnyOrder(() {
|
| - expectRemoveEvent("dir/a.txt");
|
| - expectRemoveEvent("dir/b.txt");
|
| - });
|
| + inAnyOrder([
|
| + isRemoveEvent("dir/a.txt"),
|
| + isRemoveEvent("dir/b.txt")
|
| + ]);
|
| });
|
|
|
| group("moves", () {
|
| @@ -83,10 +84,10 @@ sharedTests() {
|
| startWatcher();
|
| renameFile("old.txt", "new.txt");
|
|
|
| - inAnyOrder(() {
|
| - expectAddEvent("new.txt");
|
| - expectRemoveEvent("old.txt");
|
| - });
|
| + inAnyOrder([
|
| + isAddEvent("new.txt"),
|
| + isRemoveEvent("old.txt")
|
| + ]);
|
| });
|
|
|
| test('notifies when a file is moved from outside the watched directory',
|
| @@ -108,6 +109,13 @@ sharedTests() {
|
| });
|
| });
|
|
|
| + // Most of the time, when multiple filesystem actions happen in sequence,
|
| + // they'll be batched together and the watcher will see them all at once.
|
| + // These tests verify that the watcher normalizes and combine these events
|
| + // properly. However, very occasionally the events will be reported in
|
| + // separate batches, and the watcher will report them as though they occurred
|
| + // far apart in time, so each of these tests has a "backup case" to allow for
|
| + // that as well.
|
| group("clustered changes", () {
|
| test("doesn't notify when a file is created and then immediately removed",
|
| () {
|
| @@ -115,7 +123,12 @@ sharedTests() {
|
| writeFile("file.txt");
|
| deleteFile("file.txt");
|
|
|
| - // [startWatcher] will assert that no events were fired.
|
| + // Backup case.
|
| + startClosingEventStream();
|
| + allowEvents(() {
|
| + expectAddEvent("file.txt");
|
| + expectRemoveEvent("file.txt");
|
| + });
|
| });
|
|
|
| test("reports a modification when a file is deleted and then immediately "
|
| @@ -125,7 +138,14 @@ sharedTests() {
|
|
|
| deleteFile("file.txt");
|
| writeFile("file.txt", contents: "re-created");
|
| - expectModifyEvent("file.txt");
|
| +
|
| + allowEither(() {
|
| + expectModifyEvent("file.txt");
|
| + }, () {
|
| + // Backup case.
|
| + expectRemoveEvent("file.txt");
|
| + expectAddEvent("file.txt");
|
| + });
|
| });
|
|
|
| test("reports a modification when a file is moved and then immediately "
|
| @@ -135,9 +155,17 @@ sharedTests() {
|
|
|
| renameFile("old.txt", "new.txt");
|
| writeFile("old.txt", contents: "re-created");
|
| - inAnyOrder(() {
|
| - expectModifyEvent("old.txt");
|
| +
|
| + allowEither(() {
|
| + inAnyOrder([
|
| + isModifyEvent("old.txt"),
|
| + isAddEvent("new.txt")
|
| + ]);
|
| + }, () {
|
| + // Backup case.
|
| + expectRemoveEvent("old.txt");
|
| expectAddEvent("new.txt");
|
| + expectAddEvent("old.txt");
|
| });
|
| });
|
|
|
| @@ -148,6 +176,10 @@ sharedTests() {
|
|
|
| writeFile("file.txt", contents: "modified");
|
| deleteFile("file.txt");
|
| +
|
| + // Backup case.
|
| + allowModifyEvent("file.txt");
|
| +
|
| expectRemoveEvent("file.txt");
|
| });
|
|
|
| @@ -157,7 +189,12 @@ sharedTests() {
|
|
|
| writeFile("file.txt");
|
| writeFile("file.txt", contents: "modified");
|
| +
|
| expectAddEvent("file.txt");
|
| +
|
| + // Backup case.
|
| + startClosingEventStream();
|
| + allowModifyEvent("file.txt");
|
| });
|
| });
|
|
|
| @@ -174,10 +211,10 @@ sharedTests() {
|
| startWatcher();
|
|
|
| renameDir("old", "new");
|
| - inAnyOrder(() {
|
| - expectRemoveEvent("old/file.txt");
|
| - expectAddEvent("new/file.txt");
|
| - });
|
| + inAnyOrder([
|
| + isRemoveEvent("old/file.txt"),
|
| + isAddEvent("new/file.txt")
|
| + ]);
|
|
|
| writeFile("new/file.txt", contents: "modified");
|
| expectModifyEvent("new/file.txt");
|
| @@ -191,10 +228,8 @@ sharedTests() {
|
| startWatcher(dir: "dir");
|
| renameDir("sub", "dir/sub");
|
|
|
| - inAnyOrder(() {
|
| - withPermutations((i, j, k) =>
|
| - expectAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
|
| - });
|
| + inAnyOrder(withPermutations((i, j, k) =>
|
| + isAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
|
| });
|
|
|
| test('emits events for many nested files removed at once', () {
|
| @@ -210,10 +245,8 @@ sharedTests() {
|
| // directory.
|
| renameDir("dir/sub", "sub");
|
|
|
| - inAnyOrder(() {
|
| - withPermutations((i, j, k) =>
|
| - expectRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
|
| - });
|
| + inAnyOrder(withPermutations((i, j, k) =>
|
| + isRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
|
| });
|
|
|
| test('emits events for many nested files moved at once', () {
|
| @@ -224,12 +257,12 @@ sharedTests() {
|
| startWatcher(dir: "dir");
|
| renameDir("dir/old", "dir/new");
|
|
|
| - inAnyOrder(() {
|
| - withPermutations((i, j, k) {
|
| - expectRemoveEvent("dir/old/sub-$i/sub-$j/file-$k.txt");
|
| - expectAddEvent("dir/new/sub-$i/sub-$j/file-$k.txt");
|
| - });
|
| - });
|
| + inAnyOrder(unionAll(withPermutations((i, j, k) {
|
| + return new Set.from([
|
| + isRemoveEvent("dir/old/sub-$i/sub-$j/file-$k.txt"),
|
| + isAddEvent("dir/new/sub-$i/sub-$j/file-$k.txt")
|
| + ]);
|
| + })));
|
| });
|
|
|
| test("emits events for many files added at once in a subdirectory with the "
|
| @@ -241,11 +274,11 @@ sharedTests() {
|
|
|
| deleteFile("dir/sub");
|
| renameDir("old", "dir/sub");
|
| - inAnyOrder(() {
|
| - expectRemoveEvent("dir/sub");
|
| - withPermutations((i, j, k) =>
|
| - expectAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
|
| - });
|
| +
|
| + var events = withPermutations((i, j, k) =>
|
| + isAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
|
| + events.add(isRemoveEvent("dir/sub"));
|
| + inAnyOrder(events);
|
| });
|
| });
|
| }
|
|
|