// 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
/// WebSocket.fromUpgradedSocket(
///     Socket socket, {
///     String protocol,
///     bool serverSide,
///     CompressionOptions compression: CompressionOptions.compressionDefault
/// })
/// Creates a WebSocket from an already-upgraded socket.
///
/// The initial WebSocket handshake must have occurred prior to this call. A
/// WebSocket client can automatically perform the handshake using
/// WebSocket.connect, while a server can do so using
/// WebSocketTransformer.upgrade. To manually upgrade an HttpRequest,
/// HttpResponse.detachSocket may be called.
///
/// protocol should be the protocol negotiated by this handshake, if any.
///
/// serverSide must be passed explicitly. If it's false, the WebSocket will act
/// as the client and mask the messages it sends. If it's true, it will act as
/// the server and will not mask its messages.
///
/// If compression is provided, the WebSocket created will be configured to
/// negotiate with the specified CompressionOptions. If none is specified then
/// the WebSocket will be created with the default CompressionOptions.
///
/// @description Checks that this constructor creates a new WebSocket object.
/// @author ngl@unipro.ru

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

main() {
  HttpServer.bind("127.0.0.1", 0).then((server) {
    server.listen((request) {});
    var socket1 = Socket.connect("127.0.0.1", server.port);
    socket1.then((socket) {
      var websocket = new WebSocket.fromUpgradedSocket(socket,
          protocol: "p1.com", serverSide: true);
      Expect.isTrue(websocket is WebSocket);
      Expect.runtimeIsType<WebSocket>(websocket);
      websocket.close();
      socket.done.then((_) {
        socket.destroy();
        server.close();
      });
    });
  });
}
