| Index: pkg/watcher/test/utils.dart
|
| diff --git a/pkg/watcher/test/utils.dart b/pkg/watcher/test/utils.dart
|
| index 65d47197d7afa1e387944a5e4ae92e2866cbd766..18bec9728d5ac9e6f25720c3925c9d71c77c4b1e 100644
|
| --- a/pkg/watcher/test/utils.dart
|
| +++ b/pkg/watcher/test/utils.dart
|
| @@ -76,9 +76,17 @@ void createSandbox() {
|
| /// Normally, this will pause the schedule until the watcher is done scanning
|
| /// and is polling for changes. If you pass `false` for [waitForReady], it will
|
| /// not schedule this delay.
|
| -DirectoryWatcher createWatcher({bool waitForReady}) {
|
| +///
|
| +/// If [dir] is provided, watches a subdirectory in the sandbox with that name.
|
| +DirectoryWatcher createWatcher({String dir, bool waitForReady}) {
|
| + if (dir == null) {
|
| + dir = _sandboxDir;
|
| + } else {
|
| + dir = p.join(_sandboxDir, dir);
|
| + }
|
| +
|
| // Use a short delay to make the tests run quickly.
|
| - _watcher = new DirectoryWatcher(_sandboxDir,
|
| + _watcher = new DirectoryWatcher(dir,
|
| pollingDelay: new Duration(milliseconds: 100));
|
|
|
| // Wait until the scan is finished so that we don't miss changes to files
|
| @@ -95,31 +103,45 @@ DirectoryWatcher createWatcher({bool waitForReady}) {
|
| return _watcher;
|
| }
|
|
|
| -void expectEvent(ChangeType type, String path) {
|
| - // Immediately create the future. This ensures we don't register too late and
|
| - // drop the event before we receive it.
|
| - var future = _watcher.events.elementAt(_nextEvent++).then((event) {
|
| - expect(event, new _ChangeMatcher(type, path));
|
| - });
|
| +/// Expects that the next set of events will all be changes of [type] on
|
| +/// [paths].
|
| +///
|
| +/// Validates that events are delivered for all paths in [paths], but allows
|
| +/// them in any order.
|
| +void expectEvents(ChangeType type, Iterable<String> paths) {
|
| + var pathSet = paths.map((path) => p.join(_sandboxDir, path)).toSet();
|
| +
|
| + // Create an expectation for as many paths as we have.
|
| + var futures = [];
|
| +
|
| + for (var i = 0; i < paths.length; i++) {
|
| + // Immediately create the futures. This ensures we don't register too
|
| + // late and drop the event before we receive it.
|
| + var future = _watcher.events.elementAt(_nextEvent++).then((event) {
|
| + expect(event.type, equals(type));
|
| + expect(pathSet, contains(event.path));
|
| +
|
| + pathSet.remove(event.path);
|
| + });
|
|
|
| - // Make sure the schedule is watching it in case it fails.
|
| - currentSchedule.wrapFuture(future);
|
| + // Make sure the schedule is watching it in case it fails.
|
| + currentSchedule.wrapFuture(future);
|
| +
|
| + futures.add(future);
|
| + }
|
|
|
| // Schedule it so that later file modifications don't occur until after this
|
| // event is received.
|
| - schedule(() => future, "wait for $type event");
|
| -}
|
| -
|
| -void expectAddEvent(String path) {
|
| - expectEvent(ChangeType.ADD, p.join(_sandboxDir, path));
|
| + schedule(() => Future.wait(futures),
|
| + "wait for $type events on ${paths.join(', ')}");
|
| }
|
|
|
| -void expectModifyEvent(String path) {
|
| - expectEvent(ChangeType.MODIFY, p.join(_sandboxDir, path));
|
| -}
|
| +void expectAddEvent(String path) => expectEvents(ChangeType.ADD, [path]);
|
| +void expectModifyEvent(String path) => expectEvents(ChangeType.MODIFY, [path]);
|
| +void expectRemoveEvent(String path) => expectEvents(ChangeType.REMOVE, [path]);
|
|
|
| -void expectRemoveEvent(String path) {
|
| - expectEvent(ChangeType.REMOVE, p.join(_sandboxDir, path));
|
| +void expectRemoveEvents(Iterable<String> paths) {
|
| + expectEvents(ChangeType.REMOVE, paths);
|
| }
|
|
|
| /// Schedules writing a file in the sandbox at [path] with [contents].
|
| @@ -175,6 +197,13 @@ void renameFile(String from, String to) {
|
| }, "rename file $from to $to");
|
| }
|
|
|
| +/// Schedules deleting a directory in the sandbox at [path].
|
| +void deleteDir(String path) {
|
| + schedule(() {
|
| + new Directory(p.join(_sandboxDir, path)).deleteSync(recursive: true);
|
| + }, "delete directory $path");
|
| +}
|
| +
|
| /// A [Matcher] for [WatchEvent]s.
|
| class _ChangeMatcher extends Matcher {
|
| /// The expected change.
|
|
|