// 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 false then HttpServer objects with
/// the same combination of address, port and v6Only cannot be bind
/// @author sgrekhov@unipro.ru

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

test() async {
  HttpServer server1 =
      await HttpServer.bind(InternetAddress.loopbackIPv4, 1234);
  HttpServer? server2 = null;
  bool thrown = false;
  try {
    server2 = await HttpServer.bind(InternetAddress.loopbackIPv4, 1234);
  } catch (e) {
    thrown = true;
  } finally {
    server1.close();
    server2?.close();
    Expect.isTrue(thrown);
  }
  asyncEnd();
}

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