// 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.

// VMOptions=--delayed-filewatch-callback --enable-isolate-groups --experimental-enable-isolate-groups-jit
// VMOptions=--delayed-filewatch-callback --no-enable-isolate-groups

// Verifies that cancelling subscription from inside of the event handler
// works as expected, does not result in crash or hang.

import "dart:async";
import "dart:io";

import "package:path/path.dart";

final completer = Completer<void>();
late StreamSubscription subscription;

void handleWatchEvent(event) {
  if (event is FileSystemCreateEvent && event.path.endsWith('txt')) {
    subscription.cancel();
    completer.complete();
  }
}

void main() async {
  if (!FileSystemEntity.isWatchSupported) return;
  final dir = Directory.systemTemp.createTempSync('dart_file_system_watcher');
  final watcher = dir.watch();
  subscription = watcher.listen(handleWatchEvent);

  print('watching ${dir.path}');
  for (int i = 0; i < 1000; i++) {
    File(join(dir.path, 'file_$i.txt')).createSync();
  }
  await completer.future;
  try {
    dir.deleteSync(recursive: true);
  } catch (_) {}
}
