blob: 50f7aebba2c9e5efd196d0e3f6c5717d8bcb6050 [file] [log] [blame]
// Copyright (c) 2015, 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:scheduled_test/scheduled_test.dart';
import 'package:watcher/src/utils.dart';
import '../utils.dart';
void sharedTests() {
test("doesn't notify if the file isn't modified", () {
startWatcher(path: "file.txt");
// Give the watcher time to fire events if it's going to.
schedule(() => pumpEventQueue());
deleteFile("file.txt");
expectRemoveEvent("file.txt");
});
test("notifies when a file is modified", () {
startWatcher(path: "file.txt");
writeFile("file.txt", contents: "modified");
expectModifyEvent("file.txt");
});
test("notifies when a file is removed", () {
startWatcher(path: "file.txt");
deleteFile("file.txt");
expectRemoveEvent("file.txt");
});
test("notifies when a file is modified multiple times", () {
startWatcher(path: "file.txt");
writeFile("file.txt", contents: "modified");
expectModifyEvent("file.txt");
writeFile("file.txt", contents: "modified again");
expectModifyEvent("file.txt");
});
test("notifies even if the file contents are unchanged", () {
startWatcher(path: "file.txt");
writeFile("file.txt");
expectModifyEvent("file.txt");
});
test("emits a remove event when the watched file is moved away", () {
startWatcher(path: "file.txt");
renameFile("file.txt", "new.txt");
expectRemoveEvent("file.txt");
});
test(
"emits a modify event when another file is moved on top of the watched "
"file", () {
writeFile("old.txt");
startWatcher(path: "file.txt");
renameFile("old.txt", "file.txt");
expectModifyEvent("file.txt");
});
// Regression test for a race condition.
test("closes the watcher immediately after deleting the file", () {
writeFile("old.txt");
var watcher = createWatcher(path: "file.txt", waitForReady: false);
var sub = schedule(() => watcher.events.listen(null));
deleteFile("file.txt");
schedule(() async {
// Reproducing the race condition will always be flaky, but this sleep
// helped it reproduce more consistently on my machine.
await new Future.delayed(new Duration(milliseconds: 10));
(await sub).cancel();
});
});
}