// Copyright (c) 2013, 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.

// @dart = 2.9

part of ServerTest;

abstract class TestingServer {
  static const HOST = "127.0.0.1";
  static const INIT = 0;
  static const SHUTDOWN = -1;

  void onConnection(Socket connection); // Abstract.

  void errorHandlerServer(e, trace) {
    String msg = "Server socket error $e";
    if (trace != null) msg += "\nStackTrace: $trace";
    Expect.fail(msg);
  }

  SendPort get closeSendPort => _closePort.sendPort;

  Future<int> init() {
    _closePort = new ReceivePort();
    _closePort.first.then((_) {
      close();
    });
    return ServerSocket.bind(HOST, 0).then((server) {
      _server = server;
      _server.listen(onConnection, onError: errorHandlerServer);
      return _server.port;
    });
  }

  void close() {
    _server.close();
  }

  ServerSocket _server;
  ReceivePort _closePort;
}
