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

// @dart = 2.9

// VMOptions=--enable-isolate-groups
// VMOptions=--no-enable-isolate-groups

library exit_at_spawn;

import "dart:isolate";
import "dart:async";
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

// Isolate exiting immediately.
isomain(args) {}

// Isolate exiting after running microtasks.
isomain2(args) {
  scheduleMicrotask(() {});
}

// Isolate exiting after running timers.
isomain3(args) {
  new Timer(Duration.zero, () {});
}

main() {
  asyncStart();

  test(isomain);
  test(isomain2);
  test(isomain3);

  asyncEnd();
}

void test(mainFunction) {
  asyncStart();

  RawReceivePort exitPort = new RawReceivePort();
  exitPort.handler = (message) {
    Expect.equals(null, message);
    exitPort.close();
    asyncEnd();
  };

  // Ignore returned Future.
  Isolate.spawn(mainFunction, null,
      // Setup handler as part of spawn.
      errorsAreFatal: false,
      onExit: exitPort.sendPort);
}
