// 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 Future<HttpServer> bind(
///  address,
///  int port, {
///  int backlog: 0,
///  bool v6Only: false,
///  bool shared: false
/// }).
/// ...
/// The optional argument shared specifies whether additional HttpServer objects
/// can bind to the same combination of address, port and v6Only. If shared is
/// true and more HttpServers from this isolate or other isolates are bound to
/// the port, then the incoming connections will be distributed among all the
/// bound HttpServers. Connections can be distributed over multiple isolates this
/// way.
/// @description Checks that if [shared] is true then HttpServer objects with
/// the same combination of address, port and v6Only can bind
/// @author sgrekhov@unipro.ru

import "dart:io";
import "../../../Utils/expect.dart";

test() async {
  asyncStart();
  HttpServer? server1 = null;
  HttpServer? server2 = null;
  try {
    server1 = await HttpServer.bind(InternetAddress.loopbackIPv4, 1234,
        shared: true);
    server2 = await HttpServer.bind(InternetAddress.loopbackIPv4, 1234,
        shared: true);
  } finally {
    server1?.close();
    server2?.close();
    asyncEnd();
  }
}

main() {
  test();
}
