Index: tests/standalone/io/file_system_watcher_test.dart |
diff --git a/tests/standalone/io/file_system_watcher_test.dart b/tests/standalone/io/file_system_watcher_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..66e4396f5470392a61450a6cf98ea7fa39e46618 |
--- /dev/null |
+++ b/tests/standalone/io/file_system_watcher_test.dart |
@@ -0,0 +1,261 @@ |
+// Copyright (c) 2013, 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. |
+ |
+import "dart:async"; |
+import "package:expect/expect.dart"; |
+import "dart:io"; |
+import "dart:isolate"; |
+ |
+ |
+void testWatchCreateFile() { |
+ var dir = new Directory('').createTempSync(); |
+ var watcher = new FileSystemWatcher(); |
+ watcher.watchPath(dir.path); |
+ var file = new File(dir.path + '/file'); |
+ |
+ bool gotEvent = false; |
+ var port = new ReceivePort(); |
+ watcher.listen((event) { |
+ if (event is FileSystemCreateEvent && |
+ event.path.endsWith('file')) { |
+ Expect.isFalse(gotEvent); |
+ gotEvent = true; |
+ watcher.close(); |
+ } |
+ }, onDone: () { |
+ Expect.isTrue(gotEvent); |
+ port.close(); |
+ dir.deleteSync(recursive: true); |
+ }, onError: (e) { |
+ dir.deleteSync(recursive: true); |
+ throw e; |
+ }); |
+ |
+ file.createSync(); |
+} |
+ |
+ |
+void testWatchModifyFile() { |
+ var dir = new Directory('').createTempSync(); |
+ var watcher = new FileSystemWatcher(); |
+ var file = new File(dir.path + '/file'); |
+ file.createSync(); |
+ |
+ watcher.watchPath(dir.path); |
+ |
+ bool gotEvent = false; |
+ var port = new ReceivePort(); |
+ watcher.listen((event) { |
+ if (event is FileSystemModifyEvent) { |
+ gotEvent = true; |
+ Expect.isTrue(event.path.endsWith('file')); |
+ watcher.close(); |
+ } |
+ }, onDone: () { |
+ Expect.isTrue(gotEvent); |
+ port.close(); |
+ dir.deleteSync(recursive: true); |
+ }, onError: (e) { |
+ dir.deleteSync(recursive: true); |
+ throw e; |
+ }); |
+ |
+ file.writeAsStringSync('a'); |
+} |
+ |
+ |
+void testWatchMoveFile() { |
+ var dir = new Directory('').createTempSync(); |
+ var watcher = new FileSystemWatcher(); |
+ var file = new File(dir.path + '/file'); |
+ file.createSync(); |
+ |
+ watcher.watchPath(dir.path); |
+ |
+ bool gotEvent = false; |
+ var port = new ReceivePort(); |
+ watcher.listen((event) { |
+ if (event is FileSystemMoveEvent) { |
+ Expect.isFalse(gotEvent); |
+ gotEvent = true; |
+ Expect.isTrue(event.path.endsWith('file')); |
+ Expect.isTrue(event.destination.endsWith('file2')); |
+ watcher.close(); |
+ } |
+ }, onDone: () { |
+ Expect.isTrue(gotEvent); |
+ port.close(); |
+ dir.deleteSync(recursive: true); |
+ }, onError: (e) { |
+ dir.deleteSync(recursive: true); |
+ throw e; |
+ }); |
+ |
+ file.renameSync(dir.path + '/file2'); |
+} |
+ |
+ |
+void testWatchDeleteFile() { |
+ var dir = new Directory('').createTempSync(); |
+ var watcher = new FileSystemWatcher(); |
+ var file = new File(dir.path + '/file'); |
+ file.createSync(); |
+ |
+ watcher.watchPath(dir.path); |
+ |
+ bool gotEvent = false; |
+ var port = new ReceivePort(); |
+ watcher.listen((event) { |
+ if (event is FileSystemDeleteEvent) { |
+ Expect.isFalse(gotEvent); |
+ gotEvent = true; |
+ Expect.isTrue(event.path.endsWith('file')); |
+ watcher.close(); |
+ } |
+ }, onDone: () { |
+ Expect.isTrue(gotEvent); |
+ port.close(); |
+ dir.deleteSync(recursive: true); |
+ }, onError: (e) { |
+ dir.deleteSync(recursive: true); |
+ throw e; |
+ }); |
+ |
+ file.deleteSync(); |
+} |
+ |
+ |
+void testUnwatch() { |
+ var dir = new Directory('').createTempSync(); |
+ var watcher = new FileSystemWatcher(); |
+ var file = new File(dir.path + '/file'); |
+ file.createSync(); |
+ |
+ watcher.watchPath(dir.path); |
+ |
+ bool gotEvent = false; |
+ var port = new ReceivePort(); |
+ watcher.listen((event) { |
+ if (event is FileSystemModifyEvent && !gotEvent) { |
+ gotEvent = true; |
+ Expect.isTrue(event.path.endsWith('file')); |
+ watcher.unwatchPath(dir.path); |
+ file.writeAsStringSync(''); |
+ new Timer(const Duration(milliseconds: 50), watcher.close); |
+ } |
+ }, onDone: () { |
+ Expect.isTrue(gotEvent); |
+ port.close(); |
+ dir.deleteSync(recursive: true); |
+ }, onError: (e) { |
+ dir.deleteSync(recursive: true); |
+ throw e; |
+ }); |
+ |
+ file.writeAsStringSync('a'); |
+} |
+ |
+ |
+void testWatchOnlyModifyFile() { |
+ var dir = new Directory('').createTempSync(); |
+ var watcher = new FileSystemWatcher(); |
+ var file = new File(dir.path + '/file'); |
+ |
+ watcher.watchPath(dir.path, events: FileSystemWatcher.MODIFY_EVENT); |
+ |
+ bool gotEvent = false; |
+ var port = new ReceivePort(); |
+ watcher.listen((event) { |
+ gotEvent = true; |
+ Expect.isTrue(event is FileSystemModifyEvent); |
+ Expect.isTrue(event.path.endsWith('file')); |
+ watcher.close(); |
+ }, onDone: () { |
+ Expect.isTrue(gotEvent); |
+ port.close(); |
+ dir.deleteSync(recursive: true); |
+ }, onError: (e) { |
+ dir.deleteSync(recursive: true); |
+ throw e; |
+ }); |
+ |
+ file.createSync(); |
+ file.writeAsStringSync('a'); |
+} |
+ |
+ |
+void testDoubleWatch() { |
+ var dir = new Directory('').createTempSync(); |
+ var watcher = new FileSystemWatcher(); |
+ |
+ watcher.watchPath(dir.path); |
+ Expect.throws(() => watcher.watchPath(dir.path)); |
+ |
+ watcher.close(); |
+ dir.deleteSync(); |
+} |
+ |
+void testMultipleEvents() { |
+ var dir = new Directory('').createTempSync(); |
+ var watcher = new FileSystemWatcher(); |
+ var file = new File(dir.path + '/file'); |
+ var file2 = new File(dir.path + '/file2'); |
+ |
+ watcher.watchPath(dir.path); |
+ |
+ var port = new ReceivePort(); |
+ int state = 0; |
+ watcher.listen((event) { |
+ switch (state) { |
+ case 0: |
+ Expect.isTrue(event is FileSystemCreateEvent); |
+ state = 1; |
+ break; |
+ |
+ case 1: |
+ if (event is FileSystemCreateEvent) break; |
+ Expect.isTrue(event is FileSystemModifyEvent); |
+ state = 2; |
+ break; |
+ |
+ case 2: |
+ if (event is FileSystemModifyEvent) break; |
+ Expect.isTrue(event is FileSystemMoveEvent); |
+ state = 3; |
+ break; |
+ |
+ case 3: |
+ if (event is FileSystemMoveEvent) break; |
+ Expect.isTrue(event is FileSystemDeleteEvent); |
+ watcher.close(); |
+ state = 4; |
+ break; |
+ |
+ case 4: |
+ Expect.isTrue(event is FileSystemDeleteEvent); |
+ break; |
+ } |
+ }, onDone: () { |
+ port.close(); |
+ dir.deleteSync(); |
+ Expect.equals(4, state); |
+ }); |
+ |
+ file.createSync(); |
+ file.writeAsStringSync('a'); |
+ file.renameSync(file2.path); |
+ file2.deleteSync(); |
+} |
+ |
+ |
+void main() { |
+ testWatchCreateFile(); |
+ testWatchModifyFile(); |
+ testWatchMoveFile(); |
+ testWatchDeleteFile(); |
+ testUnwatch(); |
+ testWatchOnlyModifyFile(); |
+ testDoubleWatch(); |
+ testMultipleEvents(); |
+} |