// 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 addOnExitListener(
 *                    SendPort responsePort, {
 *                    Object response
 *            })
 * ...
 *   Adding the same port more than once will only cause it to receive one
 * message, using the last response value that was added.
 *
 * @description Check that isolate sends single event on responsePort,
 * which is supplied several times to addOnExitListener() of the same isolate.
 * Parameter response is not specified.
 *
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

test() async {
  ErrorServer server = await ErrorServer.spawn(errorsAreFatal:false);
  ReceivePort onExit = new ReceivePort();
  int eventsCount = 0;
  onExit.listen(
    (_) {
      eventsCount++;
    }
  );
  server.isolate.addOnExitListener(onExit.sendPort);
  server.isolate.addOnExitListener(onExit.sendPort);
  server.isolate.addOnExitListener(onExit.sendPort);
  server.isolate.addOnExitListener(onExit.sendPort);
  server.requestStop();
  await new Future.delayed(TWO_SECONDS); // wait for duplicate events
  onExit.close();
  Expect.equals(1, eventsCount);
  asyncEnd();
}

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