// Copyright (c) 2017, 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 removeOnExitListener(
///                    SendPort responsePort
///                 )
///    Stop listening on exit messages from the isolate.
///    If a call has previously been made to addOnExitListener with the same
/// send-port, this will unregister the port, and it will no longer receive
/// a message when the isolate terminates. A response may still be sent until
/// this operation is fully processed by the isolate.
///
/// @description Check that given port does not receive events after call
/// to removeOnExitListener().
///
/// @author a.semenov@unipro.ru

import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

test() async {
  // setup
  ReceivePort receivePort = new ReceivePort();
  ReceivePort onExit = new ReceivePort();
  Future onExitFuture = onExit.first;
  EchoServer server = await EchoServer.spawn(receivePort.sendPort);
  server.isolate.addOnExitListener(onExit.sendPort);
  // do something
  server.send("hello");
  await receivePort.first;

  server.isolate.removeOnExitListener(onExit.sendPort);

  await server.stop();
  onExitFuture = onExitFuture.timeout(new Duration(milliseconds: 200),
      onTimeout: () => "timeout");
  Expect.equals("timeout", await onExitFuture);
  // clean up
  onExit.close();
  asyncEnd();
}

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