blob: c60a58602f00476057b9c3c638af7bda23555623 [file] [log] [blame]
// 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.
@Timeout.factor(2)
library;
import 'package:test/test.dart';
import 'package:watcher/watcher.dart';
import '../utils.dart';
import 'end_to_end_tests.dart';
import 'file_tests.dart';
import 'link_tests.dart';
void main() {
// Use a short delay to make the tests run quickly.
watcherFactory = (dir) => PollingDirectoryWatcher(dir,
pollingDelay: const Duration(milliseconds: 10));
/// See [enableSleepUntilNewModificationTime] for a note about the "polling"
/// tests.
setUp(enableSleepUntilNewModificationTime);
fileTests(isNative: false);
linkTests(isNative: false);
endToEndTests();
// A poll does an async directory list that runs "stat" on each file. Check
// handling of a file that is deleted between the two.
test('deletes during poll', () async {
await startWatcher();
for (var i = 0; i != 300; ++i) {
writeFile('$i');
}
// A series of deletes with delays in between for 300ms, which will
// intersect with the 10ms polling multiple times.
for (var i = 0; i != 300; ++i) {
deleteFile('$i');
await Future<void>.delayed(const Duration(milliseconds: 1));
}
final events =
await takeEvents(duration: const Duration(milliseconds: 500));
// Events should be adds and removes that pair up, with no modify events.
final adds = <String>{};
final removes = <String>{};
for (var event in events) {
if (event.type == ChangeType.ADD) {
adds.add(event.path);
} else if (event.type == ChangeType.REMOVE) {
removes.add(event.path);
} else {
fail('Unexpected event: $event');
}
}
expect(adds, removes);
});
}