// 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.
//
// VMOptions=
// VMOptions=--short_socket_read
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write

import "dart:async";
import "dart:io";

import "package:expect/async_helper.dart";
import "package:expect/expect.dart";

void main() {
  // Connect socket and listen on the stream. The server closes
  // immediately so only a done event is received.
  asyncStart();
  ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
    server.listen((client) {
      client.close();
      client.done.then((_) => client.destroy());
    });
    Socket.connect("127.0.0.1", server.port).then((socket) {
      bool onDoneCalled = false;
      socket.listen(
        (_) {
          Expect.fail("Unexpected data");
        },
        onDone: () {
          Expect.isFalse(onDoneCalled);
          onDoneCalled = true;
          socket.close();
          server.close();
          asyncEnd();
        },
      );
    });
  });
}
