blob: cb1c19721e6aa52b16141695a08cf9a2277e4ce0 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/**
* @assertion Stream<FileSystemEvent> watch({
* int events: FileSystemEvent.ALL,
* bool recursive: false
* })
* The implementation uses platform-dependent event-based APIs for receiving
* file-system notifications, thus behavior depends on the platform.
*
* Windows: Uses ReadDirectoryChangesW. The implementation only supports
* watching directories. Recursive watching is supported.
* Linux: Uses inotify. The implementation supports watching both files and
* directories. Recursive watching is not supported. Note: When watching files
* directly, delete events might not happen as expected.
* OS X: Uses FSEvents. The implementation supports watching both files and
* directories. Recursive watching is supported.
*
* The system will start listening for events once the returned Stream is being
* listened to, not when the call to watch is issued.
*
* The returned value is an endless broadcast Stream, that only stops when one
* of the following happens:
* The Stream is canceled, e.g. by calling cancel on the StreamSubscription.
* The FileSystemEntity being watched, is deleted.
* System Watcher exits unexpectedly. e.g. On Windows this happens when buffer
* that receive events from ReadDirectoryChangesW overflows.
* Use events to specify what events to listen for. The constants in
* FileSystemEvent can be or'ed together to mix events. Default is
* FileSystemEvent.ALL.
*
* A move event may be reported as separate delete and create events.
* @description Checks that this method watches the FileSystemEntity for
* changes. Test recursive parameter
* @author sgrekhov@unipro.ru
*/
import "dart:io";
import "dart:async";
import "../../../Utils/expect.dart";
import "../file_utils.dart";
main() async {
if (!Platform.isLinux) {
await inSandbox(_main);
}
}
_main(Directory sandbox) async {
Directory dir = getTempDirectorySync(parent: sandbox);
Directory child = dir.createTempSync();
final eventCompleter = new Completer<FileSystemEvent?>();
StreamSubscription? subscription;
asyncStart();
subscription = dir.watch(events: FileSystemEvent.create,
recursive: true).listen((FileSystemEvent event) async {
eventCompleter.complete(event);
await subscription?.cancel();
if (event.type != FileSystemEvent.create) {
Expect.fail("Wrong event arrived");
} else {
asyncEnd();
}
});
child.createTempSync();
await eventCompleter.future
.timeout(Duration(seconds: eventsTimeout), onTimeout: () async {
await subscription?.cancel();
Expect.fail("Watch timed out");
});
}