/*
 * Copyright (c) 2016, 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.
 */
/**
 * @assertion void kill({
 *    int priority: BEFORE_NEXT_EVENT
 *  })
 *   Requests the isolate to shut down.
 *   The isolate is requested to terminate itself. The priority argument
 * specifies when this must happen.
 *   The priority must be one of IMMEDIATE or BEFORE_NEXT_EVENT. The shutdown
 * is performed at different times depending on the priority:
 *      IMMEDIATE: The isolate shuts down as soon as possible. Control messages
 * are handled in order, so all previously sent control events from this
 * isolate will all have been processed. The shutdown should happen no later
 * than if sent with BEFORE_NEXT_EVENT. It may happen earlier if the system
 * has a way to shut down cleanly at an earlier time, even during the
 * execution of another event.
 *      BEFORE_NEXT_EVENT: The shutdown is scheduled for the next time control
 * returns to the event loop of the receiving isolate, after the current event,
 * and any already scheduled control events, are completed.
 *
 * @description Check that all previously sent control events are processed
 * before kill(IMMEDIATE) terminates the isolate, which waits for events.
 *
 * @issue #28181
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

test() async {
  ReceivePort onExit = new ReceivePort();
  ErrorServer server = await ErrorServer.spawn(onExit:onExit.sendPort);

  Future pingFuture = ping(server.isolate, "ping", TWO_SECONDS);
  server.isolate.kill(priority:Isolate.immediate);
  Expect.equals("ping", await pingFuture);
  await onExit.first;
  asyncEnd();
}

main() {
  asyncStart();
  test();
}
