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

// VMOptions=--enable-asserts

// @dart = 2.9

import 'dart:io';
import 'dart:isolate';

// This test attempts to check that the vm can shutdown cleanly when
// isolates are starting and stopping.
//
// We spawn a set of workers.  Each worker will kill its parent
// worker (if any) and then spawn a child worker.  We start these
// workers in a staggered fashion in an attempt to see a variety of
// isolate states at the time that this program terminates.

trySpawn(Function f, Object o) async {
  try {
    await Isolate.spawn<SendPort>(f, o);
  } catch (e) {
    // Isolate spawning may fail if the program is ending.
    assert(e is IsolateSpawnException);
  }
}

void worker(SendPort parentPort) {
  var port = new RawReceivePort();

  // This worker will exit when it receives any message.
  port.handler = (_) {
    port.close();
  };

  // Send a message to terminate our parent isolate.
  if (parentPort != null) {
    parentPort.send(null);
  }

  // Spawn a child worker.
  trySpawn(worker, port.sendPort);
}

void main() {
  const numWorkers = 50;
  const delay = const Duration(milliseconds: (1000 ~/ numWorkers));
  const exitDelay = const Duration(seconds: 2);

  // Take about a second to spin up our workers in a staggered
  // fashion. We want to maximize the chance that they will be in a
  // variety of states when the vm shuts down.
  print('Starting ${numWorkers} workers...');
  for (int i = 0; i < numWorkers; i++) {
    trySpawn(worker, null);
    sleep(delay);
  }

  // Let them spin for a bit before terminating the program.
  print('Waiting for ${exitDelay} before exit...');
  sleep(exitDelay);
}
