blob: ac653447496d23a1bfe7130c74602b4ec194f6ed [file]
// Copyright (c) 2025, 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 'dart:io';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;
import 'package:watcher/watcher.dart';
import '../utils.dart';
void main() {
// Watching a relative path is not a great idea because the meaning of the
// path changes if `Directory.current` changes, leading to surprising and
// undefined behavior. But released `package:watcher` allows it so at least
// check basic functionality works.
//
// `Directory.current` is shared across the VM so only one test can change it
// at a time. Solve that by having this be the only test that changes it and
// testing both the native and polling watcher in the same test.
test('watch relative directory', () async {
final testDirectory = Directory(d.sandbox);
final oldDirectory = Directory.current;
try {
Directory.current = testDirectory;
for (final watcherFactory in [
DirectoryWatcher.new,
(String path) => PollingDirectoryWatcher(
path,
pollingDelay: const Duration(milliseconds: 1),
),
]) {
writeFile('dir/a.txt');
writeFile('dir/b.txt');
writeFile('dir/c.txt');
final watcher = watcherFactory('dir');
final events = <WatchEvent>[];
final subscription = watcher.events.listen(events.add);
await watcher.ready;
writeFile('dir/a.txt', contents: 'modified');
renameFile('dir/b.txt', 'dir/e.txt');
deleteFile('dir/c.txt');
writeFile('dir/d.txt');
await Future<void>.delayed(const Duration(milliseconds: 500));
await subscription.cancel();
expect(events.map((e) => e.toString()).toSet(), {
'modify ${p.join('dir', 'a.txt')}',
'remove ${p.join('dir', 'b.txt')}',
'add ${p.join('dir', 'e.txt')}',
'remove ${p.join('dir', 'c.txt')}',
'add ${p.join('dir', 'd.txt')}',
}, reason: 'With watcher $watcher.');
deleteDir('dir');
}
} finally {
Directory.current = oldDirectory;
}
});
}