// 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.

import 'dart:async';
import 'dart:io';

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

var events = [];

Future testSocketException() {
  var completer = new Completer();
  runZonedGuarded(
    () {
      Socket.connect("4", 1, timeout: Duration(seconds: 5)).then((Socket s) {
        Expect.fail("Socket should not be able to connect");
      });
    },
    (err, s) {
      if (err is! SocketException) Expect.fail("Not expected error: $err");
      completer.complete("socket test, ok.");
      events.add("SocketException");
    },
  );
  return completer.future;
}

Future testFileSystemException() {
  var completer = new Completer();
  runZonedGuarded(
    () {
      new File("lol it's not a file\n").openRead().listen(null);
    },
    (err, s) {
      if (err is! FileSystemException) Expect.fail("Not expected error: $err");
      completer.complete("file test, ok.");
      events.add("FileSystemException");
    },
  );
  return completer.future;
}

main() {
  // We keep a ReceivePort open until all tests are done. This way the VM will
  // hang if the callbacks are not invoked and the test will time out.
  asyncStart();
  testSocketException().then((_) => testFileSystemException()).then((_) {
    asyncEnd();
    Expect.listEquals(["SocketException", "FileSystemException"], events);
  });
}
